diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte
index e840f18..47132c9 100644
--- a/web/src/routes/+page.svelte
+++ b/web/src/routes/+page.svelte
@@ -1,3 +1,108 @@
+
+
+
+ easy-png-tools — PNG-утилиты прямо в браузере
+
+
+
easy-png-tools
-Набор PNG-утилит, которые работают полностью в вашем браузере.
-Инструменты появятся здесь по мере добавления — см. docs/mvp-plan.md.
+
+ Набор утилит для работы с PNG. Все операции выполняются локально в браузере — файлы никуда не
+ отправляются.
+
+
+{#each CATEGORIES as category (category.id)}
+ {@const categoryTools = TOOLS.filter((tool) => tool.category === category.id)}
+ {#if categoryTools.length > 0}
+
+ {/if}
+{/each}
+
+
diff --git a/web/src/routes/tools/[id]/+page.svelte b/web/src/routes/tools/[id]/+page.svelte
new file mode 100644
index 0000000..0e98a5b
--- /dev/null
+++ b/web/src/routes/tools/[id]/+page.svelte
@@ -0,0 +1,19 @@
+
+
+
+ {tool?.title ?? 'Инструмент'} — easy-png-tools
+ {#if tool}
+
+ {/if}
+
+
+{#if tool}
+
+{/if}
diff --git a/web/src/routes/tools/[id]/+page.ts b/web/src/routes/tools/[id]/+page.ts
new file mode 100644
index 0000000..a2a0ac9
--- /dev/null
+++ b/web/src/routes/tools/[id]/+page.ts
@@ -0,0 +1,13 @@
+import { error } from '@sveltejs/kit';
+import { getTool, TOOLS } from '$lib/registry';
+import type { EntryGenerator, PageLoad } from './$types';
+
+export const entries: EntryGenerator = () => TOOLS.map((tool) => ({ id: tool.id }));
+
+export const load: PageLoad = ({ params }) => {
+ const tool = getTool(params.id);
+ if (!tool) {
+ error(404, 'Инструмент не найден');
+ }
+ return { id: tool.id };
+};