Skip to content

JARVIS

A private workspace that finds freelance work and prepares proposals with AI, and never sends anything without my decision.

Kind
Independent product
What it is
AI workflow and business software
My role
Independent product · design, engineering, AI
Period
Oct 2026 – present
Discuss a similar projectSource code is private
The JARVIS Command Center on a dark background: a left sidebar of destinations, a large “6 applications need your decision” card with an Open applications button, and counts of proposals and pipeline runs waiting for review.
The JARVIS Command Center on a phone: a header marked Demo data, the 6 applications need your decision card and a bottom tab bar with Today, Leads, Studio, Applied and More.
Demonstration data · 20 Oct 2026Command Center: it leads with the one thing that needs a person. Fictional demonstration data.Phone · Demonstration data · 20 Oct 2026The same screen on a phone, with its own thumb-reach navigation. Demonstration data.

The idea

JARVIS is the tool I built to run my own acquisition work: finding freelance and remote opportunities, checking they are real, pricing them, drafting proposals and tracking outcomes. AI prepares the paperwork. Deterministic rules decide what is allowed. I decide what is sent, and the app has no way to send anything itself. It is deployed on Vercel with a Supabase PostgreSQL database and private owner sign-in. The dashboard is not public, so this page shows its real screens rendered from fictional demonstration data.

Who it's for
One person: me, as an independent developer finding client work. It is not a public product.
The problem
Finding good projects means checking many boards daily, confirming listings are genuine and still open, pricing the work and writing a proposal that does not over-promise. Autopilot AI writing tools are fast, but they invent claims and send messages nobody reviewed.

What I built

I designed and built JARVIS end to end: data model, discovery and scoring, the proposal pipeline and its safety rules, the AI router, the interface, the tests and the cloud deployment. I built it with Claude Code as an AI coding assistant, under my direction and review. The source code is private, so there is no repository link.

  • Designed and built the product end to end: Next.js 16 and React 19 interface, a repository layer over SQLite and PostgreSQL, 19 schema migrations, and a cloud deployment on Vercel and Supabase.
  • Built a staged proposal pipeline in which AI is used for exactly two things, the draft and one advisory review, while eligibility, requirements, pricing and claim checks are deterministic.
  • Wrote 596 unit tests and 600 end-to-end checks across four viewports, plus a live security regression suite that runs against the deployed application.

What it does

Each feature is verified in the source code. The label says whether it is on the production branch or still in staging.

  • Discovery from eleven sources, split by market

    In production

    Hacker News freelance threads, Freelancer.com (ten searches for websites, SaaS, dashboards and CRMs, AI agents, automation and e-commerce), Remote OK, Remotive, Jobicy, We Work Remotely, Himalayas, company boards on Greenhouse, Lever and Ashby, and Contra's job board through its official integration, imported on demand. India briefs (INR budgets) and international briefs (USD, GBP, EUR, AED and similar) are kept apart, each with its own pricing and screening floors, and the two filters combine with Freelance and Remote employment. A lead counts as verified only if it was seen open in the last three days; unverified leads are counted apart, never hidden.

  • Proposal Studio and founder approval

    In production

    Each draft shows its checks and an independent advisory review. Approval is a separate human step, and an approved document is not a submitted application: submission needs recorded evidence and a time.

  • Multi-provider AI routing

    In production

    A router picks among Gemini, Groq and Ollama Cloud per task, skipping models that are unhealthy, over quota, unaffordable or not benchmark-approved for client-facing writing. The daily spend cap defaults to zero.

  • Background work without a laptop

    In production

    A Postgres job queue with idempotency keys, leases, back-off and dead-lettering, driven by a signed request the database scheduler makes every five minutes.

  • Tracking and analytics

    In production

    Applications from first contact to a recorded outcome, a read-only Gmail inbox that classifies replies, prospecting, and analytics that show a rate only when there is enough data behind it.

  • Source performance

    In production

    A Sources view reports, for every source, Found, Active, Eligible, Qualified, Drafted, Applied, Replied and Won, with freelance briefs, employment roles and speculative prospects kept apart, the last successful sync, and the error of any source that is failing. Budgets are only those a source disclosed.

The experience

Real screens of the running application, rendered on a fictional demonstration dataset. It is deployed behind owner-only sign-in, so the dashboard itself is not public.

Freelance client opportunities as cards, each with a score ring, a client budget, a quoted price and tags for verification state, with Review draft and Source buttons.
Demonstration data · 20 Oct 2026Opportunities: scored leads with budget, quote and verification state. Fictional listings, demonstration data.
The Freelance clients page with the India market selected: a Freelance clients and Remote employment control above an All markets, India and International control, a note on how India briefs are identified, and cards with INR budgets and an India tag.
Demonstration data · 20 Oct 2026India and International are chosen independently of Freelance and Remote employment, and the choice is remembered. Fictional demonstration data.
The Analytics Sources view: for each source a row of counts from Found, Active, Eligible and Qualified to Drafted, Applied, Replied and Won, with freelance briefs and remote employment roles in separate sections.
Demonstration data · 20 Oct 2026Source performance: where briefs come from and how far each source gets. Fictional demonstration data, so the outcomes shown are not real.
Proposal Studio for a fictional WordPress migration lead: a five-step progress line from Draft to Submission tracking, Approve and Run checks buttons, and an editable proposal beside an Approval checks panel.
Demonstration data · 20 Oct 2026Proposal Studio: draft, validate, review, founder approval, then tracking. Demonstration data.
An AI pipeline run page titled Booking portal rebuild, marked Awaiting your approval, with token and latency figures and specialist stages Scout, Researcher and Pricing marked Done.
Demonstration data · 20 Oct 2026A pipeline run: each specialist stage, what it used, and the next permitted action. Demonstration data.
The AI health page showing connected models, requests left today, a zero paid spend, routing and fallback order for client proposals, and daily budget limits.
Demonstration data · 20 Oct 2026AI health: the router's real state, routing order and spend caps. Demonstration data with real benchmark results.
The Applications page with a funnel of counts from Discovered to Won and a Needs you list of applications that need evidence, a contract value or a reply classification.
Demonstration data · 20 Oct 2026Applications: a step counts only when there is a record behind it. Demonstration data.
The Analytics page in the light theme: a freelance acquisition funnel of horizontal bars from project briefs found to contracts won, with notes where there is too little data to rate.
Demonstration data · 20 Oct 2026Analytics, light theme: rates appear only when there is enough data behind them. Demonstration data.

