# Build guide: small local tools for people without a development setup
Complete text, all sections. Source: https://ai-build-guide.flomotlik.me/guide/ · Index: https://ai-build-guide.flomotlik.me/llms.txt
The audience is someone with a browser and a chat window — no terminal, no
editor, no package manager, no admin rights. Every rule below follows from that.
---
## 1. What to deliver
Read when: Always. Read this before writing any code — it constrains every other section.
### Who you are building for
Someone doing this alongside their actual job — an administrator, an
organiser, a volunteer. No development environment, no terminal, no code
editor, no package manager, no admin rights on the laptop. They have a
browser and a chat window with you. Their time budget is one evening.
Anything that requires them to install software, run a command, or start a
local server has failed before it starts. This is not a preference — it is the
constraint that decides whether the tool gets used.
### The deliverable
**A folder the user saves. `index.html` is what they double-click.**
How many files that folder holds is your choice. What matters is that it runs
from `file://` without anything being installed or started.
| Rule | Why |
|---|---|
| `index.html` runs by double-click | No server, no `npx`, no terminal |
| No build step, no bundler, no npm | They cannot run any of it |
| **No `
```
Scripts run in document order, so a global defined in `daten.js` is available
in `app.js`. Verified working from a double-clicked file, subfolders included.
**Keep the folder flat when you split.** Nested directories work technically,
but every extra path is another chance for the user to save a file in the
wrong place. `index.html` + two or three siblings is the sweet spot.
**Say how to save it.** When you hand over more than one file *in a chat*,
name each file explicitly and say they all go in the same folder. That is the
only part of multi-file delivery that is genuinely harder for the user — and
it does not apply when you write the folder yourself.
### Data belongs in a .js file, not a .json file
`fetch('daten.json')` fails from `file://` — Chrome reports *URL scheme "file"
is not supported*. Do not use it, and do not work around it with a local
server.
Instead, write the data as JavaScript that assigns a global:
```js
// daten.js
window.DATEN = {
gemeinden: [
{ name: 'Oberndorf', einwohner: 5700 },
{ name: 'Herzogenburg', einwohner: 8300 }
]
};
```
Same content, loads with a plain `