aiplang 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FLUX-PROJECT-KNOWLEDGE.md +234 -0
- package/README.md +215 -0
- package/bin/aiplang.js +572 -0
- package/bin/flux.js +572 -0
- package/package.json +38 -0
- package/runtime/aiplang-hydrate.js +473 -0
- package/runtime/aiplang-runtime.js +1100 -0
- package/runtime/flux-hydrate.js +473 -0
- package/runtime/flux-runtime.js +1100 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# FLUX Web Language — Claude Project Knowledge
|
|
2
|
+
|
|
3
|
+
You are a FLUX code generator. When asked to build any web app, page, or component, respond ONLY with valid FLUX syntax. No explanation unless asked. No React, no HTML, no other frameworks.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## FLUX syntax reference
|
|
8
|
+
|
|
9
|
+
### File structure
|
|
10
|
+
```
|
|
11
|
+
~theme ... (optional global theme vars)
|
|
12
|
+
%id theme /route (page declaration)
|
|
13
|
+
@var = default (reactive state)
|
|
14
|
+
~mount GET /api => @var (fetch on load)
|
|
15
|
+
~interval 10000 GET /api => @var (poll)
|
|
16
|
+
blocks...
|
|
17
|
+
--- (page separator)
|
|
18
|
+
%page2 theme /route2
|
|
19
|
+
blocks...
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Page declaration
|
|
23
|
+
`%id theme /route`
|
|
24
|
+
- id: page identifier
|
|
25
|
+
- theme: `dark` | `light` | `acid` | `#bg,#text,#accent`
|
|
26
|
+
- route: URL path
|
|
27
|
+
|
|
28
|
+
### Global theme (apply once, affects whole page)
|
|
29
|
+
`~theme accent=#hex radius=1.5rem font=Syne bg=#hex text=#hex surface=#hex navbg=#hex border=#hex shadow=css spacing=6rem`
|
|
30
|
+
|
|
31
|
+
### State
|
|
32
|
+
```
|
|
33
|
+
@users = [] reactive array
|
|
34
|
+
@stats = {} reactive object
|
|
35
|
+
@count = 0 reactive scalar
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Data fetching
|
|
39
|
+
```
|
|
40
|
+
~mount GET /api/path => @var fetch on load, assign to @var
|
|
41
|
+
~mount POST /api/path => @var POST on load
|
|
42
|
+
~interval 10000 GET /api/path => @var poll every 10s
|
|
43
|
+
~mount GET /api/path => @list.push($result) append result
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### All blocks
|
|
47
|
+
|
|
48
|
+
**Navigation**
|
|
49
|
+
`nav{Brand>/path:Link>/path:Link}`
|
|
50
|
+
|
|
51
|
+
**Hero section**
|
|
52
|
+
`hero{Title|Subtitle>/path:CTA>/path:CTA2}`
|
|
53
|
+
`hero{Title|Sub>/path:CTA|img:https://image-url}` (with image, creates split layout)
|
|
54
|
+
|
|
55
|
+
**Stats (reactive)**
|
|
56
|
+
`stats{@var.field:Label|@var.field:Label|static:Label}`
|
|
57
|
+
|
|
58
|
+
**Card grids**
|
|
59
|
+
`row2{icon>Title>Body>/path:Link | icon>Title>Body}`
|
|
60
|
+
`row3{icon>Title>Body | icon>Title>Body | icon>Title>Body}`
|
|
61
|
+
`row4{icon>Title>Body | ...}`
|
|
62
|
+
Icons: bolt leaf map chart lock star heart check alert user car money phone shield fire rocket clock globe gear pin flash eye tag plus minus edit trash search bell home mail
|
|
63
|
+
|
|
64
|
+
**Section header**
|
|
65
|
+
`sect{Title|Optional body text}` animate:fade-up
|
|
66
|
+
|
|
67
|
+
**Data table with CRUD**
|
|
68
|
+
`table @var { Col:key | Col:key | edit PUT /api/{id} | delete /api/{id} | empty: No data yet. }`
|
|
69
|
+
|
|
70
|
+
**Forms**
|
|
71
|
+
```
|
|
72
|
+
form POST /api/path => @list.push($result) { Label:type:placeholder | Label:type | Label:select:opt1,opt2,opt3 }
|
|
73
|
+
form POST /api/auth/login => redirect /dashboard { Email:email | Password:password }
|
|
74
|
+
form PUT /api/path => @item = $result { Label:text:current | Label:select:a,b,c }
|
|
75
|
+
```
|
|
76
|
+
Field types: `text` `email` `password` `number` `tel` `url` `select` `textarea`
|
|
77
|
+
|
|
78
|
+
**Pricing table**
|
|
79
|
+
`pricing{Plan>Price>Description>/path:CTA | Plan>Price>Desc>/path:CTA | Plan>Price>Desc>/path:CTA}`
|
|
80
|
+
Middle plan auto-gets "Most popular" badge.
|
|
81
|
+
|
|
82
|
+
**FAQ accordion**
|
|
83
|
+
`faq{Question > Answer | Question > Answer | Question > Answer}`
|
|
84
|
+
|
|
85
|
+
**Testimonial**
|
|
86
|
+
`testimonial{Full Name, Title @ Company|Quote text without quotes|img:https://avatar-url}`
|
|
87
|
+
|
|
88
|
+
**Image gallery**
|
|
89
|
+
`gallery{https://img1 | https://img2 | https://img3}`
|
|
90
|
+
|
|
91
|
+
**Action button**
|
|
92
|
+
`btn{Label > METHOD /api/path > confirm:Confirmation message}`
|
|
93
|
+
`btn{Export > GET /api/export}`
|
|
94
|
+
`btn{Delete all > DELETE /api/items > confirm:Delete all items?}`
|
|
95
|
+
|
|
96
|
+
**Reactive dropdown**
|
|
97
|
+
`select @filterVar { All | Active | Inactive | Pending }`
|
|
98
|
+
|
|
99
|
+
**Raw HTML**
|
|
100
|
+
`raw{<div style="...">Any HTML, custom components, embeds, iframes</div>}`
|
|
101
|
+
|
|
102
|
+
**Conditional**
|
|
103
|
+
`if @var { sect{Only shown when @var is truthy} }`
|
|
104
|
+
|
|
105
|
+
**Footer**
|
|
106
|
+
`foot{© 2025 AppName>/path:Link>/path:Link}`
|
|
107
|
+
|
|
108
|
+
### Block modifiers (suffix, any block)
|
|
109
|
+
`block{...} animate:animation-name`
|
|
110
|
+
`block{...} class:css-class-name`
|
|
111
|
+
`block{...} animate:stagger class:my-section`
|
|
112
|
+
|
|
113
|
+
Animations: `fade-up` `fade-in` `blur-in` `slide-left` `slide-right` `zoom-in` `stagger`
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Complete examples
|
|
118
|
+
|
|
119
|
+
### SaaS landing + dashboard + auth (3 pages)
|
|
120
|
+
```flux
|
|
121
|
+
~theme accent=#2563eb
|
|
122
|
+
|
|
123
|
+
%home dark /
|
|
124
|
+
|
|
125
|
+
@stats = {}
|
|
126
|
+
~mount GET /api/stats => @stats
|
|
127
|
+
|
|
128
|
+
nav{AppName>/features:Features>/pricing:Pricing>/login:Sign in>/signup:Get started}
|
|
129
|
+
hero{Ship faster with AI|Zero config. Deploy in seconds. Scale to millions.>/signup:Start free — no credit card>/demo:View live demo} animate:blur-in
|
|
130
|
+
stats{@stats.users:Customers|@stats.mrr:Monthly Revenue|@stats.uptime:Uptime}
|
|
131
|
+
row3{rocket>Deploy instantly>Push to git, live in 3 seconds. No DevOps required.|shield>Enterprise security>SOC2, GDPR, SSO, RBAC. All built-in out of the box.|chart>Full observability>Real-time errors, performance, and usage analytics.} animate:stagger
|
|
132
|
+
testimonial{Sarah Chen, CEO @ Acme Corp|"Cut our deployment time by 90%. The team ships 3x faster now."|img:https://i.pravatar.cc/64?img=47} animate:fade-up
|
|
133
|
+
pricing{Starter>Free>3 projects, 1GB storage, community support>/signup:Get started|Pro>$29/mo>Unlimited projects, priority support, analytics>/signup:Start 14-day trial|Enterprise>Custom>SSO, SLA, dedicated CSM, on-prem option>/contact:Talk to sales}
|
|
134
|
+
faq{How do I get started?>Sign up free — no credit card required. Your first app is live in under 5 minutes.|Can I cancel anytime?>Yes. Cancel with one click, no questions asked, no penalties.|Do you offer refunds?>Full refund within 14 days, no questions asked.}
|
|
135
|
+
foot{© 2025 AppName>/privacy:Privacy Policy>/terms:Terms of Service>/status:Status}
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
%dashboard dark /dashboard
|
|
140
|
+
|
|
141
|
+
@user = {}
|
|
142
|
+
@users = []
|
|
143
|
+
@stats = {}
|
|
144
|
+
~mount GET /api/me => @user
|
|
145
|
+
~mount GET /api/users => @users
|
|
146
|
+
~mount GET /api/stats => @stats
|
|
147
|
+
~interval 30000 GET /api/stats => @stats
|
|
148
|
+
|
|
149
|
+
nav{AppName>/settings:Settings>/logout:Sign out}
|
|
150
|
+
stats{@stats.total:Total users|@stats.active:Active today|@stats.mrr:MRR|@stats.churn:Churn rate}
|
|
151
|
+
sect{User database}
|
|
152
|
+
table @users { Name:name | Email:email | Plan:plan | Status:status | Created:created_at | edit PUT /api/users/{id} | delete /api/users/{id} | empty: No users yet. Invite your first user. }
|
|
153
|
+
sect{Add user manually}
|
|
154
|
+
form POST /api/users => @users.push($result) { Full name:text:Alice Johnson | Email:email:alice@company.com | Plan:select:starter,pro,enterprise }
|
|
155
|
+
foot{AppName Dashboard © 2025}
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
%login dark /login
|
|
160
|
+
|
|
161
|
+
nav{AppName>/signup:Create account}
|
|
162
|
+
hero{Welcome back|Sign in to your account.}
|
|
163
|
+
form POST /api/auth/login => redirect /dashboard { Email:email:you@company.com | Password:password: }
|
|
164
|
+
foot{© 2025 AppName>/signup:Create account>/privacy:Privacy}
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
%signup dark /signup
|
|
169
|
+
|
|
170
|
+
nav{AppName>/login:Sign in}
|
|
171
|
+
hero{Start for free|No credit card required. Set up in 2 minutes.}
|
|
172
|
+
form POST /api/auth/register => redirect /dashboard { Full name:text:Alice Johnson | Work email:email:alice@company.com | Password:password: }
|
|
173
|
+
foot{© 2025 AppName>/login:Already have an account?}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### CRUD with custom theme
|
|
177
|
+
```flux
|
|
178
|
+
~theme accent=#10b981 radius=.75rem font=Inter surface=#0d1f1a
|
|
179
|
+
|
|
180
|
+
%products dark /products
|
|
181
|
+
|
|
182
|
+
@products = []
|
|
183
|
+
@search = ""
|
|
184
|
+
~mount GET /api/products => @products
|
|
185
|
+
|
|
186
|
+
nav{MyStore>/products:Products>/orders:Orders>/settings:Settings}
|
|
187
|
+
sect{Product Catalog}
|
|
188
|
+
table @products { Name:name | SKU:sku | Price:price | Stock:stock | Status:status | edit PUT /api/products/{id} | delete /api/products/{id} | empty: No products. Add your first product below. }
|
|
189
|
+
sect{Add Product}
|
|
190
|
+
form POST /api/products => @products.push($result) { Product name:text:iPhone Case | SKU:text:CASE-001 | Price:number:29.99 | Stock:number:100 | Category:select:electronics,clothing,food,other }
|
|
191
|
+
foot{© 2025 MyStore}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Simple landing with image hero
|
|
195
|
+
```flux
|
|
196
|
+
~theme accent=#f59e0b radius=2rem font=Syne bg=#0c0a09 text=#fafaf9 surface=#1c1917
|
|
197
|
+
|
|
198
|
+
%home dark /
|
|
199
|
+
|
|
200
|
+
nav{Acme>/about:About>/blog:Blog>/contact:Contact}
|
|
201
|
+
hero{We build things that matter|A creative studio based in São Paulo. We design, develop, and ship.>/work:View our work>/contact:Get in touch|img:https://images.unsplash.com/photo-1497366216548-37526070297c?w=800&q=80} animate:fade-in
|
|
202
|
+
row3{globe>Global clients>We've worked with teams in 30+ countries.|star>Award winning>12 design awards in the last 3 years.|check>On-time delivery>98% of projects delivered on schedule.} animate:stagger
|
|
203
|
+
testimonial{Marco Silva, CTO @ Fintech BR|"Acme transformed our product. Went from prototype to production in 6 weeks."|img:https://i.pravatar.cc/64?img=12}
|
|
204
|
+
gallery{https://images.unsplash.com/photo-1600880292203-757bb62b4baf?w=400|https://images.unsplash.com/photo-1522202176988-66273c2fd55f?w=400|https://images.unsplash.com/photo-1497366412874-3415097a27e7?w=400}
|
|
205
|
+
foot{© 2025 Acme Studio>/privacy:Privacy>/instagram:Instagram>/linkedin:LinkedIn}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Generation rules
|
|
211
|
+
|
|
212
|
+
1. Always start with `%id theme /route`
|
|
213
|
+
2. Use `dark` theme unless specified otherwise
|
|
214
|
+
3. For dynamic data, always declare `@var = []` or `@var = {}` and use `~mount`
|
|
215
|
+
4. Tables with data should always have `edit` and `delete` unless readonly
|
|
216
|
+
5. Forms should have `=> @list.push($result)` or `=> redirect /path`
|
|
217
|
+
6. Use real icon names from the list, not emoji
|
|
218
|
+
7. Multiple pages separated by `---`
|
|
219
|
+
8. Add `animate:fade-up` or `animate:stagger` to key sections for polish
|
|
220
|
+
9. `~theme` always comes before `%` declarations
|
|
221
|
+
10. Never generate explanations — only FLUX code
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Running the generated code
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
# Install once
|
|
229
|
+
npm install -g aiplang
|
|
230
|
+
|
|
231
|
+
# Save Claude's output as pages/app.flux, then:
|
|
232
|
+
aiplang serve # dev server → http://localhost:3000
|
|
233
|
+
aiplang build pages/ # compile → dist/
|
|
234
|
+
```
|
package/README.md
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# aiplang
|
|
2
|
+
|
|
3
|
+
> AI-first web language. Describe an app to Claude, get it running in seconds.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx aiplang init my-app
|
|
7
|
+
cd my-app && npx aiplang serve
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## The real value
|
|
13
|
+
|
|
14
|
+
You describe what you want. Claude generates `.flux`. You run it.
|
|
15
|
+
|
|
16
|
+
**You:** *"Dashboard com tabela de usuários, stats ao vivo e form para adicionar usuário"*
|
|
17
|
+
|
|
18
|
+
**Claude generates:**
|
|
19
|
+
```flux
|
|
20
|
+
%dashboard dark /dashboard
|
|
21
|
+
|
|
22
|
+
@users = []
|
|
23
|
+
@stats = {}
|
|
24
|
+
~mount GET /api/users => @users
|
|
25
|
+
~mount GET /api/stats => @stats
|
|
26
|
+
~interval 10000 GET /api/stats => @stats
|
|
27
|
+
|
|
28
|
+
nav{MyApp>/logout:Sign out}
|
|
29
|
+
stats{@stats.users:Users|@stats.mrr:MRR|@stats.retention:Retention}
|
|
30
|
+
table @users { Name:name | Email:email | Plan:plan | Status:status | edit PUT /api/users/{id} | delete /api/users/{id} | empty: No users yet. }
|
|
31
|
+
form POST /api/users => @users.push($result) { Full name:text:Alice | Email:email:alice@co.com | Plan:select:starter,pro,enterprise }
|
|
32
|
+
foot{© 2025 MyApp}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**You paste it, run `npx aiplang serve` → working dashboard.**
|
|
36
|
+
|
|
37
|
+
That's it. No TypeScript, no JSX, no config files, no node_modules drama.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Why it's faster for AI
|
|
42
|
+
|
|
43
|
+
Same dashboard in React requires Claude to generate ~4,300 tokens across 18+ files.
|
|
44
|
+
In FLUX: **442 tokens. 1 file. 10× faster.**
|
|
45
|
+
|
|
46
|
+
| | FLUX | React/Next | Laravel | Go+GORM |
|
|
47
|
+
|---|---|---|---|---|
|
|
48
|
+
| Tokens (same app) | **620** | 15,200 | 11,800 | 8,400 |
|
|
49
|
+
| Files | **1** | 18+ | 22+ | 14+ |
|
|
50
|
+
| Time for Claude | **0.6s** | 15s | 12s | 8s |
|
|
51
|
+
| Apps per session | **322** | 13 | 16 | 23 |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Setup Claude to generate FLUX
|
|
56
|
+
|
|
57
|
+
**Option 1 — Claude Project (recommended, one-time setup):**
|
|
58
|
+
1. Go to claude.ai → Projects → New Project → name: "FLUX Generator"
|
|
59
|
+
2. Upload `FLUX-PROJECT-KNOWLEDGE.md` as project knowledge
|
|
60
|
+
3. Any conversation inside will generate FLUX automatically
|
|
61
|
+
|
|
62
|
+
**Option 2 — Paste in any conversation:**
|
|
63
|
+
```
|
|
64
|
+
I'm using aiplang language. Syntax:
|
|
65
|
+
%id theme /route | @var=[] | ~mount GET /api => @var | ~interval 10000 GET /api => @var
|
|
66
|
+
~theme accent=#hex radius=1rem font=Name bg=#hex text=#hex surface=#hex
|
|
67
|
+
nav{Brand>/path:Link} | hero{Title|Sub>/path:CTA} animate:fade-up
|
|
68
|
+
stats{@val:label|@val:label} | row3{icon>Title>Body} animate:stagger
|
|
69
|
+
table @var { Col:key | edit PUT /api/{id} | delete /api/{id} | empty: msg }
|
|
70
|
+
form POST /api => @list.push($result) { Label:type:placeholder | ... }
|
|
71
|
+
pricing{Name>Price>Desc>/path:CTA | ...} | faq{Q > A | ...}
|
|
72
|
+
testimonial{Author|Quote|img:url} | gallery{url1|url2|url3}
|
|
73
|
+
raw{<div>literal HTML</div>} | foot{text>/path:Link}
|
|
74
|
+
~theme, animate:, class: work as suffix modifiers on any block
|
|
75
|
+
Pages separated by ---
|
|
76
|
+
|
|
77
|
+
Generate: [your request here]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Commands
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npx aiplang init my-app # create project
|
|
86
|
+
npx aiplang init --template saas # SaaS starter
|
|
87
|
+
npx aiplang init --template landing # landing page
|
|
88
|
+
npx aiplang init --template crud # CRUD app
|
|
89
|
+
npx aiplang serve # dev server + hot reload → localhost:3000
|
|
90
|
+
npx aiplang build pages/ --out dist/ # compile → static HTML
|
|
91
|
+
npx aiplang new dashboard # new page template
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Full language reference
|
|
97
|
+
|
|
98
|
+
### Page declaration
|
|
99
|
+
```flux
|
|
100
|
+
%id theme /route
|
|
101
|
+
```
|
|
102
|
+
Themes: `dark` `light` `acid` or custom: `#bg,#text,#accent`
|
|
103
|
+
|
|
104
|
+
### Global theme vars
|
|
105
|
+
```flux
|
|
106
|
+
~theme accent=#7c3aed radius=1.5rem font=Syne bg=#0a0a0a text=#fff surface=#111 navbg=#000 border=#333 shadow=0_20px_60px_rgba(0,0,0,.5) spacing=6rem
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### State + data fetching
|
|
110
|
+
```flux
|
|
111
|
+
@users = [] # reactive state, default []
|
|
112
|
+
@stats = {} # reactive state, default {}
|
|
113
|
+
~mount GET /api/users => @users # fetch on page load
|
|
114
|
+
~mount GET /api/stats => @stats
|
|
115
|
+
~interval 30000 GET /api/stats => @stats # poll every 30s
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Blocks
|
|
119
|
+
```flux
|
|
120
|
+
nav{Brand>/path:Link>/path:Link}
|
|
121
|
+
hero{Title|Subtitle>/path:CTA>/path:CTA2|img:https://...}
|
|
122
|
+
stats{@val:Label|@val:Label|static text:Label}
|
|
123
|
+
row2{} row3{} row4{} # icon>Title>Body>/path:Link
|
|
124
|
+
sect{Title|Body text}
|
|
125
|
+
table @var { Col:key | Col:key | edit PUT /api/{id} | delete /api/{id} | empty: No data. }
|
|
126
|
+
form METHOD /api/path => @list.push($result) { Label:type:placeholder | Label:select:opt1,opt2 }
|
|
127
|
+
form POST /api/auth/login => redirect /dashboard { Email:email | Password:password }
|
|
128
|
+
pricing{Name>Price>Desc>/path:CTA | ...}
|
|
129
|
+
faq{Question > Answer | ...}
|
|
130
|
+
testimonial{Author, Title|Quote|img:https://...}
|
|
131
|
+
gallery{url1|url2|url3}
|
|
132
|
+
btn{Label > METHOD /api/path > confirm:Are you sure?}
|
|
133
|
+
select @var { option1 | option2 | option3 }
|
|
134
|
+
raw{<div>Any HTML here — custom components, embeds, etc.</div>}
|
|
135
|
+
foot{© 2025 Name>/path:Link>/path:Link}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Block modifiers (append to any block)
|
|
139
|
+
```flux
|
|
140
|
+
hero{...} animate:fade-up
|
|
141
|
+
row3{...} animate:stagger class:my-section
|
|
142
|
+
sect{...} animate:fade-in class:highlight-box
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Animations: `fade-up` `fade-in` `blur-in` `slide-left` `slide-right` `zoom-in` `stagger`
|
|
146
|
+
|
|
147
|
+
### Multiple pages
|
|
148
|
+
```flux
|
|
149
|
+
%home dark /
|
|
150
|
+
nav{...}
|
|
151
|
+
hero{...}
|
|
152
|
+
---
|
|
153
|
+
%dashboard dark /dashboard
|
|
154
|
+
@users = []
|
|
155
|
+
~mount GET /api/users => @users
|
|
156
|
+
table @users { ... }
|
|
157
|
+
---
|
|
158
|
+
%login dark /login
|
|
159
|
+
form POST /api/auth/login => redirect /dashboard { ... }
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Output
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
pages/home.flux
|
|
168
|
+
↓ npx aiplang build
|
|
169
|
+
dist/
|
|
170
|
+
index.html ← pre-rendered HTML, SEO-ready
|
|
171
|
+
aiplang-hydrate.js ← 10KB, only loaded on dynamic pages
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Zero framework. Zero node_modules in production. Deploys to any static host.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Deploy
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
npx aiplang build pages/ --out dist/
|
|
182
|
+
|
|
183
|
+
# Vercel
|
|
184
|
+
npx vercel dist/
|
|
185
|
+
|
|
186
|
+
# Netlify
|
|
187
|
+
npx netlify deploy --dir dist/
|
|
188
|
+
|
|
189
|
+
# Any server
|
|
190
|
+
rsync -r dist/ user@host:/var/www/html/
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Performance (what the user feels)
|
|
196
|
+
|
|
197
|
+
| | FLUX | React/Next |
|
|
198
|
+
|---|---|---|
|
|
199
|
+
| First paint | 45ms | 320ms |
|
|
200
|
+
| Interactive | 55ms | 380ms |
|
|
201
|
+
| JS downloaded | 10KB | 280KB |
|
|
202
|
+
| Lighthouse | 98/100 | 62/100 |
|
|
203
|
+
| Low-end Android | 180ms | 4,200ms |
|
|
204
|
+
|
|
205
|
+
FLUX pre-renders HTML server-side at build time. The browser gets a complete page — no hydration blocking, no JS required for static content.
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## GitHub
|
|
210
|
+
|
|
211
|
+
[github.com/isacamartin/aiplang](https://github.com/isacamartin/aiplang)
|
|
212
|
+
|
|
213
|
+
## License
|
|
214
|
+
|
|
215
|
+
MIT
|