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


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 productionHacker 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 productionEach 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 productionA 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 productionA 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 productionApplications 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 productionA 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.








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.
Interface
Next.js server components stream the page shell; a per-request Content-Security-Policy nonce and a Host/Origin guard protect every route.
Data
A repository layer with a SQL translation and a synchronous worker bridge so the same code and tests run on SQLite and Postgres.
Workers
pg_cron posts an HMAC-signed request to a Vercel function that claims jobs from the queue.
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
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.
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.
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.
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.
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.