Build full-stack TypeScript that stays explicit.
One visible route model. Inspectable state and dependencies. Browser, server, or static output from ordinary project files.
npx @askrjs/cli@latest create startkit my-appThe framework composes. Your application stays visible.
Askr connects the layers without turning them into hidden conventions or a second application architecture.
import {
createRouteRegistry,
group,
route,
} from '@askrjs/askr/router';
export const routes = createRouteRegistry(() => {
group({ layout: AppLayout }, () => {
route('/', OverviewPage);
route('/activity', ActivityPage);
route('/*', NotFoundPage);
});
});- 01
One visible route graph
Routes, layouts, loaders, and actions remain inspectable.
- 02
Rendering is a delivery choice
Use the same routes for browser, server, or static HTML.
- 03
Full-stack seams stay named
Schemas, policies, and dependencies meet at a visible root.
- 04
Output stays ordinary
Ship static documents and assets or a thin Node adapter.
Take the layers you need. Keep the boundaries explicit.
Start with runtime and routes. Add themes, server capabilities, and build tooling as requirements grow.
Explore the platformApplication model
Explicit state, visible routes, scoped resources, and lifecycle-aware data.
02Rendering
Choose browser rendering, server rendering, or static generation from one route model.
03Full stack
Compose pages, APIs, actions, schemas, and auth policies at one visible root.
04Themes
Layer replaceable themes and tokens over headless components.
05Tooling
Readable starters, verifiable commands, guarded updates, and local skills.
06Production
Ship static or Node artifacts behind clear operational boundaries.
Start with the application you need to ship.
Choose the closest starter, keep the generated files in view, and add rendering, server, and production capabilities only when the application calls for them.