feat: Hub overnight feed, expandable findings, and project task board

Hub Overnight Feed, Expandable Findings, and Project Task Board

Overview

Redesign the Sendy HQ hub (apps/hub/) to be a daily command center focused on overnight agent work. The homepage becomes a feed of recent overnight sessions showing summarized prompts and key findings, with expandable sections to dig deeper into each session’s branches, questions, and trace. Add a project sidebar/section linking to all ventures, and an “Up Next” task board aggregating suggested next steps from overnight reports and docs.

Deploy to a public Cloudflare Pages URL (hub.pages.dev) — already handled by the existing CI workflow.

Problem Statement / Motivation

The hub was scaffolded as a generic activity feed mixing blog posts, docs, and overnight reports equally. But the primary use case is: wake up in the morning, see what the agent did overnight, decide what to work on today, and share progress with Lana. The current design doesn’t prioritize this workflow — overnight reports are buried alongside docs, there’s no way to expand into findings without navigating to a separate page, and there’s no task board to guide daily work.

Proposed Solution

Page Structure

/ (Home) — Overnight Feed + Up Next

The homepage has two main sections:

  1. Overnight Sessions Feed (primary, ~70% of page)

    • Each session is a card showing:
      • Date, mode badge (research/build), status badge
      • The original prompt/task from CLAUDE.md
      • Executive summary (first 2-3 paragraphs of report.md)
      • Stats row: branches explored, questions answered/open, estimated tokens
      • Expandable sections (collapsed by default, pure HTML <details>):
        • Findings — each branch as a sub-card with title + first paragraph, linking to full finding
        • Questions — open questions (highlighted) + answered questions (muted)
        • Trace — chronological action log
        • Full Report — complete rendered markdown
    • Sessions sorted newest first, paginated or lazy-loaded if >10
  2. Up Next (sidebar on desktop, below feed on mobile)

    • Aggregated “Suggested Next Directions” sections from overnight reports
    • Each item shows: task description, source session, related project
    • Items grouped by project when possible
    • Manual entries supported via a simple apps/hub/src/content/tasks/ collection

/projects (replaces /businesses)

  • Same grid of all ventures but renamed to “Projects” for internal clarity
  • Each card links to the live site AND shows recent activity count (blog posts, overnight sessions mentioning this project)

/overnight/[slug] — Full Report Page (keep existing, improve styling)

  • Full rendered report with table of contents
  • Links back to feed

/docs and /docs/[slug] — Keep as-is, accessible from nav

Data Model Changes

Enhanced Overnight Content Schema:

// apps/hub/src/content.config.ts
const overnight = defineCollection({
  loader: glob({ pattern: '**/*.md', base: './src/content/overnight' }),
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    mode: z.enum(['research', 'build']).default('research'),
    status: z.enum(['complete', 'partial', 'failed']).default('complete'),
    topic: z.string().optional(),
    task: z.string().optional(),         // original prompt from CLAUDE.md
    branches: z.number().optional(),     // count of exploration branches
    questionsOpen: z.number().optional(),
    questionsAnswered: z.number().optional(),
    nextSteps: z.array(z.string()).default([]),  // suggested next directions
    relatedProjects: z.array(z.string()).default([]), // project slugs
  }),
});

// New: tasks collection for Up Next board
const tasks = defineCollection({
  loader: glob({ pattern: '**/*.md', base: './src/content/tasks' }),
  schema: z.object({
    title: z.string(),
    project: z.string().optional(),      // project slug
    source: z.string().optional(),       // overnight session slug
    priority: z.enum(['high', 'medium', 'low']).default('medium'),
    done: z.boolean().default(false),
  }),
});

Enhanced Sync Script (scripts/sync-overnight.sh):

The sync script needs to extract richer data from overnight workspaces:

  • Parse CLAUDE.md for the original task/prompt
  • Count findings in findings/ directory
  • Parse questions.md for open vs answered counts
  • Extract “Suggested Next Directions” section from report.md into frontmatter nextSteps array
  • Detect related projects by matching business slugs in report text
  • Include individual findings as sub-sections in the synced markdown (or as separate files)

Sync Script Enrichment

# Current: just copies report.md with minimal frontmatter
# Proposed: builds a rich composite document

# For each completed run:
# 1. Extract task from CLAUDE.md (everything after first heading)
# 2. Count findings/*.md files
# 3. Parse questions.md: count [ANSWERED] vs total
# 4. Extract "Suggested Next Directions" from report.md → nextSteps array
# 5. Scan report for business slugs → relatedProjects
# 6. Composite output:
#    - Frontmatter with all extracted metadata
#    - Full report.md content
#    - --- separator ---
#    - Each finding appended as ## Finding: <title>
#    - Questions section
#    - Trace section

