From Doom Scrolling to Bloom Scrolling
A perspective-driven content aggregator that counters infinite scrolling by optimizing for serendipity, finite feeds, and raw data instead of engagement and outrage.
Transform the endless scroll into a finite, intentional experience that leaves users feeling more informed and optimistic. Bloom Scroll synthesizes diverse content sourcesβfrom statistical truth to frontier science to visual cultureβinto a curated daily digest rooted in epistemic progress and constructive perspective.
Core Principle: "The End" is the product. Every feed has a definitive stopping point.
Bloom Scroll is built on four anti-doomscroll principles:
- Hard cap of 20 cards per day
- Completion celebrated with "The Garden is Watered" message
- No "Load More" escape hatch
- Daily reset encourages routine
- Users "plant" seeds at the bottom
- Scroll up to see ideas bloom
- Newest content appears at bottom (like chat)
- Natural stopping point at top (completion widget)
- Render charts from source CSV/JSON (not screenshots)
- Interactive visualizations with fl_chart
- Preserve data provenance and context
- "Show your work" transparency
- Penalize echo chambers (cosine distance 0.3-0.8)
- Prioritize blindspot perspectives
- Mix aesthetics + data + science
- "Robin Hood" visual rhythm
- FastAPI (Python 3.11+) - Async REST API
- PostgreSQL (15+) with pgvector - Vector similarity search
- Sentence-BERT (all-MiniLM-L6-v2) - 384-dim embeddings
- Redis - Caching and session management
- Flutter/Dart - Cross-platform web/mobile UI
- Riverpod - State management
- fl_chart - Interactive data visualization
- Masonry Grid - Staggered layout (Pinterest-style)
- Docker Compose - Local development
- Alembic - Database migrations
- Kubernetes + ArgoCD - Production deployment for
almanac.solar
Last audited: 2026-05-28. See docs/CURRENT_STATE.md for the evidence log from repository inspection and public production probes.
Key observed facts:
- Public web:
https://almanac.solarreturns HTTP 200. - Public API health:
https://api.almanac.solar/healthreturns healthy with database OK, 8 indexed embeddings, and 8 cards. - The production Flutter bundle is baked to
https://api.almanac.solar/api/v1. /docsand/openapi.jsonare hidden in production and covered byscripts/prod-smoke.sh.- Backend installs are deterministic through
backend/poetry.lock; production ML wheels are pinned separately inbackend/requirements-ml-linux-cpu.txtso Linux images use CPU-only PyTorch. - Enclii reports the
bloom-scroll-servicesArgo app healthy/synced atargocd-a84a3de; API and web are both healthy at2/2replicas. - Root
docker-compose.ymlis a lightweight compatibility stack on API port5200;infrastructure/remains the preferred local development path.
- Docker & Docker Compose
- (Optional) Python 3.11+ for backend development
- (Optional) Flutter SDK 3.0+ for frontend development
cd infrastructure
docker-compose -f docker-compose.dev.yml up -dThis starts:
- PostgreSQL with pgvector extension
- Redis cache
cd ../backend
poetry install
poetry run alembic upgrade headCreates the bloom_cards table with vector columns.
poetry run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000The local API runs at http://localhost:8000.
curl -X POST "http://localhost:8000/api/v1/ingest/owid/all"
curl -X POST "http://localhost:8000/api/v1/ingest/aesthetics/all?limit_per_channel=2"cd frontend
flutter pub get
flutter run -d chrome --dart-define=API_BASE_URL=http://localhost:8000API Endpoints:
- iOS Simulator:
http://localhost:8000 - Android Emulator:
http://10.0.2.2:8000 - Physical Device:
http://<your-ip>:8000
View local API docs: http://localhost:8000/docs
bloom-scroll/
βββ π docs/ # Documentation & Architecture
β βββ brief.md # Product concept
β βββ prd.md # Product Requirements Document
β βββ CURRENT_STATE.md # Evidence-backed current implementation and prod state
β βββ ARCHITECTURE.md # Technical deep dive
β βββ DESIGN_SYSTEM.md # "Paper & Ink" design tokens
β βββ ROADMAP.md # Story tracking (STORY-001 to STORY-007)
β βββ design_tokens.md # Raw design specifications
β βββ STORY-004-IMPLEMENTATION.md # Serendipity algorithm docs
β βββ STORY-006-IMPLEMENTATION.md # Perspective overlay docs
β βββ STORY-007-IMPLEMENTATION.md # Finite feed docs
β
βββ π backend/ # Python FastAPI
β βββ app/
β β βββ models/ # SQLAlchemy models (BloomCard)
β β βββ ingestion/ # Implemented OWID + Are.na connectors
β β βββ curation/ # Bloom algorithm (serendipity)
β β βββ analysis/ # NLP models (SBERT, BiasBERT)
β β βββ api/ # REST endpoints
β β βββ core/ # Database, config
β βββ alembic/ # Database migrations
β βββ tests/ # Pytest tests
β βββ Dockerfile
β βββ pyproject.toml # Poetry dependencies
β βββ README.md
β
βββ π¨ frontend/ # Flutter/Dart
β βββ lib/
β β βββ models/ # Dart data models (BloomCard, Feed)
β β βββ screens/ # Feed screen, settings
β β βββ widgets/ # Cards, perspective overlay, completion
β β βββ providers/ # Riverpod state management
β β βββ services/ # API client, storage
β β βββ theme/ # Design tokens (colors, typography)
β βββ assets/ # Images, icons
β βββ test/ # Flutter tests
β βββ pubspec.yaml # Dependencies
β βββ README.md
β
βββ ποΈ infrastructure/ # Local Docker Compose stacks
β βββ docker-compose.dev.yml # Postgres + Redis for host-run backend
β βββ docker-compose.yml # Full local stack
β
βββ docker-compose.yml # Legacy root Compose file; see docs/CURRENT_STATE.md
βββ README.md # This file
"Paper & Ink" - The UI feels like a printed Sunday newspaper, not a software application.
- High Contrast: Black ink (
#1A1A1A) on warm paper (#FDFCF8) - No Shadows: Use borders and whitespace for hierarchy
- Data First: Charts are the "hero" images, not decorations
- Botanical Colors: Growth green (
#2D6A4F) for positive trends
See DESIGN_SYSTEM.md for complete specifications.
Six content types blended into unified BloomCard format:
| Type | Source | Purpose |
|---|---|---|
| π Data | Our World in Data | Statistical truth, macro trends |
| π¬ Science | OpenAlex | Frontier research, academic papers |
| π¨ Aesthetic | Are.na / CARI | Visual culture, design inspiration |
| π Indie Web | Neocities | Human-made web, small internet |
| π Narrative | TVTropes | Story patterns, cultural analysis |
| π Education | My-MOOC | Free courses, skill building |
cd backend
# Install dependencies (Poetry)
poetry install
# Run tests
poetry run pytest
# Code quality
poetry run black .
poetry run ruff check .
poetry run mypy . --ignore-missing-imports
# Database migrations
poetry run alembic revision --autogenerate -m "Description"
poetry run alembic upgrade head
# Start dev server
poetry run uvicorn app.main:app --reloadcd frontend
# Install dependencies
flutter pub get
# Generate code (Riverpod, JSON serialization)
flutter pub run build_runner build --delete-conflicting-outputs
# Run tests
flutter test
# Static analysis
flutter analyze --no-fatal-infos
# Build for release
flutter build web --release --dart-define=API_BASE_URL=http://localhost:8000- ARCHITECTURE.md - Technical deep dive (Root System, Perspective Engine, Bloom Logic)
- DESIGN_SYSTEM.md - "Paper & Ink" design tokens and guidelines
- ROADMAP.md - Story tracking (STORY-001 to STORY-007)
- CURRENT_STATE.md - Evidence-backed implementation and production state
- STABILITY_SESSION_2026-05-28.md - 2026-05-28 stabilization session wrap-up
- Product Brief - Core concept and differentiators
- PRD - Detailed product requirements
- STORY-004 - Serendipity algorithm & vector search
- STORY-006 - Perspective overlay & 3D flip animation
- STORY-007 - Finite feed & completion widget
Version: 0.1.0 Phase: Production alpha / stabilization Last Updated: 2026-05-28
- β STORY-001: Infrastructure & OWID Ingestion
- β STORY-002: Flutter Scaffold & Charting
- β STORY-003: Aesthetics & Masonry Grid
- β STORY-004: Vector Serendipity & Bias Engine
- β STORY-006: Perspective Overlay & Flip Animation
- β STORY-007: Finite Feed & Completion Widget
- β STORY-005 backend repair: Poison pill and feed tests now target current modules/endpoints.
- β
Production docs exposure:
/docsand/openapi.jsonare hidden onapi.almanac.solarby the production environment gate and covered byscripts/prod-smoke.sh. - β Auth hardening: Janua RS256/JWKS verification is implemented with issuer and optional audience checks.
- β OpenAlex ingestion: Science cards now have a repo-owned connector and API endpoints.
- β
Control-plane observability release: Enclii CLI
v1.0.0-alpha.1reports runtime health correctly from the distributed GitHub release artifact. - β
Backend dependency determinism:
backend/poetry.lockis committed, CPU-only ML wheels are pinned separately for Docker, and lockfile guard tests prevent CUDA drift. - π Next stability priority: frontend E2E/stress coverage, production observability, and load/soak testing.
See ROADMAP.md for detailed tracking.
- Finite Feeds: Respect user time with definitive endpoints
- Serendipity: High-value outliers over echo chambers
- Transparency: Show data provenance and bias scores
- Privacy: No tracking sold to third parties
Proprietary - Bloom Scroll Team
Built with intention. Consumed with mindfulness. πΈ