Running AI Agents as an Organization: A 12-Subagent, Neon-Backed Postgres Task Board Architecture for a One-Person Company
The era of letting one AI do everything is over. An implementation-level reveal of a one-person-company OS built with Next.js + Prisma + Neon (serverless Postgres), with 12 Claude Code subagents run as an "organization" — Neon branching, PITR, and pgvector included.

The era of letting one AI do everything is over. An implementation-level reveal of a one-person-company OS built with Next.js + Prisma + Neon (serverless Postgres), with 12 Claude Code subagents run as an "organization" — Neon branching, PITR, and pgvector included.
Running AI Agents as an Organization: A 12-Subagent, Neon-Backed Postgres Task Board Architecture for a One-Person Company
Version note: Based on operational logs as of May 2026. Assumes Claude Code v2.x, Claude Sonnet 4.6 / Haiku 4.5, Next.js 14, Prisma 5, Neon serverless Postgres + pgvector 0.7, and Vercel runtime. Uses
.claude/agents/for subagents and two Claude Code hooks (SessionStart and PreToolUse). Model specs, Claude Code hook specs, and Neon pricing tiers move fast — check official docs for current behavior.
I started out as a semiconductor process development engineer and later moved into venture capital as a CVC investor. The first thing I ran into when I joined the investment team was that "review quality standards varied wildly between people." When I led the standardization effort over three months, the lesson that stuck was the obvious one: quality is guaranteed by structure, not by individual effort. That same realization came back, almost word-for-word, after I spent 500 hours running Claude Code subagents (closer to 1,000 if you count unattended runtime). This post is the operational design I arrived at — written at the code, schema, and Neon-utilization level, with nothing hidden.
TL;DR: What You'll Learn
| Topic | What you'll learn |
|---|---|
| Single AI vs. organized AI | Three structural reasons a single chat-window setup hits a ceiling |
| Four organizational pillars | How "specialization, review, written handoff, clear ownership" from VC team ops translate to subagents |
| The 12-agent breakdown | Boundaries between Leadership / Engineering / Quality / Content-Strategy-Legal |
| Implementation stack | Next.js + Prisma + Neon (serverless Postgres + pgvector) + pnpm task CLI + an Obsidian-compatible knowledge/ vault |
| Why Neon (the core wins) | Branching as DB-level git, PITR as the Inbox-deletion safety net, pgvector for semantic recall, suspend-on-idle as the economic enabler |
| Pitfalls | The Inbox-deletion incident, Decision Boundaries as the antidote, Vercel + Neon connection management |
The Ceiling of "One AI Does Everything"
Discussions about AI agent operations still feel too anchored on "a smarter model will solve it," at least to me. Comparing Claude vs. GPT vs. Codex is fair, but every one of those debates assumes a single AI doing the entire job. That assumption, I think, is where the wheels come off.
After three months of running Claude Code 6+ hours a day, I see three structural ceilings to that approach.
1. Mixed context warps output. When you stuff Project A's spec, Client B's requirements, last week's meeting notes, and today's grocery list into the same session, irrelevant signal becomes noise and answers drift. It's structurally identical to running a TCAD process simulation where one wrong boundary condition shifts the result by an order of magnitude.
2. Hallucinations multiply. With cluttered context, the AI confidently asserts things that were never decided. I'm reminded of a yield issue on a production line that the field engineer "confidently reported" as an equipment problem — when I re-ran the TCAD simulation, the actual root cause was a process-side boundary condition. Confidently wrong reports cannot be caught without multiple lenses.
3. There is no reviewer. With a single AI, the responsibility to check output collapses onto one human (me). I write the prompt, I read the result, I judge — that's a sole-investor decision with no investment committee, and no serious shop runs that way.
The unsolved part is how to address all three at once through "organization."
The Four Pillars I Borrowed from Investment-Team Ops
When I led the review-process standardization at the investment team, the structure that emerged had four pillars. The moment I realized those same four pillars map cleanly onto Claude Code subagents was where this whole operation began.
| Pillar | Investment team | Subagent org |
|---|---|---|
| Specialization | Review work split by market / tech / finance / legal | 12 agents across 4 functional groups (below) |
| Review culture | Investment committee runs multiple lenses | qa-reviewer / brand-voice-reviewer / anti-ai-slop-reviewer in series |
| Written handoff | Investment memos, ADRs, PRDs | Mandatory knowledge/handoffs/ notes per task |
| Clear ownership | Analyst / manager / committee authority | decision-boundaries.md codifies "agent decides / escalate / hard stop" |
Honestly, I thought "this is just common sense" at first. But mapping it onto subagents, I found that the answers human organizations spent millennia evolving carry over almost intact. Information sharing, decision distribution, quality assurance, escalation paths — when you run multiple subagents, the exact same four problems resurface. So borrowing the historical answer is the rational move, at least where I currently stand.
Architecture Overview: Next.js + Prisma + Neon + 12 Subagents
From here I'll describe the system I actually use — not a demo mock, but the live setup that runs ZYL0 Lab's real work (blog drafting, code, investment analysis, first-pass contract review). The stack is deliberately not flashy; everything has to be maintainable by one person.
┌────────────────────────────────────┐
│ knowledge/ (Markdown vault) │
│ context, projects, decisions, │
│ handoffs, playbooks, inbox │
└────────────────────────────────────┘
▲ ▲
read/write │ │ read/write
│ │
┌───────────┐ ┌────────┴────────┐ ┌─────────┴────────┐
│ Browser │ ◄►│ Next.js (App) │ │ Claude Code │
│ /board │ │ src/app/ │ │ 12 subagents │
│ /knowledge│ │ server actions │ │ skills + hooks │
└───────────┘ └────────┬────────┘ └────────┬─────────┘
│ Prisma │ Bash → CLI
▼ ▼
┌────────────────┐ ┌──────────────────┐
│ src/lib/ │ ◄──│ scripts/cli/ │
│ tasks.ts │ │ task.ts │
│ views.ts │ │ note.ts │
│ embeddings.ts│ │ │
└────────┬───────┘ └──────────────────┘
▼
┌────────────────────────────────────┐
│ Neon (serverless Postgres) │
│ branches: main / preview-* / │
│ recover-* + pgvector for │
│ handoff embeddings │
└────────────────────────────────────┘
Four design choices stand out. First, the CLI shares the Prisma client directly instead of going through HTTP. Subagents manipulate the board by running pnpm task add ... from Bash, but UI server actions, REST routes, and the CLI all funnel through validateTaskCreate / validateTaskUpdate in src/lib/tasks.ts. One validation surface, period. The semiconductor world has a similar law: keep the same inspection spec across multiple test paths or your spec will silently diverge.
Second, the Markdown vault sits at the repo root as knowledge/. That placement is intentional so I can open the repo as an Obsidian vault. Subagents read and write through src/lib/knowledge.ts, which path-sandboxes everything to KNOWLEDGE_ROOT.
Third, Claude Code hooks live as TS scripts under .claude/hooks/, not inline in settings.json. SessionStart queries p0Tasks, blockedTasks, and staleTasks, then pipes a markdown summary to stdout. PreToolUse (matcher: Task) reads the JSON payload from stdin, extracts subagent_type, and writes a role-specific reminder. Keeping hook bodies in TypeScript means they reuse the same Prisma client and view functions the UI uses.
Fourth, the DB is pinned to Neon serverless Postgres, and local dev uses a Neon dev branch — there is no SQLite anywhere. SQLite-local-Postgres-prod looks convenient until column behavior, JSONB indexing, and transaction isolation start drifting between environments and you ship bugs that only surface in production. Applying the "one validation surface" rule to the database, basically. DATABASE_URL points at Neon's pooled endpoint; DIRECT_URL points at the direct endpoint and is reserved for migrations.
Why Neon: Four Specific Wins
This is the new piece compared to the original write-up. Switching from SQLite to Neon serverless Postgres wasn't cosmetic — it filled four very specific gaps in subagent operations. Honestly, I expected "branching for a one-person stack" to be overkill. Neon's branching turned out to be the single most-used safety device in the whole architecture — that's a sentence I couldn't have written before running this for a few hundred hours.
1. Branching is git-for-databases
When a subagent runs schema-touching work (migrations, new columns, index changes), letting it hit the production DB directly is scary. A Neon branch is a fully isolated DB you can spin up in seconds, carrying the production data shape so experiments are realistic.
# Branch off main and hand the agent the branch's DATABASE_URL
neonctl branches create --name preview/agent-add-tags-col --parent main
neonctl connection-string preview/agent-add-tags-col --pooled
# The agent runs the migration on the branch
prisma migrate dev --name add_tags_col
# Re-apply on main if review passes; otherwise drop the branch and move on
neonctl branches delete preview/agent-add-tags-col
The Decision Boundaries doc explicitly forbids direct schema pushes to the prod branch — every migration goes through a preview branch first. Structurally identical to "no direct push to main" in git, and the minimum bar I want when handing schema authority to an AI.
2. PITR is the safety net for the Inbox-deletion incident
For Lesson 2's Inbox bulk-deletion incident, all I had at the time were manual SQLite snapshots. Neon's Point-in-Time Restore goes back to the second, up to 30 days depending on the plan. You branch from five minutes before the event and copy back just the rows that were deleted.
neonctl branches create \
--name recover/inbox-2026-05-03 \
--parent main \
--timestamp "2026-05-03T03:14:00Z"
When "irreversible mistake" turns into "five-minute rollback," the psychological bar for what you'll let an agent attempt drops noticeably. That's an effect I couldn't have predicted on paper.
3. pgvector for semantic recall over knowledge/
Once handoffs/ and decisions/ get past a few dozen entries, filename search stops working — "where was that ADR about model selection?" Neon ships pgvector natively, so I embed handoff/ADR text and store the vectors in the same DB.
// src/lib/embeddings.ts
import { prisma } from './db'
import { embed } from './embedder'
export async function searchHandoffs(query: string, k = 5) {
const [{ embedding }] = await embed([query])
// pgvector cosine distance for nearest-neighbor search
return prisma.$queryRaw<
Array<{
taskId: string
slug: string
similarity: number
}>
>`
SELECT "taskId", "slug",
1 - ("embedding" <=> ${embedding}::vector) AS similarity
FROM "HandoffEmbedding"
ORDER BY "embedding" <=> ${embedding}::vector
LIMIT ${k};
`
}
Filename lookup is for known IDs. pgvector is for fuzzy recall — "find me prior work that smells like this." A subagent that calls searchHandoffs("similar prior decisions") gets semantically nearby notes without me having to remember the exact slug, and handoffs stop being write-only.
4. Suspend-on-idle is what makes the solo-operator economics work
This is directly downstream of Lesson 1's "previously impossible work becoming viable." Neon compute auto-suspends after an idle window, which kills the bill while no agent is running. In practice, nightly QA runs ~2–3 minutes per hour, so the 24/7 footprint stays in the low single-dollar range monthly.
Running a 24-hour organization without worrying about server costs — that was the single biggest win from the Vercel + Neon pair, in my current view.
The 12-Agent Roster: Why Four Groups
Subagents live in .claude/agents/<role>.md with YAML frontmatter. The description field doubles as the Claude Code router, so writing it as "Use when… Do not invoke for…" is critical.
| Group | Agents | Model | Primary responsibilities |
|---|---|---|---|
| Leadership / Routing | engineering-lead / business-director / task-dispatcher | sonnet / sonnet / haiku | Decompose work, route, prioritize |
| Engineering | frontend-engineer / backend-engineer / infra-ops | sonnet / sonnet / haiku | UI / schema-API-CLI / board hygiene + nightly jobs |
| Quality | qa-reviewer / brand-voice-reviewer / anti-ai-slop-reviewer | sonnet / haiku / haiku | AC verification / brand alignment / AI-slop detection |
| Content / Strategy / Legal | content-director / legal-first-pass / morning-standup-writer | sonnet / sonnet / haiku | Long-form structure / contract first-pass / morning brief |
The base routing flow is short:
operator note → task-dispatcher → specialist
↘ engineering-lead (engineering, complex)
↘ business-director (strategy)
engineer finishes → qa-reviewer → Done
↘ back to engineer (FAIL)
content draft → content-director → brand-voice-reviewer
↘ anti-ai-slop-reviewer
contract → legal-first-pass → operator (always)
Model selection is simple: roles that exercise judgment over multi-file context (engineering, content, QA, legal) run on Sonnet. Rule-following / detection roles where the prompt does most of the thinking (slop, voice, dispatcher, infra hygiene, morning brief) run on Haiku. Opus is intentionally not in the roster. Strategic calls are picked up by me or escalated as ADRs. That keeps cost and ownership clean.
Minimal Agent Definition
Here's a slightly simplified version of backend-engineer. Writing the description as a router switch is the most important part. Vague descriptions cause task-dispatcher to misroute work.
---
name: backend-engineer
description: >
Use when the task touches src/lib/, prisma/schema.prisma, server actions,
API routes under src/app/api/, scripts/jobs/, or scripts/cli/. Do not
invoke for UI changes (use frontend-engineer) or stale-board hygiene
(use infra-ops).
model: sonnet
tools: [Read, Write, Edit, Bash, Glob, Grep]
---
# Backend Engineer
## Scope
- Prisma schema and migrations (always on a Neon preview branch first)
- Validation helpers in src/lib/tasks.ts
- Server actions and API routes
- Job scripts in scripts/jobs/
## Workflow
1. Read the task and acceptanceCriteria from the board
2. Implement minimum viable change; do not refactor unrelated code
3. Add a regression test or CLI invocation that proves the change
4. Move task to Review with a one-line summary in handoffNote
## Don'ts
- Never run prisma migrate reset
- Never push schema directly to the Neon prod branch (use a preview branch)
- Never add a dependency without an ADR
- Never edit .claude/agents/\* — escalate to operator
The "Do not invoke for…" tail of the description is the part most people skip, and it's the part that actually pays the rent. Codifying what an agent must NOT do is what makes role boundaries crisp — exactly the same lesson I beat into the investment team during that review-process standardization.
Task Schema: States and Validation
The board core is a single Prisma Task table living in Neon Postgres. Enums could be promoted to Postgres native enums, but I keep them as string for portability with local mocks and tests. auditTrail is a Postgres-native JSONB column now — no more "stringify and parse on every read" the way I had to under SQLite. Partial-match queries like auditTrail @> '[{"event":"deleted"}]'::jsonb become available out of the box.
// src/lib/types.ts
export const STATUSES = [
'Inbox',
'Unassigned',
'InProgress',
'Blocked',
'Review',
'Done',
'Archived',
] as const
export const PRIORITIES = ['P0', 'P1', 'P2', 'P3'] as const
export const TEAMS = ['engineering', 'content', 'business', 'infra', 'human'] as const
export type AuditEntry = {
ts: string
actor: string // "agent:backend-engineer" or "human:operator"
event: string // e.g. "status:InProgress->Review"
detail?: string
}
The Neon-specific bits show up in the Prisma schema:
// prisma/schema.prisma — Neon-specific bits
generator client {
provider = "prisma-client-js"
previewFeatures = ["postgresqlExtensions"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL") // Neon pooled
directUrl = env("DIRECT_URL") // Neon direct (for migrate)
extensions = [pgvector]
}
model Task {
id String @id @default(cuid())
status String
priority String
team String
auditTrail Json // Postgres JSONB — supports @> partial match
// ...
}
model HandoffEmbedding {
taskId String @id
slug String
embedding Unsupported("vector(1536)")?
createdAt DateTime @default(now())
}
The state transitions are easier to read as a table. Note that Review→Done flags a missing handoffNote as a warning, not an error. Hard-rejecting it would just make agents stuff in empty strings — surfacing as a warning encourages real handoff notes without blocking the flow.
| From → To | Required | Audit event | Side effect |
|---|---|---|---|
| new → Inbox | title, description, createdBy | created | auditTrail initialized |
| InProgress → Blocked | blockerReason | status:InProgress->Blocked | — |
| InProgress → Review | acceptanceCriteria | status:InProgress->Review | qa-reviewer auto-picks up |
| Review → Done | handoffNote (recommended) | status:Review->Done | completedAt set |
| any → Archived | — | archived | excluded from listTasks |
Deletion is not exposed via UI or CLI. This single rule has prevented several near-incidents. If real deletion is ever needed, I open prisma studio manually.
The knowledge/ Vault and Asynchronous Handoffs
knowledge/ lives at the repo root and opens as an Obsidian vault as-is. Subagents never chat with each other in real time. They write files instead.
knowledge/
├── inbox/ # brain dumps, nightly snapshots, morning briefs
├── projects/ # per-initiative briefs
├── ideas/ # not-yet-projects
├── resources/ # reference material
├── context/ # philosophy, identity, voice, strategy, boundaries
├── handoffs/ # <task-id>-<slug>.md handoff notes
├── decisions/ # numbered ADRs
└── playbooks/ # nightly-qa and other repeatables
context/ and handoffs/ are the two folders that earn their keep.
context/ holds philosophy, professional-identity, visual-design-language, product-strategy, and decision-boundaries — every agent gets that as ambient "what is ZYL0 Lab" memory.
Handoff filenames follow <task-id>-<slug>.md, so pnpm task show <id> and ls knowledge/handoffs/<id>-*.md work as bidirectional lookups. For the cases where filename lookup isn't enough — "find me a similar prior decision" — agents call searchHandoffs against the pgvector store on Neon, exactly the win described in reason 3 above. Filename and semantic recall sitting in the same DB has been more useful than I expected.
Designing AWS IoT Core async messaging years ago left me with a strong intuition: real-time sync is fragile, async queues plus durable logs are robust. Subagent operations are the same — writing handoffs to files instead of conversations turns debugging from impossible to tractable.
Decision Boundaries: Who Decides What
Of everything I built for this org, knowledge/context/decision-boundaries.md was the highest-leverage single document. It draws lines in three regions.
Agents may decide on their own
- File-level refactors within the assigned task
- Adding tests for code already being changed
- Reorganizing notes within an existing folder
- Reassigning to a more appropriate sub-agent (must record in audit)
- Marking another agent's task
Reviewafter independent verification
Agents must escalate to the operator
- Any change to
prisma/schema.prismarequiring a migration - Adding dependencies to
package.json - Changes to
.claude/settings.json,.claude/agents/*,.claude/skills/*, orCLAUDE.md - Anything touching cloud or external systems
- Any decision that warrants an ADR
- Transition to
Blockedon operator input
Hard stops (never without explicit operator confirmation)
git push --forceprisma migrate resetrm -rfpnpm prune- Archiving a task another agent is working on
- Editing existing entries under
knowledge/decisions/(only append new ADRs) - Direct schema push to the Neon prod branch (must go via a preview branch)
The escalation mechanism is encoded too. The agent moves the task to Unassigned and fills in the fields:
assigneeType=humanassigneeId=operator- Sets priority
- Writes the question into
descriptionorhandoffNote
My /board/needs-attention view picks it up automatically.
Three Lessons from 1,000 Hours
This is the part I most wanted to write. After ~500 hours of direct operator time and roughly 1,000 hours of cumulative agent runtime, here's what I now consider truly important.
1. The biggest payoff isn't time savings
Overnight QA, knowledge/ cleanup, the stale-check job — these are jobs that don't make economic sense for a solo player. They aren't worth the time, so usually nobody does them. But with autonomous subagents, you can run them 24/7 at near-zero marginal cost. The result: "Silicon-Valley-grade quality processes" become attainable at the scale of a single-person operation, possibly for the first time. That's what hit me hardest. The real value of an organized AI setup, in my current view, isn't time saved — it's "work that was previously impossible becoming economically viable." Neon's suspend-on-idle compute and Vercel's serverless billing line up directly with that thesis: when the bill stops while no agent is running, a 24/7 shift becomes affordable for one person.
2. Implicit understanding does not transfer
A human new hire would sense "I probably shouldn't delete the Inbox unilaterally." A subagent senses no such thing. If you didn't write "do not delete," there is a real chance it will delete. This isn't a metaphor — it actually happened in my knowledge/ vault. One agent declared "I'll tidy up" and bulk-deleted unprocessed Inbox notes.
The lesson: every judgment criterion has to be written down explicitly. The board now exposes only Archived, not delete. handoffs/ is explicitly listed under "do not delete" in decision-boundaries.md. It was the same during the review-process standardization — every place I cut corners on the assumption "this is obvious" eventually produced an incident. One footnote: after moving to Neon, PITR turned "irreversible incident" into "five-minute rollback." Written rules remain the first line of defense; Neon's restore is the second line — a two-layer setup that didn't exist on SQLite.
3. AI organizations break silently
This is the scariest lesson. Subagent organizations break without errors or warnings. A corrupted config file? "Write complete, moving on." A clogged task queue? "In progress" indefinitely.
A human new hire would escalate "this message hasn't reached me." AI doesn't. So "the agent reported it's running" is never enough. Every morning, morning-standup-writer produces a brief at knowledge/inbox/morning-brief-latest.md containing the overnight summary, today's focus, and an editor's note. Three minutes of reading and I know whether the org is healthy. Observability is, I'd argue, a non-negotiable requirement for subagent operations.
Pitfalls: Traps I Hit and How I Worked Around Them
Sharing the most frequent traps from 500+ hours of direct ops.
Trap 1: Vague descriptions clog the router. "Use when engineering tasks" is too broad — task-dispatcher routes UI, schema, and infra hygiene all to backend-engineer. Workaround: write the description as a symmetric "Use when X. Do not invoke for Y." The Y side is what actually sharpens routing accuracy.
Trap 2: Validation logic drifts. When UI server actions, REST routes, and CLI each carry their own validation, the specs diverge. Workaround: keep validateTaskCreate / validateTaskUpdate as the only exports from src/lib/tasks.ts and route every entry path through them. This works precisely because the CLI shares the same Prisma client.
Trap 3: The board rots. Tasks completed but never transitioned out of InProgress accumulate — dozens within days. Workaround: a nightly scripts/jobs/stale-check.ts flags non-Done / non-Archived tasks whose updatedAt is over 72 hours old as stale. Crucially, it never auto-archives. infra-ops surfaces "this looks stale" to the operator; the call stays human.
Trap 4: AI-flavored prose creeps in. With content-director alone, "as you can see" phrasing and em-dash padding inevitably leak through. The workaround is keeping anti-ai-slop-reviewer at the final check stage, with a list of phrases I never use, forcing a rewrite on any hit.
Trap 5: Connection management on Vercel + Neon. Vercel serverless functions open a fresh connection per invocation, which hits Neon's connection limit fast. The workaround is to point DATABASE_URL at Neon's pooled endpoint with ?pgbouncer=true&connection_limit=1, and DIRECT_URL at the direct endpoint reserved for prisma migrate. Routes that run in edge runtime get switched to @neondatabase/serverless (the HTTP/WebSocket driver). That three-lane setup has been the most stable so far. Prisma Data Proxy is another option, but it conflicts with the "CLI and UI share the same Prisma client" principle, so I haven't adopted it.
Wrap-Up
After 500 hours of direct operations and roughly 1,000 hours of cumulative runtime, the conclusion is simpler than I expected.
- Don't make one AI do everything. Twelve agents, physically isolated context.
- Everyone shares the same memory. The
knowledge/vault and Prisma task board are the shared memory. - Handoff in writing, not in conversation.
handoffs/<task-id>-<slug>.mdplus an append-onlyauditTrailJSON is the durable log. - Codify ownership and hard stops. Anything not in
decision-boundaries.mdis something AI will not infer.
These four are nearly identical to the methodology I used when standardizing the investment team's review process. There's nothing AI-specific required as a principle — the answers human organizations have refined over a long arc still apply, with AI's distinct strengths layered on top (24/7 uptime, cost optimization, parallelism). That's the view from where I currently stand.
Arguing about which model is strongest is a surface-level game. The real edge comes from how you run it. Whether your stack is Claude, Gemini, or GPT, a Prisma table plus a markdown vault as the shared substrate carries over. And the moment that Prisma table sits on Neon, four pieces of gear show up at once: branching, PITR, pgvector, and suspend-on-idle. Running 12 autonomous subagents against a real production database without flinching is what that combination buys you.
Next Issue Ideas
- Idea 1: A data-updated follow-up — Revisit the thesis with fresh numbers and separate what strengthened from what broke.
- Idea 2: A practical template edition — Turn the article into a checklist readers can reuse for investing, pricing, or technical operations.
- Idea 3: The bear-case test — Define the conditions that would invalidate this view and map the indicators to watch next.
Related Posts
- Parallel Blog Research with Subagents: Fan Out Investment, Technical, and Reader-Need Axes, Then Merge Into One Draft — A hands-on build log: split one blog post's research into investment, technical, and reader-need axes, run them as par…
- Reading the HalluHard Paper: Why Claude Hallucinates More in Long Conversations, and 4 Implementation Patterns for Claude Code/MCP — Past three conversational turns, even the strongest models hallucinate ~30%.
- How to Build a Mid-Size Company AI Operations Package Before Selling It for $3K a Month — For solo creators moving into corporate work in the AI era, sell "running operations" — not "tool deliveries." Designi…
References
The factual and numerical assumptions in this article are anchored to primary or public materials that readers can revisit during AdSense review and future updates.
This article is for informational purposes only and does not constitute investment advice or a recommendation of any specific stock, service, or contract structure. The author may hold positions or interests related to companies or services mentioned. Generative AI was used for parts of research, translation, and proofreading, with final review by ZYL0. See the disclaimer for details.
































