UI Components

New Astro components in apps/hub/src/components/:

ComponentPurpose
OvernightCard.astroSingle session card with expandable sections
FindingsList.astroRenders branch findings with summaries
QuestionsList.astroOpen/answered questions with visual indicators
UpNextBoard.astroTask board grouped by project
ProjectCard.astroProject link card with activity badge
StatsBadge.astroSmall stat indicator (branches, questions, etc.)

All components use var(--brand-*) CSS tokens and <details> for expand/collapse (no JS needed).

Sendy HQ    [Feed]  [Projects]  [Overnight]  [Docs]
  • Feed = / (default, overnight-focused)
  • Projects = /projects (renamed from Businesses)
  • Overnight = /overnight (full archive)
  • Docs = /docs

Technical Considerations

Static Site / No JS Required:

  • All expand/collapse uses native <details> + <summary> HTML elements
  • Styled with Tailwind’s open: variant for smooth transitions
  • Zero client-side JavaScript needed

Build-Time Aggregation:

  • aggregate.ts already scans filesystem at build time — extend for richer overnight data
  • The tasks collection is a simple markdown directory, manually curated or auto-generated by sync

Sync Script is the Bridge:

  • The sync script is the single point where overnight workspace data enters the repo
  • Enriching it means the Astro site stays simple (just reads frontmatter)
  • Idempotent: re-running skips already-synced sessions

Deployment:

  • Already works: hub deploys to hub.pages.dev via existing GitHub Actions
  • No workflow changes needed
  • Public URL is available immediately after first push

Acceptance Criteria

  • Homepage shows overnight sessions as expandable cards with task, summary, stats
  • Each card expands to show findings, questions, trace, and full report
  • “Up Next” section aggregates next steps from overnight reports
  • /projects page lists all ventures with live site links
  • Sync script extracts task, branches, questions, next steps from overnight workspaces
  • <details> expand/collapse works without JavaScript
  • Site builds successfully and deploys to hub.pages.dev
  • Navigation updated: Feed, Projects, Overnight, Docs

Implementation Phases

Phase 1: Enhanced Sync Script

  • Update scripts/sync-overnight.sh to extract rich metadata
  • Add composite document format (report + findings + questions + trace)
  • Create apps/hub/src/content/tasks/ directory
  • Files: scripts/sync-overnight.sh

Phase 2: Content Schema + Components

  • Update apps/hub/src/content.config.ts with enhanced schema + tasks collection
  • Create OvernightCard.astro, FindingsList.astro, QuestionsList.astro, UpNextBoard.astro
  • Files: apps/hub/src/content.config.ts, apps/hub/src/components/*.astro

Phase 3: Pages

  • Redesign / (index.astro) with overnight feed + Up Next sidebar
  • Rename /businesses/projects with activity badges
  • Update HubLayout.astro nav links
  • Files: apps/hub/src/pages/index.astro, apps/hub/src/pages/projects.astro, apps/hub/src/layouts/HubLayout.astro

Phase 4: Polish

  • Style <details> expand/collapse with Tailwind open: variants
  • Add empty states for when no overnight sessions exist yet
  • Verify build + preview
  • Files: apps/hub/src/styles/brand.css

Success Metrics

  • Morning workflow: open hub → see overnight work → expand interesting findings → check Up Next → start working (under 2 minutes)
  • Lana can browse the hub and understand what’s been happening without any technical context
  • All content auto-publishes when pushed to main

Dependencies & Risks

  • No overnight runs yet: The ~/overnight-runs/ directory is empty. Need to run at least one overnight session to generate real data. Can create sample content for development.
  • Sync is manual: User must run sync-overnight.sh and commit. Could be automated with a pre-build hook or GitHub Action, but manual is fine for now.
  • Report format may vary: Early overnight reports may not have consistent “Suggested Next Directions” sections. Sync script should handle missing sections gracefully.

Sources & References

  • Existing hub site: apps/hub/src/ (all files)
  • Overnight skill: .claude/skills/overnight/SKILL.md (report format, findings structure)
  • Dashboard data model: scripts/overnight-dashboard.py (status JSON with findings, questions, branches)
  • UI token conventions: docs/solutions/ui-patterns/astro-page-brand-token-consistency.md
  • Deployment: .github/workflows/deploy.yml (auto-deploy to Cloudflare Pages)