The engineering

How it is put together, and the problems that took the most care.

One application over one repository layer that runs on SQLite locally and PostgreSQL in the cloud. A job queue does the scheduled work. Every AI call goes through a router that enforces health, quota, privacy and budget rules.

  1. Interface

    Next.js server components stream the page shell; a per-request Content-Security-Policy nonce and a Host/Origin guard protect every route.

  2. Data

    A repository layer with a SQL translation and a synchronous worker bridge so the same code and tests run on SQLite and Postgres.

  3. Workers

    pg_cron posts an HMAC-signed request to a Vercel function that claims jobs from the queue.

  4. Security and backups

    Single-owner sign-in with MFA, row-level security on every table, public API keys denied, and encrypted (AES-256-GCM) self-verifying backups with a restore drill.

Technology

Interface
  • Next.js 16
  • React 19
  • TypeScript
  • Tailwind CSS 4
Data
  • SQLite (local)
  • PostgreSQL on Supabase (cloud)
  • 19 migrations
  • PGlite in tests
Hosting
  • Vercel
  • Supabase Auth with MFA
  • Row-level security
  • pg_cron
  • pg_net
AI
  • Google Gemini
  • Groq
  • Ollama Cloud
  • Zod-validated structured output
Quality
  • Vitest
  • Playwright
  • axe accessibility checks
  • Secret scan
  • Live security regression

Hard problems, and how I solved them

  1. Making AI output safe to rely on

    Problem
    A fluent proposal can promise experience that was never there, and a model can be talked into approving it.
    Approach
    Every sentence is classified by deterministic code as verified experience, proposed approach, assumption or unsupported, and unsupported claims block approval. Only models that pass a benchmark may write client-facing text, and the AI reviewer can add concerns but can never lift a blocker.
  2. Finding my own security hole before anyone else did

    Problem
    Validating the cloud staging site showed that the database's public Data API let anyone holding the project's public key read and write every table, and that scheduled jobs were being refused (63 of 63 returned 401).
    Approach
    I turned on row-level security, revoked the public grants and added a trigger for future tables, then wrote a live regression check: 14 read and write attempts with both public keys are now denied. The scheduler now calls the public address and the ticks return 200.
  3. One app on two databases

    Problem
    JARVIS started on SQLite. The cloud needed PostgreSQL without forking the code or losing the test suite.
    Approach
    A translation layer and synchronous worker bridge sit behind one repository interface, the same suites run on PGlite, and a reconciliation script compares row counts and checksums per table. A cloud backup of 27 tables and 809 rows restored into a scratch schema and matched every table.
  4. Finding client briefs beyond one marketplace

    Problem
    Only two sources could ever produce a client brief, and Freelancer.com supplied 70 of the 71 freelance briefs in the hosted database. Every employment board lists vacancies, not briefs.
    Approach
    I widened Freelancer.com to ten target searches (65 to 234 stored briefs in a live benchmark), added Contra's job board through its official integration (14 briefs in the first import), and checked the alternatives instead of assuming: Reddit returns 403, Upwork's RSS is retired and other marketplaces have no open job API, so those stay manual import. Hourly rates are now judged per hour and on-site briefs are excluded.
  5. Speed that matches the data

    Problem
    Functions ran in a different region from the database, so pages took 5 to 11 seconds.
    Approach
    Pinning the functions next to the database brought authenticated pages to 150 to 260 ms in staging.

The evidence

What can be checked, and what the public version does not do.

Role
Independent product
Timeline
Oct 2026 – present
Automated tests
596 unit, 600 end-to-end
Live security checks
46 of 46 passed on the deployed commit
Database migrations
19
Hosting
Deployed on Vercel with Supabase PostgreSQL. Private: owner-only sign-in with two-step verification, so the dashboard is not public.
Verified in the hosted app
Sign-in and access control, database access, read-only Gmail sync, AI drafting with Gemini, and discovery run by the hosted worker
Scheduled operation
The five-minute database scheduler is running. The first full unattended daily run (12:00 UTC) was still pending when this was written.
Customer outcomes
None claimed
Source
Private repository

Explore the product

Want AI to prepare the work and a person to make the decision?

JARVIS shows how I build that: AI drafts inside rules that deterministic code enforces, every step shows what it is waiting for, and nothing leaves without a human decision. If your team needs an AI workflow it can trust, or an internal dashboard around one, I can build it the same way.