Signal OS — project story

Category: Money & Financial Access
Product: https://signalos-web-e56u5ls3va-uc.a.run.app
Demo (no login): https://signalos-web-e56u5ls3va-uc.a.run.app/v3/demo
API (Google Cloud Run): https://signalos-api-44759222735.us-central1.run.app/health


Inspiration

I kept seeing the same gap: people already own stocks, but they do not have a research desk. They open a brokerage app, scroll headlines, and try to decide whether yesterday’s move was noise or a real change in the story. Professional investors pay for overnight briefs. Retail holders get a price chart and a comment section.

That is a financial access problem, not a trading-alpha problem. Access is not only “can you open an account?” It is “can you understand what you already hold before the market opens?”

Signal OS started as a paper-trading signal dashboard and became something more useful: a portfolio-first research brief. Upload the names you own (CSV or a read-only brokerage link). Six AI agents—news, macro, fundamentals, technicals, risk, and fusion—produce a 1-day, 5-day, and 20-day directional bias, a confidence band, risk flags, and a “what changed since yesterday” headline. We never tell you to buy or sell. The product is research, not advice.

The inspiration was selfish and then general: I wanted the brief I could not afford, then I wanted that brief to exist for educators, investment clubs, and long-term holders who spend an hour every morning reconstructing the same mosaic by hand.

What I learned

I learned that agents only matter if they decide something in production. A Gemini API key in a local .env is a prototype. A Cloud Run worker claiming evaluation_jobs, writing position_evaluations, and showing a fusion verdict on a public URL is a business.

I learned that fusion is the product. Five specialist agents will disagree. The fusion layer has to turn that disagreement into a label a human can scan in ten seconds: constructive, neutral, or cautious, with a confidence $c \in [0,1]$ on each horizon $h \in {1\text{d}, 5\text{d}, 20\text{d}}$. Attention ranking is similarly simple on purpose: a score $A$ that surfaces the names that moved, not the names that were loud.

I learned that entitlements are part of the story. Live agents belong on paid plans; free users get a demo and fallback. Pretending otherwise would be dishonest to judges and dangerous for API cost. I also learned that “research not advice” has to be in the UI, the video, and the narrative—because the first instinct of anyone watching a stock product is to hear a trade.

I learned operations: IAM on new Google Cloud projects, Cloud Build service accounts that cannot push images, Cloud Run containers that die if DATABASE_URL is truncated at the = in a password, and TypeScript that is green in dev but red in next build. None of that is the pitch. All of it is how a 90-day AI business actually ships.

How we built it

Humans deploy, bill, comply, and support. AI agents write the research.

The stack is a monorepo:

  • apps/agents — six Gemini/ADK-style agents plus fusion
  • apps/api — FastAPI, Postgres, job queue, Stripe webhooks, cron HTTP endpoints
  • apps/web — Next.js dashboard, onboarding, /v3/demo

Locally we run ./signal start (Docker Postgres, migrations, API, web). In production the same API image runs on Google Cloud Run. Cloud Scheduler POSTs to /internal/cron/nightly-enqueue and /internal/cron/worker so evaluations happen without a laptop. Logs go to Cloud Logging. Postgres is managed (Supabase) with Alembic migrations on container start.

Day-to-day AI operations:

  1. Scheduler enqueues nightly jobs for active portfolios.
  2. The worker claims a job and runs specialists, then fusion.
  3. Results persist as snapshot + per-position evaluations (bias, confidence, card summary, risk flags).
  4. A morning digest is rendered from that JSON when the user’s local hour matches.

Jobs beyond the founding team: retail holders who want a daily check without a Bloomberg; long-term holders tracking thesis drift; educators and clubs who need a consistent 10–50 name format before a meeting. Paid tiers (Personal / Investor) unlock live agents, refreshes, and email—so a club organizer can replace an hour of headline scanning with a brief.

We built a large share of the orchestration and UI with AI coding tools. Production evaluations are not a founder editing rows. They are the deployed pipeline.

Challenges we faced

Scope vs. eligibility. The original spec wanted waitlists, many paid users, and Vertex. The gate is smaller and harder: one Google Cloud product in production, agents that actually decide, one real dollar, one named customer, logs, video, P&L. We cut trading, new brokers as a blocker, and “more agents” in favor of Cloud Run + Scheduler + one live eval.

Not silently faking intelligence. Early designs wanted heuristic fallbacks when the LLM failed. That would have made a pretty dashboard and a disqualifying story. We fail positions loudly, mark snapshots partial, and keep free-tier fallbacks honest.

Production on Google Cloud. Enabling APIs was easy. IAM was not: Cloud Build could not read its own tarball; the default compute service account could not push to Artifact Registry or write logs. The first Cloud Run revision never listened on port 8000 because DATABASE_URL special characters (#, =) broke --set-env-vars. We switched to --env-vars-file, forced sslmode=require for Supabase, and added a web-only deploy after empty Stripe substitution values killed the frontend Cloud Build. A TypeScript disabled={synced} bug (boolean | "") failed next build only in CI.

Compliance and copy. Every screen wants to say “buy.” We say bias, risk, and research. That constraint made the product clearer.

Market data. yfinance is prototype-grade. Partial books are normal. We show that instead of inventing prices.

The remaining work is operational, not architectural: live Stripe webhook + one charge, one external customer on the public URL, a timestamped Cloud Logging screenshot, a three-minute video, and a P&L with a marketing line even if it is $\$0$.

Signal OS is the brief I wished existed: AI agents, on Google Cloud, on the holdings you already own.

Built With

Share this project:

Updates