Solo Engineer Stack — Full Tutorial¶
Build PulseFeedback — a real, runnable feature-feedback SaaS — using 10 open-source repos with equal weight.
Every part maps to files you can run, open in a browser, or show on camera. Nothing is slide-deck-only.
Based on The Solo Engineer Stack (Techlatest.net, Apr 2026) · Live demo: DEMO.md
Table of contents¶
- Part 0 — Live demo first
- Part 0b — Repo layout & architecture
- Part 1 — Task Master (PM)
- Part 2 — CrewAI (tech lead)
- Part 3 — LangGraph (architect)
- Part 4 — OpenHands (junior dev)
- Part 5 — Aider (mid-level dev)
- Part 6 — Cline (IDE teammate)
- Part 7 — n8n (operations)
- Part 8 — Coolify (DevOps)
- Part 9 — PostHog (QA + data)
- Part 10 — Chatwoot (support)
- Part 11 — Close the loop
- Part 12 — One-command verification
- Part 13 — Troubleshooting
Part 0 — Live demo first¶
Do this before reading further. The whole tutorial assumes PulseFeedback is running on your machine.
git clone https://github.com/Ayush7614/agentic-ai-ecosystem.git
cd agentic-ai-ecosystem/guides/solo-engineer-stack
cp .env.example .env
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
chmod +x scripts/*.sh scripts/*/*.sh 2>/dev/null || chmod +x scripts/demo.sh scripts/verify-stack.sh
./scripts/demo.sh
What you should see¶

| Output | Meaning |
|---|---|
Wrote artifacts/01-task-master/tasks.json |
Stage 1 done |
Wrote mock artifacts to artifacts/02-crewai/ |
Stage 2 done |
| 10-stage dry-run list | Stage 3 preview |
curl JSON for feedback + CSAT |
API live |
artifacts/11-csat-loop/new-task.json |
Deca-Loop closed |
Open http://localhost:8080:


| UI tab | Real API | Stack tool |
|---|---|---|
| Submit | POST /api/feedback |
Cline-built form |
| Dashboard | PATCH /api/feedback/{id} |
Cline triage UI |
| Analytics | GET /api/events |
PostHog stand-in |
| Support | POST /api/webhooks/csat |
Chatwoot + n8n loop |
| 10 Tools | GET /api/stack |
All repos status |
Prove it with tests¶
Blog/video script: DEMO.md
Part 0b — Repo layout & architecture¶
What lives in this folder¶
guides/solo-engineer-stack/
├── pulsefeedback/ # ← THE PRODUCT (stages 4–6 output)
│ ├── backend/main.py # FastAPI — all routes
│ ├── frontend/ # Dashboard UI (HTML/CSS/JS)
│ └── Dockerfile # Coolify deploy (stage 8)
├── artifacts/ # ← One folder per tool stage
│ ├── 01-task-master/tasks.json
│ ├── 02-crewai/brief.md, spec.md, test-plan.md
│ ├── 03-langgraph/state-approved.json
│ └── 11-csat-loop/new-task.json # created on CSAT ≤ 2
├── scripts/
│ ├── demo.sh # full live demo
│ ├── verify-stack.sh # check all artifacts
│ ├── 01-task-master/generate_tasks.py
│ ├── 02-crewai/run_crew.py
│ └── 03-langgraph/approve_gate.py
├── orchestrator/graph.py # LangGraph Deca-Loop
├── n8n/workflows/csat-loop.json
├── examples/prd-pulsefeedback.md
├── tests/test_api.py
└── docker-compose.yml # app + n8n
Old team → 10 tools¶



