1. Install & first route
Create a Pondoknusa app, boot the HTTP kernel, and return your first HTML page.
Create the project
npm create pondoknusa@latest blog
# fallback: npx -y @pondoknusa/cli new blog
cd blognew already installs dependencies, generates APP_KEY, creates storage/, installs auth (default), migrates SQLite, and wires MCP agent rules. You can run pondoknusa dev immediately.
The default scaffold uses SQLite, a database queue, and log mail — no Redis or cloud SDKs required.
Project layout
Key files:
src/main.ts— boots providers and the HTTP kernelsrc/routes/web.ts— web routes (orroutes/web.tsdepending on scaffold)config/— typed configuration modulesresources/views/—.tyrtemplates
See Application structure for the full map.
First route
import { Route, View } from '@pondoknusa/core';
import { Response } from '@pondoknusa/http';
Route.get('/', async () =>
Response.html(await View.render('welcome', { title: 'Hello Pondoknusa' })),
);
Route.get('/health', async () => Response.json({ ok: true }));Create the view:
pondoknusa make:view welcomeRun the dev server
pondoknusa devpondoknusa dev starts the server with view, config, and route hot reload. After pondoknusa debug:install, use pondoknusa debug:watch to tail request timelines without signing in. The /__debug JSON panel requires an authenticated session.
Visit http://127.0.0.1:3000 and /health.
Verified in CI
The examples/hello-world reference app exercises this step. Its feature test asserts the welcome page contains Hello Pondoknusa:
cd examples/hello-world && npm testNamed routes
Route.get('/posts', async () => Response.json([])).name('posts.index');List routes with pondoknusa route:list — filters and JSON output are documented in the routing guide.
Next
Continue to Auth & database to persist users and protect routes.