Flare

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 / 94

Who is telling it

Muke JohnBaptist (JB)

Fullstack engineer · Kampala, Uganda

flare-docs.codetotech.com02 / 94

And what I do when nobody is paying me

Thirteen are open. All take pull requests.

Over two thousand commits, MIT, and every one has issues nobody has taken — including this one.

flare-docs.codetotech.com03 / 94

A show of hands

Who here builds with Next.js?

Keep them up.

flare-docs.codetotech.com04 / 94

Second question

Why do you love it?

Shout them out.

flare-docs.codetotech.com05 / 94

The 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

flare-docs.codetotech.com06 / 94

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 / 94

If 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 / 94

Because 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 / 94

The list

Your six

The developer problems. You have met every one of them.

flare-docs.codetotech.com10 / 94

Developer problems · the top six

01The CRUD hell

02Auth, again

03Types written four times

04The admin built last

05File storage, never simple

06Copy and paste

flare-docs.codetotech.com11 / 94

Your six · 01

  1. 01The CRUD hell
  2. 02Auth, again
  3. 03Types written four times
  4. 04The admin built last
  5. 05File storage, never simple
  6. 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.

flare-docs.codetotech.com12 / 94

Your six · 02

  1. 01The CRUD hell
  2. 02Auth, again
  3. 03Types written four times
  4. 04The admin built last
  5. 05File storage, never simple
  6. 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.

flare-docs.codetotech.com13 / 94

Your six · 03

  1. 01The CRUD hell
  2. 02Auth, again
  3. 03Types written four times
  4. 04The admin built last
  5. 05File storage, never simple
  6. 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.

flare-docs.codetotech.com14 / 94

Your six · 04

  1. 01The CRUD hell
  2. 02Auth, again
  3. 03Types written four times
  4. 04The admin built last
  5. 05File storage, never simple
  6. 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.

flare-docs.codetotech.com15 / 94

Your six · 05

  1. 01The CRUD hell
  2. 02Auth, again
  3. 03Types written four times
  4. 04The admin built last
  5. 05File storage, never simple
  6. 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.

flare-docs.codetotech.com16 / 94

Your six · 06

  1. 01The CRUD hell
  2. 02Auth, again
  3. 03Types written four times
  4. 04The admin built last
  5. 05File storage, never simple
  6. 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.

flare-docs.codetotech.com17 / 94

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 / 94

So

What if there were a different way to start?

Not a different framework. A different first day.

flare-docs.codetotech.com19 / 94

Introducing

Flare

The fastest way to ship a full-stack app on Next.js or Cloudflare.

flare-docs.codetotech.com20 / 94

Wait — 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 / 94

So 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 / 94

So, 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 / 94

What 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.

flare-docs.codetotech.com24 / 94

The difference

Where the family stopped

  • scaffold gives 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 / 94

Where 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 / 94

Step 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.

flare-docs.codetotech.com27 / 94

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.

flare-docs.codetotech.com28 / 94

What that one flag changes · two stacks, one description

Next.js · the defaultCloudflare
Runs onVercel, real NodeWorkers, every location
DatabaseNeon — serverless PostgresD1 — SQLite
ORMPrisma 7Drizzle
CacheUpstash RedisWorkers KV
FilesR2 or UploadThingR2
Bill, app this sizeVercel + Neon + Upstash~$0–5/month
Pick it whenyou need Postgres or an npm package that assumes Nodecost and reach matter most

Everything else — auth, the dashboard, your descriptors, hooks, components — is identical.

flare-docs.codetotech.com29 / 94

Start small

Two tables.
Two commands.

Before the real brief, the smallest app that is still an app.

flare-docs.codetotech.com30 / 94

The 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 / 94

Design the tables — which is the only real thinking here

TableFields
groupsname — required, and no two the same
contactsname, 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 / 94

Transcribe 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.

flare-docs.codetotech.com33 / 94

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.

flare-docs.codetotech.com34 / 94

And inside the quotes

`<field>:<type><modifiers>`

In that commandReads as
name:stringa 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 / 94

Those 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 / 94

Run 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 / 94

So — 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 / 94

The field grammar · one sentence per table

