Back to flin
flin

MVP Status Review: What's Ready and What's Not

An honest assessment of FLIN at Session 158 -- what works, what needs work, and what comes next.

Thales & Claude | March 25, 2026 10 min flin
flinmvpreviewstatusassessment

Session 158 was not a building session. It was an accounting session. After 157 sessions of relentless construction -- lexer, parser, type checker, code generator, VM, HTTP server, database engine, security layer, search system, AI gateway -- we stopped to ask the question that matters most: is this actually ready for someone to use?

The honest answer was: mostly yes, with significant caveats.

This article documents the MVP review we conducted -- a systematic audit of every FLIN subsystem, rated on a scale from "production-ready" to "does not exist." The goal was not to celebrate what we had built, but to identify what we had not.

The Review Framework

We evaluated each subsystem against five criteria:

1. Functionality: Does it do what it claims to do? 2. Completeness: Are there missing cases, unhandled edge conditions, or stub implementations? 3. Testing: Is it covered by tests? What percentage of code paths are exercised? 4. Documentation: Could a developer use this subsystem based on existing documentation? 5. Production readiness: Would we deploy this to serve paying users?

Each subsystem received a rating:

  • GREEN: Production-ready. Tested, documented, handles edge cases.
  • YELLOW: Functional but incomplete. Works for the common case, breaks on edge cases.
  • RED: Not ready. Missing critical functionality or has known bugs.
  • GREY: Does not exist yet.

The Audit Results

Language Core

SubsystemRatingNotes
LexerGREEN42 token types, full Unicode support, excellent error messages
ParserGREENPratt parsing, all expression types, statement recovery
Type checkerGREENHindley-Milner inference, generics, union types
Code generatorGREEN120+ opcodes, constant folding, dead code elimination
VMYELLOWStable execution, but missing tail call optimization
Error diagnosticsGREENSource-mapped errors with line/column, suggestions

The language core was the most mature part of the system. After 100+ sessions of development and continuous testing, the compiler pipeline was solid. The one YELLOW was the VM's lack of tail call optimization -- recursive FLIN programs could blow the stack (addressed in Phase 1 hardening with call depth limits, but the proper solution is TCO).

Data Layer

SubsystemRatingNotes
Entity definitionGREENTypes, constraints, decorators, defaults, computed fields
CRUD operationsGREENSave, update, delete, destroy with proper lifecycle hooks
Query builderGREENWhere, order, limit, offset, count, aggregate functions
Foreign keysYELLOWWorks for simple cases, cascading deletes not yet atomic
Write-ahead logYELLOWDurability works, recovery from crash is fragile
Full-text search (BM25)GREENInverted index, TF-IDF scoring, multi-field search
Semantic searchGREENHNSW index, embedding generation, hybrid search
MigrationsREDSchema changes require manual database recreation

The data layer was functional but had two significant gaps. Foreign key cascading was not transactional (fixed in Phase 2), and migrations did not exist at all. A developer who added a field to an entity had to delete .flindb and re-seed. This was the single biggest blocker for production use.

Web Server

SubsystemRatingNotes
HTTP routingGREENFile-based routing, dynamic params, query params, body parsing
Template renderingGREENReactive components, if/for/each, bind, slots
Static filesGREENAutomatic serving from static/ directory
WebSocketGREENRFC 6455, rooms, broadcast, binary frames
Server-Sent EventsGREENEvent IDs, reconnection, hot reload integration
File uploadsGREENMultipart parsing, 4 storage backends
CORSYELLOWHardcoded * -- no configuration (fixed in Phase 2)
Rate limitingGREENToken bucket, configurable per-route
Error pagesGREENCustom 404, 500, etc. via file convention

The web server was remarkably complete. Eight of nine subsystems rated GREEN. The only gap was CORS configuration, which was set to Access-Control-Allow-Origin: * for all responses -- fine for development, a security issue for production.

Security

SubsystemRatingNotes
Password hashing (bcrypt)GREENConfigurable cost factor, timing-safe comparison
JWT generation/validationGREENHS256, RS256, configurable expiry
TOTP (2FA)GREENRFC 6238, QR code generation
OAuth (8 providers)GREENGoogle, GitHub, Discord, Twitter, Apple, Facebook, Microsoft, LinkedIn
Guards (auth middleware)GREENRoute-level, role-based, composable
CSRF protectionGREYDoes not exist
Security headersGREYDoes not exist (added in Phase 2)
Input sanitizationYELLOWSQL injection impossible (no SQL), but XSS via {@html} not prevented

Security was GREEN on the authentication side -- bcrypt, JWT, TOTP, and OAuth were all production-quality. But the protection side had gaps. No CSRF tokens, no security headers, and the {@html} raw HTML injection feature had no built-in sanitization. A developer who wrote {@html user_input} would create an XSS vulnerability.

Developer Experience

SubsystemRatingNotes
Hot reloadGREENFile watcher, sub-second reload, preserves state
CLI (flin dev)GREENClean output, colored errors, port configuration
Admin consoleGREENEntity browser, query editor, API docs
REPLYELLOWBasic expression evaluation, no multi-line support
Testing frameworkGREYDevelopers cannot write tests for their FLIN apps
DocumentationREDIncomplete, scattered across session logs

The developer experience during development was good -- hot reload, clean error messages, an admin console for database inspection. But two critical tools were missing: a testing framework (developers could not write tests for their FLIN applications) and documentation (there was no comprehensive guide for new developers). These gaps would block adoption.

Ecosystem

SubsystemRatingNotes
AI Gateway (8 providers)GREENStreaming, function calling, structured output
Email (SMTP)GREENsend_email() with HTML support
Stripe integrationGREYDoes not exist (added later)
Image processingGREYDoes not exist (added later)
PDF generationGREENgenerate_pdf() with templates
Cron jobsGREENCron expressions, immediate/scheduled/recurring
WebhooksGREYDoes not exist (added later)
Package systemGREYDoes not exist

The ecosystem had strong foundations (AI, email, PDF, cron) but lacked critical business integrations. No payment processing, no image handling, no webhooks. These would be added in the Phase 2 roadmap.

The Numbers

At Session 158, the project statistics were:

Compiler + Runtime:     ~45,000 lines of Rust
Test suite:             2,876 tests (all passing)
Native functions:       340+
Opcodes:                120+
Entity decorators:      25
Embedded components:    180
Embedded icons:         1,675
Sessions completed:     158
Calendar days:          25 (from December 22, 2025)

These numbers told a story of extraordinary velocity. In 25 calendar days, working an average of 6 sessions per day, we had built a compiler, a VM, a database engine, an HTTP server, a template engine, a search system, an AI gateway, and a security layer. The test count of 2,876 reflected a commitment to quality -- every feature was tested as it was built.

But numbers do not tell the whole story. The test suite, for all its size, was heavily skewed toward unit tests. Integration tests -- tests that exercise multiple subsystems working together -- represented only 15% of the total. And end-to-end tests -- tests that start an HTTP server, make requests, and verify responses -- represented less than 5%.

The Gap Analysis

We distilled the audit into a prioritized gap list:

Must Fix Before Any Production Use

1. Database migrations. Without migrations, schema changes destroy data. This is a non-starter for any application with persistent data.

2. CSRF protection. Forms without CSRF tokens are vulnerable to cross-site request forgery. Every application with login forms needs this.

3. Security headers. The absence of OWASP-recommended headers (CSP, HSTS, X-Frame-Options) is a hard "no" from any security review.

4. Atomic cascading deletes. A crash mid-cascade leaves orphaned records. This violates data integrity guarantees.

Must Fix Before Developer Adoption

5. Testing framework. Developers need to write tests for their applications. Without flin test, there is no confidence in deployments.

6. Documentation. A comprehensive guide covering entities, routing, templates, guards, search, and deployment. Without docs, only we can use FLIN.

7. CORS configuration. The wildcard CORS header blocks any multi-origin deployment.

Should Fix Before v1.0

8. Stripe / payment integration. Revenue-generating applications need payment processing. 9. Image processing. Every application with user-generated content needs thumbnails and format conversion. 10. Webhooks. Inter-service communication is table stakes for modern applications. 11. Structured logging. Production operations require JSON logs with levels and rotation. 12. Deployment guide. Docker, systemd, reverse proxy configuration.

The Honest Assessment

// The state of FLIN at Session 158
state = {
    compiler: "solid",
    runtime: "stable but needs hardening",
    database: "functional but fragile",
    web_server: "surprisingly complete",
    security: "authentication excellent, protection gaps",
    developer_experience: "good for us, unusable for others",
    documentation: "does not exist",
    overall: "impressive prototype, not yet a product"
}

The assessment was sobering but not discouraging. The core of FLIN -- the language, the compiler, the runtime -- was genuinely good. The gaps were in the surrounding infrastructure: migrations, security headers, testing, documentation, deployment. These are solvable problems. They require work, not breakthroughs.

The Path Forward

We created a phased roadmap based on the gap analysis:

Phase 1 -- Alpha 2 (Quick Wins): CORS configuration, Markdown rendering, CSV export, client-side form validation, cursor-based pagination, deployment guide. Small-to-medium items that each take one session.

Phase 2 -- Beta (Production Readiness): Testing framework, migrations, caching layer, email templates, webhooks, Stripe, image processing, structured logging, graceful shutdown, security headers. Medium-to-large items that require multiple sessions each.

Phase 3 -- Release Candidate (Scale and Polish): Plugin system, multi-tenancy, performance profiling, push notifications, internationalization. Enterprise-grade features for the long tail.

The MVP review at Session 158 was a turning point. Before it, we built features. After it, we built a product. The distinction is that a product is something other people can use -- not just the people who built it.

What the MVP Review Taught Us

Building a programming language is an exercise in scope management. There are always more features to build, more edge cases to handle, more optimizations to make. The MVP review forced us to distinguish between what is essential and what is aspirational.

Essential: the compiler works, the data is safe, the server does not crash, a developer can build and deploy an application.

Aspirational: a plugin ecosystem, multi-tenancy, real-time collaboration, visual query builders.

The gap between essential and aspirational is where good engineering judgment lives. Session 158 was where we exercised that judgment, and the project was better for it.

---

This is Part 184 of the "How We Built FLIN" series, documenting how a CEO in Abidjan and an AI CTO designed and built a programming language from scratch.

Series Navigation: - [183] Production Hardening Phase 3: Performance - [184] MVP Status Review: What's Ready and What's Not (you are here) - [185] Integration Tests Complete

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles