A research-to-composition web app that ingests sources + Notion notes, extracts structured musical/physics/math concepts and compositional parameters, generates weekly narrative briefs with actionable hypotheses/recipes, and tracks compositions + subjective listening feedback.
- Ingest (Notion tag + manual URL/PDF/YouTube + RSS)
- Extract (AI-assisted summaries, claims, parameters, citations)
- Synthesize (connections + hypotheses)
- Output (weekly narrative brief + compositional recipes)
- Execute (compose + publish updates)
- Evaluate (subjective listening sessions)
- Iterate (revise hypotheses/recipes)
- Owner/Admin: Keith (full access)
- Collaborators (1–2): can add feedback, comments, maybe draft hypotheses
- Followers: login-required access to the app to follow, subscribe, comment, and view public research
- No medical claims; no measurement devices/HRV/EEG
- No advanced knowledge-graph visualization required
- No bidirectional Notion sync (Notion is input source of truth for notes)
- Notion: single
Notesdatabase + generic tags; create a dedicated tag to isolate project items. - Files: no PDFs in GitHub; PDF uploads use Convex file storage, referenced by
sources.pdfStorageId. Lab Firecrawl extracts their text; see PDF capture for admission limits and operator enablement. - Weekly output: doc-style narrative brief.
- Feedback: purely subjective (for now).
- Public + login: public-facing app content is readable after login; some content may be truly public later.
resonantprojects.art(Astro): static “why”, curated posts, selected published findingsapp.resonantprojects.art(SolidJS): dashboard, ingestion, briefs, hypotheses/recipes, compositions, feedback- Convex backend: data + actions + scheduled jobs
- Scheduling: Convex crons (feed polling every 6h, batch extraction every 8h, weekly briefs) — see
convex/crons.ts. - Operator extraction:
scripts/operator-extraction.tsexportstext_readySources in chunks using the sharedextract_v3prompt inconvex/shared/extractionPrompt.ts. The operator writes the JSON and imports it throughextract.storeOperatorExtraction, retaining the selected producer model (Opus by default; use the registered--modeloverride for another producer). The CLI contacts the deployed backend and pins durable snapshots; it does not invoke the worker or a model provider.
- Install dependencies:
vp installcd web && vp install
- Set web env:
- Create
web/.env.localand setVITE_CONVEX_URL,VITE_CLERK_PUBLISHABLE_KEY,VITE_CLERK_SIGN_IN_URL, andVITE_CLERK_SIGN_UP_URL.
- Create
- Run web app:
cd web && vp run dev
- The backend is self-hosted. Copy
.env.exampleto.env.local; scripts load it viavarlock/auto-load(imported at the top of each env-reading script); Node does not auto-load.envfiles. - Caution:
vpx convex dev,vpx convex codegen, andvpx convex deploytalk to the live backend. - Deploy with
vp run convex:deploy(orvp run convex:deploy:dry-run, which still uploads and prepares schema). It typechecks, refuses uncommitted changes and.env/.env.localfiles in the release checkout, pins the target tohttps://convex.resonantprojects.art, resolves the admin key through Varlock, and asks you to typedeploybefore it runs the audited CLI per the CLI contract. - The operator evidence scripts use inherited administrative credentials only; their environment-loading exception is documented in AGENTS.md.
- For CLI mutation auth, see Guardrails in AGENTS.md.
- For parked concept classifications and explicit retries, see Concept classification.
- See
agent/README.mdfor workspace setup. - The production worker uses
agent/docker-compose.ymland the Proxmox agent deployment guide. - External agents use the Agent-Tool HTTP surface.
Full verification needs dependencies in all four packages: run vp install in the root, web/, agent/, and media/. These are separate packages; a root install alone does not install their dependencies.
- Convex:
vp test convex - Web:
vp run typecheck:webandvp run build:web - Agent:
cd agent && vp run verify && vp test - Everything at once:
vp run verify. - Commits run a pre-commit hook that blocks files over 5,000 estimated tokens (20,000 bytes);
vp installenables it. See the token-limit guardrail inAGENTS.md.
- Renovate
updates dependencies and lockfiles for the root,
web/,agent/, andmedia/Bun packages, plus Docker base images. Its policy lives inrenovate.json. - The Dependency Dashboard issue lists pending updates. Major upgrades need approval there before Renovate opens a PR. All updates require a manual merge after reviewing the diff and CI results.
- Renovate waits three days after a release, opens at most five concurrent PRs and two PRs per hour, and refreshes lockfiles on Monday between 3am and 6am America/New_York. Convex dependencies and Vite Plus packages have dedicated groups. Docker images retain their digest pins.
- Bun runtime upgrades remain manual. Update the package-manager declarations
in all four packages,
bun-versionin GitHub workflows, andBUN_VERSIONin both Dockerfiles together. Refresh all four lockfiles and runvp run verify. - Dependabot continues to own GitHub Actions updates in
.github/dependabot.yml. Renovate's enabled managers exclude GitHub Actions to avoid duplicate PRs.scripts/archive/is excluded from Renovate updates.
/Zodiac 3D knowledge navigation (live Convex pipeline + sector metrics)/ingestmanual URL/YouTube ingest + extraction trigger/displayinbox triage and source review actions/hypotheseshypothesis drafting and source-citation selection/recipesmanual/auto recipe generation/weekly-turnsweekly brief generation and publish flow/compositionscomposition lifecycle tracking/feedbacklistening session capture and ratings/adminfeed controls + operational overrides