pnpm + Turborepo social / advocacy platform. One Next.js 15 + Convex app serving three brands β redwaveplan.com (social network), DemHistory.org and PrimaryPlan.org (landing brands) β with legacy-forum imports, versioned AI research reports, and per-section discussion.
Live on Vercelredwaveplan.com DNS still on legacy server
| Repo | microspaces/redwave (scaffolded from LinkAll8) |
|---|---|
| Local | C:/Users/AI/Repos/redwave |
| Owner agent | redwaveplandev |
| Backend | Convex deployment fabulous-eel-831 (NEXT_PUBLIC_CONVEX_URL in apps/redwave-web/.env.local) |
| Deploy | Vercel git integration β push to main auto-deploys (verified 2026-09-11) |
| Brand | Domain | Serves | Status |
|---|---|---|---|
| Red Wave Plan | redwaveplan.com | The social app at / | β οΈ DNS β legacy ASP.NET box (208.98.35.66); move to Vercel (A 76.76.21.21 / CNAME cname.vercel-dns.com) |
| DemHistory | demhistory.org | /demhistory landing (host rewrite) | β Live on Vercel |
| Primary Plan | primaryplan.org | /primaryplan landing (host rewrite) | β Live on Vercel |
max-w-[1265px] container, Twitter/X-style, with sticky sidebars.public, private, state hub, county hub) replacing the legacy Ξ©-prefixed geographic groups. Join / leave / favorite, member counts, group icons (photoUrl, imported via the groups:setPhotoUrls admin mutation; default-image fallback), and a brand-tinted header card distinct from post cards.groups:ensureMembership).isSolution marking; general (unfiled) group discussion collapses under the reports.--color-brand: #dc2626 red, navy accent) declared once per app in app/globals.css @theme, kept in sync with @redwave/brands.Each issue group gets dated, versioned research reports. Every generation run creates a new version β nothing is overwritten β so discussion attached to earlier versions stays readable.
convex/crons.ts β reports:generateAll.trigger: "admin").key, e.g. mail-in-ballots) so discussion on one slice of the issue follows from report to report across versions."digest" for the no-LLM fallback (convex/lib/researcher.ts).generating β published / failed with the error stored; failed runs never clobber the last good report./groups/[id]/reports/[reportId]).<header> full-width, sticky
<div class="mx-auto max-w-[1265px] flex"> β the whole shell centers like Twitter/X
LeftSidebar (sticky, w-16 β md:w-52)
center column (main + footer, min-w-0 flex-1)
RightSidebar (sticky, w-52, β₯790px only)
</div>
sticky on the centered container, no longer fixed to the viewport edges β no more dead space on wide monitors.bg-brand-light + brand top strip + border-brand/25 so it reads as a header, not another post card.middleware.ts rewrites / β /demhistory or /primaryplan based on the Host header (same pattern as the LinkAll8 locos); redwaveplan.com serves /.vercel.json mirrors the same host rewrites at the edge.Plain Vercel git integration: push to main β Vercel builds with installCommand: cd ../.. && pnpm install --frozen-lockfile and buildCommand: pnpm --filter redwave-web build. No GitHub Actions matrix (unlike aroundtown) β the repo is linked to the redwave-web Vercel project.
fabulous-eel-831. Don't push a schema that drops tables without a reviewed, intentional change (noted in schema.ts).pnpm install
pnpm dev:redwave # Next.js app (apps/redwave-web)
pnpm backend # Convex dev (packages/backend)
pnpm --filter @redwave/ui typecheck
pnpm --filter redwave-web build
| Monorepo | pnpm 9.15.0 workspaces + Turbo 2.x, root name redwave-platform |
|---|---|
| App | apps/redwave-web β Next.js 15.5 App Router, thin pages that import components from @redwave/ui |
| UI kit | packages/ui (@redwave/ui) β app shell, groups, feed, reports, resources, people, theme, avatar |
| Backend | packages/backend β Convex functions + schema (users, groups, groupMembers, reports, reportSections, posts, postVotes, notifications, resources + Convex Auth tables) |
| Brands | packages/brands (@redwave/brands) β per-brand labels / nav / feature flags consumed via useBrand() |
| Styling | Tailwind CSS v4 (@import "tailwindcss", @theme brand tokens, @source scanning packages/ui) |
| Auth | @convex-dev/auth + Next.js middleware route matcher |
| Vercel | framework nextjs, monorepo-aware install/build commands (see apps/redwave-web/vercel.json) |
| Legacy lineage | Schema mirrors the old ASP.NET tables β AspNetUsers β users (with legacyId), Group β groups (leftmenu Top/Hot buckets), Comment β posts β so the imported data keeps its shape |
apps/redwave-web/
app/ # (brand) landings + (social) routes, middleware.ts
vercel.json # host rewrites + monorepo build commands
packages/
ui/ # @redwave/ui components (social-shell, groups, reportsβ¦)
backend/convex/ # schema.ts, groups.ts, reports.ts, posts.ts, crons.tsβ¦
brands/ # per-brand config
Live roadmap, managed as GitHub issues (redwave issues). Add or close items on GitHub β β = done, close as βnot plannedβ to remove.
2026-09-11 β icon + Twitter-style layout shipped
5fca9f8 β group icon in the detail-page heading (48px) and on groups-index cards (40px); typecheck + production build pass.df1e7bb β centered max-w-[1265px] shell, sticky sidebars, sticky members column, brand-tinted group header (Grok CLI implemented; reviewed, verified, shipped). Typecheck + build pass; live CSS probe confirmed the new shell styles are served in production.c41254e β group detail made single-column: members list flows full-width below the discussion instead of a right-hand column.18d2e02 β report restructure: compact clickable report tile on the group page (headline + section titles + comment counts); full report and per-section discussion moved to the detail page. Typecheck + build pass; pushed and deployed.start β publish, 7 sections incl. mail ballots, machines/audits, litigation tracker, take-action) as the format template; the empty cron digest is preserved as v1.demhistory.org + primaryplan.org β HTTP 200 on Vercel (Next.js); /groups β 200. Headless-Edge screenshot of the landing rendered fully; the groups page stays on its client-side Loadingβ¦ state in headless captures because Convex uses WebSockets β verified in-browser instead.redwaveplan.com β 302 to /Account/Login on Kestrel/ASP.NET β legacy box still owns the DNS (see roadmap).