Repository navigation
Home

Your idea turned into a complete app. Describe it to Claude Code, approve the
plan, and Caligrafy ships it: the database, sign-in, web pages, a phone and tablet app, a REST API and tools for AI
agents, online at https://<name>.caligrafy.com, with the code in your own GitHub repository.
Why developers choose it. A feature is written once, as a capability, and served to pages, Vue apps, REST, AI agents over MCP and Snap Cards, with the same rules and audit log everywhere. The same app takes 471 lines in Caligrafy against 708 in Laravel and 1,076 in Symfony, 7 of 8 security defaults need no code, and a new project installs 16.6 MB. See why Caligrafy: the benefits, the measurements, and what it is not yet.
With Claude Code, three steps take your idea to a complete app online:
| You | Claude and Caligrafy | |
|---|---|---|
| 1. Describe it | your idea, in a sentence: /caligrafy-quill:idea A reading list where I rate the books I read
|
turn it into a plan: a name, the tables, every feature, who may do what, the pages |
| 2. Approve it | read the plan, change it, say OK | build every feature once, then check it from a page, REST and an AI agent |
| 3. Ship it | approve the sign-ins in your browser | create your GitHub repository, deploy it, check it online |
git clone https://github.com/caligrafy/caligrafy-quill.git myapp
cd myapp
claude/caligrafy-quill:idea A reading list: I add books I want to read, mark them as read, and rate them from 1 to 5.
You say OK once, at the plan; after that you only approve sign-ins on GitHub's and Caligrafy Cloud's own pages, which Claude opens for you. It never asks for a password or a key, and asks before spending credits. See Quickstart with Claude.
Start from a proven prompt. The marketplace of caligrafy.com offers apps that
already shipped, three ways: the prompt that recreates one with Caligrafy, its code, or the app managed for you. And
once yours is online, /caligrafy-quill:marketplace offers it there: you earn 25% of every sale. No time to build it?
Submit your idea and Caligrafy builds it for you.
What makes the app complete is how Caligrafy builds it. A feature (add a task, list the books, place an order) is written once, as a capability: its inputs, its rules, who may use it, and what it does. Caligrafy then serves that same capability to every way people and machines reach your application:
| Experience | How it uses the capability |
|---|---|
| Web pages | a page calls it and shows the result |
| Vue apps on desktop, tablet and phone | a generated JavaScript function: await createTask({ title })
|
| REST API for other applications | POST /api/tasks |
| AI agents such as Claude or Cursor | an MCP tool: create_task
|
| Snap Cards and the assistant | a card a person uses, and an assistant that answers with it: Route::snap(); (more) |
The same validation messages, the same permissions and the same audit log, whichever way it is called. You never write a feature twice, and the experiences never drift apart.
Everything Claude does is plain Caligrafy you can write yourself, with the same files Claude writes:
| Step | What you do | With |
|---|---|---|
| 1. Describe it | a running project, your tables, and each feature written once with its rules |
.bin/caligrafer quickstart, create_db.sql and a model, a capability (php caligrafer.php service) |
| 2. Approve it | every experience and every permission, checked |
Route::page, Route::form, Route::auth, Route::capabilities, Route::mcp, scope and level, tests, the reviewer, php caligrafer.php doctor
|
| 3. Ship it | your application at a public address | the production Dockerfile, php caligrafer.php cloud deploy
|
The course teaches both ways: with Claude, and by hand, every file typed by you.
You need Git and Docker Desktop (running). PHP, MySQL and Composer run in Docker.
git clone https://github.com/caligrafy/caligrafy-quill.git myapp
cd myapp
.bin/caligrafer quickstart --docker --examplequickstart installs the libraries, starts the server, creates the database and the framework tables, and adds a
Tasks example (the first start builds the PHP image: a few minutes). When it asks to delete the .git folder,
answer y: your project starts its own history. To use your own Apache and MySQL (MAMP, XAMPP, LAMP) instead, see
Quickstart.
1. Use it on the web. Open http://localhost:8080/tasks, add a task, tick it, rename it.
2. Use it from another application. The same tasks, over REST:
curl -H "Accept: application/json" http://localhost:8080/api/tasks3. Use it from an AI agent. Create a token and give it to Claude Code (or Cursor, below):
docker compose exec dev-box php caligrafer.php token create "my agent" --scopes "*"
claude mcp add --transport http myapp http://localhost:8080/mcp --header "Authorization: Bearer <the token>"Ask Claude "add a task to buy milk": it calls create_task, and the task appears on the web page.
In Cursor, add to .cursor/mcp.json:
{ "mcpServers": { "myapp": { "url": "http://localhost:8080/mcp", "headers": { "Authorization": "Bearer <the token>" } } } }4. Ship it. Push the project to a GitHub repository (git init, commit, push), then:
docker compose exec dev-box php caligrafer.php cloud login # open the address it prints, approve the code
docker compose exec dev-box php caligrafer.php cloud create myapp --repo https://github.com/<you>/myapp
docker compose exec dev-box php caligrafer.php cloud deploy myapp # https://myapp.caligrafy.comcloud login opens deploy.caligrafy.com, where you sign in (or sign up) and approve.
Every new app is free for its first 30 minutes online. The Tasks example is open to everyone, online too: see
Putting it online before you share the address.
A feature, by hand, is a table, a model, a capability and its routes. The list of a book catalog:
application/services/Bookshelf/ListBooks.php (created by
docker compose exec dev-box php caligrafer.php service Bookshelf/ListBooks --scope books:read)
#[Capability(name: 'list_books', description: 'Lists the books, 20 per page, each with its author.', scope: 'books:read', readOnly: true)]
class ListBooks extends Service
{
public $rules = array('author_id' => 'integer', 'page' => 'integer');
public function handle(array $input, Context $context)
{
$query = Book::with('author')->orderBy('title');
if (!empty($input['author_id'])) {
$query->where('author_id', $input['author_id']);
}
return $query->paginate(20, $input['page'] ?? 1);
}
}application/config/routing/web.php
Route::page('/books', 'Bookshelf/books', ['data' => ['books' => 'list_books']]); // a web page
Route::capabilities(); // REST: POST /capabilities/list_books
Route::mcp(); // AI agents: the list_books toolThe same capability is also a function of the generated JavaScript client (php caligrafer.php client). The tutorial
Your first capability builds a complete
feature step by step: the table, the model, the page, a form and sign-in.
- Every experience: server-rendered pages (Pug), Vue apps and a Vite single page application, installable mobile web apps, REST, and an MCP server for AI agents.
-
One rule: only capabilities touch your data. Pages get their data from capabilities in one line
(
Route::page('/books/{id}', 'Bookshelf/book', ['data' => ['book' => 'get_book']])), so a page, the API and an agent never follow different rules. Forms, sign-in, webhooks, downloads and anything else a browser asks are one line each too (declarative routes:Route::form,Route::auth,Route::webhook,Route::download,Route::action): an application needs no controller. -
One look, or yours: Caligrafy's look on every page: a light top bar with the Caligrafy mark, title bands, forms,
rows and tiles, Caligrafy black for the main action, full-screen camera apps, the same on every device. Or pick one of 85 design styles
(
DESIGN_STYLEin.env, or your ownDESIGN.md) and let/caligrafy-quill:designrestyle every page. - Secure by design: sign-in, passkeys and face login for people; scoped, revocable tokens for programs and agents; CSRF protection; an audit log of every change; server files never served.
- What large apps need: queries with filters, paging, related rows in one query and transactions, migrations, background jobs, a cache, tests for your app, dependency injection, scheduled jobs and notifications.
- Fast: in the same benchmark, Caligrafy 2.19 beats Symfony and Laravel on all 16 measures (requests per second, median and slowest response, memory, for plain text, JSON, a database query and an HTML page): an HTML page at 2,887 requests per second, against 1,789 for Symfony and 324 for Laravel (release notes).
- Batteries included: card, ACH and crypto payments, OpenAI and open-model AI (Llama on Groq, OpenRouter, Ollama...), chatbots, face detection and machine learning in the browser, search and social metadata.
-
Made for AI-assisted development: a Claude Code plugin
that knows the framework, builds features the Caligrafy way or a whole application from your idea, and puts it
online, and
AGENTS.mdfor other coding agents. -
Online in a few commands: a production
Dockerfilein every project, the database prepared at every start, and Caligrafy Cloud:php caligrafer.php cloud deployputs it athttps://<name>.caligrafy.com, every new app free for its first 30 minutes, and/caligrafy-quill:shipdoes it all for you, from the GitHub repository to the check online. -
Sell what you built: offer an app online on the marketplace of caligrafy.com:
Caligrafy sells a prompt that recreates it and you earn 25% of every sale.
/caligrafy-quill:marketplacereads your code, screenshots its key features and submits the listing (php caligrafer.php cloud submit). -
Tools:
php caligrafer.php doctorchecks your setup and services,calltries a capability in one line,migratechanges the database,testruns your tests,queue workruns background jobs,updatemoves a project to the latest release in one command (keeping what you changed),upgradeupdates itsapplication/templates and tells you what to check,versiontells you which release you run.
| You want to | Read |
|---|---|
| Get a feel for it | Quickstart with Claude or the Quickstart, then How Caligrafy works |
| Build a feature | Your first capability, then Capabilities in depth |
| Build a web page | Views and Caligrafy's look |
| Build a Vue app or a single page application | Vue as a library, the single page application |
| Let AI agents use your application | MCP |
| Store data | Models and Relationships |
| Filter, page and load related rows | Queries |
| Take a form, sign people in, receive webhooks, export a CSV | Declarative routes |
| Change your tables, test your app | Migrations, Testing your app |
| Work in the background, keep slow results | Background jobs, The cache, Dependency injection |
| Let people sign in |
Sign-in, users and tokens (Route::auth), with an email
|
| See what changed | Release notes: 2.21.0, 2.20.0, 2.19.0 and the changelog |
| Take payments, add AI, face login... | the Built-in features of the sidebar |
| Put it online | Putting it online: Caligrafy Cloud or your own server |
| Sell your app | Selling your app on the marketplace: a prompt that recreates it, 25% of every sale |
| Build with Claude | Claude Code plugin |
| Learn step by step, from zero | The Caligrafy course |
| Use the command line (set up, create, tokens, check, upgrade) | Caligrafer: every command |
| Install another way, configure, upgrade | Installation and configuration, Security and upgrading |
- GitHub: issues for bugs and feature requests.
- Slack: join the Caligrafy community to get help and share what you build.
- Facebook: the Caligrafy group.
- Videos: the Caligrafy channel.
If Caligrafy helps you, sponsor it on GitHub or share caligrafy.com.
Caligrafy is released under the MIT License.
Caligrafy: Describe it. Approve it. Ship it. Your idea turned into a complete app: every feature built once, for web pages, Vue apps, a REST API and AI agents, and online.
Why Caligrafy: the benefits, the measurements, and what it is not yet
-
Quickstart with Claude: describe it, approve it, ship it
or the Quickstart: the same three steps by hand, in 5 minutes
- How Caligrafy works: the ideas in 5 minutes
- Your first capability: build a feature, page included
-
Capabilities in depth
-
#[Capability]: every option - Scheduled jobs: capabilities on a timer
- Notifications: web push and email
- Background jobs: capabilities run later
- Migrations: database changes, in order
- The cache
-
Testing your app
- Dependency injection
- Validation rules
-
Web pages
- Views and page components
- Design styles: another look, one setting
- Declarative routes: every request, in one line
-
Route::page·Route::form·Route::auth·Route::webhook·Route::download·Route::redirect·Route::action·Route::snap· capability routes - How to export a list as CSV
- Controllers: moving one to a declared route · how to, step by step
- Forms and helpers
-
Vue apps
-
Mobile and tablet
-
REST API
-
AI agents
-
Snap Cards and the assistant
- Payments: Stripe and crypto
- Face detection and face login
- OpenAI: chat and images · Assistants
- Open models: Llama, Mistral...
- Chatbots with Watson
- Machine learning in the browser
- Metadata and social cards · search and analytics
-
Putting it online: the production image, the database at every start
-
API reference: every class and method
-
Routing ·
Route·AuthRoutes· pages ·Controller· capabilities -
Data ·
Model·Query· sign-in · jobs ·Notify· payments · AI -
Interfaces · Snap ·
Snap\Cards·Snap\Conversation· testing · tooling · helper functions
-
Routing ·
-
Caligrafer: every command
- Project · build · data · agents · jobs and tests · maintenance · deploy
- Installation, configuration and Caligrafer
- Routing · Request · Controllers · Views
- Vue: flow of information · routes · validations
- Security and upgrading
- Release notes: 2.26 · 2.25 · 2.24 · 2.23 · 2.22 · 2.21 · 2.20 · 2.19 · 2.18 · 2.17 · 2.16 · 2.15 · 2.14 · 2.13 · 2.12 · 2.11 · 2.10 · 2.9 · 2.8 · 2.7 · 2.6 · 2.5 · 2.4 · 2.3 · 2.1 · October 2026 · changelog
- Testing Caligrafy (contributors)