Explore a browser application
Want a website rather than a JSON API? The existing browser starter is a project-and-task workspace: sign in, create a project, and manage its tasks.
It renders HTML on the server. HTMX enhances forms; native form submissions also work without JavaScript. You do not need a separate single-page application.
<img src={require('@site/static/img/starter/login.webp').default} alt="Server-rendered sign-in page from the starter" width="360" />
The sign-in page that ships with the starter.
What you will use
In the browser
- A sign-in form and session cookie.
- A project workspace and task forms.
- Search, pagination, and complete/reopen actions.
In the Rust process
- HTML handlers calling application services.
- Authentication and CSRF components.
- Owner-scoped queries to TimescaleDB.
Run the existing starter
Prerequisites: Docker with Compose, available ports 3001 and 3003, and
this checkout. The first build needs network access and may take a while.
From the repository root:
The steps are separate on purpose: build the app, migrate the database, seed local demo data, then start it. Normal startup does not migrate or seed.
Open http://localhost:3001/ and sign in with the development fixture:
| Field | Local demo value |
|---|---|
| Identifier | [email protected] |
| Password | demo-password |
The seed command does not overwrite an existing password. If you reuse an old database, the credentials may differ. Do not delete a database to fix this without first checking whether it contains work you need.
After sign-in you land on the workspace:
<img src={require('@site/static/img/starter/workspace.webp').default} alt="The workspace: create a project on top, then add, edit, complete, and search its tasks below" />
Development fixture only
These credentials are public. Do not run this seed in production. Sessions and CSRF keys in the starter are process-local; this is not a multi-replica deployment recipe.
Try an actual user task
- Create a project. Give it a name you recognize.
- Add a task. The browser submits a protected form; a service performs the change.
- Complete and reopen it. The server updates the task and renders the result.
- Reload the page. Data lives in the database, not browser memory.
These interactions show the framework's pieces working together. The browser is one caller of the application services, not where their business rules belong.
Build your own page next
- Browser UI guide: rendering, forms, and protected mutations.
- Authentication guide: connecting credentials and sessions.
- Application model: where to place behavior as it grows.
To stop the local stack without deleting volumes: