@kardoe/quickback 0.5.16 → 0.6.1

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.
@@ -0,0 +1,656 @@
1
+ ---
2
+ name: quickback
3
+ description: Quickback API engine documentation - use when working with Quickback projects, defining resources, schemas, security pillars (Firewall, Access, Guards, Masking), actions, webhooks, or deployment
4
+ allowed-tools: Read, Grep, Glob
5
+ ---
6
+
7
+ # Quickback
8
+
9
+ Quickback is two things:
10
+
11
+ 1. **Compiler** — Transforms declarative TypeScript definitions into secure, production-ready APIs
12
+ 2. **Stack** — A Supabase alternative running entirely on Cloudflare (D1, R2, KV, Durable Objects, Queues, Workers AI)
13
+
14
+ The output is standard TypeScript (Hono, Drizzle, Better Auth) running on your own infrastructure. Not a managed platform — real code you own and control.
15
+
16
+ ## Accessing Documentation
17
+
18
+ The fastest way to look up detailed docs is via the CLI:
19
+
20
+ ```bash
21
+ quickback docs # List all available topics
22
+ quickback docs <topic> # Show docs for a specific topic
23
+ quickback docs firewall # Example: firewall docs
24
+ quickback docs cms/record-layouts # Example: CMS record layouts
25
+ ```
26
+
27
+ Full online docs: https://docs.quickback.dev
28
+
29
+ ---
30
+
31
+ # PART 1: THE COMPILER
32
+
33
+ The compiler takes your TypeScript definitions and generates API routes, middleware, migrations, typed SDKs, OpenAPI specs, and AI tool definitions.
34
+
35
+ ```
36
+ ┌─────────────────────────────────────────────────────────┐
37
+ │ YOU DEFINE (in TypeScript) │
38
+ │ • Drizzle schema (your data models) │
39
+ │ • Security layers (Firewall, Access, Guards, Masking) │
40
+ │ • Views, Validation, Layouts │
41
+ │ • Actions (your business operations) │
42
+ ├─────────────────────────────────────────────────────────┤
43
+ │ QUICKBACK COMPILES TO │
44
+ │ • Database migrations (via Drizzle) │
45
+ │ • API route handlers (Hono) │
46
+ │ • Typed client SDK for your frontend │
47
+ │ • AI tool definitions │
48
+ │ • OpenAPI specification │
49
+ └─────────────────────────────────────────────────────────┘
50
+ ```
51
+
52
+ ## Project Structure
53
+
54
+ ```
55
+ my-app/
56
+ ├── quickback/
57
+ │ ├── quickback.config.ts
58
+ │ └── features/
59
+ │ └── {feature-name}/
60
+ │ ├── {table}.ts # Schema + security (defineTable)
61
+ │ ├── actions.ts # Custom actions (optional)
62
+ │ └── handlers/ # Action handlers (optional)
63
+ └── ...
64
+ ```
65
+
66
+ ## quickback.config.ts
67
+
68
+ ```typescript
69
+ import { defineConfig, defineRuntime, defineDatabase, defineAuth } from '@quickback/compiler';
70
+
71
+ export default defineConfig({
72
+ name: "my-saas-app",
73
+ providers: {
74
+ runtime: defineRuntime("cloudflare"),
75
+ database: defineDatabase("cloudflare-d1"),
76
+ auth: defineAuth("better-auth"),
77
+ },
78
+ build: {
79
+ outputDir: "dist",
80
+ dependencies: {
81
+ "fast-xml-parser": "^4.5.0", // Third-party packages used in action handlers
82
+ },
83
+ },
84
+ });
85
+ ```
86
+
87
+ ## Compile Output and State Artifacts
88
+
89
+ - Runtime code stays in `build.outputDir` (e.g. `src/`, `wrangler.toml`, `package.json`)
90
+ - Drizzle migration/state artifacts are written to `quickback/drizzle/...`
91
+ - Security contract reports are written to `quickback/reports/...`
92
+
93
+ ## Automatic Audit Fields
94
+
95
+ Quickback automatically injects these fields into every table:
96
+ - `createdAt`, `modifiedAt`, `deletedAt` (timestamps)
97
+ - `createdBy`, `modifiedBy`, `deletedBy` (user IDs)
98
+
99
+ **Do NOT add these to your schema files.** They are auto-injected by the compiler.
100
+
101
+ ---
102
+
103
+ ## Feature Definitions
104
+
105
+ Features live in `quickback/features/{name}/` with one file per table using `defineTable()`.
106
+
107
+ ### Example: todos.ts
108
+
109
+ ```typescript
110
+ import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
111
+ import { defineTable } from "@quickback/compiler";
112
+
113
+ export const todos = sqliteTable("todos", {
114
+ id: integer("id").primaryKey(),
115
+ title: text("title").notNull(),
116
+ description: text("description"),
117
+ completed: integer("completed", { mode: "boolean" }).default(false),
118
+ userId: text("user_id").notNull(),
119
+ organizationId: text("organization_id").notNull(),
120
+ });
121
+
122
+ export default defineTable(todos, {
123
+ firewall: {
124
+ organization: {},
125
+ owner: {},
126
+ },
127
+ crud: {
128
+ list: { access: { roles: ["member", "admin"] } },
129
+ get: { access: { roles: ["member", "admin"] } },
130
+ create: { access: { roles: ["member", "admin"] } },
131
+ update: { access: { roles: ["admin"] } },
132
+ delete: { access: { roles: ["admin"] }, mode: "soft" },
133
+ },
134
+ guards: {
135
+ createable: ["title", "description", "completed"],
136
+ updatable: ["title", "description", "completed"],
137
+ },
138
+ masking: {
139
+ userId: { type: "redact", show: { roles: ["admin"] } },
140
+ },
141
+ layouts: {
142
+ default: {
143
+ sections: [
144
+ { label: "Details", columns: 2, fields: ["title", "completed"] },
145
+ { label: "Audit", collapsed: true, fields: ["userId"] },
146
+ ],
147
+ },
148
+ },
149
+ });
150
+ ```
151
+
152
+ ### Internal/Junction Tables (No API)
153
+
154
+ Tables without a `defineTable()` default export get no API routes:
155
+
156
+ ```typescript
157
+ export const roomAmenities = sqliteTable('room_amenities', {
158
+ roomId: text('room_id').notNull(),
159
+ amenityId: text('amenity_id').notNull(),
160
+ });
161
+ ```
162
+
163
+ ---
164
+
165
+ ## Four Security Layers
166
+
167
+ Every API request passes through four layers in order:
168
+
169
+ ```
170
+ Request → Firewall → Access → Guards → Database → Masking → Response
171
+ ```
172
+
173
+ | Layer | Purpose | Failure |
174
+ |-------|---------|---------|
175
+ | **Firewall** | Tenant isolation via automatic WHERE clauses | 404 |
176
+ | **Access** | Role-based CRUD permissions (deny by default) | 403 |
177
+ | **Guards** | Field modification rules (protected/immutable fields) | 400 |
178
+ | **Masking** | PII redaction for unauthorized viewers | — |
179
+
180
+ ### 1. Firewall — Data Isolation
181
+
182
+ Compiles WHERE clauses to isolate data by ownership. Auto-detects column names.
183
+
184
+ ```typescript
185
+ firewall: {
186
+ organization: {}, // WHERE organizationId = ctx.activeOrgId
187
+ owner: { mode: 'optional' }, // AND (ownerId = ctx.userId OR ownerId IS NULL)
188
+ team: {}, // WHERE teamId = ctx.activeTeamId
189
+ softDelete: {}, // AND deletedAt IS NULL
190
+ exception: true, // No filtering (public resources)
191
+ }
192
+ ```
193
+
194
+ Auto-detection:
195
+ - `organization` → looks for `organizationId` or `organization_id`
196
+ - `owner` → looks for `userId` or `user_id`
197
+ - `team` → looks for `teamId` or `team_id`
198
+
199
+ Column overrides:
200
+
201
+ ```typescript
202
+ firewall: {
203
+ organization: {
204
+ column: 'tenant_id',
205
+ source: 'ctx.tenant.id',
206
+ },
207
+ }
208
+ ```
209
+
210
+ Owner modes: default = strict (only own records), `optional` = own + NULL owner (admin pattern).
211
+
212
+ ### 2. Access — Permission Checks
213
+
214
+ Role-based and record-based access control. Deny by default.
215
+
216
+ ```typescript
217
+ crud: {
218
+ list: { access: { roles: ['member'] } },
219
+ get: { access: { roles: ['member'] } },
220
+ create: { access: { roles: ['admin', 'manager'] } },
221
+ update: {
222
+ access: {
223
+ or: [
224
+ { roles: ['admin'] },
225
+ { record: { createdBy: { equals: '$ctx.userId' } } },
226
+ ],
227
+ },
228
+ },
229
+ delete: { access: { roles: ['admin'] } },
230
+ }
231
+ ```
232
+
233
+ Record condition operators: `equals`, `notEquals`, `in`, `notIn`, `greaterThan`, `lessThan`
234
+
235
+ Context variables: `$ctx.userId`, `$ctx.activeOrgId`, `$ctx.activeTeamId`, `$ctx.roles`, `$ctx.isAnonymous`
236
+
237
+ ### 3. Guards — Field Protection
238
+
239
+ ```typescript
240
+ guards: {
241
+ createable: ['name', 'description'], // Allowed on POST
242
+ updatable: ['description'], // Allowed on PATCH
243
+ immutable: ['invoiceNumber'], // Set once, never change
244
+ protected: { status: ['approve'] }, // Only via named actions
245
+ }
246
+ ```
247
+
248
+ System-managed fields (always protected): `createdAt`, `createdBy`, `modifiedAt`, `modifiedBy`, `deletedAt`, `deletedBy`
249
+
250
+ PUT/Upsert requires both `generateId: false` and `guards: false`.
251
+
252
+ ### 4. Masking — PII Redaction
253
+
254
+ ```typescript
255
+ masking: {
256
+ ssn: { type: 'ssn', show: { roles: ['admin', 'hr'] } },
257
+ email: { type: 'email', show: { roles: ['admin'], or: 'owner' } },
258
+ }
259
+ ```
260
+
261
+ Mask types: `email`, `phone`, `ssn`, `creditCard`, `name`, `redact`, `custom`
262
+
263
+ Auto-detection warns on unmasked sensitive columns (`email`, `phone`, `ssn`, `password`, etc.).
264
+
265
+ ---
266
+
267
+ ## Views — Column-Level Security
268
+
269
+ Named projections that control which fields are visible based on role.
270
+
271
+ ```typescript
272
+ views: {
273
+ summary: {
274
+ fields: ['id', 'name', 'email'],
275
+ access: { roles: ['member', 'admin'] },
276
+ },
277
+ full: {
278
+ fields: ['id', 'name', 'email', 'phone', 'ssn', 'address'],
279
+ access: { roles: ['admin'] },
280
+ },
281
+ }
282
+ ```
283
+
284
+ Generated endpoints: `GET /api/v1/{resource}/views/{viewName}`
285
+
286
+ ---
287
+
288
+ ## Validation
289
+
290
+ ```typescript
291
+ validation: {
292
+ name: { minLength: 1, maxLength: 100 },
293
+ capacity: { min: 1, max: 1000 },
294
+ roomType: { enum: ['meeting', 'conference', 'breakout'] },
295
+ email: { email: true },
296
+ code: { pattern: '^[A-Z]{3}$' },
297
+ }
298
+ ```
299
+
300
+ ---
301
+
302
+ ## CMS Record Layouts
303
+
304
+ Control how fields are grouped on the CMS record detail page.
305
+
306
+ ```typescript
307
+ layouts: {
308
+ default: {
309
+ sections: [
310
+ { label: "Contact Info", columns: 2, fields: ["name", "email", "phone"] },
311
+ { label: "Notes", collapsed: true, fields: ["notes", "internalNotes"] },
312
+ ],
313
+ },
314
+ }
315
+ ```
316
+
317
+ Section options: `label` (string), `fields` (string[]), `columns` (1|2, default 1), `collapsed` (boolean, default false). Unassigned fields go to "Other Fields".
318
+
319
+ ---
320
+
321
+ ## Actions — Custom Business Logic
322
+
323
+ Defined in a separate `actions.ts` file using `defineActions()`.
324
+
325
+ ```typescript
326
+ import { todos } from './todos';
327
+ import { defineActions } from '@quickback/compiler';
328
+ import { z } from 'zod';
329
+
330
+ export default defineActions(todos, {
331
+ complete: {
332
+ description: "Mark todo as complete",
333
+ input: z.object({ completedAt: z.string().datetime().optional() }),
334
+ guard: { roles: ["member", "admin"], record: { completed: { equals: false } } },
335
+ execute: async ({ db, record, ctx, input }) => {
336
+ await db.update(todos).set({ completed: true }).where(eq(todos.id, record.id));
337
+ return { success: true };
338
+ },
339
+ sideEffects: "sync",
340
+ },
341
+ archive: {
342
+ description: "Archive a todo",
343
+ input: z.object({}),
344
+ guard: { roles: ["admin"] },
345
+ handler: "./handlers/archive",
346
+ },
347
+ });
348
+ ```
349
+
350
+ **Record-based** (default): `POST /api/v1/{resource}/:id/{action}`
351
+ **Standalone**: `standalone: true`, custom `path` and `method`
352
+
353
+ Action options: `standalone`, `method` (GET/POST/PUT/PATCH/DELETE), `responseType` (json/stream/file), `sideEffects` (sync/async/fire-and-forget)
354
+
355
+ ### Actions-Only Features
356
+
357
+ Features that only contain standalone actions (no tables). Use `defineActions(null, { ... })`:
358
+
359
+ ```typescript
360
+ // quickback/features/utilities/actions.ts
361
+ import { defineActions } from '@quickback/compiler';
362
+ import { z } from 'zod';
363
+
364
+ export default defineActions(null, {
365
+ healthCheck: {
366
+ standalone: true,
367
+ path: "/health",
368
+ method: "GET",
369
+ description: "Health check endpoint",
370
+ input: z.object({}),
371
+ guard: { roles: ["member", "admin"] },
372
+ handler: "./handlers/health-check",
373
+ },
374
+ });
375
+ ```
376
+
377
+ All actions in an actions-only feature must have `standalone: true` (since there's no table for record-based actions).
378
+
379
+ ---
380
+
381
+ ## API Reference
382
+
383
+ ### CRUD Operations
384
+
385
+ | Method | Endpoint | Description |
386
+ |--------|----------|-------------|
387
+ | `GET` | `/api/v1/{resource}` | List records |
388
+ | `GET` | `/api/v1/{resource}/:id` | Get single record |
389
+ | `POST` | `/api/v1/{resource}` | Create record |
390
+ | `PATCH` | `/api/v1/{resource}/:id` | Update record |
391
+ | `DELETE` | `/api/v1/{resource}/:id` | Delete record |
392
+ | `PUT` | `/api/v1/{resource}/:id` | Upsert (if enabled) |
393
+
394
+ ### Batch Operations
395
+
396
+ `POST|PATCH|DELETE|PUT /api/v1/{resource}/batch` with `{ "records": [...], "options": { "atomic": false } }`
397
+
398
+ ### Query Parameters
399
+
400
+ | Feature | Syntax |
401
+ |---------|--------|
402
+ | Pagination | `?limit=50&offset=0` (max 100) |
403
+ | Filter | `?status=active`, `?amount.gt=100`, `?status.in=draft,pending` |
404
+ | Sort | `?sort=status,-createdAt` (multi-sort, `-` = desc) |
405
+ | Fields | `?fields=id,name,status` |
406
+ | Total count | `?total=true` |
407
+ | Search | `?search=conference` (OR'd LIKE across text columns) |
408
+
409
+ Filter operators: `.gt`, `.gte`, `.lt`, `.lte`, `.ne`, `.like`, `.in`
410
+
411
+ ### Response Format
412
+
413
+ ```json
414
+ {
415
+ "data": [{ "id": "...", "title": "Todo 1" }],
416
+ "pagination": { "limit": 10, "offset": 0, "count": 2, "total": 42 }
417
+ }
418
+ ```
419
+
420
+ ### Error Responses
421
+
422
+ | Status | Layer | Meaning |
423
+ |--------|-------|---------|
424
+ | `401` | Auth | Invalid/expired session |
425
+ | `403` | Access | Insufficient permissions |
426
+ | `404` | Firewall | Record not found or outside scope |
427
+ | `400` | Guards | Invalid field modification |
428
+
429
+ ---
430
+
431
+ ## Database Dialects
432
+
433
+ | Stack | Import | Table Function |
434
+ |-------|--------|----------------|
435
+ | Cloudflare D1 / SQLite | `drizzle-orm/sqlite-core` | `sqliteTable` |
436
+ | Supabase / PostgreSQL | `drizzle-orm/pg-core` | `pgTable` |
437
+ | MySQL | `drizzle-orm/mysql-core` | `mysqlTable` |
438
+
439
+ ---
440
+
441
+ # PART 2: THE QUICKBACK STACK
442
+
443
+ The Quickback Stack is a production-ready backend platform built entirely on Cloudflare's edge infrastructure. It's a Supabase alternative where everything runs on your own Cloudflare account — your data, your infrastructure, global edge performance.
444
+
445
+ ```
446
+ ┌─────────────────────────────────────────────────────────┐
447
+ │ QUICKBACK STACK ON CLOUDFLARE │
448
+ │ │
449
+ │ Workers — API runtime (Hono) │
450
+ │ D1 — SQLite database at the edge │
451
+ │ R2 — S3-compatible file storage │
452
+ │ KV — Distributed key-value store │
453
+ │ Durable Objects — Realtime WebSockets │
454
+ │ Queues — Background job processing │
455
+ │ Workers AI — Embeddings & vector search │
456
+ │ Better Auth — Authentication & organizations │
457
+ └─────────────────────────────────────────────────────────┘
458
+ ```
459
+
460
+ ## Authentication (Better Auth)
461
+
462
+ Built on Better Auth with multi-tenant organization support.
463
+
464
+ - Email/password, magic links, passkeys, email OTP
465
+ - Three org roles: `owner`, `admin`, `member`
466
+ - Session storage in KV namespace
467
+ - All auth routes at `/auth/v1/*`
468
+ - Extensible via Better Auth plugins
469
+
470
+ ```typescript
471
+ // Config
472
+ providers: {
473
+ auth: defineAuth("better-auth"),
474
+ }
475
+ ```
476
+
477
+ Docs: `quickback docs stack/auth/using-auth` | https://docs.quickback.dev/stack/auth
478
+
479
+ ## Database (D1)
480
+
481
+ SQLite at the edge with zero configuration. Multi-database pattern for independent scaling:
482
+
483
+ | Binding | Purpose |
484
+ |---------|---------|
485
+ | `DB` | Application data (features) |
486
+ | `AUTH_DB` | Auth sessions & users |
487
+ | `FILES_DB` | File metadata |
488
+ | `WEBHOOKS_DB` | Webhook tracking |
489
+
490
+ - Drizzle ORM for type-safe queries
491
+ - Auto-generated migrations on compile
492
+ - Application-layer security (firewall, access, guards, masking)
493
+ - Local dev with `.wrangler/state/`
494
+ - Neon Postgres available as alternative
495
+
496
+ ```typescript
497
+ providers: {
498
+ database: defineDatabase("cloudflare-d1", {
499
+ splitDatabases: true,
500
+ }),
501
+ }
502
+ ```
503
+
504
+ Docs: `quickback docs stack/database/d1` | https://docs.quickback.dev/stack/database/d1
505
+
506
+ ## File Storage (R2)
507
+
508
+ S3-compatible object storage with built-in access control.
509
+
510
+ - Two-worker architecture: API worker (upload/manage) + Files worker (serve)
511
+ - Bucket-scoped access policies (public, organization, user)
512
+ - File metadata tracked in `FILES_DB`
513
+ - Soft deletes with org-level tenant isolation
514
+ - API at `/storage/v1/*`
515
+
516
+ Docs: `quickback docs stack/storage/r2` | https://docs.quickback.dev/stack/storage/r2
517
+
518
+ ## KV Storage
519
+
520
+ Distributed key-value store optimized for reads (300+ edge locations, sub-millisecond).
521
+
522
+ - Use cases: sessions, caching, rate limiting, feature flags
523
+ - Eventually consistent (60 second propagation)
524
+ - TTL/expiration support
525
+
526
+ Docs: `quickback docs stack/storage/kv` | https://docs.quickback.dev/stack/storage/kv
527
+
528
+ ## Realtime (Durable Objects)
529
+
530
+ WebSocket connections for live updates via organization-scoped Durable Objects.
531
+
532
+ - CRUD event broadcasting (insert, update, delete)
533
+ - Custom broadcasts and event namespaces
534
+ - Role-based filtering and per-role field masking
535
+ - Session token or API key authentication
536
+ - Type-safe with `defineRealtime()` for custom events
537
+ - Endpoint: `/realtime/v1/websocket`
538
+
539
+ Docs: `quickback docs stack/realtime/durable-objects` | https://docs.quickback.dev/stack/realtime
540
+
541
+ ## Queues (Background Processing)
542
+
543
+ Cloudflare Queues for reliable async job processing.
544
+
545
+ | Queue | Purpose |
546
+ |-------|---------|
547
+ | `EMBEDDINGS_QUEUE` | Auto-generate embeddings |
548
+ | `WEBHOOKS_QUEUE` | Webhook delivery |
549
+ | Custom queues | Your background jobs |
550
+
551
+ - Custom handlers via `defineQueue()` in `services/queues/`
552
+ - Auto-retry up to 3 times, max batch 10, 30s timeout
553
+ - Chaining between queues
554
+
555
+ Docs: `quickback docs stack/queues/using-queues` | https://docs.quickback.dev/stack/queues
556
+
557
+ ## Vector & Embeddings (Workers AI)
558
+
559
+ Auto-generated embeddings for similarity search and classification.
560
+
561
+ - Table-level config via `embeddings` in `defineTable()`
562
+ - Service-level config via `defineEmbedding()`
563
+ - Default model: `@cf/baai/bge-base-en-v1.5` (768 dimensions)
564
+ - Async processing via `EMBEDDINGS_QUEUE`
565
+ - Vector storage in D1 + optional Vectorize index
566
+ - API: `/api/v1/embeddings`
567
+
568
+ Docs: `quickback docs stack/vector/embeddings` | https://docs.quickback.dev/stack/vector
569
+
570
+ ## Webhooks
571
+
572
+ ### Inbound (Receiving)
573
+
574
+ Receive events from Stripe, Paddle, GitHub, etc. at `POST /webhooks/v1/inbound/:provider`
575
+
576
+ ```typescript
577
+ import { onWebhookEvent } from './lib/webhooks';
578
+
579
+ onWebhookEvent('stripe:checkout.session.completed', async (ctx) => {
580
+ const { data, env } = ctx;
581
+ await createSubscription({ ... });
582
+ });
583
+ ```
584
+
585
+ ### Outbound (Sending)
586
+
587
+ Emit signed events when data changes. HMAC-SHA256 signing, async delivery via queue with exponential backoff retry.
588
+
589
+ ```typescript
590
+ import { emitWebhookEvent } from './lib/webhooks';
591
+
592
+ await emitWebhookEvent('user.created', { id: user.id, email: user.email }, { organizationId: orgId }, env);
593
+ ```
594
+
595
+ Event patterns: `user.*`, `subscription.*`, `organization.*`, `file.*`, `*`
596
+ Endpoint management: `/webhooks/v1/endpoints`
597
+
598
+ Docs: `quickback docs stack/webhooks/outbound` | https://docs.quickback.dev/stack/webhooks
599
+
600
+ ---
601
+
602
+ # CLI Commands
603
+
604
+ | Command | Description |
605
+ |---------|-------------|
606
+ | `quickback create <template> <name>` | Create project from template |
607
+ | `quickback compile` | Compile definitions to output |
608
+ | `quickback docs [topic]` | Browse built-in documentation |
609
+ | `quickback login` | Authenticate for Pro templates |
610
+ | `quickback logout` | Clear stored credentials |
611
+ | `quickback whoami` | Show current auth status |
612
+ | `quickback claude install` | Install Claude Code skill |
613
+ | `quickback claude update` | Update to latest skill version |
614
+
615
+ ## Available Templates
616
+
617
+ | Template | Stack | Status |
618
+ |----------|-------|--------|
619
+ | `cloudflare` | Cloudflare Workers + D1 + Better Auth | Free |
620
+ | `bun` | Bun + SQLite + Better Auth | Free |
621
+ | `turso` | Turso/LibSQL + Better Auth | Pro |
622
+
623
+ ## Development Workflow
624
+
625
+ ```bash
626
+ quickback create cloudflare my-app # 1. Create project
627
+ # Define features in quickback/features/
628
+ quickback compile # 2. Compile
629
+ npm install && npm run dev # 3. Run
630
+ ```
631
+
632
+ ---
633
+
634
+ # Online Documentation
635
+
636
+ - [Getting Started](https://docs.quickback.dev/compiler/getting-started)
637
+ - [Concepts](https://docs.quickback.dev/compiler/definitions/concepts)
638
+ - [Database Schema](https://docs.quickback.dev/compiler/definitions/schema)
639
+ - [Firewall](https://docs.quickback.dev/compiler/definitions/firewall)
640
+ - [Access](https://docs.quickback.dev/compiler/definitions/access)
641
+ - [Guards](https://docs.quickback.dev/compiler/definitions/guards)
642
+ - [Masking](https://docs.quickback.dev/compiler/definitions/masking)
643
+ - [Views](https://docs.quickback.dev/compiler/definitions/views)
644
+ - [Actions](https://docs.quickback.dev/compiler/definitions/actions)
645
+ - [CRUD API](https://docs.quickback.dev/compiler/using-the-api/crud)
646
+ - [Query Parameters](https://docs.quickback.dev/compiler/using-the-api/query-params)
647
+ - [CLI Reference](https://docs.quickback.dev/compiler/cloud-compiler/cli)
648
+ - [Stack Overview](https://docs.quickback.dev/stack)
649
+ - [D1 Database](https://docs.quickback.dev/stack/database/d1)
650
+ - [R2 Storage](https://docs.quickback.dev/stack/storage/r2)
651
+ - [Realtime](https://docs.quickback.dev/stack/realtime)
652
+ - [Queues](https://docs.quickback.dev/stack/queues)
653
+ - [Embeddings](https://docs.quickback.dev/stack/vector)
654
+ - [Webhooks](https://docs.quickback.dev/stack/webhooks)
655
+ - [CMS Overview](https://docs.quickback.dev/cms)
656
+ - [CMS Record Layouts](https://docs.quickback.dev/cms/record-layouts)