diff --git a/apps/todo/20260130-181927/.npmrc b/apps/todo/20260130-181927/.npmrc
deleted file mode 100644
index 6c57d5c..0000000
--- a/apps/todo/20260130-181927/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-registry=https://npm.nose.space
diff --git a/apps/todo/20260130-181927/bun.lock b/apps/todo/20260130-181927/bun.lock
deleted file mode 100644
index 43acf88..0000000
--- a/apps/todo/20260130-181927/bun.lock
+++ /dev/null
@@ -1,45 +0,0 @@
-{
- "lockfileVersion": 1,
- "configVersion": 1,
- "workspaces": {
- "": {
- "name": "todo",
- "dependencies": {
- "@because/forge": "^0.0.1",
- "@because/hype": "^0.0.2",
- "@because/toes": "^0.0.5",
- },
- "devDependencies": {
- "@types/bun": "latest",
- },
- "peerDependencies": {
- "typescript": "^5.9.3",
- },
- },
- },
- "packages": {
- "@because/forge": ["@because/forge@0.0.1", "https://npm.nose.space/@because/forge/-/forge-0.0.1.tgz", { "peerDependencies": { "typescript": "^5" } }, "sha512-QS5CK51gcWma91i4uECWe4HPJeNHcE+Af4SQHOcfEovyzOEa7VOTAjei+jIWr2i+abGWqQCEC9wIuFgPgyr2Bg=="],
-
- "@because/hype": ["@because/hype@0.0.2", "https://npm.nose.space/@because/hype/-/hype-0.0.2.tgz", { "dependencies": { "hono": "^4.10.4", "kleur": "^4.1.5" }, "peerDependencies": { "typescript": "^5" } }, "sha512-fdKeII6USGC1loVVj+tPz086cKz+Bm+XozNee3NOnK4VP+q4yNPP2Fq1Yujw5xeDYE+ZvJn40gKwlngRvmX2hA=="],
-
- "@because/toes": ["@because/toes@0.0.5", "https://npm.nose.space/@because/toes/-/toes-0.0.5.tgz", { "dependencies": { "@because/forge": "^0.0.1", "@because/hype": "^0.0.2", "commander": "^14.0.2", "diff": "^8.0.3", "kleur": "^4.1.5" }, "peerDependencies": { "typescript": "^5.9.2" }, "bin": { "toes": "src/cli/index.ts" } }, "sha512-YM1VuR1sym7m7pFcaiqnjg6eJUyhJYUH2ROBb+xi+HEXajq46ZL8KDyyCtz7WiHTfrbxcEWGjqyj20a7UppcJg=="],
-
- "@types/bun": ["@types/bun@1.3.8", "https://npm.nose.space/@types/bun/-/bun-1.3.8.tgz", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="],
-
- "@types/node": ["@types/node@25.1.0", "https://npm.nose.space/@types/node/-/node-25.1.0.tgz", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA=="],
-
- "bun-types": ["bun-types@1.3.8", "https://npm.nose.space/bun-types/-/bun-types-1.3.8.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="],
-
- "commander": ["commander@14.0.3", "https://npm.nose.space/commander/-/commander-14.0.3.tgz", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
-
- "diff": ["diff@8.0.3", "https://npm.nose.space/diff/-/diff-8.0.3.tgz", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="],
-
- "hono": ["hono@4.11.7", "https://npm.nose.space/hono/-/hono-4.11.7.tgz", {}, "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw=="],
-
- "kleur": ["kleur@4.1.5", "https://npm.nose.space/kleur/-/kleur-4.1.5.tgz", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
-
- "typescript": ["typescript@5.9.3", "https://npm.nose.space/typescript/-/typescript-5.9.3.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
-
- "undici-types": ["undici-types@7.16.0", "https://npm.nose.space/undici-types/-/undici-types-7.16.0.tgz", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
- }
-}
diff --git a/apps/todo/20260130-181927/index.tsx b/apps/todo/20260130-181927/index.tsx
deleted file mode 100644
index 9b61e99..0000000
--- a/apps/todo/20260130-181927/index.tsx
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './src/server'
diff --git a/apps/todo/20260130-181927/package.json b/apps/todo/20260130-181927/package.json
deleted file mode 100644
index 8aefbe6..0000000
--- a/apps/todo/20260130-181927/package.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "name": "todo",
- "module": "index.tsx",
- "type": "module",
- "private": true,
- "scripts": {
- "toes": "bun run --watch index.tsx",
- "start": "bun toes",
- "dev": "bun run --hot index.tsx"
- },
- "toes": {
- "tool": "TODO",
- "icon": "✅"
- },
- "devDependencies": {
- "@types/bun": "latest"
- },
- "peerDependencies": {
- "typescript": "^5.9.3"
- },
- "dependencies": {
- "@because/forge": "^0.0.1",
- "@because/hype": "^0.0.2",
- "@because/toes": "^0.0.5"
- }
-}
diff --git a/apps/todo/20260130-181927/pub/img/bite1.png b/apps/todo/20260130-181927/pub/img/bite1.png
deleted file mode 100644
index bdc5d37..0000000
Binary files a/apps/todo/20260130-181927/pub/img/bite1.png and /dev/null differ
diff --git a/apps/todo/20260130-181927/pub/img/bite2.png b/apps/todo/20260130-181927/pub/img/bite2.png
deleted file mode 100644
index f0be640..0000000
Binary files a/apps/todo/20260130-181927/pub/img/bite2.png and /dev/null differ
diff --git a/apps/todo/20260130-181927/pub/img/burger.png b/apps/todo/20260130-181927/pub/img/burger.png
deleted file mode 100644
index 292aef3..0000000
Binary files a/apps/todo/20260130-181927/pub/img/burger.png and /dev/null differ
diff --git a/apps/todo/20260130-181927/src/client/App.tsx b/apps/todo/20260130-181927/src/client/App.tsx
deleted file mode 100644
index 4cb5ef6..0000000
--- a/apps/todo/20260130-181927/src/client/App.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { render, useState } from 'hono/jsx/dom'
-import { define } from '@because/forge'
-
-const Wrapper = define({
- margin: '0 auto',
- marginTop: 50,
- width: '50vw',
- border: '1px solid black',
- padding: 24,
- textAlign: 'center'
-
-})
-
-export default function App() {
- const [count, setCount] = useState(0)
-
- try {
- return (
-
- It works!
- Count: {count}
-
-
-
-
-
-
- )
- } catch (error) {
- console.error('Render error:', error)
- return <>
Error
{error instanceof Error ? error : new Error(String(error))}>
- }
-}
-
-const root = document.getElementById('root')!
-render(, root)
diff --git a/apps/todo/20260130-181927/src/css/main.css b/apps/todo/20260130-181927/src/css/main.css
deleted file mode 100644
index 62bcd77..0000000
--- a/apps/todo/20260130-181927/src/css/main.css
+++ /dev/null
@@ -1,40 +0,0 @@
-section {
- max-width: 500px;
- margin: 0 auto;
- text-align: center;
- font-size: 200%;
-}
-
-h1 {
- margin-top: 0;
-}
-
-.hype {
- display: inline-block;
- padding: 0.3rem 0.8rem;
- background: linear-gradient(45deg,
- #ff00ff 0%,
- #00ffff 33%,
- #ffff00 66%,
- #ff00ff 100%);
- background-size: 400% 400%;
- animation: gradientShift 15s ease infinite;
- color: black;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- font-weight: 700;
- border-radius: 4px;
-}
-
-@keyframes gradientShift {
- 0% {
- background-position: 0% 50%;
- }
-
- 100% {
- background-position: 100% 50%;
- }
-}
-
-ul {
- list-style-type: none;
-}
\ No newline at end of file
diff --git a/apps/todo/20260130-181927/src/pages/index.tsx b/apps/todo/20260130-181927/src/pages/index.tsx
deleted file mode 100644
index 126eeb5..0000000
--- a/apps/todo/20260130-181927/src/pages/index.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { $ } from 'bun'
-
-const GIT_HASH = process.env.RENDER_GIT_COMMIT?.slice(0, 7)
- || await $`git rev-parse --short HEAD`.text().then(s => s.trim()).catch(() => 'unknown')
-
-export default () => <>
-
-
- hype
-
-
-
-
-
-
-
-
-
-
-
->
diff --git a/apps/todo/20260130-181927/src/server/index.tsx b/apps/todo/20260130-181927/src/server/index.tsx
deleted file mode 100644
index 4ecf054..0000000
--- a/apps/todo/20260130-181927/src/server/index.tsx
+++ /dev/null
@@ -1,366 +0,0 @@
-import { Hype } from '@because/hype'
-import { define, stylesToCSS } from '@because/forge'
-import { baseStyles, ToolScript, theme } from '@because/toes/tools'
-import { readFileSync, writeFileSync, existsSync } from 'fs'
-import { join } from 'path'
-
-const APPS_DIR = process.env.APPS_DIR!
-
-const app = new Hype({ prettyHTML: false })
-
-const Container = define('TodoContainer', {
- fontFamily: theme('fonts-sans'),
- padding: '20px',
- maxWidth: '800px',
- margin: '0 auto',
- color: theme('colors-text'),
-})
-
-const Header = define('Header', {
- marginBottom: '20px',
- display: 'flex',
- justifyContent: 'space-between',
- alignItems: 'center',
-})
-
-const Title = define('Title', {
- margin: 0,
- fontSize: '24px',
- fontWeight: 'bold',
-})
-
-const AppName = define('AppName', {
- color: theme('colors-textMuted'),
- fontSize: '14px',
-})
-
-const TodoList = define('TodoList', {
- listStyle: 'none',
- padding: 0,
- margin: 0,
-})
-
-const TodoSection = define('TodoSection', {
- marginBottom: '24px',
-})
-
-const SectionTitle = define('SectionTitle', {
- fontSize: '16px',
- fontWeight: 600,
- color: theme('colors-textMuted'),
- marginBottom: '12px',
- paddingBottom: '8px',
- borderBottom: `1px solid ${theme('colors-border')}`,
-})
-
-const TodoItemStyle = define('TodoItem', {
- display: 'flex',
- alignItems: 'flex-start',
- padding: '8px 0',
- gap: '10px',
- selectors: {
- '& input[type="checkbox"]': {
- marginTop: '3px',
- width: '18px',
- height: '18px',
- cursor: 'pointer',
- },
- '& label': {
- flex: 1,
- cursor: 'pointer',
- lineHeight: '1.5',
- },
- },
-})
-
-const doneClass = 'todo-done'
-
-const Error = define('Error', {
- color: theme('colors-error'),
- padding: '20px',
- backgroundColor: theme('colors-bgElement'),
- borderRadius: theme('radius-md'),
- margin: '20px 0',
-})
-
-const successClass = 'msg-success'
-const errorClass = 'msg-error'
-
-const SaveButton = define('SaveButton', {
- base: 'button',
- backgroundColor: theme('colors-primary'),
- color: theme('colors-primaryText'),
- border: 'none',
- padding: '8px 16px',
- borderRadius: theme('radius-md'),
- cursor: 'pointer',
- fontSize: '14px',
- fontWeight: 500,
- states: {
- ':hover': {
- opacity: 0.9,
- },
- ':disabled': {
- opacity: 0.5,
- cursor: 'not-allowed',
- },
- },
-})
-
-const AddForm = define('AddForm', {
- display: 'flex',
- gap: '10px',
- marginBottom: '20px',
-})
-
-const AddInput = define('AddInput', {
- base: 'input',
- flex: 1,
- padding: '8px 12px',
- border: `1px solid ${theme('colors-border')}`,
- borderRadius: theme('radius-md'),
- fontSize: '14px',
- backgroundColor: theme('colors-bg'),
- color: theme('colors-text'),
- states: {
- ':focus': {
- outline: 'none',
- borderColor: theme('colors-primary'),
- },
- },
-})
-
-const todoStyles = `
-.${doneClass} {
- color: ${theme('colors-done')};
- text-decoration: line-through;
-}
-.${successClass} {
- padding: 12px 16px;
- border-radius: ${theme('radius-md')};
- margin-bottom: 16px;
- background-color: ${theme('colors-successBg')};
- color: ${theme('colors-success')};
-}
-.${errorClass} {
- padding: 12px 16px;
- border-radius: ${theme('radius-md')};
- margin-bottom: 16px;
- background-color: ${theme('colors-bgElement')};
- color: ${theme('colors-error')};
-}
-`
-
-interface TodoEntry {
- text: string
- done: boolean
-}
-
-interface ParsedTodo {
- title: string
- items: TodoEntry[]
-}
-
-function parseTodoFile(content: string): ParsedTodo {
- const lines = content.split('\n')
- let title = 'TODO'
- const items: TodoEntry[] = []
-
- for (const line of lines) {
- const trimmed = line.trim()
- if (!trimmed) continue
-
- if (trimmed.startsWith('# ')) {
- title = trimmed.slice(2)
- } else if (trimmed.startsWith('[x] ') || trimmed.startsWith('[X] ')) {
- items.push({ text: trimmed.slice(4), done: true })
- } else if (trimmed.startsWith('[ ] ')) {
- items.push({ text: trimmed.slice(4), done: false })
- }
- }
-
- return { title, items }
-}
-
-function serializeTodo(todo: ParsedTodo): string {
- const lines = [`# ${todo.title}`]
- for (const item of todo.items) {
- lines.push(item.done ? `[x] ${item.text}` : `[ ] ${item.text}`)
- }
- return lines.join('\n') + '\n'
-}
-
-app.get('/ok', c => c.text('ok'))
-
-app.get('/styles.css', c => c.text(baseStyles + todoStyles + stylesToCSS(), 200, {
- 'Content-Type': 'text/css; charset=utf-8',
-}))
-
-app.get('/', async c => {
- const appName = c.req.query('app')
- const message = c.req.query('message')
- const messageType = c.req.query('type') as 'success' | 'error' | undefined
-
- if (!appName) {
- return c.html(
-
-
-
-
- TODO
-
-
-
-
-
-
- Select an app to view its TODO list
-
-
-
- )
- }
-
- const todoPath = join(APPS_DIR, appName, 'current', 'TODO.txt')
-
- let todo: ParsedTodo
- if (existsSync(todoPath)) {
- const content = readFileSync(todoPath, 'utf-8')
- todo = parseTodoFile(content)
- } else {
- todo = { title: `${appName} TODO`, items: [] }
- }
-
- const pendingItems = todo.items.filter(i => !i.done)
-
- return c.html(
-
-
-
-
- {todo.title}
-
-
-
-
-
-
-
-
{todo.title}
-
{appName}/TODO.txt
-
-
-
- {message && (
-
- {message}
-
- )}
-
-
-
- {todo.items.length > 0 && (
-
-
- {pendingItems.length === 0 ? 'All done!' : `Pending (${pendingItems.length})`}
-
-
- {todo.items.map((item, i) => (
-
-
-
- ))}
-
-
- )}
-
- {todo.items.length === 0 && (
-
- No todos yet
- Add your first todo above!
-
- )}
-
-
-
- )
-})
-
-app.post('/toggle', async c => {
- const form = await c.req.formData()
- const appName = form.get('app') as string
- const index = parseInt(form.get('index') as string, 10)
-
- const todoPath = join(APPS_DIR, appName, 'current', 'TODO.txt')
-
- let todo: ParsedTodo
- if (existsSync(todoPath)) {
- const content = readFileSync(todoPath, 'utf-8')
- todo = parseTodoFile(content)
- } else {
- return c.redirect(`/?app=${appName}`)
- }
-
- const item = todo.items[index]
- if (item) {
- item.done = !item.done
- }
-
- try {
- writeFileSync(todoPath, serializeTodo(todo))
- return c.redirect(`/?app=${appName}`)
- } catch {
- return c.redirect(`/?app=${appName}&message=${encodeURIComponent('Failed to save')}&type=error`)
- }
-})
-
-app.post('/add', async c => {
- const form = await c.req.formData()
- const appName = form.get('app') as string
- const text = (form.get('text') as string).trim()
-
- if (!text) {
- return c.redirect(`/?app=${appName}`)
- }
-
- const todoPath = join(APPS_DIR, appName, 'current', 'TODO.txt')
-
- let todo: ParsedTodo
- if (existsSync(todoPath)) {
- const content = readFileSync(todoPath, 'utf-8')
- todo = parseTodoFile(content)
- } else {
- todo = { title: `${appName} TODO`, items: [] }
- }
-
- todo.items.push({ text, done: false })
-
- try {
- writeFileSync(todoPath, serializeTodo(todo))
- return c.redirect(`/?app=${appName}`)
- } catch {
- return c.redirect(`/?app=${appName}&message=${encodeURIComponent('Failed to add')}&type=error`)
- }
-})
-
-export default app.defaults
diff --git a/apps/todo/20260130-181927/src/shared/types.ts b/apps/todo/20260130-181927/src/shared/types.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/apps/todo/20260130-181927/tsconfig.json b/apps/todo/20260130-181927/tsconfig.json
deleted file mode 100644
index b16b513..0000000
--- a/apps/todo/20260130-181927/tsconfig.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "compilerOptions": {
- "lib": ["ESNext"],
- "target": "ESNext",
- "module": "Preserve",
- "moduleDetection": "force",
- "jsx": "react-jsx",
- "jsxImportSource": "hono/jsx",
- "allowJs": true,
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "verbatimModuleSyntax": true,
- "noEmit": true,
- "strict": true,
- "skipLibCheck": true,
- "noFallthroughCasesInSwitch": true,
- "noUncheckedIndexedAccess": true,
- "noImplicitOverride": true,
- "noUnusedLocals": false,
- "noUnusedParameters": false,
- "noPropertyAccessFromIndexSignature": false,
- "baseUrl": ".",
- "paths": {
- "$*": ["src/server/*"],
- "#*": ["src/client/*"],
- "@*": ["src/shared/*"]
- }
- }
-}