WrittenGives you
string · text · markdowna 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 · ratingnumbers — and money as integer minor units
boolean · date · datetimea 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 / 94

The field grammar · and the rest of it

WrittenGives you
tags · jsonfree-form labels, and an arbitrary object
file:[image,pdf]:5mbupload: 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 == cancelleda 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 / 94

Field 01 · text

string, text, markdown

WrittenThe columnIn the form
name:stringvarchar — one line, requireda single-line input
bio:text?text — any length, nullablea textarea that grows
body:markdowntext, with the format recordeda 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.

flare-docs.codetotech.com41 / 94

Field 02 · the formats

Text that knows what it is

WrittenWhat 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:countrya 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.

flare-docs.codetotech.com42 / 94

Field 03 · numbers

int, float — and the three shorthands

WrittenThe columnIn the form
age:int?integera number input, steppers, integers only
weight:float?reala number input that accepts decimals
fee:moneyinteger minor units — cents, not dollarsa currency input with grouped digits
rate:percent?a number, stored as the numbera per-cent suffix on the input
score:rating?integer, 1–5stars 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.

flare-docs.codetotech.com43 / 94

Field 04 · boolean

A yes or a no

WrittenThe columnIn the form
active:booleanboolean, defaults to falsea switch — on or off, never empty
active:boolean?boolean, nullablea 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 / 94

Field 05 · dates

date, datetime

WrittenThe columnIn the form
birthday:date?a calendar date — no time, no zonea date picker
scheduledAt:datetimean instant, stored UTCa 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.

flare-docs.codetotech.com45 / 94

Field 06 · closed lists

enum, radio, multiselect

WrittenThe columnIn the form
status:enum(booked,seen,cancelled)text, plus a CHECK constrainta dropdown with exactly those three
gender:radio(male,female,other)the same column, a different widgetradio buttons, every option visible
symptoms:multiselect(fever,cough,pain)a JSON arraycheckboxes — any number of them
select(a,b)an alias for enumthe 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 / 94

Field 07 · the open-ended two

tags, json

WrittenThe columnIn the form
labels:tags?a JSON array of stringsa tag input — type, press enter, chips appear
meta:json?a JSON object, unvalidateda 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.

flare-docs.codetotech.com47 / 94

Field 08 · uploads — the one with the most hidden work

WrittenWhat it generates
photo:file:[image]bucket wiring, a signed upload URL, MIME check — 10MB default cap
scan:file:[image,pdf]:20mbtwo accepted kinds, and a cap of your own
doc:file:[document,spreadsheet]?the size is optional — only the list of kinds is required
the kindsimage pdf video audio csv document spreadsheet archive any
in the forma 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 / 94

Field 09 · relations

belongsTo, hasMany

WrittenThe columnIn the form
patient:belongsTo(Patient)patientId, a foreign key and an indexa searchable picker, not a raw id box
doctor:belongsTo(Doctor)?the same, nullablea picker you can clear
visits:hasMany(Visit)no column — it is the other sidea 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.

flare-docs.codetotech.com49 / 94

Field 10 · the two marks, and the clause

! ? and if

WrittenMeans
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 == cancelledthe 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 / 94

Prove it

A Patient
Management System

A real brief, built the Flare way, in front of you.

flare-docs.codetotech.com51 / 94

Same 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 / 94

The 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 / 94

The design: seven tables

The whole system

01patientsThe person, and their photo
02doctorsWho sees them, and their licence
03appointmentsA booking, with a statuspatient · doctor
04visitsWhat actually happenedappointment
05prescriptionsWhat was given, and how oftenvisit
06invoicesWhat it costspatient · visit
07paymentsWhat was paid, and howinvoice
flare-docs.codetotech.com54 / 94

Table 1 of 7 · patients

The person

FieldTypeWhy
nametext, required—
phonetext, uniquehow the clinic reaches them
dateOfBirthdatea paediatric dose depends on it
sexfemale | malea closed list, not free text
photoimage, max 5MBthe receptionist matches a face to a file
allergieslong text, optionalthe field a doctor reads first
flare-docs.codetotech.com55 / 94

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.

flare-docs.codetotech.com56 / 94

Table 2 of 7 · doctors

Who sees them

FieldTypeWhy
nametext, required—
emailemail, uniqueone account per doctor
specialtya closed list of fivedrives who can be booked for what
licenceNumbertext, uniquea clinic is inspected on this
activetrue | falsea locum leaves; the history stays
flare-docs.codetotech.com57 / 94

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.

flare-docs.codetotech.com58 / 94

Table 3 of 7 · appointments

The booking — and the first relationship

FieldTypeWhy
patientId→ patientsrestrict: you cannot delete a booked patient
doctorId→ doctors—
scheduledFordate and time—
statusbooked | arrived | seen | cancelled | noShowthe front desk runs on this
cancelledBecausetext — only when cancelledan empty reason is a complaint waiting to happen
flare-docs.codetotech.com59 / 94

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.

flare-docs.codetotech.com60 / 94

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 / 94

Table 4 of 7 · visits

What actually happened

FieldTypeWhy
appointmentId→ appointmentsa visit only exists for a booking
complaintlong textin the patient's words
diagnosistextin the doctor's
followUptrue | false—
followUpOndate — only when followUpa date on a visit needing no follow-up is noise
flare-docs.codetotech.com62 / 94

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.

flare-docs.codetotech.com63 / 94

Table 5 of 7 · prescriptions

What was given

FieldTypeWhy
visitId→ visitsa prescription belongs to a visit
drugtext, required—
dosagetextin units the pharmacist reads
frequencytext“1 × 3, after meals”
daysnumberhow long the course runs
flare-docs.codetotech.com64 / 94

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.

flare-docs.codetotech.com65 / 94

Table 6 of 7 · invoices

What it costs

FieldTypeWhy
patientId→ patients—
visitId→ visitsan invoice bills a visit
amountmoneynot a float — next slide shows why
statusdraft | sent | paid | overdue—
flare-docs.codetotech.com66 / 94

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 / 94

invoices · 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.

flare-docs.codetotech.com68 / 94

Table 7 of 7 · payments

What was paid, and how

FieldTypeWhy
invoiceId→ invoices—
amountmoneypartial payments are normal
methodcash | mobileMoney | card | insurancea Ugandan clinic takes all four
claimNumbertext — only when insuranceuseless on cash, required on a claim
flare-docs.codetotech.com69 / 94

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 / 94

And 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 / 94

Step by step

From commands
to a running clinic

Migrate, seed, run, share, deploy — in order.

flare-docs.codetotech.com72 / 94

The 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

flare-docs.codetotech.com73 / 94

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 / 94

Step 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 / 94

Step 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 / 94

Step 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 / 94

Step 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 / 94

Step 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.dev

Migrations, the deploy, then any secret you forgot — generated, not googled. Nothing to click on a dashboard.

flare-docs.codetotech.com79 / 94

The same command, two honestly different jobs

Next.jsCloudflare
flare deploy isvercel deploy --prodmigrate, upload, then secrets
Migrationsflare migrate — you run it, deliberatelyrun for you, D1 remote, in order
Secretsset once in the Vercel projectpushed from .dev.vars; the auth secret generated if missing
DatabaseNeon — you paste the URL onceD1 — created and bound by create
Storage · cacheR2 or UploadThing · UpstashR2 · KV, both bound already
You end up withclinic.vercel.appclinic.you.workers.dev

Vercel already owns the build, the env and the project — so Flare does not pretend to.

flare-docs.codetotech.com80 / 94

And 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 / 94

So — 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 / 94

One more thing

And if you build
with an agent

Which, let us be honest, is most of us now.

flare-docs.codetotech.com83 / 94

Why 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 / 94

But 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 wrangler in 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 / 94

So 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 / 94

What 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 / 94

Three 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 / 94

The 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 hooks or policies

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 / 94

Before 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 / 94

Which 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 / 94

Where 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

flare-docs.codetotech.com92 / 94

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 / 94

Thank you

Flare

pnpm create flare-framework clinic · flare-docs.codetotech.com · github.com/MUKE-coder/flare-framework


Muke JohnBaptist

flare-docs.codetotech.com94 / 94
1 / 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.