| 2022 hire | 2026 repo | PulseFeedback artifact |
|---|---|---|
| PM | Task Master | tasks.json |
| Tech lead | CrewAI | brief.md + spec.md + test-plan.md |
| Architect | LangGraph | orchestrator/graph.py + approval JSON |
| Junior dev | OpenHands | pulsefeedback/ scaffold |
| Mid-level dev | Aider | API in main.py + git commits |
| IDE dev | Cline | frontend/ UI |
| Ops | n8n | n8n/workflows/*.json |
| DevOps | Coolify | Dockerfile + live URL |
| QA / data | PostHog | /api/events + funnel |
| Support | Chatwoot | /api/webhooks/csat + widget |
Deca-Loop (equal stages)¶
flowchart LR
TM[1 Task Master] --> CR[2 CrewAI] --> LG[3 LangGraph]
LG --> OH[4 OpenHands] --> AI[5 Aider] --> CL[6 Cline]
CL --> N8[7 n8n] --> CO[8 Coolify] --> PH[9 PostHog] --> CW[10 Chatwoot]
CW -->|CSAT ≤ 2| TM
Rule: Each tool ships one artifact before the next starts. ~30 minutes per tool on first run.
Part 1 — Task Master (PM)¶
Repo: eyaltoledano/claude-task-master
Job: Turn the PRD into 10 epics — one per stack tool.
Run now (included script — no npm install)¶

python scripts/01-task-master/generate_tasks.py
cat artifacts/01-task-master/tasks.json | python -m json.tool
You get 10 epics (E1–E10) tagged crewai, langgraph, openhands, … task_master.
Input PRD¶
Extend with real Task Master (optional)¶
git clone https://github.com/eyaltoledano/claude-task-master.git ~/claude-task-master
cd ~/claude-task-master && npm install && cp .env.example .env
# Set ANTHROPIC_API_KEY or OPENAI_* in .env
npx task-master parse-prd \
"$(pwd)/../agentic-ai-ecosystem/guides/solo-engineer-stack/examples/prd-pulsefeedback.md"
npx task-master list
# Merge LLM output into artifacts/01-task-master/tasks.json if desired
Verify¶
test -f artifacts/01-task-master/tasks.json && echo "Part 1 OK"
jq '.epics | length' artifacts/01-task-master/tasks.json # should print 10
Handoff: Part 1 → row in table-handoff-summary.gif
| Field | Value |
|---|---|
| Artifact | artifacts/01-task-master/tasks.json |
| Handoff → Part 2 | PRD + tasks.json |
Part 2 — CrewAI (tech lead)¶
Repo: crewAIInc/crewai
Job: Three agents → three documents (equal weight).
Run now — offline demo (no API key)¶


| File | Agent role |
|---|---|
brief.md |
Market Researcher |
spec.md |
Technical Architect |
test-plan.md |
QA Lead |
Medium / blog: use the GIF above instead of the markdown table.
Run live (needs LLM)¶
pip install crewai # or uncomment in requirements.txt
export OPENAI_API_KEY=sk-...
export CREWAI_MODEL=gpt-4o
python scripts/02-crewai/run_crew.py
The live script uses three CrewAI agents defined in scripts/02-crewai/run_crew.py:
- Researcher — competitor landscape
- Architect — API routes + schema (matches
pulsefeedback/backend/main.py) - QA Lead — acceptance tests (matches
tests/test_api.py)
Verify¶
Handoff: Part 2 → table-handoff-summary.gif
| Field | Value |
|---|---|
| Artifact | artifacts/02-crewai/{brief,spec,test-plan}.md |
| Handoff → Part 3 | All three files + tasks.json |
Part 3 — LangGraph (architect)¶
Repo: langchain-ai/langgraph
Job: Enforce the Deca-Loop order + human approval gate before code ships.
Run now — preview all 10 stages¶

Run now — pass approval gate¶
pip install langgraph langchain-openai # for invoke path
python scripts/03-langgraph/approve_gate.py
cat artifacts/03-langgraph/state-approved.json
Simulate CSAT loop (returns to Task Master)¶
What the graph does¶
File: orchestrator/graph.py

| Node | Next stage |
|---|---|
task_master |
crewai |
crewai |
langgraph_gate |
langgraph_gate |
openhands (only if human_approved=True) |
| … | … |
chatwoot |
task_master if CSAT ≤ 2, else done |
Verify¶
Handoff: Part 3 → table-handoff-summary.gif
| Field | Value |
|---|---|
| Artifact | artifacts/03-langgraph/state-approved.json |
| Handoff → Part 4 | Approved spec → start building |
Part 4 — OpenHands (junior dev)¶
Repo: OpenHands/OpenHands
Job: Scaffold repo — folders, Dockerfile, stub routes, CI skeleton.
What's already in the repo (reference implementation)¶
OpenHands would generate this structure. We ship it ready to run:
tree pulsefeedback -L 2
# pulsefeedback/
# ├── backend/main.py ← FastAPI app
# ├── backend/database.py ← SQLite
# ├── backend/schemas.py
# ├── frontend/index.html ← UI shell
# ├── frontend/app.js
# └── Dockerfile
Start the app manually:

cd pulsefeedback/backend
source ../../.venv/bin/activate
uvicorn main:app --reload --port 8080
# open http://localhost:8080
Extend with real OpenHands (optional — for blog footage)¶
git clone https://github.com/OpenHands/OpenHands.git ~/OpenHands
cd ~/OpenHands
export LLM_MODEL=gpt-4o
export LLM_API_KEY=$OPENAI_API_KEY
export LLM_BASE_URL=${OPENAI_API_BASE:-https://api.openai.com/v1}
docker compose up
Paste into OpenHands UI:
Scaffold a feedback SaaS from artifacts/02-crewai/spec.md in a new repo.
Include: FastAPI, SQLite, static frontend, Dockerfile, pytest.
Match routes: POST/GET/PATCH /api/feedback, POST /api/events, POST /api/webhooks/csat.
Compare your output to github.com/Ayush7614/agentic-ai-ecosystem/tree/main/guides/solo-engineer-stack/pulsefeedback
Verify¶
curl -sf http://localhost:8080/health | python -m json.tool
# {"status":"ok","product":"PulseFeedback",...}
Handoff: Part 4 → table-handoff-summary.gif
| Field | Value |
|---|---|
| Artifact | pulsefeedback/ directory |
| Handoff → Part 5 | Running backend on port 8080 |
Part 5 — Aider (mid-level dev)¶
Repo: Aider-AI/aider
Job: Implement API logic with one git commit per feature.
What's already implemented¶
These routes exist in pulsefeedback/backend/main.py:

| Method | Path | Status |
|---|---|---|
POST |
/api/feedback |
✅ Create feedback |
GET |
/api/feedback |
✅ List (?status= filter) |
PATCH |
/api/feedback/{id} |
✅ Update status |
POST |
/api/events |
✅ Analytics capture |
GET |
/api/events |
✅ Event stream |
POST |
/api/webhooks/csat |
✅ CSAT loop |
GET |
/api/stack |
✅ 10-tool status |
Test with curl (show on camera)¶

# Create
curl -X POST http://localhost:8080/api/feedback \
-H 'Content-Type: application/json' \
-d '{"title":"Dark mode","body":"Please add dark theme","email":"demo@example.com"}'
# List
curl http://localhost:8080/api/feedback | python -m json.tool
# Triage
curl -X PATCH http://localhost:8080/api/feedback/1 \
-H 'Content-Type: application/json' \
-d '{"status":"triaged"}'
Extend with real Aider (optional)¶
pip install aider-chat
cd pulsefeedback/backend
aider --model openai/gpt-4o \
--openai-api-base "${OPENAI_API_BASE:-https://api.openai.com/v1}" \
--openai-api-key "$OPENAI_API_KEY" \
main.py schemas.py database.py
Example prompts (one commit each):
- "Add email validation on POST /api/feedback"
- "Add DELETE /api/feedback/{id} for admin"
- "Add test in ../../tests/test_api.py"
Save git log for artifact:
Verify¶
Handoff: Part 5 → table-handoff-summary.gif
| Field | Value |
|---|---|
| Artifact | Working API + tests/test_api.py |
| Handoff → Part 6 | API stable → build UI |
Part 6 — Cline (IDE teammate)¶
Repo: cline/cline
Job: Build dashboard UI + verify in browser.
What's already in the repo¶
The UI has 5 tabs wired to real APIs:
- Submit — form →
POST /api/feedback - Dashboard — cards →
PATCH /api/feedback/{id} - Analytics — table →
GET /api/events - Support — CSAT form →
POST /api/webhooks/csat - 10 Tools — grid →
GET /api/stack
Demo in browser (no Cline required)¶

./scripts/demo.sh
# open http://localhost:8080
# Submit → Dashboard → change status → Analytics → Support (score 1)
Extend with real Cline in Cursor (optional)¶
- Install Cline extension in Cursor
- Settings → API Provider → OpenAI Compatible
- Open
guides/solo-engineer-stack/pulsefeedback/frontend/ - Prompt:
Add a search filter to the Dashboard tab that filters feedback cards by title.
Use the existing GET /api/feedback endpoint. Verify in browser.
Acceptance: see artifacts/02-crewai/test-plan.md
Verify¶
Handoff: Part 6 → table-handoff-summary.gif
| Field | Value |
|---|---|
| Artifact | pulsefeedback/frontend/ + working browser flow |
| Handoff → Part 7 | App runs end-to-end locally |
Part 7 — n8n (operations)¶
Repo: n8n-io/n8n
Job: Three workflows — deploy, notify, CSAT loop.
Run now — start n8n¶

Import real workflow (included)¶
- n8n UI → Workflows → Import from file
- Select
n8n/workflows/csat-loop.json - Activate workflow → copy webhook URL
Workflow path:
Test CSAT without n8n (direct — always works)¶
curl -X POST http://localhost:8080/api/webhooks/csat \
-H 'Content-Type: application/json' \
-d '{"score":1,"comment":"Support bot failed"}'
cat artifacts/11-csat-loop/new-task.json
Expected new-task.json:
{
"source": "chatwoot_csat",
"title": "Fix support issue from low CSAT",
"next_tool": "task_master",
...
}
Test through n8n webhook¶
# Replace WEBHOOK_ID after import
curl -X POST http://localhost:5678/webhook/csat \
-H 'Content-Type: application/json' \
-d '{"score":2,"comment":"via n8n"}'
Optional workflows to add in n8n UI¶

| Workflow | Trigger | Action |
|---|---|---|
| Deploy | GitHub push main |
Coolify redeploy API |
| Notify | Deploy success | Slack / email |
| CSAT loop | ✅ included JSON | → PulseFeedback → Task Master file |
Save workflow IDs:
mkdir -p artifacts/07-n8n
echo "csat-loop: imported from n8n/workflows/csat-loop.json" > artifacts/07-n8n/workflow-ids.txt
Verify¶
test -f n8n/workflows/csat-loop.json && echo "Part 7 OK"
curl -sf http://localhost:5678/healthz && echo "n8n running"
Handoff: Part 7 → table-handoff-summary.gif
| Field | Value |
|---|---|
| Artifact | n8n/workflows/csat-loop.json + running n8n |
| Handoff → Part 8 | Webhooks wired → deploy |
Part 8 — Coolify (DevOps)¶
Repo: coollabsio/coolify
Job: HTTPS deploy for app + services.
Run now — Docker (local production preview)¶

This builds pulsefeedback/Dockerfile:
- FastAPI on port 8080
- Mounts
./artifactsfor CSAT loop files STACK_ROOT=/appfor correct paths inside container
Deploy to Coolify (VPS)¶
- Install Coolify on a VPS → coolify.io/docs
- New resource → Docker Compose or Dockerfile
- Point at your fork /
guides/solo-engineer-stack/pulsefeedback/ - Set domain + enable SSL
- Pair with n8n workflow from Part 7 for auto-redeploy
Save URLs:
mkdir -p artifacts/08-coolify
cat > artifacts/08-coolify/urls.txt <<EOF
APP_URL=http://localhost:8080
N8N_URL=http://localhost:5678
# Production:
# APP_URL=https://feedback.yourdomain.com
EOF
Verify¶
Handoff: Part 8 → table-handoff-summary.gif
| Field | Value |
|---|---|
| Artifact | artifacts/08-coolify/urls.txt + live URL |
| Handoff → Part 9 | App reachable on HTTPS or localhost |
Part 9 — PostHog (QA + data)¶
Repo: PostHog/posthog
Job: Product analytics — events, funnel, feature flags.
Run now — local event API (already wired)¶
Every UI action hits POST /api/events. View the stream:

Or open the Analytics tab at http://localhost:8080.
Events captured automatically:

| Event | When |
|---|---|
feedback_submitted |
User submits form |
feedback_status_changed |
Triage status update |
csat_received |
CSAT webhook fired |
Wire real PostHog (production)¶
- Create project at posthog.com or self-host
- Add to
pulsefeedback/frontend/index.html(beforeapp.js):
<script>
!function(t,e){...}(document,window.posthog||[]);
posthog.init('phc_YOUR_KEY', { api_host: 'https://app.posthog.com' })
</script>
- Mirror events — in
app.jsafter successful submit:
- Create funnel:
feedback_submitted→feedback_status_changed - Create feature flag
new-triage-ui— 50% rollout
Set in .env:
QA checklist (from artifacts/02-crewai/test-plan.md)¶
pytest tests/ -q # API
curl -sf http://localhost:8080/api/events | jq length # events > 0 after demo
- [ ] Submit feedback → event appears in Analytics tab
- [ ] Triage status →
feedback_status_changedevent - [ ] CSAT 1 →
csat_receivedwithloop_triggered: true
Verify¶
Handoff: Part 9 → table-handoff-summary.gif
| Field | Value |
|---|---|
| Artifact | Event stream at /api/events (+ PostHog project in prod) |
| Handoff → Part 10 | Metrics live → add support |
Part 10 — Chatwoot (support)¶
Repo: chatwoot/chatwoot
Job: Support inbox + CSAT → loop back to Task Master.
Run now — CSAT loop (no Chatwoot install required)¶
The Support tab at http://localhost:8080 simulates Chatwoot CSAT.
Or via curl:

curl -X POST http://localhost:8080/api/webhooks/csat \
-H 'Content-Type: application/json' \
-d '{"score":1,"comment":"I need human help"}'
cat artifacts/11-csat-loop/new-task.json
cat artifacts/11-csat-loop/events.jsonl
This is the Deca-Loop closing — low CSAT creates a Task Master task file.
Wire real Chatwoot (production)¶
- Deploy Chatwoot via Coolify or chatwoot.com/docs
- Create Website inbox → copy widget script
- Add widget to a landing page (or
pulsefeedback/frontend/index.html) - Configure CSAT survey after conversation
- Point CSAT webhook to n8n →
n8n/workflows/csat-loop.json→ PulseFeedback
.env:
n8n bridge (tools #7 + #10)¶
Verify¶
curl -sf -X POST http://localhost:8080/api/webhooks/csat \
-H 'Content-Type: application/json' \
-d '{"score":1}' | grep -q loop_triggered
echo "Part 10 OK"
Handoff: Part 10 → table-handoff-summary.gif
| Field | Value |
|---|---|
| Artifact | artifacts/11-csat-loop/new-task.json |
| Handoff → Part 11 | Loop closed |
Part 11 — Close the loop¶
The stack only works when it feeds itself:
flowchart LR
User[User CSAT survey]
CW[Chatwoot]
N8[n8n]
API["/api/webhooks/csat"]
ART["new-task.json"]
TM[Task Master]
CR[CrewAI]
APP[pulsefeedback/]
User --> CW --> N8 --> API --> ART --> TM --> CR --> APP
Full loop demo (terminal)¶

./scripts/demo.sh
# Watch: CSAT → new-task.json → re-run generate_tasks.py for next sprint
python scripts/01-task-master/generate_tasks.py
python orchestrator/graph.py --csat 1.5
Weekly solo-founder ritual¶

| Day | Tool | Action |
|---|---|---|
| Mon | PostHog | Review /api/events or PostHog funnel |
| Tue | Chatwoot | Triage inbox + tag themes |
| Wed | Task Master | generate_tasks.py or Task Master CLI |
| Thu | Aider + Cline | Ship one epic on pulsefeedback/ |
| Fri | n8n + Coolify | Deploy + Slack notify |
Part 12 — One-command verification¶
Run before recording a blog or presenting:

Expected:
API reference (quick)¶

| Endpoint | Method | Purpose |
|---|---|---|
/health |
GET | Health check |
/api/feedback |
POST, GET | Create / list feedback |
/api/feedback/{id} |
PATCH | Triage status |
/api/events |
POST, GET | Analytics (PostHog) |
/api/webhooks/csat |
POST | Chatwoot / n8n CSAT |
/api/stack |
GET | 10-tool status board |
/docs |
GET | OpenAPI (FastAPI) |
Part 13 — Troubleshooting¶

| Symptom | Fix |
|---|---|
./scripts/demo.sh — port in use |
PORT=8081 ./scripts/demo.sh |
ModuleNotFoundError: fastapi |
source .venv/bin/activate && pip install -r requirements.txt |
| UI loads but API 404 | Run from pulsefeedback/backend: uvicorn main:app --port 8080 |
| CSAT loop no file | Score must be ≤ 2; check artifacts/11-csat-loop/ |
| n8n webhook fails | App must run; use host.docker.internal:8080 in Docker |
verify-stack fails Part 3 |
pip install langgraph && python scripts/03-langgraph/approve_gate.py |
| CrewAI live run fails | Use --mock or set OPENAI_API_KEY |
| PostHog tab empty | Submit feedback in browser first, then refresh Analytics |
| Coolify build fails | Ensure STACK_ROOT=/app in Dockerfile (already set) |
What's next¶

| Goal | Guide |
|---|---|
| Private LLM for all coding agents | Gemma 4 12B |
| CrewAI + RAG research tool | Qwen Agentic RAG |
| Cursor team rules | Claude Code .claude/ |
| Equal config for all 10 repos | STACK.md |
| 5-min recording script | DEMO.md |
Regenerate terminal GIFs¶
Same pipeline as Anthropic Cybersecurity Skills:
cd guides/solo-engineer-stack/assets
pip install playwright
python -m playwright install chromium
python3 render_stack_screenshots.py gif # all 13 GIFs
python3 render_stack_screenshots.py gif --only 05-aider # one step
./scripts/prepare-docs.sh # from repo root — copies assets/ to docs/
| GIF | Tutorial part |
|---|---|
step-00-demo.gif |
Part 0 — live demo |
step-01-task-master.gif |
Part 1 |
step-02-crewai.gif |
Part 2 |
step-03-langgraph.gif |
Part 3 |
step-04-openhands.gif |
Part 4 |
step-05-aider.gif |
Part 5 |
step-06-cline.gif |
Part 6 |
step-07-n8n.gif |
Part 7 |
step-08-coolify.gif |
Part 8 |
step-09-posthog.gif |
Part 9 |
step-10-chatwoot.gif |
Part 10 |
step-11-verify-stack.gif |
Part 12 — verification |
step-12-csat-loop.gif |
Part 11 — close loop |
Table GIFs (Medium — use instead of markdown tables)¶
All tables in this tutorial have animated GIF + static PNG in assets/:
| GIF | Tutorial section |
|---|---|
table-demo-output.gif |
Part 0 — demo outputs |
table-ui-tabs.gif |
Part 0 — browser tabs |
team-vs-stack-table.gif |
Part 0b — 2022 → 2026 |
table-hire-artifacts.gif |
Part 0b — hire + artifact |
table-handoff-summary.gif |
Parts 1–10 — handoffs |
crewai-agents-table.gif |
Part 2 — CrewAI agents |
table-langgraph-nodes.gif |
Part 3 — LangGraph |
table-api-routes.gif |
Part 5 — API routes |
table-n8n-workflows.gif |
Part 7 — n8n |
table-posthog-events.gif |
Part 9 — PostHog |
table-weekly-ritual.gif |
Part 11 — weekly ritual |
table-api-reference.gif |
Part 12 — API reference |
table-troubleshooting.gif |
Part 13 — troubleshooting |
table-whats-next.gif |
What's next |
deca-loop-tools-table.gif |
README — 10 tools |
Regenerate all:
Source: tutorial-tables.html · Static PNGs: same name with .png
Terminal prompt: (base) ayushkumar@Ayushs-Mac-mini ~ % (local macOS zsh style).
Upstream repos: OpenHands · Aider · Cline · Task Master · CrewAI · LangGraph · n8n · Coolify · PostHog · Chatwoot