← Back to Timeline
← Back to Timeline
Overall Project Stats
Total Development Time
12 months
Start Date
May 2025
End Date
Apr 2026
Total Commits
349
Repository Breakdown
Backend Commits (API)
197
Frontend Commits (Web)
152
Pull Requests Merged
15+
Development Branches
10+
Codebase Size
Excludes the vendored tailwind-plus-radiant UI component library (~5,400 LOC, 43 files) shipped as part of the frontend bundle.
Backend Source
~9,600 LOC115 files
Backend Tests
~14,300 LOC57 files · ~1.5:1 ratio
Frontend Source
~15,600 LOC128 files
Total Codebase
~40,000 LOC305 files
Technology Stack
Backend (inpromptout-api)
- Framework: FastAPI (async Python web framework)
- Database: Firebase Firestore (NoSQL document store)
- Authentication: Firebase Auth with JWT verification
- AI Integration: OpenAI GPT-4o-mini
- Validation: Pydantic v2 (type-safe data models)
- Testing: pytest with Firebase Emulator
- Language: Python 3.11
Frontend (inpromptout-web)
- Framework: React 19 (bleeding edge)
- Language: TypeScript 5.8
- Build Tool: Vite 7
- Drag & Drop: @dnd-kit (core + sortable)
- UI Components: Headless UI + Radiant Design System
- Styling: Tailwind CSS 4
- Authentication: Firebase Auth SDK
- Routing: React Router v6
- Testing: Vitest + jsdom
Key Features Implemented
Core Features
- Five node types (Thought, Prompt, Insight, Result, Journal)
- Hierarchical graph structure with edges
- Drag-and-drop tree UI
- Node capabilities system
- Type-safe validation throughout
AI Integration
- Context-aware AI suggestions
- Privacy controls (private/visible/pinned)
- Mock mode for development
- AI loading states with animations
- Source context tracking
Performance
- Graph traversal: 19s → <1s (20-node graph)
- Batched graph traversal (BFS)
- Query optimisation (60+ → 7–9)
- Optimistic UI updates
- Debounced mutation queue
Security
- Firebase authentication (JWT)
- Repository-level ownership checks
- Immutable field filtering
- Cross-tenant isolation
- Comprehensive auth tests
Development Phases Overview
Notable Achievements
"Holy Shit, that actually worked first time, unexpected! This is ACTUALLY a thing. I am in a bit of disbelief - it has been a good few months!!"
- Learned React from zero: Built a production app with no prior React experience
- OpenAI integration success: Worked on first try (10 October 2025)
- Graph traversal overhaul: 60+ Firestore queries → 7–9 on a 20-node graph; worst-case latency 19s → <1s (Phase 9 batching)
- Privacy-first design: Three-tier AI context model from day one
- Comprehensive security: Auth, ownership, and validation at every layer
- Backend architecture: Repository pattern, service layer, clear boundaries
- Test coverage: 735 backend tests across 43 files (~14,300 LOC, ~1.5:1 test-to-source ratio); frontend testing deferred
Lessons Learned
What Worked
- Repository pattern provided clean separation and testability
- Pydantic schemas caught bugs early (type safety in Python)
- Feature-based frontend organisation scaled beautifully
- Mock mode enabled fast iteration without API costs
- TypeScript prevented countless runtime errors
- Pragmatic decisions (stayed with Vite, shipped imperfect drag lag)
- Commit message discipline made debugging easier
What Didn't (But Got Fixed)
- N+1 graph queries (Phase 3) → Batched BFS (Phase 9)
- snake_case/camelCase chaos (Phase 6) → API transform layer
- Immutable field vulnerability (Phase 8) → Repository filtering
- Cross-tenant cache leak (Phase 9) → {user_id}:{op_id} keys
- Unvalidated update payloads (Phase 9) → Schema enforcement
What Remains (Known Issues)
- Tree component refactor still pending – planned hook extraction was deferred during the great refactor
- No state machine for tree operations (implicit state transitions)
Development Metrics
Average Commits/Month
~29
Largest Single Commit
5,026 lines
Backend Tests
735
Node Types Implemented
5
Project Philosophy
"InPromptOut explores the idea that AI doesn't need to overwrite human creativity – it can enhance it.
By blending generated prompts with personal journaling, sketches, and reflections, the app encourages
users to reassert authorship."
Core Principles Realised
- Privacy by default: All nodes start as private
- Explicit consent: Users choose what AI sees
- Persistent context: Pinned nodes guide AI consistently
- Human authorship: AI suggests, user creates
- Minimal overwhelm: Quiet space for creativity