Astro’s routes for the whole site, one file per address. astro.config.mjs sets no output, so a route is built ahead of time unless it says export const prerender = false. Only the community’s pages, /admin and /linked/ are drawn when asked. Every other page is built at build time, from getStaticPaths over src/lib/ where it has a parameter.
The app’s and the account’s pages are shells: a frame from src/layouts/ and a React island filled in by the browser. They check nothing themselves (ADR 0018). The worker sends a signed-out visitor at /properties/ and /property/ to /signin/ before Astro is asked (src/lib/ways.ts:led; see server/worker). /new/ and its steps stay open to a guest.
The pages drawn when asked do their work in server/community/ (posts.ts, hausboss.ts), with the env of server/community/env.ts.
Addresses end in / in a build (trailingSlash: 'always'). A subdirectory holds the routes under its address (community/ ten, handbook/ four, calculators/ three, editor/, examples/ and features/ two each, the rest one), and has no README of its own. The table has one row for each of the 42 route files.
| Address | File | Kind | Built ahead | What it does |
|---|---|---|---|---|
/ |
index.astro |
page | yes | The home page |
/404 |
404.astro |
page | yes | Not found, noindex |
/start/ |
start.astro |
page | yes | The ad page: an address given starts /new/, noindex |
/solutions/ |
solutions/index.astro |
page | yes | What owners use it for |
/tools/ |
tools/index.astro |
page | yes | The editor’s tools |
/features/ |
features/index.astro |
page | yes | The features |
/features/[feature]/ |
features/[feature].astro |
page | yes | One feature, from src/lib/site.ts features |
/examples/ |
examples/index.astro |
page | yes | House styles |
/examples/[style]/ |
examples/[style].astro |
page | yes | One style in 3D, on its lot with its yard |
/calculators/ |
calculators/index.astro |
page | yes | The calculators, searched in the browser |
/calculators/[...tool]/ |
calculators/[...tool].astro |
page | yes | One calculator in 3D with its cut list |
/calculators/[...tool].md |
calculators/[...tool].md.ts |
endpoint GET |
yes | A calculator said in markdown, for agents |
/handbook/ |
handbook/index.astro |
page | yes | The guides |
/handbook/[chapter]/ |
handbook/[chapter].astro |
page | yes | A chapter’s steps |
/handbook/guides/[guide]/ |
handbook/guides/[guide]/index.astro |
page | yes | A guide: its plan, what to buy, its steps |
/handbook/guides/[guide]/[step].png |
handbook/guides/[guide]/[step].png.ts |
endpoint GET |
yes | One step’s picture |
/drawn/[name].svg |
drawn/[name].svg.ts |
endpoint GET |
yes | A framing drawing |
/demos/[name].json |
demos/[name].json.ts |
endpoint GET |
yes | A scene’s demo documents |
/llms.txt |
llms.txt.ts |
endpoint GET |
yes | The site said for language models (src/lib/llms.ts) |
/editor/demo/ |
editor/demo.astro |
page | yes | The editor on a kept demo property |
/editor/embed/ |
editor/embed.astro |
page | yes | The editor embedded |
/properties/ |
properties.astro |
page | yes | The app: an owner’s properties (React, client:only) |
/property/ |
property.astro |
page | yes | The app: one property, and the editor’s frame |
/new/ |
new.astro |
page | yes | The app: a new property from an address |
/signin/ |
signin.astro |
page | yes | Account shell, signed out |
/reset-password/ |
reset-password.astro |
page | yes | Account shell, signed out |
/account/, /account/profile/, /account/billing/ |
account/[...page].astro |
page | yes | Account shell, signed in |
/connect/ |
connect.astro |
page | yes | Account shell: approve an AI app |
/device/ |
device.astro |
page | yes | Account shell: approve a script by its code |
/community/ |
community/index.astro |
page, GET and POST |
no | The community’s parts and categories; a POST writes a new post (/community/new/’s form is sent here) |
/community/[id]/[...under] |
community/[id]/[...under].astro |
page, GET and POST |
no | A part, a category, a post, a feed or an edit, as posts.ts:route finds it |
/community/new/ |
community/new.astro |
page | no | Write a post |
/community/members/[id]/ |
community/members/[id].astro |
page | no | A member’s profile |
/community/shell/ |
community/shell.astro |
page | yes | The community’s frame for the app, noindex |
/community/latest.json |
community/latest.json.ts |
endpoint GET |
no | The latest showcases, posts and news |
/community/me |
community/me.ts |
endpoint GET |
no | How many posts are unread, or false signed out |
/community/attachments/[key] |
community/attachments/[key].ts |
endpoint GET |
no | A post’s attachment from R2 |
/community/faces/[...hash] |
community/faces/[...hash].ts |
endpoint GET, POST |
no | Avatars: served, or put up |
/community/pictures/[...hash] |
community/pictures/[...hash].ts |
endpoint GET, POST |
no | A post’s or a reply’s pictures: served, or put up |
/linked/[hash] |
linked/[hash].ts |
endpoint GET |
no | A picture linked from a property (linked/ in R2) |
/admin |
admin.astro |
page | no | Admins talk with Hausboss |
/admin/hausboss/[...at] |
admin/hausboss/[...at].ts |
endpoint ALL |
no | Sent on to Hausboss |
locals.user is found only for a page drawn when asked whose address starts with /community/ or /admin [src/middleware.ts:onRequest]./admin sends someone signed out to /signin/?to=… (303), and answers anyone not an admin 403 [admin.astro; server/community/posts.ts:door]./admin/hausboss/* answers 401 signed out and 403 to anyone not an admin; its first segment must be a 36-character id, else 404 [server/community/hausboss.ts:hausboss].route() finds nothing at is 404; an old category slug is sent on to its new one through category_slugs [community/[id]/[...under].astro; server/community/posts.ts:route]./community/members/[id]/ takes an id of /^[\w-]{1,64}$/, and is 404 for a member with nothing written and nothing said about them, unless it is the one asking [server/community/posts.ts:member].faces/, pictures/, linked/ or a bare one, else 404 [server/community/posts.ts:attachment].MAX (413) that is an image (400) [server/community/posts.ts:faced, pictured].public/shots/<slug>.jpg [calculators/[...tool].astro:getStaticPaths].POST needs a Turnstile token for community, checked by siteverify where TURNSTILE_SECRET is set, else 403 [server/community/posts.ts:act, person].signed={true} or signed={false} to layouts/Account.astro, which decides; the page files check nothing.hausboss: read by /admin, written by /admin/hausboss/* [server/community/hausboss.ts:talking, hausboss].parts, categories, category_slugs, posts, reactions, flags, attachments, seen, "user": read by the community pages; seen written when a signed-in member opens a post [server/community/posts.ts:route, thread, unread, latest, member].posts, reactions, flags, attachments: written by a community POST (write, change, react, mark, answer, flag, clear, delete) [server/community/posts.ts:act, acted].ATTACHMENTS: read by the attachment, face, picture and linked endpoints; written under faces/ and pictures/ [server/community/posts.ts:attachment, put]; a post’s pictures written under a bare hash, and removed with it [server/community/posts.ts:attach, unattach].POST [server/community/posts.ts:person].ACCOUNT.earned as a member’s counts grow, not to admins [server/community/posts.ts:earn, awarded].IMAGES: uploads re-encoded, pictures served in the best format asked for [server/worker/images.ts:kept, best].HAUSBOSS: /admin/hausboss/* is sent on to it [server/community/hausboss.ts:hausboss].Cache-Control: public, max-age=300 on /community/latest.json [community/latest.json.ts:GET]; attachments immutable for a year with a sandbox CSP [server/community/posts.ts:attachment].asking.sent [src/middleware.ts:onRequest].npm run build (from the repository root)