JS Meetup · 2026
Flare, as presented
The whole talk, as a story: why the room loves Next.js, the blank canvas every real project starts on, six developer problems and four client expectations — and then a Patient Management System built table by table, one Flare command each, run, seeded and deployed.
JS Meetup · 2026
Flare Framework
The fastest way to ship a full-stack app on Next.js or Cloudflare.
Muke JohnBaptist · Desishub
flare-docs.codetotech.com01 / 94Who is telling it

Muke JohnBaptist (JB)
Fullstack engineer · Kampala, Uganda
- Founder of Desishub Technologies
- 30+ client projects shipped across four countries
- 30+ products sold online — $19k in product sales alone
DGateway— MTN, Airtel and Stripe payments, over 100M in transactionsFlare— the framework this talk is aboutGrit— its Go sibling- 10,310 contributions across 567 repositories — 12+ open source projects
- JB WEB DEVELOPER on YouTube — 16K subscribers
And what I do when nobody is paying me
Thirteen are open. All take pull requests.
- Grit1,288 commitssitecode
- Flare234 commitssitecode
- Scout142 commitssitecode
- Orbita107 commitssitecode
- Vibekit91 commitssitecode
- JEditor83 commitssitecode
- Simple UI79 commitssitecode
- Sentinel47 commitssitecode
- Pulse40 commitscode
- Zenith34 commitssitecode
- GORM Studio28 commitssitecode
- Beautiful Banner Ads20 commitsnpmcode
- Optimised Uploadsnpm
Over two thousand commits, MIT, and every one has issues nobody has taken — including this one.
flare-docs.codetotech.com03 / 94A show of hands
Who here builds with Next.js?
Keep them up.
flare-docs.codetotech.com04 / 94Second question
Why do you love it?
Shout them out.
flare-docs.codetotech.com05 / 94The answers that always come up
01One app — frontend and backend together
02Deploy the whole thing free; cheap to run
03File-based routing, zero config
04Server and client in one file
05It's just React
06Everyone hires for it
And it's all true
Next.js earned this room.
So nothing tonight is against it. Tonight is about what happens after you pick it — on day one of a real project.
flare-docs.codetotech.com07 / 94If you have built full-stack, you know this feeling
The blank canvas.
A new client. An empty folder. And you already know everything this project owes you before the first feature: auth, a database, an admin, uploads, roles, a deploy.
flare-docs.codetotech.com08 / 94Because a real project
comes with a to-do list
nobody put on the quote.
Six of them. Every one is work you have done before, and not one of them is the thing the client is paying for.
flare-docs.codetotech.com09 / 94The list
Your six
The developer problems. You have met every one of them.
flare-docs.codetotech.com10 / 94Developer problems · the top six
01The CRUD hell
02Auth, again
03Types written four times
04The admin built last
05File storage, never simple
06Copy and paste
Your six · 01
- 01The CRUD hell
- 02Auth, again
- 03Types written four times
- 04The admin built last
- 05File storage, never simple
- 06Copy and paste
The CRUD hell.
Model. Validators. Routes. A table. A form. Then the same five ceremonies for the next entity, and the next. By the tenth table you are not programming — you are transcribing.
Your six · 02
- 01The CRUD hell
- 02Auth, again
- 03Types written four times
- 04The admin built last
- 05File storage, never simple
- 06Copy and paste
Auth is a week
you cannot bill.
Sign-up, reset emails, sessions, two-factor. Identical on every project — and dangerous on every project, because auth is where a shortcut becomes a headline.
Your six · 03
- 01The CRUD hell
- 02Auth, again
- 03Types written four times
- 04The admin built last
- 05File storage, never simple
- 06Copy and paste
The same shape,
spelled four times.
The Prisma model. The Zod schema for create. Another for update, all optional. The type the form uses. Four descriptions of one thing, kept in step by memory.
Your six · 04
- 01The CRUD hell
- 02Auth, again
- 03Types written four times
- 04The admin built last
- 05File storage, never simple
- 06Copy and paste
The admin panel
is built last.
It is the screen the client spends their working day in — and it is built by whoever is free, on the last Friday, out of whatever components are lying around.
Your six · 05
- 01The CRUD hell
- 02Auth, again
- 03Types written four times
- 04The admin built last
- 05File storage, never simple
- 06Copy and paste
File storage is never
just file storage.
A bucket. A signed URL. A size cap. And a check on what is actually in the file — because an .exe renamed to .jpg has exactly the extension you asked for.
Your six · 06
- 01The CRUD hell
- 02Auth, again
- 03Types written four times
- 04The admin built last
- 05File storage, never simple
- 06Copy and paste
Copy and paste,
and the fix that cannot travel.
You cope by copying the last project, or buying a template. Then you fix a session bug in March — in one repository. The other four are in production, and there is no mechanism that carries the fix to them.
The honest answer to all six
“Yes — in about three weeks.”
Which the client hears as a no. So the security, the audit and the polish are promised for phase two — and phase two never arrives.
flare-docs.codetotech.com18 / 94So
What if there were a different way to start?
Not a different framework. A different first day.
flare-docs.codetotech.com19 / 94Introducing
Flare
The fastest way to ship a full-stack app on Next.js or Cloudflare.
flare-docs.codetotech.com20 / 94Wait — a framework?
Why that word makes you flinch
- Breaking changes every major version
- Abstractions you end up fighting
- Magic you cannot debug
- Lock-in you cannot leave
- And the rewrite when it dies
Every one of these is a scar, not a hypothetical.
flare-docs.codetotech.com21 / 94So here is the deal
Flare's answer to all five
- Nothing of Flare runs in production
- Plain Next.js code, in your repo
- The engine: ~800 readable lines, copied into the app
- Upgrades are a diff you read, not a version you pray over
- Delete the CLI — the app still builds
No runtime to be trapped by, because there is no runtime.
flare-docs.codetotech.com22 / 94So, honestly
Flare, the framework
Delete the CLI tomorrow, and your code keeps working. That is the test — and it is the whole philosophy in one sentence.
flare-docs.codetotech.com23 / 94What it actually is
A code generator — from a proud old family.
Rails gave us scaffold. Django gave us the admin. Laravel gave us artisan make. Twenty years of proof that generating the boring parts works.
The difference
Where the family stopped
scaffoldgives you a model and a controller — one layer- The admin lives inside the framework, not in your code
- Regenerate, and your edits are overwritten
- One language, one runtime, their server
Flare keeps going on all four. The first one is the big one.
flare-docs.codetotech.com25 / 94Where Flare keeps going
One command writes the whole vertical slice
- The model — schema, migration, validators, types
- The controller — a REST API, with auth and roles already on it
- The view — list, create, edit and detail pages, and the forms
- Plus the parts MVC never named: a typed client, hooks, seeds, a policy file
Full MVC and then some, in your repository — and your edits are detected as drift, never lost. The same description deploys to Next.js or Cloudflare.
flare-docs.codetotech.com26 / 94Step zero · install
npm install -g @flaredev/cli flare --version
Node 22+, and that is the whole install. Or skip it: every command below runs through npx flare with nothing installed.
Step one · create the app, on either stack
# Next.js on Vercel — the default pnpm create flare-framework clinic cd clinic # Cloudflare Workers — one flag pnpm create flare-framework clinic --stack cloudflare cd clinic
One flag is the entire difference at the command line. create scaffolds a working app either way: sign-in, a database, an admin shell and the bindings — before any resource exists.
What that one flag changes · two stacks, one description
| Next.js · the default | Cloudflare | |
|---|---|---|
| Runs on | Vercel, real Node | Workers, every location |
| Database | Neon — serverless Postgres | D1 — SQLite |
| ORM | Prisma 7 | Drizzle |
| Cache | Upstash Redis | Workers KV |
| Files | R2 or UploadThing | R2 |
| Bill, app this size | Vercel + Neon + Upstash | ~$0–5/month |
| Pick it when | you need Postgres or an npm package that assumes Node | cost and reach matter most |
Everything else — auth, the dashboard, your descriptors, hooks, components — is identical.
flare-docs.codetotech.com29 / 94Start small
Two tables.
Two commands.
Before the real brief, the smallest app that is still an app.
flare-docs.codetotech.com30 / 94The brief
A contacts app.
Groups have a name. Contacts have a name, a phone and an email, and belong to a group. That is the entire specification.
flare-docs.codetotech.com31 / 94Design the tables — which is the only real thinking here
| Table | Fields |
|---|---|
groups | name — required, and no two the same |
contacts | name, phone, email — unique, and the group it belongs to |
Two tables. Read them aloud and you have already written the commands — that is the whole method, and the clinic later is the same thing seven times.
flare-docs.codetotech.com32 / 94Transcribe them
npx flare gen resource Group \ --fields 'name:string!' npx flare gen resource Contact \ --fields 'name:string, phone:tel?, email:email!, group:belongsTo(Group)?'
Groups first: a belongsTo needs something to point at. ! is unique, ? is optional, tel and email validate themselves.
That command, piece by piece
npx flare gen resource <Name> --fields '<field>:<type><modifiers>, …'
╰── verb ──╯ ╰name╯ ╰───── the table design ─────╯
# the one you just ran
npx flare gen resource Contact \
--fields 'name:string, phone:tel?, email:email!, group:belongsTo(Group)?'Contact becomes the contacts table, /api/contacts, and Contacts in the sidebar — you name it once. Two optional flags decide where it sits: --icon and --group.
And inside the quotes
`<field>:<type><modifiers>`
| In that command | Reads as |
|---|---|
name:string | a required line of text |
phone:tel? | ? — optional: nullable, and not demanded by the form |
email:email! | ! — unique: a constraint in the database, not a check in the form |
group:belongsTo(Group)? | a relation: a foreign key, an index, and a searchable picker |
Four fields, four decisions, one line. Every type there is comes two slides from now — these are the four you need to read anything else in this talk.
flare-docs.codetotech.com35 / 94Those two commands wrote
Twenty files. None of them by hand.
Two tables and their migrations. Validators. Eight API routes. A typed client. Eight admin screens — list, create, edit, detail, each with a loading skeleton shaped like it. And a policy, admin-only until you open it.
flare-docs.codetotech.com36 / 94Run it
npx flare migrate npx flare seed:resource Group 5 npx flare seed:resource Contact 40 npx flare dev
localhost:3000 — sign in, and there is a contacts app: a group picker, a working email field, tables that sort, filter, page and export.
flare-docs.codetotech.com37 / 94So — the uncomfortable question
How long would those two tables have taken you?
Not the thinking. The typing: the schema, the migration, the validation, the routes, the forms, the list with its empty state. An afternoon, honestly, and you have built it before.
flare-docs.codetotech.com38 / 94The field grammar · one sentence per table
| Written | Gives you |
|---|---|
string · text · markdown | a line, a paragraph, or a Markdown editor |
email url tel slug color country … | text with the right keyboard, validator and widget |
int · float · money · percent · rating | numbers — and money as integer minor units |
boolean · date · datetime | a switch, and date pickers with or without a time |
enum(a,b) · radio(a,b) · multiselect(a,b) | a closed list: dropdown, radios, or many-of |
Half the language. One more slide, then we take them one at a time.
flare-docs.codetotech.com39 / 94The field grammar · and the rest of it
| Written | Gives you |
|---|---|
tags · json | free-form labels, and an arbitrary object |
file:[image,pdf]:5mb | upload: bucket, signed URL, type and size checks |
belongsTo(Model) · hasMany(Model) | a foreign key and a picker, or a child list |
! · ? | unique, and optional |
… if status == cancelled | a field that only sometimes applies |
Ten rows across two slides, and that is the whole language. Everything else in Flare is derived from it.
flare-docs.codetotech.com40 / 94Field 01 · text
string, text, markdown
| Written | The column | In the form |
|---|---|---|
name:string | varchar — one line, required | a single-line input |
bio:text? | text — any length, nullable | a textarea that grows |
body:markdown | text, with the format recorded | a Markdown editor, and rendered output on the detail page |
string when it fits on a line, text when it does not, markdown when someone will want a heading and a link.
Field 02 · the formats
Text that knows what it is
| Written | What you get for free |
|---|---|
email:email! | format validation, an email keyboard, unique constraint |
phone:tel? | a tel input — phone also works, they are the same field |
site:url? | URL validation, and a clickable link in the table |
brand:color? | a colour swatch picker, stored as hex |
country:country | a searchable country dropdown, ISO codes |
Every one is a text column — the format picks the validator, the keyboard and the widget. Also slug domain username ip uuid timezone locale postcode.
Field 03 · numbers
int, float — and the three shorthands
| Written | The column | In the form |
|---|---|---|
age:int? | integer | a number input, steppers, integers only |
weight:float? | real | a number input that accepts decimals |
fee:money | integer minor units — cents, not dollars | a currency input with grouped digits |
rate:percent? | a number, stored as the number | a per-cent suffix on the input |
score:rating? | integer, 1–5 | stars you click |
money is the one that matters: never a float. 19.99 cannot be represented exactly in binary, and a clinic's invoices are not the place to discover that.
Field 04 · boolean
A yes or a no
| Written | The column | In the form |
|---|---|---|
active:boolean | boolean, defaults to false | a switch — on or off, never empty |
active:boolean? | boolean, nullable | a switch that can also be unset |
The table column renders it as a badge rather than the word “true”, and the filter bar gets a yes/no toggle for it without being asked.
flare-docs.codetotech.com44 / 94Field 05 · dates
date, datetime
| Written | The column | In the form |
|---|---|---|
birthday:date? | a calendar date — no time, no zone | a date picker |
scheduledAt:datetime | an instant, stored UTC | a date and time picker |
date for a birthday, datetime for an appointment. A birthday with a timezone is how someone ends up a day older in Kampala than in London.
Field 06 · closed lists
enum, radio, multiselect
| Written | The column | In the form |
|---|---|---|
status:enum(booked,seen,cancelled) | text, plus a CHECK constraint | a dropdown with exactly those three |
gender:radio(male,female,other) | the same column, a different widget | radio buttons, every option visible |
symptoms:multiselect(fever,cough,pain) | a JSON array | checkboxes — any number of them |
select(a,b) | an alias for enum | the same dropdown |
The database refuses a fourth value — so next year's typo fails loudly instead of quietly adding a status nothing handles.
flare-docs.codetotech.com46 / 94Field 07 · the open-ended two
tags, json
| Written | The column | In the form |
|---|---|---|
labels:tags? | a JSON array of strings | a tag input — type, press enter, chips appear |
meta:json? | a JSON object, unvalidated | a code editor with JSON checking |
tags when the list is open but the values are words. json when you genuinely do not know the shape yet — and knowing you will regret it later is part of choosing it.
Field 08 · uploads — the one with the most hidden work
| Written | What it generates |
|---|---|
photo:file:[image] | bucket wiring, a signed upload URL, MIME check — 10MB default cap |
scan:file:[image,pdf]:20mb | two accepted kinds, and a cap of your own |
doc:file:[document,spreadsheet]? | the size is optional — only the list of kinds is required |
| the kinds | image pdf video audio csv document spreadsheet archive any |
| in the form | a drag-and-drop zone, a progress bar, a preview, and a remove button |
| several files? | one field holds one file — model many as a child table with belongsTo |
The cap is checked twice — in the browser, and on the server against the real bytes. The browser is not a security boundary.
flare-docs.codetotech.com48 / 94Field 09 · relations
belongsTo, hasMany
| Written | The column | In the form |
|---|---|---|
patient:belongsTo(Patient) | patientId, a foreign key and an index | a searchable picker, not a raw id box |
doctor:belongsTo(Doctor)? | the same, nullable | a picker you can clear |
visits:hasMany(Visit) | no column — it is the other side | a list of children on the detail page |
You write patient, Flare writes patientId. The index comes with it, which is the line between a list page that stays fast and one that quietly does not.
Field 10 · the two marks, and the clause
! ? and if
| Written | Means |
|---|---|
email:string! | unique — a database constraint, and a 409 that names the field |
bio:text? | optional — nullable column, optional in the form |
sku:string!? | both, in that order: unique when present |
reason:text if status == cancelled | the field only exists when the condition holds |
Two characters each. Between them they cover most of what you would otherwise write a validator for — and because unique is a database constraint, a race between two requests still cannot create a duplicate.
flare-docs.codetotech.com50 / 94Prove it
A Patient
Management System
A real brief, built the Flare way, in front of you.
flare-docs.codetotech.com51 / 94Same question, seven times the size
And how long would this one take?
Patients, doctors, appointments, visits, prescriptions, invoices, payments. Auth, admin, uploads, roles, deploy. Think of your real number — with meetings in it.
flare-docs.codetotech.com52 / 94The Flare way
Understand three things: the tables, their fields, and how they relate.
That is the real work — and you were always going to do it. You just did it for contacts in thirty seconds. Flare's job is to translate that understanding directly into code.
flare-docs.codetotech.com53 / 94The design: seven tables
The whole system
Table 1 of 7 · patients
The person
| Field | Type | Why |
|---|---|---|
| name | text, required | — |
| phone | text, unique | how the clinic reaches them |
| dateOfBirth | date | a paediatric dose depends on it |
| sex | female | male | a closed list, not free text |
| photo | image, max 5MB | the receptionist matches a face to a file |
| allergies | long text, optional | the field a doctor reads first |
patients · as a command
npx flare gen resource Patient --icon user-round --group Clinic \
--fields 'name:string!, phone:tel!, dateOfBirth:date,
sex:enum(female,male),
photo:file:[image]:5mb?, allergies:text?'tel validates per country. ! on phone: unique. file:[image]:5mb? is the bucket, the signed URL, the size cap and the leading-bytes check — optional, because not everyone has a photo.
Table 2 of 7 · doctors
Who sees them
| Field | Type | Why |
|---|---|---|
| name | text, required | — |
| email, unique | one account per doctor | |
| specialty | a closed list of five | drives who can be booked for what |
| licenceNumber | text, unique | a clinic is inspected on this |
| active | true | false | a locum leaves; the history stays |
doctors · as a command
npx flare gen resource Doctor --icon stethoscope --group Clinic \
--fields 'name:string!, email:email!,
specialty:enum(gp,paediatrics,dental,gyn,surgery),
licenceNumber:string!, active:boolean'email is a type of its own: format validation and a mailto link in the admin. Two ! fields — two unique constraints.
Table 3 of 7 · appointments
The booking — and the first relationship
| Field | Type | Why |
|---|---|---|
| patientId | → patients | restrict: you cannot delete a booked patient |
| doctorId | → doctors | — |
| scheduledFor | date and time | — |
| status | booked | arrived | seen | cancelled | noShow | the front desk runs on this |
| cancelledBecause | text — only when cancelled | an empty reason is a complaint waiting to happen |
appointments · as a command
npx flare gen resource Appointment --icon calendar-clock --group Clinic \
--fields 'patient:belongsTo(Patient), doctor:belongsTo(Doctor),
scheduledFor:datetime,
status:enum(booked,arrived,seen,cancelled,noShow),
cancelledBecause:string if status == cancelled'belongsTo is the foreign key, its index, and a searchable picker in the form. The if clause is checked at generation time: cancelled must be one of the statuses, or no file is written.
That if clause, in full
One clause. Three behaviours. Zero disagreements.
The form shows the field only when cancelled. The validator requires it only when cancelled. And when a booking is edited away from cancelled, the store clears it — so last week's reason never haunts the row.
flare-docs.codetotech.com61 / 94Table 4 of 7 · visits
What actually happened
| Field | Type | Why |
|---|---|---|
| appointmentId | → appointments | a visit only exists for a booking |
| complaint | long text | in the patient's words |
| diagnosis | text | in the doctor's |
| followUp | true | false | — |
| followUpOn | date — only when followUp | a date on a visit needing no follow-up is noise |
visits · as a command
npx flare gen resource Visit --icon clipboard-list --group Clinic \
--fields 'appointment:belongsTo(Appointment),
complaint:text, diagnosis:string,
followUp:boolean,
followUpOn:date if followUp == true'text is the long-text column with a textarea; string the short one. The conditional date works exactly like the cancellation reason.
Table 5 of 7 · prescriptions
What was given
| Field | Type | Why |
|---|---|---|
| visitId | → visits | a prescription belongs to a visit |
| drug | text, required | — |
| dosage | text | in units the pharmacist reads |
| frequency | text | “1 × 3, after meals” |
| days | number | how long the course runs |
prescriptions · as a command
npx flare gen resource Prescription --icon pill --group Clinic \
--fields 'visit:belongsTo(Visit), drug:string!,
dosage:string, frequency:string, days:int'int is a whole number: integer column, stepper input, no decimals accepted.
Table 6 of 7 · invoices
What it costs
| Field | Type | Why |
|---|---|---|
| patientId | → patients | — |
| visitId | → visits | an invoice bills a visit |
| amount | money | not a float — next slide shows why |
| status | draft | sent | paid | overdue | — |
What a float thinks money is
0.07 + 0.07 + 0.07 = 0.21000000000000002
Found months later, by whoever reconciles the bank statement. Fixed with a migration and a data repair, in production.
flare-docs.codetotech.com67 / 94invoices · as a command
npx flare gen resource Invoice --icon receipt --group Clinic \
--fields 'patient:belongsTo(Patient), visit:belongsTo(Visit),
amount:money,
status:enum(draft,sent,paid,overdue)'money stores whole minor units — the column only ever sees 120050. The API and forms still speak 1200.50; three extra decimals are a 422, not a silent rounding.
Table 7 of 7 · payments
What was paid, and how
| Field | Type | Why |
|---|---|---|
| invoiceId | → invoices | — |
| amount | money | partial payments are normal |
| method | cash | mobileMoney | card | insurance | a Ugandan clinic takes all four |
| claimNumber | text — only when insurance | useless on cash, required on a claim |
payments · as a command — the last one
npx flare gen resource Payment --icon hand-coins --group Clinic \
--fields 'invoice:belongsTo(Invoice), amount:money,
method:enum(cash,mobileMoney,card,insurance),
claimNumber:string if method == insurance'Seven tables, seven sentences. Every flag on every command was a row in a table you designed.
flare-docs.codetotech.com70 / 94And each of those seven commands wrote
The schema. The migration. Validators. The API. A typed client. Four admin pages.
Twenty files per table, into your repository — the whole vertical slice, with loading skeletons shaped like each screen. The CRUD hell, generated out of existence.
flare-docs.codetotech.com71 / 94Step by step
From commands
to a running clinic
Migrate, seed, run, share, deploy — in order.
flare-docs.codetotech.com72 / 94The whole path
01Create the app
02Generate the seven resources
03flare migrate
04flare seed demo
05flare dev
06First sign-up becomes admin
07flare dev --tunnel
08flare deploy
Step 03 · the database catches up
$ flare migrate 0000_init.sql ✓ 0001_create_patients.sql ✓ 0002_create_doctors.sql ✓ … 0007_create_payments.sql ✓
Plain SQL migrations, written by the generator, applied in order. Readable in review like any migration you wrote yourself.
flare-docs.codetotech.com74 / 94Step 04 · flare seed demo
A clinic that looks like a clinic.
Realistic patients, bookings and invoices — not three rows named “asdf”. Friday's demo stops being a liability the moment the data looks true.
flare-docs.codetotech.com75 / 94Step 05 · flare dev
localhost:3000 — and the admin is already there.
A sign-in page. A sidebar with seven resources. Tables that sort, filter, page and export. Forms with the pickers and the conditional fields. Nobody has opened a component file.
flare-docs.codetotech.com76 / 94Step 06 · the first sign-up
The first account becomes the admin.
Every resource arrives admin-only, enforced by the API and the admin UI from the same policy file. A patient record open to anyone who registers is not a bug you want to find in a clinic.
flare-docs.codetotech.com77 / 94Step 07 · flare dev --tunnel
Show it before you ship it.
Your local app on a public HTTPS link — no account, no DNS, no open ports. The client sees Friday's demo on Wednesday, from their own phone.
flare-docs.codetotech.com78 / 94Step 08 · the last command — on Cloudflare
$ npx flare deploy
flare Applying migrations to clinic-db (remote)
0001_create_patients.sql ✓ … 0007_create_payments.sql ✓
flare Deploying
Uploaded clinic
flare Generating BETTER_AUTH_SECRET for production
Deployed to https://clinic.you.workers.devMigrations, the deploy, then any secret you forgot — generated, not googled. Nothing to click on a dashboard.
flare-docs.codetotech.com79 / 94The same command, two honestly different jobs
| Next.js | Cloudflare | |
|---|---|---|
flare deploy is | vercel deploy --prod | migrate, upload, then secrets |
| Migrations | flare migrate — you run it, deliberately | run for you, D1 remote, in order |
| Secrets | set once in the Vercel project | pushed from .dev.vars; the auth secret generated if missing |
| Database | Neon — you paste the URL once | D1 — created and bound by create |
| Storage · cache | R2 or UploadThing · Upstash | R2 · KV, both bound already |
| You end up with | clinic.vercel.app | clinic.you.workers.dev |
Vercel already owns the build, the env and the project — so Flare does not pretend to.
flare-docs.codetotech.com80 / 94And remember “cheap to run”?
Cloudflare
- Workers, D1, R2
- no cold starts, every location
- a clinic this size: ~$0–5/month
flare deploy
Next.js on Vercel
- Neon Postgres, Prisma
- real Node, every npm package
- the default stack
flare deploy, the same command
The same seven commands, the same descriptors, either home. Pick for the database — everything else travels.
flare-docs.codetotech.com81 / 94So — the number you thought of earlier
The tables took longer than the app.
And the tables were the real work all along. Seven commands, a migrate, a seed, a deploy: the rest of your estimate is now features.
flare-docs.codetotech.com82 / 94One more thing
And if you build
with an agent
Which, let us be honest, is most of us now.
flare-docs.codetotech.com83 / 94Why Flare and agents get along
Less code to write, more structure to follow.
An agent's two failure modes are inventing structure and writing too much of it. Flare removes both: the structure is fixed, and two-thirds of the code is generated before the agent starts.
flare-docs.codetotech.com84 / 94But an agent that has never seen Flare
…will fight it
- Hand-edits the generated blocks, and loses the work on the next
flare gen - Checks roles in the component instead of the policy file
- Reaches for
wranglerin a Next.js app, or Prisma in a Cloudflare one - Writes the CRUD you already had, by hand, confidently
None of that is the agent being bad. It is the agent guessing, because nobody told it.
flare-docs.codetotech.com85 / 94So we wrote it down — as a skill
npx skills add MUKE-coder/flare-framework@flare
One command. It installs a skill your agent loads the moment it notices it is in a Flare app — and it works in Claude Code, Codex, Copilot, Cursor and OpenCode, because the installer puts it where each one looks.
flare-docs.codetotech.com86 / 94What is in it
Everything you have just watched me explain
- The full CLI reference, per stack
- The field grammar — every type on those ten slides
- The seven rules, each with the reasoning, so it knows when they bend
- Recipes: relations, uploads, search, auth, billing, policies
- And the overwrite contract, so it never hand-edits a generated block
The agent does not get smarter. It stops guessing about the things with one right answer.
flare-docs.codetotech.com87 / 94Three ways in, pick any
If you do not want a skill installed
llms.txt— every docs page as one list, in the llmstxt.org format. Point an agent at it- The Build with AI button at the foot of every docs page — copies a full brief to paste into a fresh chat
- Or the skill, which is the same knowledge, loaded automatically
All three carry the same content, generated from the same docs — so a page that exists is a page your agent can find.
flare-docs.codetotech.com88 / 94The honest division of labour
An agent is genuinely good at
- descriptors and fields
- relations and seeds
- the shape of a dashboard page
- the mechanical two-thirds
And will confidently get wrong
- pricing rules
- what a status transition means
- which of two designs is right
- anything in
hooksorpolicies
review those two folders by hand
A mistake in a generated file is a compile error. A mistake in a policy file is a security bug — so that is the third you read line by line.
flare-docs.codetotech.com89 / 94Before you believe all of it
Not there yet
- no multi-tenancy — one clinic per app
- no field-level permissions
- no plugin system
- realtime is Cloudflare-only
on the roadmap, publicly
Known costs
- pre-1.0: the format can still move
- the Cloudflare stack depends on vinext, which is young
- one maintainer
- 190 files before you add anything
written down in the docs
A framework that only lists its strengths is asking you to find the weaknesses yourself, on your own project, at your own cost.
flare-docs.codetotech.com90 / 94Which brings me to the real ask
Flare needs people who will stay.
It is MIT. It is one maintainer. The roadmap is public and bigger than one person: multi-tenancy, field-level permissions, a plugin system. A project becomes real the day it stops being one person's.
flare-docs.codetotech.com91 / 94Where to start, tonight
01Build something this week — file what breaks
02Pick a good-first-issue on GitHub
03Write a guide, or an example app
04Take a roadmap item: tenancy, permissions, plugins
05Teach it — a video, a post, your own meetup
06github.com/MUKE-coder/flare-framework
And tonight
pnpm create flare-framework clinic
Node 22 and pnpm. By the time the kettle boils, you are signing in to your own admin — and you already know all seven commands that come next.
flare-docs.codetotech.com93 / 94Thank you
Flare
pnpm create flare-framework clinic · flare-docs.codetotech.com · github.com/MUKE-coder/flare-framework
Muke JohnBaptist
flare-docs.codetotech.com94 / 94← → to page through, N for speaker notes, F for fullscreen. Every command in the deck was run before it went on a slide.
Build the clinic yourself
The seven commands in the deck are the whole build. The field grammar page documents every type they use, including the conditional fields that only apply sometimes.