diff --git a/.env b/.env
index 653c84e..02222bb 100644
--- a/.env
+++ b/.env
@@ -19,5 +19,6 @@ STAGING_PATH=/staging/__ORG__/__PROJECT__/dev
LIVE_URL=https://www
STAGING_URL=https://dev-__PROJECT_NAME__.staging.testversion.online
+CODING_URL=https://__PROJECT_NAME__.code.testversion.online
#START_SCRIPT=:ssr
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 53d8101..07cb11f 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -1,25 +1,25 @@
# Copilot Instructions
-## Common Instructions
+This workspace uses scoped instructions with YAML front matter in `.github/instructions/*.instructions.md`.
+Keep this file minimal to avoid duplicate or conflicting guidance.
-- Look in the problems tab for any errors or warnings in the code
-- Follow the existing code style and conventions used in the project
-- Write clear and concise comments where necessary to explain complex logic
-- Ensure code is modular and reusable where possible
-- Write unit tests for new functionality and ensure existing tests pass, but only if there is a configured testing framework
-- Avoid introducing new dependencies unless absolutely necessary, but ask the user if there is a specific library they want to use
-- If you are unsure about any requirements or details, ask the user for clarification before proceeding
-- Respect a11y and localization best practices if applicable, optimize for WCAG AA standards
+## Quick Reference
+
+- **General workflow**: See `.github/instructions/general.instructions.md`
+- **Frontend (Svelte)**: See `.github/instructions/frontend.instructions.md`
+- **API Hooks (tibi-server)**: See `.github/instructions/api-hooks.instructions.md`
+- **SSR/Caching**: See `.github/instructions/ssr.instructions.md`
+- **Testing (Playwright)**: See `.github/instructions/testing.instructions.md`
## Toolchain
-- See .env in root for project specific environment variables
-- See Makefile for starting up the development environment with Docker
-- If development environment is running, access the website at: https://${PROJECT_NAME}.code.testversion.online/ or ask the user for the correct URL
+- See `.env` in root for project-specific environment variables
+- See `Makefile` for starting up the development environment with Docker
+- If development environment is running, access the website at: `https://${PROJECT_NAME}.code.testversion.online/` or ask the user for the correct URL
- You can also use Browser MCP, so ask user to connect if needed
- Esbuild is used, watching for changes in files to rebuild automatically
-- To force a restart of the frontend build and dev-server run: `make restart-frontend`
-- Backend is tibi-server configured in /api/ folder and also restarted if changes are detected in this folder
-- To show last X lines of docker logs run: `make docker-logs-X` where X is the number
- of lines you want to see
+- To force a restart of the frontend build and dev-server run: `make docker-restart-frontend`
+- Backend is tibi-server configured in `/api/` folder and also restarted if changes are detected in this folder
+- To show last X lines of docker logs run: `make docker-logs-X` where X is the number of lines you want to see
- For a11y testing use the MCP a11y tools if available
+- For testing run: `yarn test` (all), `yarn test:e2e`, `yarn test:api`, `yarn test:visual`
diff --git a/.github/instructions/api-hooks.instructions.md b/.github/instructions/api-hooks.instructions.md
new file mode 100644
index 0000000..bc2f14f
--- /dev/null
+++ b/.github/instructions/api-hooks.instructions.md
@@ -0,0 +1,51 @@
+---
+name: API Hooks
+description: tibi-server hook conventions and typing.
+applyTo: "api/hooks/**"
+---
+
+# API Hooks (tibi-server)
+
+- Wrap hook files in an IIFE: `;(function () { ... })()`.
+- Always return a HookResponse type or throw a HookException type.
+- Use inline type casting with `/** @type {TypeName} */ (value)` and typed collection entries from `types/global.d.ts`.
+- Avoid `@ts-ignore`; use proper casting instead.
+- Use `const` and `let` instead of `var`. The tibi-server runtime supports modern JS declarations.
+
+## context.filter – Go object quirk
+
+`context.filter` is not a regular JS object but a Go object. Even when empty, it is **truthy**.
+Always check with `Object.keys()`:
+
+```js
+const requestedFilter =
+ context.filter &&
+ typeof context.filter === "object" &&
+ !Array.isArray(context.filter) &&
+ Object.keys(context.filter).length > 0
+ ? context.filter
+ : null
+```
+
+**Never** use `context.filter || null` – it is always truthy and results in an empty filter object inside `$and`, which crashes the Go server.
+
+## Single-item vs. list retrieval
+
+For single-item retrieval (`GET /:collection/:id`), the Go server sets `_id` automatically from the URL parameter.
+GET read hooks should therefore **not set their own `_id` filter** for `req.param("id")`;
+instead, only add authorization filters (e.g. `{ userId: userId }`).
+
+## HookResponse fields for GET hooks
+
+- `filter` – MongoDB filter (list retrieval only, or to restrict single-item retrieval)
+- `selector` – MongoDB projection (`{ fieldName: 0 }` to exclude, `{ fieldName: 1 }` to include)
+- `offset`, `limit`, `sort` – pagination/sorting
+- `pipelineMod` – function to manipulate the aggregation pipeline
+
+## API Tests (Playwright)
+
+- When creating or modifying collections/hooks: extend or create corresponding API tests in `tests/api/`.
+- Test files live under `tests/api/` and use fixtures from `tests/api/fixtures.ts`.
+- Helpers: `ensureTestUser()` (`tests/api/helpers/test-user.ts`), Admin API (`tests/api/helpers/admin-api.ts`), MailDev (`tests/api/helpers/maildev.ts`).
+- After hook changes, run only the affected API tests: `npx playwright test tests/api/filename.spec.ts`.
+- When tests fail, clarify whether the hook or the test needs adjustment – coordinate with the user.
diff --git a/.github/instructions/frontend.instructions.md b/.github/instructions/frontend.instructions.md
new file mode 100644
index 0000000..3b7cf6e
--- /dev/null
+++ b/.github/instructions/frontend.instructions.md
@@ -0,0 +1,28 @@
+---
+name: Frontend
+description: Svelte SPA structure and conventions.
+applyTo: "frontend/src/**"
+---
+
+# Frontend
+
+- SPA entry point is `frontend/src/index.ts`, main component is `frontend/src/App.svelte`.
+- Component organization: `lib/` for utilities and stores, keep route components in a `routes/` folder when needed, `css/` for styles.
+- Use PascalCase component names and export props at the top of the `
-