From e3a76b0d1985e5e6cd30eaeea72df9b4d7c8cf0b Mon Sep 17 00:00:00 2001 From: Artem Zakharchenko Date: Tue, 26 Aug 2025 13:33:28 +0200 Subject: [PATCH 01/17] add new workshop outline --- .../README.mdx | 0 .../package.json | 0 .../tsconfig.json | 0 .../README.mdx | 0 .../package.json | 0 .../playwright.config.ts | 0 .../tests/epicweb.test.ts | 0 .../tsconfig.json | 0 .../02.problem.running-the-app/.env | 0 .../02.problem.running-the-app/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../02.problem.running-the-app/.gitignore | 0 .../02.problem.running-the-app/.npmrc | 0 .../.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../02.problem.running-the-app/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../02.problem.running-the-app/app/root.tsx | 0 .../02.problem.running-the-app/app/routes.ts | 0 .../app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../components.json | 0 .../eslint.config.js | 0 .../02.problem.running-the-app/fly.toml | 0 .../02.problem.running-the-app/index.js | 0 .../other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../other/README.md | 0 .../other/build-server.ts | 0 .../other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../02.problem.running-the-app/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../02.problem.running-the-app/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/homepage.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../02.problem.running-the-app/tests/utils.ts | 0 .../02.problem.running-the-app/tsconfig.json | 0 .../types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../types/reset.d.ts | 0 .../02.problem.running-the-app/vite.config.ts | 0 .../02.solution.running-the-app/.env | 0 .../02.solution.running-the-app/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../02.solution.running-the-app/.gitignore | 0 .../02.solution.running-the-app/.npmrc | 0 .../.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../02.solution.running-the-app/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../02.solution.running-the-app/app/root.tsx | 0 .../02.solution.running-the-app/app/routes.ts | 0 .../app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../components.json | 0 .../eslint.config.js | 0 .../02.solution.running-the-app/fly.toml | 0 .../02.solution.running-the-app/index.js | 0 .../other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../other/README.md | 0 .../other/build-server.ts | 0 .../other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../02.solution.running-the-app/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/homepage.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/utils.ts | 0 .../02.solution.running-the-app/tsconfig.json | 0 .../types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../types/reset.d.ts | 0 .../vite.config.ts | 0 .../03.problem.custom-fixtures}/.env | 0 .../03.problem.custom-fixtures}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../03.problem.custom-fixtures}/.gitignore | 0 .../03.problem.custom-fixtures}/.npmrc | 0 .../.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../03.problem.custom-fixtures}/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../03.problem.custom-fixtures}/app/root.tsx | 0 .../03.problem.custom-fixtures}/app/routes.ts | 0 .../app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../components.json | 0 .../eslint.config.js | 0 .../03.problem.custom-fixtures}/fly.toml | 0 .../03.problem.custom-fixtures}/index.js | 0 .../other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../other/README.md | 0 .../other/build-server.ts | 0 .../other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../03.problem.custom-fixtures}/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/homepage.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../tests/utils.ts | 0 .../03.problem.custom-fixtures}/tsconfig.json | 0 .../types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../types/reset.d.ts | 0 .../vite.config.ts | 0 .../03.solution.custom-fixtures}/.env | 0 .../03.solution.custom-fixtures}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../03.solution.custom-fixtures}/.gitignore | 0 .../03.solution.custom-fixtures}/.npmrc | 0 .../.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../03.solution.custom-fixtures}/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../03.solution.custom-fixtures}/app/root.tsx | 0 .../app/routes.ts | 0 .../app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../components.json | 0 .../eslint.config.js | 0 .../03.solution.custom-fixtures}/fly.toml | 0 .../03.solution.custom-fixtures}/index.js | 0 .../other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../other/README.md | 0 .../other/build-server.ts | 0 .../other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../03.solution.custom-fixtures}/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/homepage.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../tests/utils.ts | 0 .../tsconfig.json | 0 .../types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../types/reset.d.ts | 0 .../vite.config.ts | 0 .../{01.basics => 01.setup}/FINISHED.mdx | 0 exercises/{01.basics => 01.setup}/README.mdx | 0 .../.cursor/rules/avoid-use-effect.mdc | 0 .../01.problem.basic}/.env | 0 .../01.problem.basic}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../01.problem.basic}/.gitignore | 0 .../01.problem.basic}/.npmrc | 0 .../01.problem.basic}/.prettierignore | 0 .../01.problem.basic}/.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../01.problem.basic}/.vscode/settings.json | 0 .../01.problem.basic}/README.mdx | 2 +- .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../01.problem.basic}/app/entry.client.tsx | 0 .../01.problem.basic}/app/entry.server.tsx | 0 .../01.problem.basic}/app/root.tsx | 0 .../01.problem.basic}/app/routes.ts | 0 .../01.problem.basic}/app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../01.problem.basic}/app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../01.problem.basic}/app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../01.problem.basic}/app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../01.problem.basic}/app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../01.problem.basic}/app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../01.problem.basic}/app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../01.problem.basic}/components.json | 0 .../01.problem.basic}/eslint.config.js | 0 .../01.problem.basic}/fly.toml | 0 .../01.problem.basic}/index.js | 0 .../01.problem.basic}/other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../01.problem.basic}/other/README.md | 0 .../01.problem.basic}/other/build-server.ts | 0 .../01.problem.basic}/other/litefs.yml | 0 .../01.problem.basic}/other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../01.problem.basic}/other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../01.problem.basic}/package-lock.json | 0 .../01.problem.basic}/package.json | 0 .../01.problem.basic}/playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../01.problem.basic}/prisma/schema.prisma | 0 .../01.problem.basic}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../01.problem.basic}/public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../01.problem.basic}/public/img/user.png | Bin .../01.problem.basic}/public/site.webmanifest | 0 .../01.problem.basic}/react-router.config.ts | 0 .../01.problem.basic}/server/dev-server.js | 0 .../01.problem.basic}/server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../01.problem.basic}/tests/db-utils.ts | 0 .../tests/e2e/notes-create.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../01.problem.basic}/tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../01.problem.basic}/tests/test-extend.ts | 0 .../01.problem.basic}/tests/utils.ts | 0 .../01.problem.basic}/tsconfig.json | 0 .../01.problem.basic}/types/deps.d.ts | 0 .../01.problem.basic}/types/env.env.d.ts | 0 .../01.problem.basic}/types/icon-name.d.ts | 0 .../01.problem.basic}/types/reset.d.ts | 0 .../01.problem.basic}/vite.config.ts | 0 .../01.solution.basic}/.env | 0 .../01.solution.basic}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../01.solution.basic}/.gitignore | 0 .../01.solution.basic}/.npmrc | 0 .../01.solution.basic}/.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../01.solution.basic}/.vscode/settings.json | 0 .../01.solution.basic}/README.mdx | 2 +- .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../01.solution.basic}/app/entry.client.tsx | 0 .../01.solution.basic}/app/entry.server.tsx | 0 .../01.solution.basic}/app/root.tsx | 0 .../01.solution.basic}/app/routes.ts | 0 .../01.solution.basic}/app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../01.solution.basic}/app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../01.solution.basic}/app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../01.solution.basic}/app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../01.solution.basic}/app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../01.solution.basic}/components.json | 0 .../01.solution.basic}/eslint.config.js | 0 .../01.solution.basic}/fly.toml | 0 .../01.solution.basic}/index.js | 0 .../01.solution.basic}/other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../01.solution.basic}/other/README.md | 0 .../01.solution.basic}/other/build-server.ts | 0 .../01.solution.basic}/other/litefs.yml | 0 .../01.solution.basic}/other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../01.solution.basic}/package-lock.json | 0 .../01.solution.basic}/package.json | 0 .../01.solution.basic}/playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../01.solution.basic}/prisma/schema.prisma | 0 .../01.solution.basic}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../01.solution.basic}/public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../01.solution.basic}/public/img/user.png | Bin .../public/site.webmanifest | 0 .../01.solution.basic}/react-router.config.ts | 0 .../01.solution.basic}/server/dev-server.js | 0 .../01.solution.basic}/server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../01.solution.basic}/tests/db-utils.ts | 0 .../tests/e2e/notes-create.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../01.solution.basic}/tests/test-extend.ts | 0 .../01.solution.basic}/tests/utils.ts | 0 .../01.solution.basic}/tsconfig.json | 0 .../01.solution.basic}/types/deps.d.ts | 0 .../01.solution.basic}/types/env.env.d.ts | 0 .../01.solution.basic}/types/icon-name.d.ts | 0 .../01.solution.basic}/types/reset.d.ts | 0 .../01.solution.basic}/vite.config.ts | 0 .../02.solution.2fa/README.mdx | 1 + .../03.solution.passkeys/README.mdx | 1 + .../04.solution.captcha/README.mdx | 1 + exercises/02.authentication/FINISHED.mdx | 1 + exercises/02.authentication/README.mdx | 1 + .../02.problem.mock-databases/README.mdx | 11 - .../02.problem.mock-databases/package.json | 3 - .../02.solution.mock-databases/README.mdx | 10 - .../02.solution.mock-databases/package.json | 3 - exercises/02.test-setup/FINISHED.mdx | 5 - exercises/02.test-setup/README.mdx | 1 - .../01.solution.file-based/README.mdx | 1 + .../02.solution.in-memory/README.mdx | 1 + .../03.solution.dockerized/README.mdx | 1 + .../04.problem.test-data}/.env | 0 .../04.problem.test-data}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../04.problem.test-data}/.gitignore | 0 .../04.problem.test-data}/.npmrc | 0 .../04.problem.test-data}/.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../04.problem.test-data}/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../04.problem.test-data}/app/root.tsx | 0 .../04.problem.test-data}/app/routes.ts | 0 .../04.problem.test-data}/app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../04.problem.test-data}/app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../04.problem.test-data}/app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../04.problem.test-data}/app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../04.problem.test-data}/components.json | 0 .../04.problem.test-data}/eslint.config.js | 0 .../04.problem.test-data}/fly.toml | 0 .../04.problem.test-data}/index.js | 0 .../04.problem.test-data}/other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../04.problem.test-data}/other/README.md | 0 .../other/build-server.ts | 0 .../04.problem.test-data}/other/litefs.yml | 0 .../04.problem.test-data}/other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../04.problem.test-data}/package-lock.json | 0 .../04.problem.test-data}/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../04.problem.test-data}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../04.problem.test-data}/public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../04.problem.test-data}/public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../04.problem.test-data}/server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../04.problem.test-data}/tests/db-utils.ts | 0 .../tests/e2e/notes-list.test.ts | 0 .../04.problem.test-data}/tests/e2e/utils.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../04.problem.test-data}/tests/utils.ts | 0 .../04.problem.test-data}/tsconfig.json | 0 .../04.problem.test-data}/types/deps.d.ts | 0 .../04.problem.test-data}/types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../04.problem.test-data}/types/reset.d.ts | 0 .../04.problem.test-data}/vite.config.ts | 0 .../04.solution.test-data}/.env | 0 .../04.solution.test-data}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../04.solution.test-data}/.gitignore | 0 .../04.solution.test-data}/.npmrc | 0 .../04.solution.test-data}/.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../04.solution.test-data}/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../04.solution.test-data}/app/root.tsx | 0 .../04.solution.test-data}/app/routes.ts | 0 .../04.solution.test-data}/app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../04.solution.test-data}/app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../04.solution.test-data}/app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../04.solution.test-data}/app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../04.solution.test-data}/components.json | 0 .../04.solution.test-data}/eslint.config.js | 0 .../04.solution.test-data}/fly.toml | 0 .../04.solution.test-data}/index.js | 0 .../04.solution.test-data}/other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../04.solution.test-data}/other/README.md | 0 .../other/build-server.ts | 0 .../04.solution.test-data}/other/litefs.yml | 0 .../04.solution.test-data}/other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../04.solution.test-data}/package-lock.json | 0 .../04.solution.test-data}/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../04.solution.test-data}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../04.solution.test-data}/public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../04.solution.test-data}/server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../04.solution.test-data}/tests/db-utils.ts | 0 .../tests/e2e/notes-list.test.ts | 0 .../04.solution.test-data}/tests/e2e/utils.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../04.solution.test-data}/tests/utils.ts | 0 .../04.solution.test-data}/tsconfig.json | 0 .../04.solution.test-data}/types/deps.d.ts | 0 .../04.solution.test-data}/types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../04.solution.test-data}/types/reset.d.ts | 0 .../04.solution.test-data}/vite.config.ts | 0 exercises/03.databases/FINISHED.mdx | 1 + exercises/03.databases/README.mdx | 1 + .../02.problem.test-annotations/README.mdx | 88 - .../02.problem.test-annotations/app/root.tsx | 263 - .../app/routes/_marketing+/index.tsx | 101 - .../02.problem.test-annotations/package.json | 171 - .../tests/e2e/homepage.test.ts | 15 - .../tests/e2e/notes-create.test.ts | 22 - .../tests/e2e/profile-edit.test.ts | 42 - .../tests/test-extend.ts | 57 - .../02.solution.test-annotations/README.mdx | 31 - .../02.solution.test-annotations/app/root.tsx | 263 - .../app/routes/_marketing+/index.tsx | 101 - .../02.solution.test-annotations/package.json | 171 - .../tests/e2e/homepage.test.ts | 19 - .../tests/e2e/notes-create.test.ts | 24 - .../tests/e2e/profile-edit.test.ts | 37 - .../tests/test-extend.ts | 57 - .../README.mdx | 27 - .../package.json | 172 - .../tests/e2e/homepage.test.ts | 9 - .../tests/test-extend.ts | 71 - .../README.mdx | 5 - .../package.json | 172 - .../tests/e2e/homepage.test.ts | 9 - .../04.debugging/01.problem.ui-mode/.env | 29 - .../01.problem.ui-mode/.env.example | 29 - .../app/routes/users+/$username_+/notes.tsx | 102 - .../app/utils/env.server.ts | 74 - .../04.debugging/01.solution.ui-mode/.env | 29 - .../01.solution.ui-mode/.env.example | 29 - .../app/routes/users+/$username_+/notes.tsx | 102 - .../app/utils/env.server.ts | 74 - .../.github/PULL_REQUEST_TEMPLATE.md | 15 - .../.github/workflows/deploy.yml | 229 - .../02.problem.trace-viewer/.gitignore | 28 - .../02.problem.trace-viewer/.npmrc | 2 - .../02.problem.trace-viewer/.prettierignore | 15 - .../.vscode/extensions.json | 12 - .../.vscode/remix.code-snippets | 80 - .../.vscode/settings.json | 14 - .../app/assets/favicons/apple-touch-icon.png | Bin 8986 -> 0 bytes .../app/assets/favicons/favicon.svg | 13 - .../app/components/error-boundary.tsx | 53 - .../app/components/floating-toolbar.tsx | 2 - .../app/components/forms.tsx | 202 - .../app/components/progress-bar.tsx | 63 - .../app/components/search-bar.tsx | 63 - .../app/components/spacer.tsx | 57 - .../app/components/toaster.tsx | 16 - .../app/components/ui/README.md | 7 - .../app/components/ui/button.tsx | 60 - .../app/components/ui/checkbox.tsx | 41 - .../app/components/ui/dropdown-menu.tsx | 243 - .../app/components/ui/icon.tsx | 77 - .../app/components/ui/input-otp.tsx | 69 - .../app/components/ui/input.tsx | 23 - .../app/components/ui/label.tsx | 22 - .../app/components/ui/sonner.tsx | 26 - .../app/components/ui/status-button.tsx | 78 - .../app/components/ui/textarea.tsx | 20 - .../app/components/ui/tooltip.tsx | 42 - .../app/components/user-dropdown.tsx | 71 - .../app/entry.client.tsx | 11 - .../app/entry.server.tsx | 142 - .../02.problem.trace-viewer/app/routes.ts | 21 - .../02.problem.trace-viewer/app/routes/$.tsx | 47 - .../_auth+/auth.$provider.callback.test.ts | 265 - .../routes/_auth+/auth.$provider.callback.ts | 200 - .../app/routes/_auth+/auth_.$provider.ts | 34 - .../app/routes/_auth+/forgot-password.tsx | 189 - .../app/routes/_auth+/login.server.ts | 158 - .../app/routes/_auth+/login.tsx | 307 - .../app/routes/_auth+/logout.tsx | 11 - .../app/routes/_auth+/onboarding.server.ts | 19 - .../app/routes/_auth+/onboarding.tsx | 245 - .../_auth+/onboarding_.$provider.server.ts | 19 - .../routes/_auth+/onboarding_.$provider.tsx | 271 - .../routes/_auth+/reset-password.server.ts | 34 - .../app/routes/_auth+/reset-password.tsx | 151 - .../app/routes/_auth+/signup.tsx | 194 - .../app/routes/_auth+/verify.server.ts | 200 - .../app/routes/_auth+/verify.tsx | 144 - .../routes/_auth+/webauthn+/authentication.ts | 113 - .../routes/_auth+/webauthn+/registration.ts | 136 - .../routes/_auth+/webauthn+/utils.server.ts | 89 - .../app/routes/_marketing+/about.tsx | 3 - .../app/routes/_marketing+/logos/docker.svg | 47 - .../app/routes/_marketing+/logos/eslint.svg | 17 - .../app/routes/_marketing+/logos/faker.svg | 736 - .../app/routes/_marketing+/logos/fly.svg | 1 - .../app/routes/_marketing+/logos/github.svg | 1 - .../app/routes/_marketing+/logos/logos.ts | 173 - .../app/routes/_marketing+/logos/msw.svg | 13 - .../routes/_marketing+/logos/playwright.svg | 9 - .../app/routes/_marketing+/logos/prettier.svg | 76 - .../app/routes/_marketing+/logos/prisma.svg | 9 - .../app/routes/_marketing+/logos/radix.svg | 1 - .../routes/_marketing+/logos/react-email.svg | 1 - .../app/routes/_marketing+/logos/remix.svg | 25 - .../app/routes/_marketing+/logos/resend.svg | 31 - .../app/routes/_marketing+/logos/sentry.svg | 6 - .../routes/_marketing+/logos/shadcn-ui.svg | 1 - .../app/routes/_marketing+/logos/sqlite.svg | 67 - .../app/routes/_marketing+/logos/stars.jpg | Bin 391161 -> 0 bytes .../app/routes/_marketing+/logos/tailwind.svg | 1 - .../_marketing+/logos/testing-library.png | Bin 5803 -> 0 bytes .../routes/_marketing+/logos/typescript.svg | 6 - .../app/routes/_marketing+/logos/vitest.svg | 5 - .../app/routes/_marketing+/logos/zod.svg | 46 - .../app/routes/_marketing+/privacy.tsx | 3 - .../app/routes/_marketing+/support.tsx | 3 - .../app/routes/_marketing+/tos.tsx | 3 - .../app/routes/_seo+/robots[.]txt.ts | 9 - .../app/routes/_seo+/sitemap[.]xml.ts | 17 - .../app/routes/admin+/cache.tsx | 244 - .../app/routes/admin+/cache_.lru.$cacheKey.ts | 31 - .../routes/admin+/cache_.sqlite.$cacheKey.ts | 31 - .../app/routes/admin+/cache_.sqlite.server.ts | 59 - .../app/routes/admin+/cache_.sqlite.tsx | 1 - .../02.problem.trace-viewer/app/routes/me.tsx | 19 - .../routes/resources+/download-user-data.tsx | 62 - .../app/routes/resources+/healthcheck.tsx | 26 - .../app/routes/resources+/images.tsx | 80 - .../app/routes/resources+/theme-switch.tsx | 143 - .../settings+/profile.change-email.server.tsx | 124 - .../routes/settings+/profile.change-email.tsx | 146 - .../routes/settings+/profile.connections.tsx | 212 - .../app/routes/settings+/profile.index.tsx | 371 - .../app/routes/settings+/profile.passkeys.tsx | 191 - .../app/routes/settings+/profile.password.tsx | 182 - .../settings+/profile.password_.create.tsx | 137 - .../app/routes/settings+/profile.photo.tsx | 236 - .../app/routes/settings+/profile.tsx | 82 - .../settings+/profile.two-factor.disable.tsx | 62 - .../settings+/profile.two-factor.index.tsx | 90 - .../routes/settings+/profile.two-factor.tsx | 16 - .../settings+/profile.two-factor.verify.tsx | 227 - .../app/routes/users+/$username.test.tsx | 97 - .../app/routes/users+/$username.tsx | 130 - .../$username_+/__note-editor.server.tsx | 131 - .../users+/$username_+/__note-editor.tsx | 294 - .../users+/$username_+/notes.$noteId.tsx | 236 - .../$username_+/notes.$noteId_.edit.tsx | 51 - .../routes/users+/$username_+/notes.index.tsx | 27 - .../routes/users+/$username_+/notes.new.tsx | 12 - .../app/routes/users+/index.tsx | 81 - .../app/styles/tailwind.css | 220 - .../app/utils/auth.server.test.ts | 109 - .../app/utils/auth.server.ts | 294 - .../app/utils/cache.server.ts | 178 - .../app/utils/client-hints.tsx | 56 - .../app/utils/connections.server.ts | 21 - .../app/utils/connections.tsx | 57 - .../app/utils/db.server.ts | 37 - .../app/utils/email.server.ts | 98 - .../app/utils/headers.server.test.ts | 39 - .../app/utils/headers.server.ts | 114 - .../app/utils/honeypot.server.ts | 17 - .../app/utils/litefs.server.ts | 22 - .../app/utils/misc.error-message.test.ts | 24 - .../app/utils/misc.tsx | 292 - .../app/utils/misc.use-double-check.test.tsx | 83 - .../app/utils/monitoring.client.tsx | 35 - .../app/utils/nonce-provider.ts | 5 - .../app/utils/permissions.server.ts | 60 - .../app/utils/providers/constants.ts | 3 - .../app/utils/providers/github.server.ts | 158 - .../app/utils/providers/provider.ts | 28 - .../app/utils/redirect-cookie.server.ts | 17 - .../app/utils/request-info.ts | 19 - .../app/utils/session.server.ts | 38 - .../app/utils/storage.server.ts | 179 - .../app/utils/theme.server.ts | 19 - .../app/utils/timing.server.ts | 121 - .../app/utils/toast.server.ts | 62 - .../app/utils/totp.server.ts | 3 - .../app/utils/user-validation.ts | 48 - .../02.problem.trace-viewer/app/utils/user.ts | 70 - .../app/utils/verification.server.ts | 13 - .../02.problem.trace-viewer/components.json | 18 - .../02.problem.trace-viewer/eslint.config.js | 14 - .../02.problem.trace-viewer/fly.toml | 61 - .../02.problem.trace-viewer/index.js | 23 - .../02.problem.trace-viewer/other/Dockerfile | 97 - .../other/Dockerfile.dockerignore | 9 - .../02.problem.trace-viewer/other/README.md | 9 - .../other/build-server.ts | 50 - .../02.problem.trace-viewer/other/litefs.yml | 46 - .../other/sly/sly.json | 10 - .../other/sly/transform-icon.ts | 19 - .../other/svg-icons/README.md | 9 - .../other/svg-icons/arrow-left.svg | 11 - .../other/svg-icons/arrow-right.svg | 11 - .../other/svg-icons/avatar.svg | 11 - .../other/svg-icons/camera.svg | 11 - .../other/svg-icons/check.svg | 11 - .../other/svg-icons/clock.svg | 11 - .../other/svg-icons/cross-1.svg | 11 - .../other/svg-icons/dots-horizontal.svg | 13 - .../other/svg-icons/download.svg | 13 - .../other/svg-icons/envelope-closed.svg | 13 - .../other/svg-icons/exit.svg | 11 - .../other/svg-icons/file-text.svg | 11 - .../other/svg-icons/github-logo.svg | 13 - .../other/svg-icons/laptop.svg | 11 - .../other/svg-icons/link-2.svg | 13 - .../other/svg-icons/lock-closed.svg | 11 - .../other/svg-icons/lock-open-1.svg | 11 - .../other/svg-icons/magnifying-glass.svg | 11 - .../other/svg-icons/moon.svg | 11 - .../other/svg-icons/passkey.svg | 4 - .../other/svg-icons/pencil-1.svg | 11 - .../other/svg-icons/pencil-2.svg | 11 - .../other/svg-icons/plus.svg | 11 - .../other/svg-icons/question-mark-circled.svg | 13 - .../other/svg-icons/reset.svg | 11 - .../other/svg-icons/sun.svg | 11 - .../other/svg-icons/trash.svg | 11 - .../other/svg-icons/update.svg | 11 - .../02.problem.trace-viewer/package-lock.json | 18800 ---------------- .../playwright.config.ts | 45 - .../20250221233640_init/migration.sql | 275 - .../prisma/migrations/migration_lock.toml | 3 - .../prisma/schema.prisma | 186 - .../02.problem.trace-viewer/prisma/seed.ts | 263 - .../prisma/sql/searchUsers.sql | 19 - .../public/favicon.ico | Bin 15406 -> 0 bytes .../public/favicons/README.md | 12 - .../favicons/android-chrome-192x192.png | Bin 10041 -> 0 bytes .../favicons/android-chrome-512x512.png | Bin 27787 -> 0 bytes .../public/img/user.png | Bin 3012 -> 0 bytes .../public/site.webmanifest | 20 - .../react-router.config.ts | 23 - .../server/dev-server.js | 18 - .../02.problem.trace-viewer/server/index.ts | 267 - .../server/utils/monitoring.ts | 43 - .../02.problem.trace-viewer/tests/db-utils.ts | 100 - .../tests/setup/custom-matchers.ts | 169 - .../tests/setup/db-setup.ts | 20 - .../tests/setup/global-setup.ts | 38 - .../tests/setup/setup-test-env.ts | 35 - .../02.problem.trace-viewer/tests/utils.ts | 33 - .../02.problem.trace-viewer/tsconfig.json | 17 - .../02.problem.trace-viewer/types/deps.d.ts | 6 - .../types/env.env.d.ts | 2 - .../types/icon-name.d.ts | 3 - .../02.problem.trace-viewer/types/reset.d.ts | 2 - .../02.problem.trace-viewer/vite.config.ts | 87 - .../.github/PULL_REQUEST_TEMPLATE.md | 15 - .../.github/workflows/deploy.yml | 229 - .../02.solution.trace-viewer/.gitignore | 28 - .../02.solution.trace-viewer/.npmrc | 2 - .../02.solution.trace-viewer/.prettierignore | 15 - .../.vscode/extensions.json | 12 - .../.vscode/remix.code-snippets | 80 - .../.vscode/settings.json | 14 - .../app/assets/favicons/apple-touch-icon.png | Bin 8986 -> 0 bytes .../app/assets/favicons/favicon.svg | 13 - .../app/components/error-boundary.tsx | 53 - .../app/components/floating-toolbar.tsx | 2 - .../app/components/forms.tsx | 202 - .../app/components/progress-bar.tsx | 63 - .../app/components/search-bar.tsx | 63 - .../app/components/spacer.tsx | 57 - .../app/components/toaster.tsx | 16 - .../app/components/ui/README.md | 7 - .../app/components/ui/button.tsx | 60 - .../app/components/ui/checkbox.tsx | 41 - .../app/components/ui/dropdown-menu.tsx | 243 - .../app/components/ui/icon.tsx | 77 - .../app/components/ui/input-otp.tsx | 69 - .../app/components/ui/input.tsx | 23 - .../app/components/ui/label.tsx | 22 - .../app/components/ui/sonner.tsx | 26 - .../app/components/ui/status-button.tsx | 78 - .../app/components/ui/textarea.tsx | 20 - .../app/components/ui/tooltip.tsx | 42 - .../app/components/user-dropdown.tsx | 71 - .../app/entry.client.tsx | 11 - .../app/entry.server.tsx | 142 - .../02.solution.trace-viewer/app/routes.ts | 21 - .../02.solution.trace-viewer/app/routes/$.tsx | 47 - .../_auth+/auth.$provider.callback.test.ts | 265 - .../routes/_auth+/auth.$provider.callback.ts | 200 - .../app/routes/_auth+/auth_.$provider.ts | 34 - .../app/routes/_auth+/forgot-password.tsx | 189 - .../app/routes/_auth+/login.server.ts | 158 - .../app/routes/_auth+/login.tsx | 307 - .../app/routes/_auth+/logout.tsx | 11 - .../app/routes/_auth+/onboarding.server.ts | 19 - .../app/routes/_auth+/onboarding.tsx | 245 - .../_auth+/onboarding_.$provider.server.ts | 19 - .../routes/_auth+/onboarding_.$provider.tsx | 271 - .../routes/_auth+/reset-password.server.ts | 34 - .../app/routes/_auth+/reset-password.tsx | 151 - .../app/routes/_auth+/signup.tsx | 194 - .../app/routes/_auth+/verify.server.ts | 200 - .../app/routes/_auth+/verify.tsx | 144 - .../routes/_auth+/webauthn+/authentication.ts | 113 - .../routes/_auth+/webauthn+/registration.ts | 136 - .../routes/_auth+/webauthn+/utils.server.ts | 89 - .../app/routes/_marketing+/about.tsx | 3 - .../app/routes/_marketing+/logos/docker.svg | 47 - .../app/routes/_marketing+/logos/eslint.svg | 17 - .../app/routes/_marketing+/logos/faker.svg | 736 - .../app/routes/_marketing+/logos/fly.svg | 1 - .../app/routes/_marketing+/logos/github.svg | 1 - .../app/routes/_marketing+/logos/logos.ts | 173 - .../app/routes/_marketing+/logos/msw.svg | 13 - .../routes/_marketing+/logos/playwright.svg | 9 - .../app/routes/_marketing+/logos/prettier.svg | 76 - .../app/routes/_marketing+/logos/prisma.svg | 9 - .../app/routes/_marketing+/logos/radix.svg | 1 - .../routes/_marketing+/logos/react-email.svg | 1 - .../app/routes/_marketing+/logos/remix.svg | 25 - .../app/routes/_marketing+/logos/resend.svg | 31 - .../app/routes/_marketing+/logos/sentry.svg | 6 - .../routes/_marketing+/logos/shadcn-ui.svg | 1 - .../app/routes/_marketing+/logos/sqlite.svg | 67 - .../app/routes/_marketing+/logos/stars.jpg | Bin 391161 -> 0 bytes .../app/routes/_marketing+/logos/tailwind.svg | 1 - .../_marketing+/logos/testing-library.png | Bin 5803 -> 0 bytes .../routes/_marketing+/logos/typescript.svg | 6 - .../app/routes/_marketing+/logos/vitest.svg | 5 - .../app/routes/_marketing+/logos/zod.svg | 46 - .../app/routes/_marketing+/privacy.tsx | 3 - .../app/routes/_marketing+/support.tsx | 3 - .../app/routes/_marketing+/tos.tsx | 3 - .../app/routes/_seo+/robots[.]txt.ts | 9 - .../app/routes/_seo+/sitemap[.]xml.ts | 17 - .../app/routes/admin+/cache.tsx | 244 - .../app/routes/admin+/cache_.lru.$cacheKey.ts | 31 - .../routes/admin+/cache_.sqlite.$cacheKey.ts | 31 - .../app/routes/admin+/cache_.sqlite.server.ts | 59 - .../app/routes/admin+/cache_.sqlite.tsx | 1 - .../app/routes/me.tsx | 19 - .../routes/resources+/download-user-data.tsx | 62 - .../app/routes/resources+/healthcheck.tsx | 26 - .../app/routes/resources+/images.tsx | 80 - .../app/routes/resources+/theme-switch.tsx | 143 - .../settings+/profile.change-email.server.tsx | 124 - .../routes/settings+/profile.change-email.tsx | 146 - .../routes/settings+/profile.connections.tsx | 212 - .../app/routes/settings+/profile.index.tsx | 371 - .../app/routes/settings+/profile.passkeys.tsx | 191 - .../app/routes/settings+/profile.password.tsx | 182 - .../settings+/profile.password_.create.tsx | 137 - .../app/routes/settings+/profile.photo.tsx | 236 - .../app/routes/settings+/profile.tsx | 82 - .../settings+/profile.two-factor.disable.tsx | 62 - .../settings+/profile.two-factor.index.tsx | 90 - .../routes/settings+/profile.two-factor.tsx | 16 - .../settings+/profile.two-factor.verify.tsx | 227 - .../app/routes/users+/$username.test.tsx | 97 - .../app/routes/users+/$username.tsx | 130 - .../$username_+/__note-editor.server.tsx | 131 - .../users+/$username_+/__note-editor.tsx | 294 - .../users+/$username_+/notes.$noteId.tsx | 236 - .../$username_+/notes.$noteId_.edit.tsx | 51 - .../routes/users+/$username_+/notes.index.tsx | 27 - .../routes/users+/$username_+/notes.new.tsx | 12 - .../app/routes/users+/index.tsx | 81 - .../app/styles/tailwind.css | 220 - .../app/utils/auth.server.test.ts | 109 - .../app/utils/auth.server.ts | 294 - .../app/utils/cache.server.ts | 178 - .../app/utils/client-hints.tsx | 56 - .../app/utils/connections.server.ts | 21 - .../app/utils/connections.tsx | 57 - .../app/utils/db.server.ts | 37 - .../app/utils/email.server.ts | 98 - .../app/utils/headers.server.test.ts | 39 - .../app/utils/headers.server.ts | 114 - .../app/utils/honeypot.server.ts | 17 - .../app/utils/litefs.server.ts | 22 - .../app/utils/misc.error-message.test.ts | 24 - .../app/utils/misc.tsx | 292 - .../app/utils/misc.use-double-check.test.tsx | 83 - .../app/utils/monitoring.client.tsx | 35 - .../app/utils/nonce-provider.ts | 5 - .../app/utils/permissions.server.ts | 60 - .../app/utils/providers/constants.ts | 3 - .../app/utils/providers/github.server.ts | 158 - .../app/utils/providers/provider.ts | 28 - .../app/utils/redirect-cookie.server.ts | 17 - .../app/utils/request-info.ts | 19 - .../app/utils/session.server.ts | 38 - .../app/utils/storage.server.ts | 179 - .../app/utils/theme.server.ts | 19 - .../app/utils/timing.server.ts | 121 - .../app/utils/toast.server.ts | 62 - .../app/utils/totp.server.ts | 3 - .../app/utils/user-validation.ts | 48 - .../app/utils/user.ts | 70 - .../app/utils/verification.server.ts | 13 - .../02.solution.trace-viewer/components.json | 18 - .../02.solution.trace-viewer/eslint.config.js | 14 - .../02.solution.trace-viewer/fly.toml | 61 - .../02.solution.trace-viewer/index.js | 23 - .../02.solution.trace-viewer/other/Dockerfile | 97 - .../other/Dockerfile.dockerignore | 9 - .../02.solution.trace-viewer/other/README.md | 9 - .../other/build-server.ts | 50 - .../02.solution.trace-viewer/other/litefs.yml | 46 - .../other/sly/sly.json | 10 - .../other/sly/transform-icon.ts | 19 - .../other/svg-icons/README.md | 9 - .../other/svg-icons/arrow-left.svg | 11 - .../other/svg-icons/arrow-right.svg | 11 - .../other/svg-icons/avatar.svg | 11 - .../other/svg-icons/camera.svg | 11 - .../other/svg-icons/check.svg | 11 - .../other/svg-icons/clock.svg | 11 - .../other/svg-icons/cross-1.svg | 11 - .../other/svg-icons/dots-horizontal.svg | 13 - .../other/svg-icons/download.svg | 13 - .../other/svg-icons/envelope-closed.svg | 13 - .../other/svg-icons/exit.svg | 11 - .../other/svg-icons/file-text.svg | 11 - .../other/svg-icons/github-logo.svg | 13 - .../other/svg-icons/laptop.svg | 11 - .../other/svg-icons/link-2.svg | 13 - .../other/svg-icons/lock-closed.svg | 11 - .../other/svg-icons/lock-open-1.svg | 11 - .../other/svg-icons/magnifying-glass.svg | 11 - .../other/svg-icons/moon.svg | 11 - .../other/svg-icons/passkey.svg | 4 - .../other/svg-icons/pencil-1.svg | 11 - .../other/svg-icons/pencil-2.svg | 11 - .../other/svg-icons/plus.svg | 11 - .../other/svg-icons/question-mark-circled.svg | 13 - .../other/svg-icons/reset.svg | 11 - .../other/svg-icons/sun.svg | 11 - .../other/svg-icons/trash.svg | 11 - .../other/svg-icons/update.svg | 11 - .../package-lock.json | 18800 ---------------- .../playwright.config.ts | 45 - .../20250221233640_init/migration.sql | 275 - .../prisma/migrations/migration_lock.toml | 3 - .../prisma/schema.prisma | 186 - .../02.solution.trace-viewer/prisma/seed.ts | 263 - .../prisma/sql/searchUsers.sql | 19 - .../public/favicon.ico | Bin 15406 -> 0 bytes .../public/favicons/README.md | 12 - .../favicons/android-chrome-192x192.png | Bin 10041 -> 0 bytes .../favicons/android-chrome-512x512.png | Bin 27787 -> 0 bytes .../public/img/user.png | Bin 3012 -> 0 bytes .../public/site.webmanifest | 20 - .../react-router.config.ts | 23 - .../server/dev-server.js | 18 - .../02.solution.trace-viewer/server/index.ts | 267 - .../server/utils/monitoring.ts | 43 - .../tests/db-utils.ts | 100 - .../tests/setup/custom-matchers.ts | 169 - .../tests/setup/db-setup.ts | 20 - .../tests/setup/global-setup.ts | 38 - .../tests/setup/setup-test-env.ts | 35 - .../02.solution.trace-viewer/tests/utils.ts | 33 - .../02.solution.trace-viewer/tsconfig.json | 17 - .../02.solution.trace-viewer/types/deps.d.ts | 6 - .../types/env.env.d.ts | 2 - .../types/icon-name.d.ts | 3 - .../02.solution.trace-viewer/types/reset.d.ts | 2 - .../02.solution.trace-viewer/vite.config.ts | 87 - .../03.problem.live-debugging/.env | 29 - .../03.problem.live-debugging/.env.example | 29 - .../.github/PULL_REQUEST_TEMPLATE.md | 15 - .../.github/workflows/deploy.yml | 229 - .../03.problem.live-debugging/.gitignore | 28 - .../03.problem.live-debugging/.npmrc | 2 - .../03.problem.live-debugging/.prettierignore | 15 - .../.vscode/extensions.json | 12 - .../.vscode/remix.code-snippets | 80 - .../.vscode/settings.json | 14 - .../app/assets/favicons/apple-touch-icon.png | Bin 8986 -> 0 bytes .../app/assets/favicons/favicon.svg | 13 - .../app/components/error-boundary.tsx | 53 - .../app/components/floating-toolbar.tsx | 2 - .../app/components/forms.tsx | 202 - .../app/components/progress-bar.tsx | 63 - .../app/components/search-bar.tsx | 63 - .../app/components/spacer.tsx | 57 - .../app/components/toaster.tsx | 16 - .../app/components/ui/README.md | 7 - .../app/components/ui/button.tsx | 60 - .../app/components/ui/checkbox.tsx | 41 - .../app/components/ui/dropdown-menu.tsx | 243 - .../app/components/ui/icon.tsx | 77 - .../app/components/ui/input-otp.tsx | 69 - .../app/components/ui/input.tsx | 23 - .../app/components/ui/label.tsx | 22 - .../app/components/ui/sonner.tsx | 26 - .../app/components/ui/status-button.tsx | 78 - .../app/components/ui/textarea.tsx | 20 - .../app/components/ui/tooltip.tsx | 42 - .../app/components/user-dropdown.tsx | 71 - .../app/entry.client.tsx | 11 - .../app/entry.server.tsx | 142 - .../03.problem.live-debugging/app/root.tsx | 268 - .../03.problem.live-debugging/app/routes.ts | 21 - .../app/routes/$.tsx | 47 - .../_auth+/auth.$provider.callback.test.ts | 265 - .../routes/_auth+/auth.$provider.callback.ts | 200 - .../app/routes/_auth+/auth_.$provider.ts | 34 - .../app/routes/_auth+/forgot-password.tsx | 189 - .../app/routes/_auth+/login.server.ts | 158 - .../app/routes/_auth+/login.tsx | 307 - .../app/routes/_auth+/logout.tsx | 11 - .../app/routes/_auth+/onboarding.server.ts | 19 - .../app/routes/_auth+/onboarding.tsx | 245 - .../_auth+/onboarding_.$provider.server.ts | 19 - .../routes/_auth+/onboarding_.$provider.tsx | 271 - .../routes/_auth+/reset-password.server.ts | 34 - .../app/routes/_auth+/reset-password.tsx | 151 - .../app/routes/_auth+/signup.tsx | 194 - .../app/routes/_auth+/verify.server.ts | 200 - .../app/routes/_auth+/verify.tsx | 144 - .../routes/_auth+/webauthn+/authentication.ts | 113 - .../routes/_auth+/webauthn+/registration.ts | 136 - .../routes/_auth+/webauthn+/utils.server.ts | 89 - .../app/routes/_marketing+/about.tsx | 3 - .../app/routes/_marketing+/index.tsx | 101 - .../app/routes/_marketing+/logos/docker.svg | 47 - .../app/routes/_marketing+/logos/eslint.svg | 17 - .../app/routes/_marketing+/logos/faker.svg | 736 - .../app/routes/_marketing+/logos/fly.svg | 1 - .../app/routes/_marketing+/logos/github.svg | 1 - .../app/routes/_marketing+/logos/logos.ts | 173 - .../app/routes/_marketing+/logos/msw.svg | 13 - .../routes/_marketing+/logos/playwright.svg | 9 - .../app/routes/_marketing+/logos/prettier.svg | 76 - .../app/routes/_marketing+/logos/prisma.svg | 9 - .../app/routes/_marketing+/logos/radix.svg | 1 - .../routes/_marketing+/logos/react-email.svg | 1 - .../app/routes/_marketing+/logos/remix.svg | 25 - .../app/routes/_marketing+/logos/resend.svg | 31 - .../app/routes/_marketing+/logos/sentry.svg | 6 - .../routes/_marketing+/logos/shadcn-ui.svg | 1 - .../app/routes/_marketing+/logos/sqlite.svg | 67 - .../app/routes/_marketing+/logos/stars.jpg | Bin 391161 -> 0 bytes .../app/routes/_marketing+/logos/tailwind.svg | 1 - .../_marketing+/logos/testing-library.png | Bin 5803 -> 0 bytes .../routes/_marketing+/logos/typescript.svg | 6 - .../app/routes/_marketing+/logos/vitest.svg | 5 - .../app/routes/_marketing+/logos/zod.svg | 46 - .../app/routes/_marketing+/privacy.tsx | 3 - .../app/routes/_marketing+/support.tsx | 3 - .../app/routes/_marketing+/tos.tsx | 3 - .../app/routes/_seo+/robots[.]txt.ts | 9 - .../app/routes/_seo+/sitemap[.]xml.ts | 17 - .../app/routes/admin+/cache.tsx | 244 - .../app/routes/admin+/cache_.lru.$cacheKey.ts | 31 - .../routes/admin+/cache_.sqlite.$cacheKey.ts | 31 - .../app/routes/admin+/cache_.sqlite.server.ts | 59 - .../app/routes/admin+/cache_.sqlite.tsx | 1 - .../app/routes/me.tsx | 19 - .../routes/resources+/download-user-data.tsx | 62 - .../app/routes/resources+/healthcheck.tsx | 26 - .../app/routes/resources+/images.tsx | 80 - .../app/routes/resources+/theme-switch.tsx | 143 - .../settings+/profile.change-email.server.tsx | 124 - .../routes/settings+/profile.change-email.tsx | 146 - .../routes/settings+/profile.connections.tsx | 212 - .../app/routes/settings+/profile.index.tsx | 371 - .../app/routes/settings+/profile.passkeys.tsx | 191 - .../app/routes/settings+/profile.password.tsx | 182 - .../settings+/profile.password_.create.tsx | 137 - .../app/routes/settings+/profile.photo.tsx | 236 - .../app/routes/settings+/profile.tsx | 82 - .../settings+/profile.two-factor.disable.tsx | 62 - .../settings+/profile.two-factor.index.tsx | 90 - .../routes/settings+/profile.two-factor.tsx | 16 - .../settings+/profile.two-factor.verify.tsx | 227 - .../app/routes/users+/$username.test.tsx | 97 - .../app/routes/users+/$username.tsx | 130 - .../$username_+/__note-editor.server.tsx | 131 - .../users+/$username_+/__note-editor.tsx | 294 - .../users+/$username_+/notes.$noteId.tsx | 236 - .../$username_+/notes.$noteId_.edit.tsx | 51 - .../routes/users+/$username_+/notes.index.tsx | 27 - .../routes/users+/$username_+/notes.new.tsx | 12 - .../app/routes/users+/$username_+/notes.tsx | 102 - .../app/routes/users+/index.tsx | 81 - .../app/styles/tailwind.css | 220 - .../app/utils/auth.server.test.ts | 109 - .../app/utils/auth.server.ts | 294 - .../app/utils/cache.server.ts | 178 - .../app/utils/client-hints.tsx | 56 - .../app/utils/connections.server.ts | 21 - .../app/utils/connections.tsx | 57 - .../app/utils/db.server.ts | 37 - .../app/utils/email.server.ts | 98 - .../app/utils/env.server.ts | 74 - .../app/utils/headers.server.test.ts | 39 - .../app/utils/headers.server.ts | 114 - .../app/utils/honeypot.server.ts | 17 - .../app/utils/litefs.server.ts | 22 - .../app/utils/misc.error-message.test.ts | 24 - .../app/utils/misc.tsx | 292 - .../app/utils/misc.use-double-check.test.tsx | 83 - .../app/utils/monitoring.client.tsx | 35 - .../app/utils/nonce-provider.ts | 5 - .../app/utils/permissions.server.ts | 60 - .../app/utils/providers/constants.ts | 3 - .../app/utils/providers/github.server.ts | 158 - .../app/utils/providers/provider.ts | 28 - .../app/utils/redirect-cookie.server.ts | 17 - .../app/utils/request-info.ts | 19 - .../app/utils/session.server.ts | 38 - .../app/utils/storage.server.ts | 179 - .../app/utils/theme.server.ts | 19 - .../app/utils/timing.server.ts | 121 - .../app/utils/toast.server.ts | 62 - .../app/utils/totp.server.ts | 3 - .../app/utils/user-validation.ts | 48 - .../app/utils/user.ts | 70 - .../app/utils/verification.server.ts | 13 - .../03.problem.live-debugging/components.json | 18 - .../eslint.config.js | 14 - .../03.problem.live-debugging/fly.toml | 61 - .../03.problem.live-debugging/index.js | 23 - .../other/Dockerfile | 97 - .../other/Dockerfile.dockerignore | 9 - .../03.problem.live-debugging/other/README.md | 9 - .../other/build-server.ts | 50 - .../other/litefs.yml | 46 - .../other/sly/sly.json | 10 - .../other/sly/transform-icon.ts | 19 - .../other/svg-icons/README.md | 9 - .../other/svg-icons/arrow-left.svg | 11 - .../other/svg-icons/arrow-right.svg | 11 - .../other/svg-icons/avatar.svg | 11 - .../other/svg-icons/camera.svg | 11 - .../other/svg-icons/check.svg | 11 - .../other/svg-icons/clock.svg | 11 - .../other/svg-icons/cross-1.svg | 11 - .../other/svg-icons/dots-horizontal.svg | 13 - .../other/svg-icons/download.svg | 13 - .../other/svg-icons/envelope-closed.svg | 13 - .../other/svg-icons/exit.svg | 11 - .../other/svg-icons/file-text.svg | 11 - .../other/svg-icons/github-logo.svg | 13 - .../other/svg-icons/laptop.svg | 11 - .../other/svg-icons/link-2.svg | 13 - .../other/svg-icons/lock-closed.svg | 11 - .../other/svg-icons/lock-open-1.svg | 11 - .../other/svg-icons/magnifying-glass.svg | 11 - .../other/svg-icons/moon.svg | 11 - .../other/svg-icons/passkey.svg | 4 - .../other/svg-icons/pencil-1.svg | 11 - .../other/svg-icons/pencil-2.svg | 11 - .../other/svg-icons/plus.svg | 11 - .../other/svg-icons/question-mark-circled.svg | 13 - .../other/svg-icons/reset.svg | 11 - .../other/svg-icons/sun.svg | 11 - .../other/svg-icons/trash.svg | 11 - .../other/svg-icons/update.svg | 11 - .../package-lock.json | 18800 ---------------- .../playwright.config.ts | 45 - .../20250221233640_init/migration.sql | 275 - .../prisma/migrations/migration_lock.toml | 3 - .../prisma/schema.prisma | 186 - .../03.problem.live-debugging/prisma/seed.ts | 263 - .../prisma/sql/searchUsers.sql | 19 - .../public/favicon.ico | Bin 15406 -> 0 bytes .../public/favicons/README.md | 12 - .../favicons/android-chrome-192x192.png | Bin 10041 -> 0 bytes .../favicons/android-chrome-512x512.png | Bin 27787 -> 0 bytes .../public/img/user.png | Bin 3012 -> 0 bytes .../public/site.webmanifest | 20 - .../react-router.config.ts | 23 - .../server/dev-server.js | 18 - .../03.problem.live-debugging/server/index.ts | 267 - .../server/utils/monitoring.ts | 43 - .../tests/db-utils.ts | 100 - .../tests/setup/custom-matchers.ts | 169 - .../tests/setup/db-setup.ts | 20 - .../tests/setup/global-setup.ts | 38 - .../tests/setup/setup-test-env.ts | 35 - .../03.problem.live-debugging/tests/utils.ts | 33 - .../03.problem.live-debugging/tsconfig.json | 17 - .../03.problem.live-debugging/types/deps.d.ts | 6 - .../types/env.env.d.ts | 2 - .../types/icon-name.d.ts | 3 - .../types/reset.d.ts | 2 - .../03.problem.live-debugging/vite.config.ts | 87 - .../03.solution.live-debugging/.env | 29 - .../03.solution.live-debugging/.env.example | 29 - .../.github/PULL_REQUEST_TEMPLATE.md | 15 - .../.github/workflows/deploy.yml | 229 - .../03.solution.live-debugging/.gitignore | 28 - .../03.solution.live-debugging/.npmrc | 2 - .../.prettierignore | 15 - .../.vscode/extensions.json | 12 - .../.vscode/remix.code-snippets | 80 - .../.vscode/settings.json | 14 - .../app/assets/favicons/apple-touch-icon.png | Bin 8986 -> 0 bytes .../app/assets/favicons/favicon.svg | 13 - .../app/components/error-boundary.tsx | 53 - .../app/components/floating-toolbar.tsx | 2 - .../app/components/forms.tsx | 202 - .../app/components/progress-bar.tsx | 63 - .../app/components/search-bar.tsx | 63 - .../app/components/spacer.tsx | 57 - .../app/components/toaster.tsx | 16 - .../app/components/ui/README.md | 7 - .../app/components/ui/button.tsx | 60 - .../app/components/ui/checkbox.tsx | 41 - .../app/components/ui/dropdown-menu.tsx | 243 - .../app/components/ui/icon.tsx | 77 - .../app/components/ui/input-otp.tsx | 69 - .../app/components/ui/input.tsx | 23 - .../app/components/ui/label.tsx | 22 - .../app/components/ui/sonner.tsx | 26 - .../app/components/ui/status-button.tsx | 78 - .../app/components/ui/textarea.tsx | 20 - .../app/components/ui/tooltip.tsx | 42 - .../app/components/user-dropdown.tsx | 71 - .../app/entry.client.tsx | 11 - .../app/entry.server.tsx | 142 - .../03.solution.live-debugging/app/root.tsx | 268 - .../03.solution.live-debugging/app/routes.ts | 21 - .../app/routes/$.tsx | 47 - .../_auth+/auth.$provider.callback.test.ts | 265 - .../routes/_auth+/auth.$provider.callback.ts | 200 - .../app/routes/_auth+/auth_.$provider.ts | 34 - .../app/routes/_auth+/forgot-password.tsx | 189 - .../app/routes/_auth+/login.server.ts | 158 - .../app/routes/_auth+/login.tsx | 307 - .../app/routes/_auth+/logout.tsx | 11 - .../app/routes/_auth+/onboarding.server.ts | 19 - .../app/routes/_auth+/onboarding.tsx | 245 - .../_auth+/onboarding_.$provider.server.ts | 19 - .../routes/_auth+/onboarding_.$provider.tsx | 271 - .../routes/_auth+/reset-password.server.ts | 34 - .../app/routes/_auth+/reset-password.tsx | 151 - .../app/routes/_auth+/signup.tsx | 194 - .../app/routes/_auth+/verify.server.ts | 200 - .../app/routes/_auth+/verify.tsx | 144 - .../routes/_auth+/webauthn+/authentication.ts | 113 - .../routes/_auth+/webauthn+/registration.ts | 136 - .../routes/_auth+/webauthn+/utils.server.ts | 89 - .../app/routes/_marketing+/about.tsx | 3 - .../app/routes/_marketing+/index.tsx | 101 - .../app/routes/_marketing+/logos/docker.svg | 47 - .../app/routes/_marketing+/logos/eslint.svg | 17 - .../app/routes/_marketing+/logos/faker.svg | 736 - .../app/routes/_marketing+/logos/fly.svg | 1 - .../app/routes/_marketing+/logos/github.svg | 1 - .../app/routes/_marketing+/logos/logos.ts | 173 - .../app/routes/_marketing+/logos/msw.svg | 13 - .../routes/_marketing+/logos/playwright.svg | 9 - .../app/routes/_marketing+/logos/prettier.svg | 76 - .../app/routes/_marketing+/logos/prisma.svg | 9 - .../app/routes/_marketing+/logos/radix.svg | 1 - .../routes/_marketing+/logos/react-email.svg | 1 - .../app/routes/_marketing+/logos/remix.svg | 25 - .../app/routes/_marketing+/logos/resend.svg | 31 - .../app/routes/_marketing+/logos/sentry.svg | 6 - .../routes/_marketing+/logos/shadcn-ui.svg | 1 - .../app/routes/_marketing+/logos/sqlite.svg | 67 - .../app/routes/_marketing+/logos/stars.jpg | Bin 391161 -> 0 bytes .../app/routes/_marketing+/logos/tailwind.svg | 1 - .../_marketing+/logos/testing-library.png | Bin 5803 -> 0 bytes .../routes/_marketing+/logos/typescript.svg | 6 - .../app/routes/_marketing+/logos/vitest.svg | 5 - .../app/routes/_marketing+/logos/zod.svg | 46 - .../app/routes/_marketing+/privacy.tsx | 3 - .../app/routes/_marketing+/support.tsx | 3 - .../app/routes/_marketing+/tos.tsx | 3 - .../app/routes/_seo+/robots[.]txt.ts | 9 - .../app/routes/_seo+/sitemap[.]xml.ts | 17 - .../app/routes/admin+/cache.tsx | 244 - .../app/routes/admin+/cache_.lru.$cacheKey.ts | 31 - .../routes/admin+/cache_.sqlite.$cacheKey.ts | 31 - .../app/routes/admin+/cache_.sqlite.server.ts | 59 - .../app/routes/admin+/cache_.sqlite.tsx | 1 - .../app/routes/me.tsx | 19 - .../routes/resources+/download-user-data.tsx | 62 - .../app/routes/resources+/healthcheck.tsx | 26 - .../app/routes/resources+/images.tsx | 80 - .../app/routes/resources+/theme-switch.tsx | 143 - .../settings+/profile.change-email.server.tsx | 124 - .../routes/settings+/profile.change-email.tsx | 146 - .../routes/settings+/profile.connections.tsx | 212 - .../app/routes/settings+/profile.index.tsx | 371 - .../app/routes/settings+/profile.passkeys.tsx | 191 - .../app/routes/settings+/profile.password.tsx | 182 - .../settings+/profile.password_.create.tsx | 137 - .../app/routes/settings+/profile.photo.tsx | 236 - .../app/routes/settings+/profile.tsx | 82 - .../settings+/profile.two-factor.disable.tsx | 62 - .../settings+/profile.two-factor.index.tsx | 90 - .../routes/settings+/profile.two-factor.tsx | 16 - .../settings+/profile.two-factor.verify.tsx | 227 - .../app/routes/users+/$username.test.tsx | 97 - .../app/routes/users+/$username.tsx | 130 - .../$username_+/__note-editor.server.tsx | 131 - .../users+/$username_+/__note-editor.tsx | 294 - .../users+/$username_+/notes.$noteId.tsx | 236 - .../$username_+/notes.$noteId_.edit.tsx | 51 - .../routes/users+/$username_+/notes.index.tsx | 27 - .../routes/users+/$username_+/notes.new.tsx | 12 - .../app/routes/users+/$username_+/notes.tsx | 102 - .../app/routes/users+/index.tsx | 81 - .../app/styles/tailwind.css | 220 - .../app/utils/auth.server.test.ts | 109 - .../app/utils/auth.server.ts | 294 - .../app/utils/cache.server.ts | 178 - .../app/utils/client-hints.tsx | 56 - .../app/utils/connections.server.ts | 21 - .../app/utils/connections.tsx | 57 - .../app/utils/db.server.ts | 37 - .../app/utils/email.server.ts | 98 - .../app/utils/env.server.ts | 74 - .../app/utils/headers.server.test.ts | 39 - .../app/utils/headers.server.ts | 114 - .../app/utils/honeypot.server.ts | 17 - .../app/utils/litefs.server.ts | 22 - .../app/utils/misc.error-message.test.ts | 24 - .../app/utils/misc.tsx | 292 - .../app/utils/misc.use-double-check.test.tsx | 83 - .../app/utils/monitoring.client.tsx | 35 - .../app/utils/nonce-provider.ts | 5 - .../app/utils/permissions.server.ts | 60 - .../app/utils/providers/constants.ts | 3 - .../app/utils/providers/github.server.ts | 158 - .../app/utils/providers/provider.ts | 28 - .../app/utils/redirect-cookie.server.ts | 17 - .../app/utils/request-info.ts | 19 - .../app/utils/session.server.ts | 38 - .../app/utils/storage.server.ts | 179 - .../app/utils/theme.server.ts | 19 - .../app/utils/timing.server.ts | 121 - .../app/utils/toast.server.ts | 62 - .../app/utils/totp.server.ts | 3 - .../app/utils/user-validation.ts | 48 - .../app/utils/user.ts | 70 - .../app/utils/verification.server.ts | 13 - .../components.json | 18 - .../eslint.config.js | 14 - .../03.solution.live-debugging/fly.toml | 61 - .../03.solution.live-debugging/index.js | 23 - .../other/Dockerfile | 97 - .../other/Dockerfile.dockerignore | 9 - .../other/README.md | 9 - .../other/build-server.ts | 50 - .../other/litefs.yml | 46 - .../other/sly/sly.json | 10 - .../other/sly/transform-icon.ts | 19 - .../other/svg-icons/README.md | 9 - .../other/svg-icons/arrow-left.svg | 11 - .../other/svg-icons/arrow-right.svg | 11 - .../other/svg-icons/avatar.svg | 11 - .../other/svg-icons/camera.svg | 11 - .../other/svg-icons/check.svg | 11 - .../other/svg-icons/clock.svg | 11 - .../other/svg-icons/cross-1.svg | 11 - .../other/svg-icons/dots-horizontal.svg | 13 - .../other/svg-icons/download.svg | 13 - .../other/svg-icons/envelope-closed.svg | 13 - .../other/svg-icons/exit.svg | 11 - .../other/svg-icons/file-text.svg | 11 - .../other/svg-icons/github-logo.svg | 13 - .../other/svg-icons/laptop.svg | 11 - .../other/svg-icons/link-2.svg | 13 - .../other/svg-icons/lock-closed.svg | 11 - .../other/svg-icons/lock-open-1.svg | 11 - .../other/svg-icons/magnifying-glass.svg | 11 - .../other/svg-icons/moon.svg | 11 - .../other/svg-icons/passkey.svg | 4 - .../other/svg-icons/pencil-1.svg | 11 - .../other/svg-icons/pencil-2.svg | 11 - .../other/svg-icons/plus.svg | 11 - .../other/svg-icons/question-mark-circled.svg | 13 - .../other/svg-icons/reset.svg | 11 - .../other/svg-icons/sun.svg | 11 - .../other/svg-icons/trash.svg | 11 - .../other/svg-icons/update.svg | 11 - .../package-lock.json | 18800 ---------------- .../playwright.config.ts | 45 - .../20250221233640_init/migration.sql | 275 - .../prisma/migrations/migration_lock.toml | 3 - .../prisma/schema.prisma | 186 - .../03.solution.live-debugging/prisma/seed.ts | 263 - .../prisma/sql/searchUsers.sql | 19 - .../public/favicon.ico | Bin 15406 -> 0 bytes .../public/favicons/README.md | 12 - .../favicons/android-chrome-192x192.png | Bin 10041 -> 0 bytes .../favicons/android-chrome-512x512.png | Bin 27787 -> 0 bytes .../public/img/user.png | Bin 3012 -> 0 bytes .../public/site.webmanifest | 20 - .../react-router.config.ts | 23 - .../server/dev-server.js | 18 - .../server/index.ts | 267 - .../server/utils/monitoring.ts | 43 - .../tests/db-utils.ts | 100 - .../tests/setup/custom-matchers.ts | 169 - .../tests/setup/db-setup.ts | 20 - .../tests/setup/global-setup.ts | 38 - .../tests/setup/setup-test-env.ts | 35 - .../tests/test-extend.ts | 67 - .../03.solution.live-debugging/tests/utils.ts | 33 - .../03.solution.live-debugging/tsconfig.json | 17 - .../types/deps.d.ts | 6 - .../types/env.env.d.ts | 2 - .../types/icon-name.d.ts | 3 - .../types/reset.d.ts | 2 - .../03.solution.live-debugging/vite.config.ts | 87 - .../01.problem.recording-interactions}/.env | 0 .../.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../.gitignore | 0 .../01.problem.recording-interactions}/.npmrc | 0 .../.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../app/root.tsx | 0 .../app/routes.ts | 0 .../app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../components.json | 0 .../eslint.config.js | 0 .../fly.toml | 0 .../index.js | 0 .../other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../other/README.md | 0 .../other/build-server.ts | 0 .../other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/profile-edit.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../tests/utils.ts | 0 .../tsconfig.json | 0 .../types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../types/reset.d.ts | 0 .../vite.config.ts | 0 .../01.solution.recording-interactions}/.env | 0 .../.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../.gitignore | 0 .../.npmrc | 0 .../.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../app/root.tsx | 0 .../app/routes.ts | 0 .../app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../components.json | 0 .../eslint.config.js | 0 .../fly.toml | 0 .../index.js | 0 .../other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../other/README.md | 0 .../other/build-server.ts | 0 .../other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/profile-edit.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../tests/utils.ts | 0 .../tsconfig.json | 0 .../types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../types/reset.d.ts | 0 .../vite.config.ts | 0 .../02.problem.api-mocking}/.env | 0 .../02.problem.api-mocking}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../02.problem.api-mocking}/.gitignore | 0 .../02.problem.api-mocking}/.npmrc | 0 .../02.problem.api-mocking}/.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../02.problem.api-mocking}/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/combobox.tsx | 0 .../app/components/ui/command.tsx | 0 .../app/components/ui/dialog.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/popover.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../02.problem.api-mocking}/app/root.tsx | 0 .../02.problem.api-mocking}/app/routes.ts | 0 .../02.problem.api-mocking}/app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../02.problem.api-mocking}/app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../02.problem.api-mocking}/app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../02.problem.api-mocking}/components.json | 0 .../02.problem.api-mocking}/eslint.config.js | 0 .../02.problem.api-mocking}/fly.toml | 0 .../02.problem.api-mocking}/index.js | 0 .../02.problem.api-mocking}/other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../02.problem.api-mocking}/other/README.md | 0 .../other/build-server.ts | 0 .../02.problem.api-mocking}/other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../02.problem.api-mocking}/package-lock.json | 0 .../02.problem.api-mocking}/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../02.problem.api-mocking}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/mockServiceWorker.js | 0 .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../02.problem.api-mocking}/server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../02.problem.api-mocking}/tests/db-utils.ts | 0 .../tests/e2e/notes-create.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../02.problem.api-mocking}/tests/utils.ts | 0 .../02.problem.api-mocking}/tsconfig.json | 0 .../02.problem.api-mocking}/types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../02.problem.api-mocking}/types/reset.d.ts | 0 .../02.problem.api-mocking}/vite.config.ts | 0 .../02.solution.api-mocking}/.env | 0 .../02.solution.api-mocking}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../02.solution.api-mocking}/.gitignore | 0 .../02.solution.api-mocking}/.npmrc | 0 .../02.solution.api-mocking}/.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../02.solution.api-mocking}/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/command.tsx | 0 .../app/components/ui/dialog.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/popover.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../02.solution.api-mocking}/app/root.tsx | 0 .../02.solution.api-mocking}/app/routes.ts | 0 .../02.solution.api-mocking}/app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../02.solution.api-mocking}/components.json | 0 .../02.solution.api-mocking}/eslint.config.js | 0 .../02.solution.api-mocking}/fly.toml | 0 .../02.solution.api-mocking}/index.js | 0 .../02.solution.api-mocking}/other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../02.solution.api-mocking}/other/README.md | 0 .../other/build-server.ts | 0 .../02.solution.api-mocking}/other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../02.solution.api-mocking}/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../02.solution.api-mocking}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../02.solution.api-mocking}/server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/notes-create.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../02.solution.api-mocking}/tests/utils.ts | 0 .../02.solution.api-mocking}/tsconfig.json | 0 .../02.solution.api-mocking}/types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../02.solution.api-mocking}/types/reset.d.ts | 0 .../02.solution.api-mocking}/vite.config.ts | 0 .../{03.guides => 04.guides}/FINISHED.mdx | 0 exercises/{03.guides => 04.guides}/README.mdx | 0 .../01.problem.ui-mode}/.env | 0 .../01.problem.ui-mode}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../01.problem.ui-mode}/.gitignore | 0 .../01.problem.ui-mode}/.npmrc | 0 .../01.problem.ui-mode}/.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../01.problem.ui-mode}/.vscode/settings.json | 0 .../01.problem.ui-mode/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../01.problem.ui-mode}/app/entry.client.tsx | 0 .../01.problem.ui-mode}/app/entry.server.tsx | 0 .../01.problem.ui-mode}/app/root.tsx | 0 .../01.problem.ui-mode}/app/routes.ts | 0 .../01.problem.ui-mode}/app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../01.problem.ui-mode}/app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../01.problem.ui-mode}/app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../01.problem.ui-mode}/app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../01.problem.ui-mode}/components.json | 0 .../01.problem.ui-mode}/eslint.config.js | 0 .../01.problem.ui-mode}/fly.toml | 0 .../01.problem.ui-mode}/index.js | 0 .../01.problem.ui-mode}/other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../01.problem.ui-mode}/other/README.md | 0 .../01.problem.ui-mode}/other/build-server.ts | 0 .../01.problem.ui-mode}/other/litefs.yml | 0 .../01.problem.ui-mode}/other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../01.problem.ui-mode/package.json | 0 .../01.problem.ui-mode}/playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../01.problem.ui-mode}/prisma/schema.prisma | 0 .../01.problem.ui-mode}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../01.problem.ui-mode}/public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../01.problem.ui-mode}/public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../01.problem.ui-mode}/server/dev-server.js | 0 .../01.problem.ui-mode}/server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../01.problem.ui-mode}/tests/db-utils.ts | 0 .../tests/e2e/notes-search.test.ts | 0 .../01.problem.ui-mode/tests/e2e/utils.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../01.problem.ui-mode}/tests/test-extend.ts | 0 .../01.problem.ui-mode}/tests/utils.ts | 0 .../01.problem.ui-mode}/tsconfig.json | 0 .../01.problem.ui-mode}/types/deps.d.ts | 0 .../01.problem.ui-mode}/types/env.env.d.ts | 0 .../01.problem.ui-mode}/types/icon-name.d.ts | 0 .../01.problem.ui-mode}/types/reset.d.ts | 0 .../01.problem.ui-mode}/vite.config.ts | 0 .../01.solution.ui-mode}/.env | 0 .../01.solution.ui-mode}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../01.solution.ui-mode}/.gitignore | 0 .../01.solution.ui-mode}/.npmrc | 0 .../01.solution.ui-mode}/.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../01.solution.ui-mode/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../01.solution.ui-mode}/app/entry.client.tsx | 0 .../01.solution.ui-mode}/app/entry.server.tsx | 0 .../01.solution.ui-mode}/app/root.tsx | 0 .../01.solution.ui-mode}/app/routes.ts | 0 .../01.solution.ui-mode}/app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../01.solution.ui-mode}/app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../01.solution.ui-mode}/app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../01.solution.ui-mode}/app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../01.solution.ui-mode}/components.json | 0 .../01.solution.ui-mode}/eslint.config.js | 0 .../01.solution.ui-mode}/fly.toml | 0 .../01.solution.ui-mode}/index.js | 0 .../01.solution.ui-mode}/other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../01.solution.ui-mode}/other/README.md | 0 .../other/build-server.ts | 0 .../01.solution.ui-mode}/other/litefs.yml | 0 .../01.solution.ui-mode}/other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../01.solution.ui-mode/package.json | 0 .../01.solution.ui-mode}/playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../01.solution.ui-mode}/prisma/schema.prisma | 0 .../01.solution.ui-mode}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../01.solution.ui-mode}/public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../01.solution.ui-mode}/public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../01.solution.ui-mode}/server/dev-server.js | 0 .../01.solution.ui-mode}/server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../01.solution.ui-mode}/tests/db-utils.ts | 0 .../tests/e2e/notes-search.test.ts | 0 .../01.solution.ui-mode/tests/e2e/utils.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../01.solution.ui-mode}/tests/test-extend.ts | 0 .../01.solution.ui-mode}/tests/utils.ts | 0 .../01.solution.ui-mode}/tsconfig.json | 0 .../01.solution.ui-mode}/types/deps.d.ts | 0 .../01.solution.ui-mode}/types/env.env.d.ts | 0 .../01.solution.ui-mode}/types/icon-name.d.ts | 0 .../01.solution.ui-mode}/types/reset.d.ts | 0 .../01.solution.ui-mode}/vite.config.ts | 0 .../02.problem.trace-viewer/.env | 0 .../02.problem.trace-viewer/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../02.problem.trace-viewer}/.gitignore | 0 .../02.problem.trace-viewer}/.npmrc | 0 .../02.problem.trace-viewer}/.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../02.problem.trace-viewer/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/newsletter-dialog.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dialog.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../02.problem.trace-viewer}/app/root.tsx | 0 .../02.problem.trace-viewer}/app/routes.ts | 0 .../02.problem.trace-viewer}/app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../02.problem.trace-viewer}/components.json | 0 .../02.problem.trace-viewer}/eslint.config.js | 0 .../02.problem.trace-viewer}/fly.toml | 0 .../02.problem.trace-viewer}/index.js | 0 .../02.problem.trace-viewer}/other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../02.problem.trace-viewer}/other/README.md | 0 .../other/build-server.ts | 0 .../02.problem.trace-viewer}/other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../02.problem.trace-viewer/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../02.problem.trace-viewer}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../02.problem.trace-viewer}/server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/notes-create.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../02.problem.trace-viewer}/tests/utils.ts | 0 .../02.problem.trace-viewer/trace.zip | Bin .../02.problem.trace-viewer}/tsconfig.json | 0 .../02.problem.trace-viewer}/types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../02.problem.trace-viewer}/types/reset.d.ts | 0 .../02.problem.trace-viewer}/vite.config.ts | 0 .../02.solution.trace-viewer/.env | 0 .../02.solution.trace-viewer/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../02.solution.trace-viewer}/.gitignore | 0 .../02.solution.trace-viewer}/.npmrc | 0 .../02.solution.trace-viewer}/.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../02.solution.trace-viewer/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/newsletter-dialog.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dialog.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../02.solution.trace-viewer}/app/root.tsx | 0 .../02.solution.trace-viewer}/app/routes.ts | 0 .../app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../02.solution.trace-viewer}/components.json | 0 .../eslint.config.js | 0 .../02.solution.trace-viewer}/fly.toml | 0 .../02.solution.trace-viewer}/index.js | 0 .../other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../02.solution.trace-viewer}/other/README.md | 0 .../other/build-server.ts | 0 .../other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../02.solution.trace-viewer/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../02.solution.trace-viewer}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../02.solution.trace-viewer}/server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/notes-create.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../02.solution.trace-viewer}/tests/utils.ts | 0 .../02.solution.trace-viewer/trace.zip | Bin .../02.solution.trace-viewer}/tsconfig.json | 0 .../02.solution.trace-viewer}/types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../types/reset.d.ts | 0 .../02.solution.trace-viewer}/vite.config.ts | 0 .../03.problem.live-debugging}/.env | 0 .../03.problem.live-debugging}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../03.problem.live-debugging}/.gitignore | 0 .../03.problem.live-debugging}/.npmrc | 0 .../.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../03.problem.live-debugging/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dialog.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../03.problem.live-debugging}/app/root.tsx | 0 .../03.problem.live-debugging}/app/routes.ts | 0 .../app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../components.json | 0 .../eslint.config.js | 0 .../03.problem.live-debugging}/fly.toml | 0 .../03.problem.live-debugging}/index.js | 0 .../other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../other/README.md | 0 .../other/build-server.ts | 0 .../other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../03.problem.live-debugging/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../03.problem.live-debugging}/prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/logout.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../03.problem.live-debugging}/tests/utils.ts | 0 .../03.problem.live-debugging}/tsconfig.json | 0 .../types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../types/reset.d.ts | 0 .../03.problem.live-debugging}/vite.config.ts | 0 .../03.solution.live-debugging}/.env | 0 .../03.solution.live-debugging}/.env.example | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/deploy.yml | 0 .../03.solution.live-debugging}/.gitignore | 0 .../03.solution.live-debugging}/.npmrc | 0 .../.prettierignore | 0 .../.vscode/extensions.json | 0 .../.vscode/remix.code-snippets | 0 .../.vscode/settings.json | 0 .../03.solution.live-debugging/README.mdx | 0 .../app/assets/favicons/apple-touch-icon.png | Bin .../app/assets/favicons/favicon.svg | 0 .../app/components/error-boundary.tsx | 0 .../app/components/floating-toolbar.tsx | 0 .../app/components/forms.tsx | 0 .../app/components/progress-bar.tsx | 0 .../app/components/search-bar.tsx | 0 .../app/components/spacer.tsx | 0 .../app/components/toaster.tsx | 0 .../app/components/ui/README.md | 0 .../app/components/ui/button.tsx | 0 .../app/components/ui/checkbox.tsx | 0 .../app/components/ui/dialog.tsx | 0 .../app/components/ui/dropdown-menu.tsx | 0 .../app/components/ui/icon.tsx | 0 .../app/components/ui/input-otp.tsx | 0 .../app/components/ui/input.tsx | 0 .../app/components/ui/label.tsx | 0 .../app/components/ui/sonner.tsx | 0 .../app/components/ui/status-button.tsx | 0 .../app/components/ui/textarea.tsx | 0 .../app/components/ui/tooltip.tsx | 0 .../app/components/user-dropdown.tsx | 0 .../app/entry.client.tsx | 0 .../app/entry.server.tsx | 0 .../03.solution.live-debugging}/app/root.tsx | 0 .../03.solution.live-debugging}/app/routes.ts | 0 .../app/routes/$.tsx | 0 .../_auth+/auth.$provider.callback.test.ts | 0 .../routes/_auth+/auth.$provider.callback.ts | 0 .../app/routes/_auth+/auth_.$provider.ts | 0 .../app/routes/_auth+/forgot-password.tsx | 0 .../app/routes/_auth+/login.server.ts | 0 .../app/routes/_auth+/login.tsx | 0 .../app/routes/_auth+/logout.tsx | 0 .../app/routes/_auth+/onboarding.server.ts | 0 .../app/routes/_auth+/onboarding.tsx | 0 .../_auth+/onboarding_.$provider.server.ts | 0 .../routes/_auth+/onboarding_.$provider.tsx | 0 .../routes/_auth+/reset-password.server.ts | 0 .../app/routes/_auth+/reset-password.tsx | 0 .../app/routes/_auth+/signup.tsx | 0 .../app/routes/_auth+/verify.server.ts | 0 .../app/routes/_auth+/verify.tsx | 0 .../routes/_auth+/webauthn+/authentication.ts | 0 .../routes/_auth+/webauthn+/registration.ts | 0 .../routes/_auth+/webauthn+/utils.server.ts | 0 .../app/routes/_marketing+/about.tsx | 0 .../app/routes/_marketing+/index.tsx | 0 .../app/routes/_marketing+/logos/docker.svg | 0 .../app/routes/_marketing+/logos/eslint.svg | 0 .../app/routes/_marketing+/logos/faker.svg | 0 .../app/routes/_marketing+/logos/fly.svg | 0 .../app/routes/_marketing+/logos/github.svg | 0 .../app/routes/_marketing+/logos/logos.ts | 0 .../app/routes/_marketing+/logos/msw.svg | 0 .../routes/_marketing+/logos/playwright.svg | 0 .../app/routes/_marketing+/logos/prettier.svg | 0 .../app/routes/_marketing+/logos/prisma.svg | 0 .../app/routes/_marketing+/logos/radix.svg | 0 .../routes/_marketing+/logos/react-email.svg | 0 .../app/routes/_marketing+/logos/remix.svg | 0 .../app/routes/_marketing+/logos/resend.svg | 0 .../app/routes/_marketing+/logos/sentry.svg | 0 .../routes/_marketing+/logos/shadcn-ui.svg | 0 .../app/routes/_marketing+/logos/sqlite.svg | 0 .../app/routes/_marketing+/logos/stars.jpg | Bin .../app/routes/_marketing+/logos/tailwind.svg | 0 .../_marketing+/logos/testing-library.png | Bin .../routes/_marketing+/logos/typescript.svg | 0 .../app/routes/_marketing+/logos/vitest.svg | 0 .../app/routes/_marketing+/logos/zod.svg | 0 .../app/routes/_marketing+/privacy.tsx | 0 .../app/routes/_marketing+/support.tsx | 0 .../app/routes/_marketing+/tos.tsx | 0 .../app/routes/_seo+/robots[.]txt.ts | 0 .../app/routes/_seo+/sitemap[.]xml.ts | 0 .../app/routes/admin+/cache.tsx | 0 .../app/routes/admin+/cache_.lru.$cacheKey.ts | 0 .../routes/admin+/cache_.sqlite.$cacheKey.ts | 0 .../app/routes/admin+/cache_.sqlite.server.ts | 0 .../app/routes/admin+/cache_.sqlite.tsx | 0 .../app/routes/me.tsx | 0 .../routes/resources+/download-user-data.tsx | 0 .../app/routes/resources+/healthcheck.tsx | 0 .../app/routes/resources+/images.tsx | 0 .../app/routes/resources+/theme-switch.tsx | 0 .../settings+/profile.change-email.server.tsx | 0 .../routes/settings+/profile.change-email.tsx | 0 .../routes/settings+/profile.connections.tsx | 0 .../app/routes/settings+/profile.index.tsx | 0 .../app/routes/settings+/profile.passkeys.tsx | 0 .../app/routes/settings+/profile.password.tsx | 0 .../settings+/profile.password_.create.tsx | 0 .../app/routes/settings+/profile.photo.tsx | 0 .../app/routes/settings+/profile.tsx | 0 .../settings+/profile.two-factor.disable.tsx | 0 .../settings+/profile.two-factor.index.tsx | 0 .../routes/settings+/profile.two-factor.tsx | 0 .../settings+/profile.two-factor.verify.tsx | 0 .../app/routes/users+/$username.test.tsx | 0 .../app/routes/users+/$username.tsx | 0 .../$username_+/__note-editor.server.tsx | 0 .../users+/$username_+/__note-editor.tsx | 0 .../users+/$username_+/notes.$noteId.tsx | 0 .../$username_+/notes.$noteId_.edit.tsx | 0 .../routes/users+/$username_+/notes.index.tsx | 0 .../routes/users+/$username_+/notes.new.tsx | 0 .../app/routes/users+/$username_+/notes.tsx | 0 .../app/routes/users+/index.tsx | 0 .../app/styles/tailwind.css | 0 .../app/utils/auth.server.test.ts | 0 .../app/utils/auth.server.ts | 0 .../app/utils/cache.server.ts | 0 .../app/utils/client-hints.tsx | 0 .../app/utils/connections.server.ts | 0 .../app/utils/connections.tsx | 0 .../app/utils/db.server.ts | 0 .../app/utils/email.server.ts | 0 .../app/utils/env.server.ts | 0 .../app/utils/headers.server.test.ts | 0 .../app/utils/headers.server.ts | 0 .../app/utils/honeypot.server.ts | 0 .../app/utils/litefs.server.ts | 0 .../app/utils/misc.error-message.test.ts | 0 .../app/utils/misc.tsx | 0 .../app/utils/misc.use-double-check.test.tsx | 0 .../app/utils/monitoring.client.tsx | 0 .../app/utils/nonce-provider.ts | 0 .../app/utils/permissions.server.ts | 0 .../app/utils/providers/constants.ts | 0 .../app/utils/providers/github.server.ts | 0 .../app/utils/providers/provider.ts | 0 .../app/utils/redirect-cookie.server.ts | 0 .../app/utils/request-info.ts | 0 .../app/utils/session.server.ts | 0 .../app/utils/storage.server.ts | 0 .../app/utils/theme.server.ts | 0 .../app/utils/timing.server.ts | 0 .../app/utils/toast.server.ts | 0 .../app/utils/totp.server.ts | 0 .../app/utils/user-validation.ts | 0 .../app/utils/user.ts | 0 .../app/utils/verification.server.ts | 0 .../components.json | 0 .../eslint.config.js | 0 .../03.solution.live-debugging}/fly.toml | 0 .../03.solution.live-debugging}/index.js | 0 .../other/Dockerfile | 0 .../other/Dockerfile.dockerignore | 0 .../other/README.md | 0 .../other/build-server.ts | 0 .../other/litefs.yml | 0 .../other/sly/sly.json | 0 .../other/sly/transform-icon.ts | 0 .../other/svg-icons/README.md | 0 .../other/svg-icons/arrow-left.svg | 0 .../other/svg-icons/arrow-right.svg | 0 .../other/svg-icons/avatar.svg | 0 .../other/svg-icons/camera.svg | 0 .../other/svg-icons/check.svg | 0 .../other/svg-icons/clock.svg | 0 .../other/svg-icons/cross-1.svg | 0 .../other/svg-icons/dots-horizontal.svg | 0 .../other/svg-icons/download.svg | 0 .../other/svg-icons/envelope-closed.svg | 0 .../other/svg-icons/exit.svg | 0 .../other/svg-icons/file-text.svg | 0 .../other/svg-icons/github-logo.svg | 0 .../other/svg-icons/laptop.svg | 0 .../other/svg-icons/link-2.svg | 0 .../other/svg-icons/lock-closed.svg | 0 .../other/svg-icons/lock-open-1.svg | 0 .../other/svg-icons/magnifying-glass.svg | 0 .../other/svg-icons/moon.svg | 0 .../other/svg-icons/passkey.svg | 0 .../other/svg-icons/pencil-1.svg | 0 .../other/svg-icons/pencil-2.svg | 0 .../other/svg-icons/plus.svg | 0 .../other/svg-icons/question-mark-circled.svg | 0 .../other/svg-icons/reset.svg | 0 .../other/svg-icons/sun.svg | 0 .../other/svg-icons/trash.svg | 0 .../other/svg-icons/update.svg | 0 .../package-lock.json | 0 .../03.solution.live-debugging/package.json | 0 .../playwright.config.ts | 0 .../20250221233640_init/migration.sql | 0 .../prisma/migrations/migration_lock.toml | 0 .../prisma/schema.prisma | 0 .../prisma/seed.ts | 0 .../prisma/sql/searchUsers.sql | 0 .../public/favicon.ico | Bin .../public/favicons/README.md | 0 .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../public/img/user.png | Bin .../public/site.webmanifest | 0 .../react-router.config.ts | 0 .../server/dev-server.js | 0 .../server/index.ts | 0 .../server/utils/monitoring.ts | 0 .../tests/db-utils.ts | 0 .../tests/e2e/logout.test.ts | 0 .../tests/setup/custom-matchers.ts | 0 .../tests/setup/db-setup.ts | 0 .../tests/setup/global-setup.ts | 0 .../tests/setup/setup-test-env.ts | 0 .../tests/test-extend.ts | 0 .../tests/utils.ts | 0 .../03.solution.live-debugging}/tsconfig.json | 0 .../types/deps.d.ts | 0 .../types/env.env.d.ts | 0 .../types/icon-name.d.ts | 0 .../types/reset.d.ts | 0 .../vite.config.ts | 0 .../FINISHED.mdx | 0 .../{04.debugging => 05.debugging}/README.mdx | 0 5023 files changed, 12 insertions(+), 137651 deletions(-) rename exercises/{01.basics => 01.setup}/01.problem.install-and-configure/README.mdx (100%) rename exercises/{01.basics => 01.setup}/01.problem.install-and-configure/package.json (100%) rename exercises/{01.basics => 01.setup}/01.problem.install-and-configure/tsconfig.json (100%) rename exercises/{01.basics => 01.setup}/01.solution.install-and-configure/README.mdx (100%) rename exercises/{01.basics => 01.setup}/01.solution.install-and-configure/package.json (100%) rename exercises/{01.basics => 01.setup}/01.solution.install-and-configure/playwright.config.ts (100%) rename exercises/{01.basics => 01.setup}/01.solution.install-and-configure/tests/epicweb.test.ts (100%) rename exercises/{01.basics => 01.setup}/01.solution.install-and-configure/tsconfig.json (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/.env (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/.env.example (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/.github/workflows/deploy.yml (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/.gitignore (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/.npmrc (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/.prettierignore (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/.vscode/extensions.json (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/.vscode/remix.code-snippets (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/.vscode/settings.json (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/README.mdx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/assets/favicons/favicon.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/error-boundary.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/floating-toolbar.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/forms.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/progress-bar.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/search-bar.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/spacer.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/toaster.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/README.md (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/button.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/checkbox.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/icon.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/input-otp.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/input.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/label.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/sonner.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/status-button.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/textarea.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/ui/tooltip.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/components/user-dropdown.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/entry.client.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/entry.server.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/root.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/$.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/login.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/login.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/logout.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/signup.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/verify.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/verify.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/about.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/index.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/support.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_marketing+/tos.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/admin+/cache.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/me.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/resources+/images.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.index.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.password.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/users+/$username.test.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/users+/$username.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/routes/users+/index.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/styles/tailwind.css (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/auth.server.test.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/auth.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/cache.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/client-hints.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/connections.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/connections.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/db.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/email.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/env.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/headers.server.test.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/headers.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/honeypot.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/litefs.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/misc.error-message.test.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/misc.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/monitoring.client.tsx (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/nonce-provider.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/permissions.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/providers/constants.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/providers/github.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/providers/provider.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/redirect-cookie.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/request-info.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/session.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/storage.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/theme.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/timing.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/toast.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/totp.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/user-validation.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/user.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/app/utils/verification.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/components.json (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/eslint.config.js (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/fly.toml (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/index.js (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/Dockerfile (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/Dockerfile.dockerignore (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/README.md (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/build-server.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/litefs.yml (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/sly/sly.json (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/sly/transform-icon.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/README.md (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/arrow-left.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/arrow-right.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/avatar.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/camera.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/check.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/clock.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/cross-1.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/download.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/envelope-closed.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/exit.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/file-text.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/github-logo.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/laptop.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/link-2.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/lock-closed.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/lock-open-1.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/moon.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/passkey.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/pencil-1.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/pencil-2.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/plus.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/reset.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/sun.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/trash.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/other/svg-icons/update.svg (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/package-lock.json (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/package.json (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/playwright.config.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/prisma/migrations/migration_lock.toml (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/prisma/schema.prisma (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/prisma/seed.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/prisma/sql/searchUsers.sql (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/public/favicon.ico (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/public/favicons/README.md (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/public/favicons/android-chrome-192x192.png (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/public/favicons/android-chrome-512x512.png (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/public/img/user.png (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/public/site.webmanifest (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/react-router.config.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/server/dev-server.js (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/server/index.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/server/utils/monitoring.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/tests/db-utils.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/tests/e2e/homepage.test.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/tests/setup/custom-matchers.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/tests/setup/db-setup.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/tests/setup/global-setup.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/tests/setup/setup-test-env.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/tests/utils.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/tsconfig.json (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/types/deps.d.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/types/env.env.d.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/types/icon-name.d.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/types/reset.d.ts (100%) rename exercises/{01.basics => 01.setup}/02.problem.running-the-app/vite.config.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/.env (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/.env.example (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/.github/workflows/deploy.yml (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/.gitignore (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/.npmrc (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/.prettierignore (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/.vscode/extensions.json (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/.vscode/remix.code-snippets (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/.vscode/settings.json (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/README.mdx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/assets/favicons/favicon.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/error-boundary.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/floating-toolbar.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/forms.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/progress-bar.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/search-bar.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/spacer.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/toaster.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/README.md (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/button.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/checkbox.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/icon.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/input-otp.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/input.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/label.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/sonner.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/status-button.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/textarea.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/ui/tooltip.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/components/user-dropdown.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/entry.client.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/entry.server.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/root.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/$.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/login.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/login.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/logout.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/signup.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/verify.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/verify.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/about.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/index.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/support.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_marketing+/tos.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/admin+/cache.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/me.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/resources+/images.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.index.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.password.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/users+/$username.test.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/users+/$username.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/routes/users+/index.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/styles/tailwind.css (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/auth.server.test.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/auth.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/cache.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/client-hints.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/connections.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/connections.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/db.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/email.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/env.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/headers.server.test.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/headers.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/honeypot.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/litefs.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/misc.error-message.test.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/misc.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/monitoring.client.tsx (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/nonce-provider.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/permissions.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/providers/constants.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/providers/github.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/providers/provider.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/redirect-cookie.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/request-info.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/session.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/storage.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/theme.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/timing.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/toast.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/totp.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/user-validation.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/user.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/app/utils/verification.server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/components.json (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/eslint.config.js (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/fly.toml (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/index.js (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/Dockerfile (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/Dockerfile.dockerignore (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/README.md (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/build-server.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/litefs.yml (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/sly/sly.json (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/sly/transform-icon.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/README.md (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/arrow-left.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/arrow-right.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/avatar.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/camera.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/check.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/clock.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/cross-1.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/download.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/envelope-closed.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/exit.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/file-text.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/github-logo.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/laptop.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/link-2.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/lock-closed.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/lock-open-1.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/moon.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/passkey.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/pencil-1.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/pencil-2.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/plus.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/reset.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/sun.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/trash.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/other/svg-icons/update.svg (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/package-lock.json (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/package.json (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/playwright.config.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/prisma/migrations/migration_lock.toml (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/prisma/schema.prisma (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/prisma/seed.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/prisma/sql/searchUsers.sql (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/public/favicon.ico (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/public/favicons/README.md (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/public/favicons/android-chrome-192x192.png (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/public/favicons/android-chrome-512x512.png (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/public/img/user.png (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/public/site.webmanifest (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/react-router.config.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/server/dev-server.js (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/server/index.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/server/utils/monitoring.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/tests/db-utils.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/tests/e2e/homepage.test.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/tests/setup/custom-matchers.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/tests/setup/db-setup.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/tests/setup/global-setup.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/tests/setup/setup-test-env.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/tests/utils.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/tsconfig.json (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/types/deps.d.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/types/env.env.d.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/types/icon-name.d.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/types/reset.d.ts (100%) rename exercises/{01.basics => 01.setup}/02.solution.running-the-app/vite.config.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/.env (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/.env.example (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/.github/workflows/deploy.yml (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/.gitignore (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/.npmrc (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/.prettierignore (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/.vscode/extensions.json (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/.vscode/remix.code-snippets (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/.vscode/settings.json (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/README.mdx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/assets/favicons/favicon.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/error-boundary.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/floating-toolbar.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/forms.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/progress-bar.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/search-bar.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/spacer.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/toaster.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/README.md (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/button.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/checkbox.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/icon.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/input-otp.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/input.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/label.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/sonner.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/status-button.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/textarea.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/ui/tooltip.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/components/user-dropdown.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/entry.client.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/entry.server.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/root.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/$.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/login.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/login.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/logout.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/signup.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/verify.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/about.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/index.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/support.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/admin+/cache.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/me.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/resources+/images.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/users+/$username.test.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/users+/$username.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/routes/users+/index.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/styles/tailwind.css (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/auth.server.test.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/auth.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/cache.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/client-hints.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/connections.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/connections.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/db.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/email.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/env.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/headers.server.test.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/headers.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/honeypot.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/litefs.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/misc.error-message.test.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/misc.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/monitoring.client.tsx (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/nonce-provider.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/permissions.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/providers/constants.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/providers/github.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/providers/provider.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/request-info.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/session.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/storage.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/theme.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/timing.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/toast.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/totp.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/user-validation.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/user.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/app/utils/verification.server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/components.json (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/eslint.config.js (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/fly.toml (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/index.js (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/Dockerfile (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/Dockerfile.dockerignore (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/README.md (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/build-server.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/litefs.yml (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/sly/sly.json (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/sly/transform-icon.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/README.md (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/arrow-left.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/arrow-right.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/avatar.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/camera.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/check.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/clock.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/cross-1.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/download.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/exit.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/file-text.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/github-logo.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/laptop.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/link-2.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/lock-closed.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/moon.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/passkey.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/pencil-1.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/pencil-2.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/plus.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/reset.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/sun.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/trash.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/other/svg-icons/update.svg (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/package-lock.json (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/package.json (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/playwright.config.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/prisma/migrations/migration_lock.toml (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/prisma/schema.prisma (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/prisma/seed.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/prisma/sql/searchUsers.sql (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/public/favicon.ico (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/public/favicons/README.md (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/public/img/user.png (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/public/site.webmanifest (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/react-router.config.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/server/dev-server.js (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/server/index.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/server/utils/monitoring.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/tests/db-utils.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/tests/e2e/homepage.test.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/tests/setup/custom-matchers.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/tests/setup/db-setup.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/tests/setup/global-setup.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/tests/setup/setup-test-env.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/tests/test-extend.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/tests/utils.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/tsconfig.json (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/types/deps.d.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/types/env.env.d.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/types/icon-name.d.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/types/reset.d.ts (100%) rename exercises/{02.test-setup/01.problem.custom-fixtures => 01.setup/03.problem.custom-fixtures}/vite.config.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/.env (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/.env.example (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/.github/workflows/deploy.yml (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/.gitignore (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/.npmrc (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/.prettierignore (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/.vscode/extensions.json (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/.vscode/remix.code-snippets (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/.vscode/settings.json (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/README.mdx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/assets/favicons/favicon.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/error-boundary.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/floating-toolbar.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/forms.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/progress-bar.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/search-bar.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/spacer.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/toaster.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/README.md (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/button.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/checkbox.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/icon.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/input-otp.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/input.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/label.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/sonner.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/status-button.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/textarea.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/ui/tooltip.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/components/user-dropdown.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/entry.client.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/entry.server.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/root.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/$.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/login.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/login.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/logout.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/signup.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/verify.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/about.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/index.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/support.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/admin+/cache.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/me.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/resources+/images.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/users+/$username.test.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/users+/$username.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/routes/users+/index.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/styles/tailwind.css (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/auth.server.test.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/auth.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/cache.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/client-hints.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/connections.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/connections.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/db.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/email.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/env.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/headers.server.test.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/headers.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/honeypot.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/litefs.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/misc.error-message.test.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/misc.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/monitoring.client.tsx (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/nonce-provider.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/permissions.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/providers/constants.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/providers/github.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/providers/provider.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/request-info.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/session.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/storage.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/theme.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/timing.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/toast.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/totp.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/user-validation.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/user.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/app/utils/verification.server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/components.json (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/eslint.config.js (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/fly.toml (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/index.js (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/Dockerfile (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/Dockerfile.dockerignore (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/README.md (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/build-server.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/litefs.yml (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/sly/sly.json (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/sly/transform-icon.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/README.md (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/arrow-left.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/arrow-right.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/avatar.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/camera.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/check.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/clock.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/cross-1.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/download.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/exit.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/file-text.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/github-logo.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/laptop.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/link-2.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/lock-closed.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/moon.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/passkey.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/pencil-1.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/pencil-2.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/plus.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/reset.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/sun.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/trash.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/other/svg-icons/update.svg (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/package-lock.json (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/package.json (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/playwright.config.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/prisma/migrations/migration_lock.toml (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/prisma/schema.prisma (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/prisma/seed.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/prisma/sql/searchUsers.sql (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/public/favicon.ico (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/public/favicons/README.md (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/public/img/user.png (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/public/site.webmanifest (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/react-router.config.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/server/dev-server.js (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/server/index.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/server/utils/monitoring.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/tests/db-utils.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/tests/e2e/homepage.test.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/tests/setup/custom-matchers.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/tests/setup/db-setup.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/tests/setup/global-setup.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/tests/setup/setup-test-env.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/tests/test-extend.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/tests/utils.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/tsconfig.json (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/types/deps.d.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/types/env.env.d.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/types/icon-name.d.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/types/reset.d.ts (100%) rename exercises/{02.test-setup/01.solution.custom-fixtures => 01.setup/03.solution.custom-fixtures}/vite.config.ts (100%) rename exercises/{01.basics => 01.setup}/FINISHED.mdx (100%) rename exercises/{01.basics => 01.setup}/README.mdx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.cursor/rules/avoid-use-effect.mdc (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.env (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.env.example (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.github/workflows/deploy.yml (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.gitignore (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.npmrc (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.prettierignore (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.vscode/extensions.json (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.vscode/remix.code-snippets (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/.vscode/settings.json (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/README.mdx (98%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/assets/favicons/favicon.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/error-boundary.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/floating-toolbar.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/forms.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/progress-bar.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/search-bar.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/spacer.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/toaster.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/README.md (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/button.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/checkbox.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/icon.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/input-otp.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/input.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/label.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/sonner.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/status-button.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/textarea.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/ui/tooltip.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/components/user-dropdown.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/entry.client.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/entry.server.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/root.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/$.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/login.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/login.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/logout.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/signup.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/verify.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/about.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/index.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/support.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/admin+/cache.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/me.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/resources+/images.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/users+/$username.test.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/users+/$username.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/routes/users+/index.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/styles/tailwind.css (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/auth.server.test.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/auth.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/cache.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/client-hints.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/connections.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/connections.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/db.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/email.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/env.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/headers.server.test.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/headers.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/honeypot.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/litefs.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/misc.error-message.test.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/misc.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/monitoring.client.tsx (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/nonce-provider.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/permissions.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/providers/constants.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/providers/github.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/providers/provider.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/request-info.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/session.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/storage.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/theme.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/timing.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/toast.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/totp.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/user-validation.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/user.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/app/utils/verification.server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/components.json (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/eslint.config.js (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/fly.toml (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/index.js (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/Dockerfile (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/Dockerfile.dockerignore (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/README.md (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/build-server.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/litefs.yml (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/sly/sly.json (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/sly/transform-icon.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/README.md (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/arrow-left.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/arrow-right.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/avatar.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/camera.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/check.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/clock.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/cross-1.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/download.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/exit.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/file-text.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/github-logo.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/laptop.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/link-2.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/lock-closed.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/moon.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/passkey.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/pencil-1.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/pencil-2.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/plus.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/reset.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/sun.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/trash.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/other/svg-icons/update.svg (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/package-lock.json (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/package.json (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/playwright.config.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/prisma/migrations/migration_lock.toml (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/prisma/schema.prisma (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/prisma/seed.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/prisma/sql/searchUsers.sql (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/public/favicon.ico (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/public/favicons/README.md (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/public/img/user.png (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/public/site.webmanifest (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/react-router.config.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/server/dev-server.js (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/server/index.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/server/utils/monitoring.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/tests/db-utils.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/tests/e2e/notes-create.test.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/tests/setup/custom-matchers.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/tests/setup/db-setup.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/tests/setup/global-setup.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/tests/setup/setup-test-env.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/tests/test-extend.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/tests/utils.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/tsconfig.json (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/types/deps.d.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/types/env.env.d.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/types/icon-name.d.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/types/reset.d.ts (100%) rename exercises/{02.test-setup/03.problem.authentication => 02.authentication/01.problem.basic}/vite.config.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/.env (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/.env.example (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/.github/workflows/deploy.yml (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/.gitignore (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/.npmrc (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/.prettierignore (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/.vscode/extensions.json (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/.vscode/remix.code-snippets (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/.vscode/settings.json (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/README.mdx (87%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/assets/favicons/favicon.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/error-boundary.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/floating-toolbar.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/forms.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/progress-bar.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/search-bar.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/spacer.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/toaster.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/README.md (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/button.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/checkbox.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/icon.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/input-otp.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/input.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/label.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/sonner.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/status-button.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/textarea.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/ui/tooltip.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/components/user-dropdown.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/entry.client.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/entry.server.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/root.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/$.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/login.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/login.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/logout.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/signup.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/verify.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/about.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/index.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/support.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/admin+/cache.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/me.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/resources+/images.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/users+/$username.test.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/users+/$username.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/routes/users+/index.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/styles/tailwind.css (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/auth.server.test.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/auth.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/cache.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/client-hints.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/connections.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/connections.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/db.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/email.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/env.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/headers.server.test.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/headers.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/honeypot.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/litefs.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/misc.error-message.test.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/misc.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/monitoring.client.tsx (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/nonce-provider.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/permissions.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/providers/constants.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/providers/github.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/providers/provider.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/request-info.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/session.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/storage.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/theme.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/timing.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/toast.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/totp.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/user-validation.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/user.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/app/utils/verification.server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/components.json (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/eslint.config.js (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/fly.toml (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/index.js (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/Dockerfile (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/Dockerfile.dockerignore (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/README.md (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/build-server.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/litefs.yml (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/sly/sly.json (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/sly/transform-icon.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/README.md (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/arrow-left.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/arrow-right.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/avatar.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/camera.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/check.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/clock.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/cross-1.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/download.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/exit.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/file-text.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/github-logo.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/laptop.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/link-2.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/lock-closed.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/moon.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/passkey.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/pencil-1.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/pencil-2.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/plus.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/reset.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/sun.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/trash.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/other/svg-icons/update.svg (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/package-lock.json (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/package.json (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/playwright.config.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/prisma/migrations/migration_lock.toml (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/prisma/schema.prisma (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/prisma/seed.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/prisma/sql/searchUsers.sql (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/public/favicon.ico (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/public/favicons/README.md (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/public/img/user.png (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/public/site.webmanifest (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/react-router.config.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/server/dev-server.js (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/server/index.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/server/utils/monitoring.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/tests/db-utils.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/tests/e2e/notes-create.test.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/tests/setup/custom-matchers.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/tests/setup/db-setup.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/tests/setup/global-setup.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/tests/setup/setup-test-env.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/tests/test-extend.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/tests/utils.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/tsconfig.json (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/types/deps.d.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/types/env.env.d.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/types/icon-name.d.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/types/reset.d.ts (100%) rename exercises/{02.test-setup/03.solution.authentication => 02.authentication/01.solution.basic}/vite.config.ts (100%) create mode 100644 exercises/02.authentication/02.solution.2fa/README.mdx create mode 100644 exercises/02.authentication/03.solution.passkeys/README.mdx create mode 100644 exercises/02.authentication/04.solution.captcha/README.mdx create mode 100644 exercises/02.authentication/FINISHED.mdx create mode 100644 exercises/02.authentication/README.mdx delete mode 100644 exercises/02.test-setup/02.problem.mock-databases/README.mdx delete mode 100644 exercises/02.test-setup/02.problem.mock-databases/package.json delete mode 100644 exercises/02.test-setup/02.solution.mock-databases/README.mdx delete mode 100644 exercises/02.test-setup/02.solution.mock-databases/package.json delete mode 100644 exercises/02.test-setup/FINISHED.mdx delete mode 100644 exercises/02.test-setup/README.mdx create mode 100644 exercises/03.databases/01.solution.file-based/README.mdx create mode 100644 exercises/03.databases/02.solution.in-memory/README.mdx create mode 100644 exercises/03.databases/03.solution.dockerized/README.mdx rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/.env (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/.env.example (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/.github/workflows/deploy.yml (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/.gitignore (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/.npmrc (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/.prettierignore (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/.vscode/extensions.json (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/.vscode/remix.code-snippets (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/.vscode/settings.json (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/README.mdx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/assets/favicons/favicon.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/error-boundary.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/floating-toolbar.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/app/components/forms.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/progress-bar.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/search-bar.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/spacer.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/toaster.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/README.md (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/button.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/checkbox.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/icon.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/input-otp.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/input.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/label.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/sonner.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/status-button.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/textarea.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/ui/tooltip.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/components/user-dropdown.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/entry.client.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/app/entry.server.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/app/root.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/$.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/login.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/login.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/logout.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/signup.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/verify.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/about.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/index.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/support.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/admin+/cache.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/me.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/resources+/images.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/users+/$username.test.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/users+/$username.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/routes/users+/index.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/styles/tailwind.css (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/auth.server.test.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/auth.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/cache.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/client-hints.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/connections.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/connections.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/db.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/email.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/env.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/headers.server.test.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/headers.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/honeypot.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/litefs.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/misc.error-message.test.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/misc.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/monitoring.client.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/nonce-provider.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/permissions.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/providers/constants.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/providers/github.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/providers/provider.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/request-info.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/session.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/storage.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/theme.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/timing.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/toast.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/totp.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/user-validation.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/user.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/app/utils/verification.server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/components.json (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/eslint.config.js (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/fly.toml (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/index.js (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/Dockerfile (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/Dockerfile.dockerignore (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/README.md (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/build-server.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/litefs.yml (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/sly/sly.json (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/sly/transform-icon.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/README.md (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/arrow-left.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/arrow-right.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/avatar.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/camera.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/check.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/clock.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/cross-1.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/download.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/exit.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/file-text.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/github-logo.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/laptop.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/link-2.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/lock-closed.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/moon.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/passkey.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/pencil-1.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/pencil-2.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/plus.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/reset.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/sun.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/trash.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/other/svg-icons/update.svg (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/package-lock.json (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/package.json (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/playwright.config.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/prisma/migrations/migration_lock.toml (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/prisma/schema.prisma (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/prisma/seed.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/prisma/sql/searchUsers.sql (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/public/favicon.ico (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/public/favicons/README.md (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/public/img/user.png (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/public/site.webmanifest (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/react-router.config.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/server/dev-server.js (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/server/index.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/server/utils/monitoring.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/tests/db-utils.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/tests/e2e/notes-list.test.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/tests/e2e/utils.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/tests/setup/custom-matchers.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/tests/setup/db-setup.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/tests/setup/global-setup.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/tests/setup/setup-test-env.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 03.databases/04.problem.test-data}/tests/test-extend.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/tests/utils.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/tsconfig.json (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/types/deps.d.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/types/env.env.d.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/types/icon-name.d.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/types/reset.d.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 03.databases/04.problem.test-data}/vite.config.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/.env (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/.env.example (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/.github/workflows/deploy.yml (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/.gitignore (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/.npmrc (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/.prettierignore (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/.vscode/extensions.json (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/.vscode/remix.code-snippets (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/.vscode/settings.json (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/README.mdx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/assets/favicons/favicon.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/error-boundary.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/floating-toolbar.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/app/components/forms.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/progress-bar.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/search-bar.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/spacer.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/toaster.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/README.md (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/button.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/checkbox.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/icon.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/input-otp.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/input.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/label.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/sonner.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/status-button.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/textarea.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/ui/tooltip.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/components/user-dropdown.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/entry.client.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/app/entry.server.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/app/root.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/$.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/login.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/login.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/logout.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/signup.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/verify.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/about.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/index.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/support.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/admin+/cache.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/me.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/resources+/images.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/users+/$username.test.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/users+/$username.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/routes/users+/index.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/styles/tailwind.css (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/auth.server.test.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/auth.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/cache.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/client-hints.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/connections.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/connections.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/db.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/email.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/env.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/headers.server.test.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/headers.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/honeypot.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/litefs.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/misc.error-message.test.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/misc.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/monitoring.client.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/nonce-provider.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/permissions.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/providers/constants.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/providers/github.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/providers/provider.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/request-info.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/session.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/storage.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/theme.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/timing.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/toast.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/totp.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/user-validation.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/user.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/app/utils/verification.server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/components.json (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/eslint.config.js (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/fly.toml (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/index.js (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/Dockerfile (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/Dockerfile.dockerignore (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/README.md (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/build-server.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/litefs.yml (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/sly/sly.json (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/sly/transform-icon.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/README.md (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/arrow-left.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/arrow-right.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/avatar.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/camera.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/check.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/clock.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/cross-1.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/download.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/exit.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/file-text.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/github-logo.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/laptop.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/link-2.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/lock-closed.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/moon.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/passkey.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/pencil-1.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/pencil-2.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/plus.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/reset.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/sun.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/trash.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/other/svg-icons/update.svg (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/package-lock.json (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/package.json (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/playwright.config.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/prisma/migrations/migration_lock.toml (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/prisma/schema.prisma (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/prisma/seed.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/prisma/sql/searchUsers.sql (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/public/favicon.ico (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/public/favicons/README.md (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/public/img/user.png (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/public/site.webmanifest (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/react-router.config.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/server/dev-server.js (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/server/index.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/server/utils/monitoring.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/tests/db-utils.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/tests/e2e/notes-list.test.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/tests/e2e/utils.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/tests/setup/custom-matchers.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/tests/setup/db-setup.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/tests/setup/global-setup.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/tests/setup/setup-test-env.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 03.databases/04.solution.test-data}/tests/test-extend.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/tests/utils.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/tsconfig.json (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/types/deps.d.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/types/env.env.d.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/types/icon-name.d.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/types/reset.d.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 03.databases/04.solution.test-data}/vite.config.ts (100%) create mode 100644 exercises/03.databases/FINISHED.mdx create mode 100644 exercises/03.databases/README.mdx delete mode 100644 exercises/03.guides/02.problem.test-annotations/README.mdx delete mode 100644 exercises/03.guides/02.problem.test-annotations/app/root.tsx delete mode 100644 exercises/03.guides/02.problem.test-annotations/app/routes/_marketing+/index.tsx delete mode 100644 exercises/03.guides/02.problem.test-annotations/package.json delete mode 100644 exercises/03.guides/02.problem.test-annotations/tests/e2e/homepage.test.ts delete mode 100644 exercises/03.guides/02.problem.test-annotations/tests/e2e/notes-create.test.ts delete mode 100644 exercises/03.guides/02.problem.test-annotations/tests/e2e/profile-edit.test.ts delete mode 100644 exercises/03.guides/02.problem.test-annotations/tests/test-extend.ts delete mode 100644 exercises/03.guides/02.solution.test-annotations/README.mdx delete mode 100644 exercises/03.guides/02.solution.test-annotations/app/root.tsx delete mode 100644 exercises/03.guides/02.solution.test-annotations/app/routes/_marketing+/index.tsx delete mode 100644 exercises/03.guides/02.solution.test-annotations/package.json delete mode 100644 exercises/03.guides/02.solution.test-annotations/tests/e2e/homepage.test.ts delete mode 100644 exercises/03.guides/02.solution.test-annotations/tests/e2e/notes-create.test.ts delete mode 100644 exercises/03.guides/02.solution.test-annotations/tests/e2e/profile-edit.test.ts delete mode 100644 exercises/03.guides/02.solution.test-annotations/tests/test-extend.ts delete mode 100644 exercises/03.guides/03.problem.blocking-unneeded-requests/README.mdx delete mode 100644 exercises/03.guides/03.problem.blocking-unneeded-requests/package.json delete mode 100644 exercises/03.guides/03.problem.blocking-unneeded-requests/tests/e2e/homepage.test.ts delete mode 100644 exercises/03.guides/03.problem.blocking-unneeded-requests/tests/test-extend.ts delete mode 100644 exercises/03.guides/03.solution.blocking-unneeded-requests/README.mdx delete mode 100644 exercises/03.guides/03.solution.blocking-unneeded-requests/package.json delete mode 100644 exercises/03.guides/03.solution.blocking-unneeded-requests/tests/e2e/homepage.test.ts delete mode 100644 exercises/04.debugging/01.problem.ui-mode/.env delete mode 100644 exercises/04.debugging/01.problem.ui-mode/.env.example delete mode 100644 exercises/04.debugging/01.problem.ui-mode/app/routes/users+/$username_+/notes.tsx delete mode 100644 exercises/04.debugging/01.problem.ui-mode/app/utils/env.server.ts delete mode 100644 exercises/04.debugging/01.solution.ui-mode/.env delete mode 100644 exercises/04.debugging/01.solution.ui-mode/.env.example delete mode 100644 exercises/04.debugging/01.solution.ui-mode/app/routes/users+/$username_+/notes.tsx delete mode 100644 exercises/04.debugging/01.solution.ui-mode/app/utils/env.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/.github/workflows/deploy.yml delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/.gitignore delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/.npmrc delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/.prettierignore delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/.vscode/extensions.json delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/.vscode/remix.code-snippets delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/.vscode/settings.json delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/assets/favicons/apple-touch-icon.png delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/assets/favicons/favicon.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/error-boundary.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/floating-toolbar.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/forms.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/progress-bar.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/search-bar.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/spacer.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/toaster.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/README.md delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/button.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/checkbox.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/dropdown-menu.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/icon.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/input-otp.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/input.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/label.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/sonner.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/status-button.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/textarea.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/ui/tooltip.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/components/user-dropdown.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/entry.client.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/entry.server.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/$.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/auth.$provider.callback.test.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/auth.$provider.callback.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/auth_.$provider.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/forgot-password.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/login.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/login.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/logout.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/onboarding.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/onboarding.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/onboarding_.$provider.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/onboarding_.$provider.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/reset-password.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/reset-password.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/signup.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/verify.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/verify.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/webauthn+/authentication.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/webauthn+/registration.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_auth+/webauthn+/utils.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/about.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/docker.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/eslint.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/faker.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/fly.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/github.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/logos.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/msw.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/playwright.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/prettier.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/prisma.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/radix.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/react-email.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/remix.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/resend.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/sentry.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/shadcn-ui.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/sqlite.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/stars.jpg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/tailwind.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/testing-library.png delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/typescript.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/vitest.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/logos/zod.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/privacy.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/support.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_marketing+/tos.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_seo+/robots[.]txt.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/_seo+/sitemap[.]xml.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/admin+/cache.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/admin+/cache_.lru.$cacheKey.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/admin+/cache_.sqlite.$cacheKey.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/admin+/cache_.sqlite.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/admin+/cache_.sqlite.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/me.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/resources+/download-user-data.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/resources+/healthcheck.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/resources+/images.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/resources+/theme-switch.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.change-email.server.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.change-email.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.connections.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.index.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.passkeys.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.password.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.password_.create.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.photo.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.two-factor.disable.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.two-factor.index.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.two-factor.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/settings+/profile.two-factor.verify.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/users+/$username.test.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/users+/$username.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/users+/$username_+/__note-editor.server.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/users+/$username_+/__note-editor.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/users+/$username_+/notes.$noteId.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/users+/$username_+/notes.$noteId_.edit.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/users+/$username_+/notes.index.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/users+/$username_+/notes.new.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/routes/users+/index.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/styles/tailwind.css delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/auth.server.test.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/auth.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/cache.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/client-hints.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/connections.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/connections.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/db.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/email.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/headers.server.test.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/headers.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/honeypot.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/litefs.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/misc.error-message.test.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/misc.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/misc.use-double-check.test.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/monitoring.client.tsx delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/nonce-provider.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/permissions.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/providers/constants.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/providers/github.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/providers/provider.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/redirect-cookie.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/request-info.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/session.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/storage.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/theme.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/timing.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/toast.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/totp.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/user-validation.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/user.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/app/utils/verification.server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/components.json delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/eslint.config.js delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/fly.toml delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/index.js delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/Dockerfile delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/Dockerfile.dockerignore delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/README.md delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/build-server.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/litefs.yml delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/sly/sly.json delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/sly/transform-icon.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/README.md delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/arrow-left.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/arrow-right.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/avatar.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/camera.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/check.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/clock.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/cross-1.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/dots-horizontal.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/download.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/envelope-closed.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/exit.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/file-text.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/github-logo.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/laptop.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/link-2.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/lock-closed.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/lock-open-1.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/magnifying-glass.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/moon.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/passkey.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/pencil-1.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/pencil-2.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/plus.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/question-mark-circled.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/reset.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/sun.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/trash.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/other/svg-icons/update.svg delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/package-lock.json delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/playwright.config.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/prisma/migrations/20250221233640_init/migration.sql delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/prisma/migrations/migration_lock.toml delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/prisma/schema.prisma delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/prisma/seed.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/prisma/sql/searchUsers.sql delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/public/favicon.ico delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/public/favicons/README.md delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/public/favicons/android-chrome-192x192.png delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/public/favicons/android-chrome-512x512.png delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/public/img/user.png delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/public/site.webmanifest delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/react-router.config.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/server/dev-server.js delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/server/index.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/server/utils/monitoring.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/tests/db-utils.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/tests/setup/custom-matchers.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/tests/setup/db-setup.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/tests/setup/global-setup.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/tests/setup/setup-test-env.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/tests/utils.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/tsconfig.json delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/types/deps.d.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/types/env.env.d.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/types/icon-name.d.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/types/reset.d.ts delete mode 100644 exercises/04.debugging/02.problem.trace-viewer/vite.config.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/.github/workflows/deploy.yml delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/.gitignore delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/.npmrc delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/.prettierignore delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/.vscode/extensions.json delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/.vscode/remix.code-snippets delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/.vscode/settings.json delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/assets/favicons/apple-touch-icon.png delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/assets/favicons/favicon.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/error-boundary.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/floating-toolbar.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/forms.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/progress-bar.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/search-bar.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/spacer.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/toaster.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/README.md delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/button.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/checkbox.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/dropdown-menu.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/icon.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/input-otp.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/input.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/label.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/sonner.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/status-button.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/textarea.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/ui/tooltip.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/components/user-dropdown.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/entry.client.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/entry.server.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/$.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/auth.$provider.callback.test.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/auth.$provider.callback.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/auth_.$provider.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/forgot-password.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/login.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/login.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/logout.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/onboarding.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/onboarding.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/onboarding_.$provider.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/onboarding_.$provider.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/reset-password.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/reset-password.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/signup.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/verify.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/verify.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/webauthn+/authentication.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/webauthn+/registration.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_auth+/webauthn+/utils.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/about.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/docker.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/eslint.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/faker.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/fly.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/github.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/logos.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/msw.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/playwright.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/prettier.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/prisma.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/radix.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/react-email.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/remix.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/resend.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/sentry.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/shadcn-ui.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/sqlite.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/stars.jpg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/tailwind.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/testing-library.png delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/typescript.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/vitest.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/logos/zod.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/privacy.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/support.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_marketing+/tos.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_seo+/robots[.]txt.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/_seo+/sitemap[.]xml.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/admin+/cache.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/admin+/cache_.lru.$cacheKey.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/admin+/cache_.sqlite.$cacheKey.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/admin+/cache_.sqlite.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/admin+/cache_.sqlite.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/me.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/resources+/download-user-data.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/resources+/healthcheck.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/resources+/images.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/resources+/theme-switch.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.change-email.server.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.change-email.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.connections.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.index.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.passkeys.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.password.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.password_.create.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.photo.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.two-factor.disable.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.two-factor.index.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.two-factor.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/settings+/profile.two-factor.verify.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/users+/$username.test.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/users+/$username.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/users+/$username_+/__note-editor.server.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/users+/$username_+/__note-editor.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/users+/$username_+/notes.$noteId.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/users+/$username_+/notes.$noteId_.edit.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/users+/$username_+/notes.index.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/users+/$username_+/notes.new.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/routes/users+/index.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/styles/tailwind.css delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/auth.server.test.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/auth.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/cache.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/client-hints.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/connections.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/connections.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/db.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/email.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/headers.server.test.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/headers.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/honeypot.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/litefs.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/misc.error-message.test.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/misc.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/misc.use-double-check.test.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/monitoring.client.tsx delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/nonce-provider.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/permissions.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/providers/constants.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/providers/github.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/providers/provider.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/redirect-cookie.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/request-info.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/session.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/storage.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/theme.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/timing.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/toast.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/totp.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/user-validation.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/user.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/app/utils/verification.server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/components.json delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/eslint.config.js delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/fly.toml delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/index.js delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/Dockerfile delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/Dockerfile.dockerignore delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/README.md delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/build-server.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/litefs.yml delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/sly/sly.json delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/sly/transform-icon.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/README.md delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/arrow-left.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/arrow-right.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/avatar.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/camera.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/check.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/clock.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/cross-1.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/dots-horizontal.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/download.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/envelope-closed.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/exit.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/file-text.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/github-logo.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/laptop.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/link-2.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/lock-closed.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/lock-open-1.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/magnifying-glass.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/moon.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/passkey.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/pencil-1.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/pencil-2.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/plus.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/question-mark-circled.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/reset.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/sun.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/trash.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/other/svg-icons/update.svg delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/package-lock.json delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/playwright.config.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/prisma/migrations/20250221233640_init/migration.sql delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/prisma/migrations/migration_lock.toml delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/prisma/schema.prisma delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/prisma/seed.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/prisma/sql/searchUsers.sql delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/public/favicon.ico delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/public/favicons/README.md delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/public/favicons/android-chrome-192x192.png delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/public/favicons/android-chrome-512x512.png delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/public/img/user.png delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/public/site.webmanifest delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/react-router.config.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/server/dev-server.js delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/server/index.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/server/utils/monitoring.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/tests/db-utils.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/tests/setup/custom-matchers.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/tests/setup/db-setup.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/tests/setup/global-setup.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/tests/setup/setup-test-env.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/tests/utils.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/tsconfig.json delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/types/deps.d.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/types/env.env.d.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/types/icon-name.d.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/types/reset.d.ts delete mode 100644 exercises/04.debugging/02.solution.trace-viewer/vite.config.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/.env delete mode 100644 exercises/04.debugging/03.problem.live-debugging/.env.example delete mode 100644 exercises/04.debugging/03.problem.live-debugging/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 exercises/04.debugging/03.problem.live-debugging/.github/workflows/deploy.yml delete mode 100644 exercises/04.debugging/03.problem.live-debugging/.gitignore delete mode 100644 exercises/04.debugging/03.problem.live-debugging/.npmrc delete mode 100644 exercises/04.debugging/03.problem.live-debugging/.prettierignore delete mode 100644 exercises/04.debugging/03.problem.live-debugging/.vscode/extensions.json delete mode 100644 exercises/04.debugging/03.problem.live-debugging/.vscode/remix.code-snippets delete mode 100644 exercises/04.debugging/03.problem.live-debugging/.vscode/settings.json delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/assets/favicons/apple-touch-icon.png delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/assets/favicons/favicon.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/error-boundary.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/floating-toolbar.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/forms.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/progress-bar.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/search-bar.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/spacer.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/toaster.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/README.md delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/button.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/checkbox.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/dropdown-menu.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/icon.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/input-otp.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/input.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/label.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/sonner.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/status-button.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/textarea.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/ui/tooltip.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/components/user-dropdown.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/entry.client.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/entry.server.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/root.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/$.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/auth.$provider.callback.test.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/auth.$provider.callback.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/auth_.$provider.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/forgot-password.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/login.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/login.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/logout.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/onboarding.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/onboarding.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/onboarding_.$provider.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/onboarding_.$provider.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/reset-password.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/reset-password.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/signup.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/verify.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/verify.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/webauthn+/authentication.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/webauthn+/registration.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_auth+/webauthn+/utils.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/about.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/index.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/docker.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/eslint.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/faker.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/fly.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/github.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/logos.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/msw.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/playwright.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/prettier.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/prisma.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/radix.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/react-email.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/remix.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/resend.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/sentry.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/shadcn-ui.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/sqlite.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/stars.jpg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/tailwind.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/testing-library.png delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/typescript.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/vitest.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/logos/zod.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/privacy.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/support.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_marketing+/tos.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_seo+/robots[.]txt.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/_seo+/sitemap[.]xml.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/admin+/cache.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/admin+/cache_.lru.$cacheKey.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/admin+/cache_.sqlite.$cacheKey.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/admin+/cache_.sqlite.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/admin+/cache_.sqlite.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/me.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/resources+/download-user-data.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/resources+/healthcheck.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/resources+/images.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/resources+/theme-switch.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.change-email.server.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.change-email.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.connections.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.index.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.passkeys.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.password.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.password_.create.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.photo.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.two-factor.disable.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.two-factor.index.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.two-factor.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/settings+/profile.two-factor.verify.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/users+/$username.test.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/users+/$username.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/users+/$username_+/__note-editor.server.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/users+/$username_+/__note-editor.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/users+/$username_+/notes.$noteId.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/users+/$username_+/notes.$noteId_.edit.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/users+/$username_+/notes.index.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/users+/$username_+/notes.new.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/users+/$username_+/notes.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/routes/users+/index.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/styles/tailwind.css delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/auth.server.test.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/auth.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/cache.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/client-hints.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/connections.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/connections.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/db.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/email.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/env.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/headers.server.test.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/headers.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/honeypot.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/litefs.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/misc.error-message.test.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/misc.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/misc.use-double-check.test.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/monitoring.client.tsx delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/nonce-provider.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/permissions.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/providers/constants.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/providers/github.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/providers/provider.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/redirect-cookie.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/request-info.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/session.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/storage.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/theme.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/timing.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/toast.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/totp.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/user-validation.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/user.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/app/utils/verification.server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/components.json delete mode 100644 exercises/04.debugging/03.problem.live-debugging/eslint.config.js delete mode 100644 exercises/04.debugging/03.problem.live-debugging/fly.toml delete mode 100644 exercises/04.debugging/03.problem.live-debugging/index.js delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/Dockerfile delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/Dockerfile.dockerignore delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/README.md delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/build-server.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/litefs.yml delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/sly/sly.json delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/sly/transform-icon.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/README.md delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/arrow-left.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/arrow-right.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/avatar.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/camera.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/check.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/clock.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/cross-1.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/dots-horizontal.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/download.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/envelope-closed.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/exit.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/file-text.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/github-logo.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/laptop.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/link-2.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/lock-closed.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/lock-open-1.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/magnifying-glass.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/moon.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/passkey.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/pencil-1.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/pencil-2.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/plus.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/question-mark-circled.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/reset.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/sun.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/trash.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/other/svg-icons/update.svg delete mode 100644 exercises/04.debugging/03.problem.live-debugging/package-lock.json delete mode 100644 exercises/04.debugging/03.problem.live-debugging/playwright.config.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/prisma/migrations/20250221233640_init/migration.sql delete mode 100644 exercises/04.debugging/03.problem.live-debugging/prisma/migrations/migration_lock.toml delete mode 100644 exercises/04.debugging/03.problem.live-debugging/prisma/schema.prisma delete mode 100644 exercises/04.debugging/03.problem.live-debugging/prisma/seed.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/prisma/sql/searchUsers.sql delete mode 100644 exercises/04.debugging/03.problem.live-debugging/public/favicon.ico delete mode 100644 exercises/04.debugging/03.problem.live-debugging/public/favicons/README.md delete mode 100644 exercises/04.debugging/03.problem.live-debugging/public/favicons/android-chrome-192x192.png delete mode 100644 exercises/04.debugging/03.problem.live-debugging/public/favicons/android-chrome-512x512.png delete mode 100644 exercises/04.debugging/03.problem.live-debugging/public/img/user.png delete mode 100644 exercises/04.debugging/03.problem.live-debugging/public/site.webmanifest delete mode 100644 exercises/04.debugging/03.problem.live-debugging/react-router.config.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/server/dev-server.js delete mode 100644 exercises/04.debugging/03.problem.live-debugging/server/index.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/server/utils/monitoring.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/tests/db-utils.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/tests/setup/custom-matchers.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/tests/setup/db-setup.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/tests/setup/global-setup.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/tests/setup/setup-test-env.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/tests/utils.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/tsconfig.json delete mode 100644 exercises/04.debugging/03.problem.live-debugging/types/deps.d.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/types/env.env.d.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/types/icon-name.d.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/types/reset.d.ts delete mode 100644 exercises/04.debugging/03.problem.live-debugging/vite.config.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/.env delete mode 100644 exercises/04.debugging/03.solution.live-debugging/.env.example delete mode 100644 exercises/04.debugging/03.solution.live-debugging/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 exercises/04.debugging/03.solution.live-debugging/.github/workflows/deploy.yml delete mode 100644 exercises/04.debugging/03.solution.live-debugging/.gitignore delete mode 100644 exercises/04.debugging/03.solution.live-debugging/.npmrc delete mode 100644 exercises/04.debugging/03.solution.live-debugging/.prettierignore delete mode 100644 exercises/04.debugging/03.solution.live-debugging/.vscode/extensions.json delete mode 100644 exercises/04.debugging/03.solution.live-debugging/.vscode/remix.code-snippets delete mode 100644 exercises/04.debugging/03.solution.live-debugging/.vscode/settings.json delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/assets/favicons/apple-touch-icon.png delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/assets/favicons/favicon.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/error-boundary.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/floating-toolbar.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/forms.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/progress-bar.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/search-bar.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/spacer.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/toaster.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/README.md delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/button.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/checkbox.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/dropdown-menu.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/icon.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/input-otp.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/input.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/label.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/sonner.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/status-button.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/textarea.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/ui/tooltip.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/components/user-dropdown.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/entry.client.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/entry.server.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/root.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/$.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/auth.$provider.callback.test.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/auth.$provider.callback.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/auth_.$provider.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/forgot-password.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/login.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/login.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/logout.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/onboarding.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/onboarding.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/onboarding_.$provider.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/onboarding_.$provider.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/reset-password.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/reset-password.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/signup.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/verify.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/verify.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/webauthn+/authentication.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/webauthn+/registration.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_auth+/webauthn+/utils.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/about.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/index.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/docker.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/eslint.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/faker.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/fly.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/github.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/logos.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/msw.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/playwright.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/prettier.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/prisma.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/radix.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/react-email.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/remix.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/resend.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/sentry.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/shadcn-ui.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/sqlite.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/stars.jpg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/tailwind.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/testing-library.png delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/typescript.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/vitest.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/logos/zod.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/privacy.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/support.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_marketing+/tos.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_seo+/robots[.]txt.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/_seo+/sitemap[.]xml.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/admin+/cache.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/admin+/cache_.lru.$cacheKey.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/admin+/cache_.sqlite.$cacheKey.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/admin+/cache_.sqlite.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/admin+/cache_.sqlite.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/me.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/resources+/download-user-data.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/resources+/healthcheck.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/resources+/images.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/resources+/theme-switch.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.change-email.server.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.change-email.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.connections.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.index.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.passkeys.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.password.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.password_.create.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.photo.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.two-factor.disable.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.two-factor.index.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.two-factor.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/settings+/profile.two-factor.verify.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/users+/$username.test.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/users+/$username.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/users+/$username_+/__note-editor.server.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/users+/$username_+/__note-editor.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/users+/$username_+/notes.$noteId.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/users+/$username_+/notes.$noteId_.edit.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/users+/$username_+/notes.index.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/users+/$username_+/notes.new.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/users+/$username_+/notes.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/routes/users+/index.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/styles/tailwind.css delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/auth.server.test.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/auth.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/cache.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/client-hints.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/connections.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/connections.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/db.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/email.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/env.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/headers.server.test.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/headers.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/honeypot.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/litefs.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/misc.error-message.test.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/misc.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/misc.use-double-check.test.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/monitoring.client.tsx delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/nonce-provider.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/permissions.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/providers/constants.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/providers/github.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/providers/provider.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/redirect-cookie.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/request-info.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/session.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/storage.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/theme.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/timing.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/toast.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/totp.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/user-validation.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/user.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/app/utils/verification.server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/components.json delete mode 100644 exercises/04.debugging/03.solution.live-debugging/eslint.config.js delete mode 100644 exercises/04.debugging/03.solution.live-debugging/fly.toml delete mode 100644 exercises/04.debugging/03.solution.live-debugging/index.js delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/Dockerfile delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/Dockerfile.dockerignore delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/README.md delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/build-server.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/litefs.yml delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/sly/sly.json delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/sly/transform-icon.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/README.md delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/arrow-left.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/arrow-right.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/avatar.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/camera.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/check.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/clock.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/cross-1.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/dots-horizontal.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/download.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/envelope-closed.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/exit.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/file-text.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/github-logo.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/laptop.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/link-2.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/lock-closed.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/lock-open-1.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/magnifying-glass.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/moon.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/passkey.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/pencil-1.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/pencil-2.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/plus.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/question-mark-circled.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/reset.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/sun.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/trash.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/other/svg-icons/update.svg delete mode 100644 exercises/04.debugging/03.solution.live-debugging/package-lock.json delete mode 100644 exercises/04.debugging/03.solution.live-debugging/playwright.config.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/prisma/migrations/20250221233640_init/migration.sql delete mode 100644 exercises/04.debugging/03.solution.live-debugging/prisma/migrations/migration_lock.toml delete mode 100644 exercises/04.debugging/03.solution.live-debugging/prisma/schema.prisma delete mode 100644 exercises/04.debugging/03.solution.live-debugging/prisma/seed.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/prisma/sql/searchUsers.sql delete mode 100644 exercises/04.debugging/03.solution.live-debugging/public/favicon.ico delete mode 100644 exercises/04.debugging/03.solution.live-debugging/public/favicons/README.md delete mode 100644 exercises/04.debugging/03.solution.live-debugging/public/favicons/android-chrome-192x192.png delete mode 100644 exercises/04.debugging/03.solution.live-debugging/public/favicons/android-chrome-512x512.png delete mode 100644 exercises/04.debugging/03.solution.live-debugging/public/img/user.png delete mode 100644 exercises/04.debugging/03.solution.live-debugging/public/site.webmanifest delete mode 100644 exercises/04.debugging/03.solution.live-debugging/react-router.config.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/server/dev-server.js delete mode 100644 exercises/04.debugging/03.solution.live-debugging/server/index.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/server/utils/monitoring.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/tests/db-utils.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/tests/setup/custom-matchers.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/tests/setup/db-setup.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/tests/setup/global-setup.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/tests/setup/setup-test-env.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/tests/test-extend.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/tests/utils.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/tsconfig.json delete mode 100644 exercises/04.debugging/03.solution.live-debugging/types/deps.d.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/types/env.env.d.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/types/icon-name.d.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/types/reset.d.ts delete mode 100644 exercises/04.debugging/03.solution.live-debugging/vite.config.ts rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/.env (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/.env.example (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/.github/workflows/deploy.yml (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/.gitignore (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/.npmrc (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/.prettierignore (100%) rename exercises/{03.guides => 04.guides}/01.problem.recording-interactions/.vscode/extensions.json (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/.vscode/remix.code-snippets (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/.vscode/settings.json (100%) rename exercises/{03.guides => 04.guides}/01.problem.recording-interactions/README.mdx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/assets/favicons/favicon.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/error-boundary.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/floating-toolbar.tsx (100%) rename exercises/{03.guides => 04.guides}/01.problem.recording-interactions/app/components/forms.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/progress-bar.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/search-bar.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/spacer.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/toaster.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/README.md (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/button.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/checkbox.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/icon.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/input-otp.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/input.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/label.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/sonner.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/status-button.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/textarea.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/ui/tooltip.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/components/user-dropdown.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/entry.client.tsx (100%) rename exercises/{03.guides => 04.guides}/01.problem.recording-interactions/app/entry.server.tsx (100%) rename exercises/{03.guides => 04.guides}/01.problem.recording-interactions/app/root.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/$.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/login.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/login.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/logout.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/signup.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/verify.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/about.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/index.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/support.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/admin+/cache.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/me.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/resources+/images.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{03.guides => 04.guides}/01.problem.recording-interactions/app/routes/settings+/profile.index.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/users+/$username.test.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/users+/$username.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{03.guides => 04.guides}/01.problem.recording-interactions/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/01.problem.recording-interactions}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/routes/users+/index.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/styles/tailwind.css (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/auth.server.test.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/auth.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/cache.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/client-hints.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/connections.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/connections.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/db.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/email.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/env.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/headers.server.test.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/headers.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/honeypot.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/litefs.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/misc.error-message.test.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/misc.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/monitoring.client.tsx (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/nonce-provider.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/permissions.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/providers/constants.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/providers/github.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/providers/provider.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/request-info.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/session.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/storage.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/theme.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/timing.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/toast.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/totp.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/user-validation.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/user.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/app/utils/verification.server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/components.json (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/eslint.config.js (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/fly.toml (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/index.js (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/Dockerfile (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/Dockerfile.dockerignore (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/README.md (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/build-server.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/litefs.yml (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/sly/sly.json (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/sly/transform-icon.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/README.md (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/arrow-left.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/arrow-right.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/avatar.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/camera.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/check.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/clock.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/cross-1.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/download.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/exit.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/file-text.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/github-logo.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/laptop.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/link-2.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/lock-closed.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/moon.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/passkey.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/pencil-1.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/pencil-2.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/plus.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/reset.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/sun.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/trash.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/other/svg-icons/update.svg (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/package-lock.json (100%) rename exercises/{03.guides => 04.guides}/01.problem.recording-interactions/package.json (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/playwright.config.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/prisma/migrations/migration_lock.toml (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/prisma/schema.prisma (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/prisma/seed.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/prisma/sql/searchUsers.sql (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/public/favicon.ico (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/public/favicons/README.md (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/public/img/user.png (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/public/site.webmanifest (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/react-router.config.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/server/dev-server.js (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/server/index.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/server/utils/monitoring.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/tests/db-utils.ts (100%) rename exercises/{03.guides => 04.guides}/01.problem.recording-interactions/tests/e2e/profile-edit.test.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/tests/setup/custom-matchers.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/tests/setup/db-setup.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/tests/setup/global-setup.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/tests/setup/setup-test-env.ts (100%) rename exercises/{03.guides => 04.guides}/01.problem.recording-interactions/tests/test-extend.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/tests/utils.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/tsconfig.json (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/types/deps.d.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/types/env.env.d.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/types/icon-name.d.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/types/reset.d.ts (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/01.problem.recording-interactions}/vite.config.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/.env (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/.env.example (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/.github/workflows/deploy.yml (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/.gitignore (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/.npmrc (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/.prettierignore (100%) rename exercises/{03.guides => 04.guides}/01.solution.recording-interactions/.vscode/extensions.json (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/.vscode/remix.code-snippets (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/.vscode/settings.json (100%) rename exercises/{03.guides => 04.guides}/01.solution.recording-interactions/README.mdx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/assets/favicons/favicon.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/error-boundary.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/floating-toolbar.tsx (100%) rename exercises/{03.guides => 04.guides}/01.solution.recording-interactions/app/components/forms.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/progress-bar.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/search-bar.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/spacer.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/toaster.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/README.md (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/button.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/checkbox.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/icon.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/input-otp.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/input.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/label.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/sonner.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/status-button.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/textarea.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/ui/tooltip.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/components/user-dropdown.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/entry.client.tsx (100%) rename exercises/{03.guides => 04.guides}/01.solution.recording-interactions/app/entry.server.tsx (100%) rename exercises/{03.guides => 04.guides}/01.solution.recording-interactions/app/root.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/$.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/login.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/login.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/logout.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/signup.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/verify.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/about.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/index.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/support.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/admin+/cache.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/me.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/resources+/images.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{03.guides => 04.guides}/01.solution.recording-interactions/app/routes/settings+/profile.index.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/users+/$username.test.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/users+/$username.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{03.guides => 04.guides}/01.solution.recording-interactions/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/01.solution.recording-interactions}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/routes/users+/index.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/styles/tailwind.css (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/auth.server.test.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/auth.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/cache.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/client-hints.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/connections.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/connections.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/db.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/email.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/env.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/headers.server.test.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/headers.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/honeypot.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/litefs.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/misc.error-message.test.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/misc.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/monitoring.client.tsx (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/nonce-provider.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/permissions.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/providers/constants.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/providers/github.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/providers/provider.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/request-info.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/session.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/storage.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/theme.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/timing.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/toast.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/totp.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/user-validation.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/user.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/app/utils/verification.server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/components.json (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/eslint.config.js (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/fly.toml (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/index.js (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/Dockerfile (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/Dockerfile.dockerignore (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/README.md (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/build-server.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/litefs.yml (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/sly/sly.json (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/sly/transform-icon.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/README.md (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/arrow-left.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/arrow-right.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/avatar.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/camera.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/check.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/clock.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/cross-1.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/download.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/exit.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/file-text.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/github-logo.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/laptop.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/link-2.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/lock-closed.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/moon.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/passkey.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/pencil-1.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/pencil-2.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/plus.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/reset.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/sun.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/trash.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/other/svg-icons/update.svg (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/package-lock.json (100%) rename exercises/{03.guides => 04.guides}/01.solution.recording-interactions/package.json (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/playwright.config.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/prisma/migrations/migration_lock.toml (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/prisma/schema.prisma (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/prisma/seed.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/prisma/sql/searchUsers.sql (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/public/favicon.ico (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/public/favicons/README.md (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/public/img/user.png (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/public/site.webmanifest (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/react-router.config.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/server/dev-server.js (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/server/index.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/server/utils/monitoring.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/tests/db-utils.ts (100%) rename exercises/{03.guides => 04.guides}/01.solution.recording-interactions/tests/e2e/profile-edit.test.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/tests/setup/custom-matchers.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/tests/setup/db-setup.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/tests/setup/global-setup.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/tests/setup/setup-test-env.ts (100%) rename exercises/{03.guides => 04.guides}/01.solution.recording-interactions/tests/test-extend.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/tests/utils.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/tsconfig.json (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/types/deps.d.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/types/env.env.d.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/types/icon-name.d.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/types/reset.d.ts (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/01.solution.recording-interactions}/vite.config.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/.env (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/.env.example (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/.github/workflows/deploy.yml (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/.gitignore (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/.npmrc (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/.prettierignore (100%) rename exercises/{02.test-setup/05.problem.test-data => 04.guides/02.problem.api-mocking}/.vscode/extensions.json (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/.vscode/remix.code-snippets (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/.vscode/settings.json (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/README.mdx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/assets/favicons/favicon.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/error-boundary.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/floating-toolbar.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/app/components/forms.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/progress-bar.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/search-bar.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/spacer.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/toaster.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/README.md (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/button.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/checkbox.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/app/components/ui/combobox.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/app/components/ui/command.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/app/components/ui/dialog.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/icon.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/input-otp.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/input.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/label.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/app/components/ui/popover.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/sonner.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/status-button.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/textarea.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/ui/tooltip.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/components/user-dropdown.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/entry.client.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/app/entry.server.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/app/root.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/$.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/login.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/login.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/logout.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/signup.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/verify.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/about.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/index.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/support.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/admin+/cache.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/me.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/resources+/images.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/users+/$username.test.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/users+/$username.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/routes/users+/index.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/styles/tailwind.css (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/auth.server.test.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/auth.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/cache.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/client-hints.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/connections.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/connections.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/db.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/email.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/env.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/headers.server.test.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/headers.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/honeypot.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/litefs.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/misc.error-message.test.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/misc.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/monitoring.client.tsx (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/nonce-provider.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/permissions.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/providers/constants.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/providers/github.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/providers/provider.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/request-info.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/session.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/storage.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/theme.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/timing.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/toast.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/totp.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/user-validation.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/user.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/app/utils/verification.server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/components.json (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/eslint.config.js (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/fly.toml (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/index.js (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/Dockerfile (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/Dockerfile.dockerignore (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/README.md (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/build-server.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/litefs.yml (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/sly/sly.json (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/sly/transform-icon.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/README.md (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/arrow-left.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/arrow-right.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/avatar.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/camera.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/check.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/clock.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/cross-1.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/download.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/exit.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/file-text.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/github-logo.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/laptop.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/link-2.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/lock-closed.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/moon.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/passkey.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/pencil-1.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/pencil-2.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/plus.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/reset.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/sun.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/trash.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/other/svg-icons/update.svg (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/package-lock.json (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/package.json (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/playwright.config.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/prisma/migrations/migration_lock.toml (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/prisma/schema.prisma (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/prisma/seed.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/prisma/sql/searchUsers.sql (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/public/favicon.ico (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/public/favicons/README.md (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/public/img/user.png (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/public/mockServiceWorker.js (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/public/site.webmanifest (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/react-router.config.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/server/dev-server.js (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/server/index.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/server/utils/monitoring.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/tests/db-utils.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/tests/e2e/notes-create.test.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/tests/setup/custom-matchers.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/tests/setup/db-setup.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/tests/setup/global-setup.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/tests/setup/setup-test-env.ts (100%) rename exercises/{02.test-setup/04.problem.api-mocking => 04.guides/02.problem.api-mocking}/tests/test-extend.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/tests/utils.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/tsconfig.json (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/types/deps.d.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/types/env.env.d.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/types/icon-name.d.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/types/reset.d.ts (100%) rename exercises/{03.guides/01.problem.recording-interactions => 04.guides/02.problem.api-mocking}/vite.config.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/.env (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/.env.example (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/.github/workflows/deploy.yml (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/.gitignore (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/.npmrc (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/.prettierignore (100%) rename exercises/{02.test-setup/05.solution.test-data => 04.guides/02.solution.api-mocking}/.vscode/extensions.json (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/.vscode/remix.code-snippets (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/.vscode/settings.json (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/README.mdx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/assets/favicons/favicon.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/error-boundary.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/floating-toolbar.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/app/components/forms.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/progress-bar.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/search-bar.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/spacer.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/toaster.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/README.md (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/button.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/checkbox.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/app/components/ui/command.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/app/components/ui/dialog.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/icon.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/input-otp.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/input.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/label.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/app/components/ui/popover.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/sonner.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/status-button.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/textarea.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/ui/tooltip.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/components/user-dropdown.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/entry.client.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/app/entry.server.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/app/root.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/$.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/login.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/login.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/logout.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/signup.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/verify.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/about.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/index.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/support.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/admin+/cache.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/me.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/resources+/images.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/users+/$username.test.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/users+/$username.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/routes/users+/index.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/styles/tailwind.css (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/auth.server.test.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/auth.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/cache.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/client-hints.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/connections.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/connections.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/db.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/email.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/env.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/headers.server.test.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/headers.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/honeypot.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/litefs.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/misc.error-message.test.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/misc.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/monitoring.client.tsx (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/nonce-provider.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/permissions.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/providers/constants.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/providers/github.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/providers/provider.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/request-info.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/session.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/storage.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/theme.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/timing.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/toast.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/totp.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/user-validation.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/user.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/app/utils/verification.server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/components.json (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/eslint.config.js (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/fly.toml (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/index.js (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/Dockerfile (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/Dockerfile.dockerignore (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/README.md (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/build-server.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/litefs.yml (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/sly/sly.json (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/sly/transform-icon.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/README.md (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/arrow-left.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/arrow-right.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/avatar.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/camera.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/check.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/clock.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/cross-1.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/download.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/exit.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/file-text.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/github-logo.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/laptop.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/link-2.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/lock-closed.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/moon.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/passkey.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/pencil-1.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/pencil-2.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/plus.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/reset.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/sun.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/trash.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/other/svg-icons/update.svg (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/package-lock.json (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/package.json (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/playwright.config.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/prisma/migrations/migration_lock.toml (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/prisma/schema.prisma (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/prisma/seed.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/prisma/sql/searchUsers.sql (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/public/favicon.ico (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/public/favicons/README.md (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/public/img/user.png (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/public/site.webmanifest (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/react-router.config.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/server/dev-server.js (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/server/index.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/server/utils/monitoring.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/tests/db-utils.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/tests/e2e/notes-create.test.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/tests/setup/custom-matchers.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/tests/setup/db-setup.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/tests/setup/global-setup.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/tests/setup/setup-test-env.ts (100%) rename exercises/{02.test-setup/04.solution.api-mocking => 04.guides/02.solution.api-mocking}/tests/test-extend.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/tests/utils.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/tsconfig.json (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/types/deps.d.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/types/env.env.d.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/types/icon-name.d.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/types/reset.d.ts (100%) rename exercises/{03.guides/01.solution.recording-interactions => 04.guides/02.solution.api-mocking}/vite.config.ts (100%) rename exercises/{03.guides => 04.guides}/FINISHED.mdx (100%) rename exercises/{03.guides => 04.guides}/README.mdx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/.env (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/.env.example (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/.github/workflows/deploy.yml (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/.gitignore (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/.npmrc (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/.prettierignore (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/.vscode/extensions.json (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/.vscode/remix.code-snippets (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/.vscode/settings.json (100%) rename exercises/{04.debugging => 05.debugging}/01.problem.ui-mode/README.mdx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/assets/favicons/favicon.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/error-boundary.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/floating-toolbar.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/forms.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/progress-bar.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/search-bar.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/spacer.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/toaster.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/README.md (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/button.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/checkbox.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/icon.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/input-otp.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/input.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/label.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/sonner.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/status-button.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/textarea.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/ui/tooltip.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/components/user-dropdown.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/entry.client.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/entry.server.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/01.problem.ui-mode}/app/root.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/$.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/login.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/login.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/logout.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/signup.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/verify.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/about.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/index.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/support.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/admin+/cache.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/me.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/resources+/images.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/users+/$username.test.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/users+/$username.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{04.debugging => 05.debugging}/01.problem.ui-mode/app/routes/users+/index.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/styles/tailwind.css (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/auth.server.test.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/auth.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/cache.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/client-hints.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/connections.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/connections.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/db.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/email.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/env.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/headers.server.test.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/headers.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/honeypot.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/litefs.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/misc.error-message.test.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/misc.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/monitoring.client.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/nonce-provider.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/permissions.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/providers/constants.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/providers/github.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/providers/provider.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/request-info.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/session.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/storage.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/theme.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/timing.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/toast.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/totp.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/user-validation.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/user.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/app/utils/verification.server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/components.json (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/eslint.config.js (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/fly.toml (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/index.js (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/Dockerfile (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/Dockerfile.dockerignore (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/README.md (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/build-server.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/litefs.yml (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/sly/sly.json (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/sly/transform-icon.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/README.md (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/arrow-left.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/arrow-right.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/avatar.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/camera.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/check.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/clock.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/cross-1.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/download.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/exit.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/file-text.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/github-logo.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/laptop.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/link-2.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/lock-closed.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/moon.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/passkey.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/pencil-1.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/pencil-2.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/plus.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/reset.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/sun.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/trash.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/other/svg-icons/update.svg (100%) rename exercises/{04.debugging => 05.debugging}/01.problem.ui-mode/package.json (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/playwright.config.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/prisma/migrations/migration_lock.toml (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/prisma/schema.prisma (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/prisma/seed.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/prisma/sql/searchUsers.sql (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/public/favicon.ico (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/public/favicons/README.md (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/public/img/user.png (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/public/site.webmanifest (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/react-router.config.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/server/dev-server.js (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/server/index.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/server/utils/monitoring.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/tests/db-utils.ts (100%) rename exercises/{04.debugging => 05.debugging}/01.problem.ui-mode/tests/e2e/notes-search.test.ts (100%) rename exercises/{04.debugging => 05.debugging}/01.problem.ui-mode/tests/e2e/utils.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/tests/setup/custom-matchers.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/tests/setup/db-setup.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/tests/setup/global-setup.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/tests/setup/setup-test-env.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/01.problem.ui-mode}/tests/test-extend.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/tests/utils.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/tsconfig.json (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/types/deps.d.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/types/env.env.d.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/types/icon-name.d.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/types/reset.d.ts (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/01.problem.ui-mode}/vite.config.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/.env (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/.env.example (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/.github/workflows/deploy.yml (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/.gitignore (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/.npmrc (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/.prettierignore (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/.vscode/extensions.json (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/.vscode/remix.code-snippets (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/.vscode/settings.json (100%) rename exercises/{04.debugging => 05.debugging}/01.solution.ui-mode/README.mdx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/assets/favicons/favicon.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/error-boundary.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/floating-toolbar.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/forms.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/progress-bar.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/search-bar.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/spacer.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/toaster.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/README.md (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/button.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/checkbox.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/icon.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/input-otp.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/input.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/label.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/sonner.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/status-button.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/textarea.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/ui/tooltip.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/components/user-dropdown.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/entry.client.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/entry.server.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/01.solution.ui-mode}/app/root.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/$.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/login.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/login.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/logout.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/signup.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/verify.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/about.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/index.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/support.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/admin+/cache.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/me.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/resources+/images.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/users+/$username.test.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/users+/$username.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{04.debugging => 05.debugging}/01.solution.ui-mode/app/routes/users+/index.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/styles/tailwind.css (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/auth.server.test.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/auth.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/cache.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/client-hints.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/connections.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/connections.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/db.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/email.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/env.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/headers.server.test.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/headers.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/honeypot.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/litefs.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/misc.error-message.test.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/misc.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/monitoring.client.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/nonce-provider.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/permissions.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/providers/constants.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/providers/github.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/providers/provider.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/request-info.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/session.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/storage.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/theme.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/timing.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/toast.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/totp.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/user-validation.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/user.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/app/utils/verification.server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/components.json (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/eslint.config.js (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/fly.toml (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/index.js (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/Dockerfile (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/Dockerfile.dockerignore (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/README.md (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/build-server.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/litefs.yml (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/sly/sly.json (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/sly/transform-icon.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/README.md (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/arrow-left.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/arrow-right.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/avatar.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/camera.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/check.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/clock.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/cross-1.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/download.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/exit.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/file-text.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/github-logo.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/laptop.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/link-2.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/lock-closed.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/moon.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/passkey.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/pencil-1.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/pencil-2.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/plus.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/reset.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/sun.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/trash.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/other/svg-icons/update.svg (100%) rename exercises/{04.debugging => 05.debugging}/01.solution.ui-mode/package.json (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/playwright.config.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/prisma/migrations/migration_lock.toml (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/prisma/schema.prisma (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/prisma/seed.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/prisma/sql/searchUsers.sql (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/public/favicon.ico (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/public/favicons/README.md (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/public/img/user.png (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/public/site.webmanifest (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/react-router.config.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/server/dev-server.js (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/server/index.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/server/utils/monitoring.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/tests/db-utils.ts (100%) rename exercises/{04.debugging => 05.debugging}/01.solution.ui-mode/tests/e2e/notes-search.test.ts (100%) rename exercises/{04.debugging => 05.debugging}/01.solution.ui-mode/tests/e2e/utils.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/tests/setup/custom-matchers.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/tests/setup/db-setup.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/tests/setup/global-setup.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/tests/setup/setup-test-env.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/01.solution.ui-mode}/tests/test-extend.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/tests/utils.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/tsconfig.json (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/types/deps.d.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/types/env.env.d.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/types/icon-name.d.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/types/reset.d.ts (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/01.solution.ui-mode}/vite.config.ts (100%) rename exercises/{04.debugging => 05.debugging}/02.problem.trace-viewer/.env (100%) rename exercises/{04.debugging => 05.debugging}/02.problem.trace-viewer/.env.example (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/.github/workflows/deploy.yml (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/.gitignore (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/.npmrc (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/.prettierignore (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/.vscode/extensions.json (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/.vscode/remix.code-snippets (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/.vscode/settings.json (100%) rename exercises/{04.debugging => 05.debugging}/02.problem.trace-viewer/README.mdx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/assets/favicons/favicon.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/error-boundary.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/floating-toolbar.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/forms.tsx (100%) rename exercises/{04.debugging => 05.debugging}/02.problem.trace-viewer/app/components/newsletter-dialog.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/progress-bar.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/search-bar.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/spacer.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/toaster.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/README.md (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/button.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/checkbox.tsx (100%) rename exercises/{04.debugging => 05.debugging}/02.problem.trace-viewer/app/components/ui/dialog.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/icon.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/input-otp.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/input.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/label.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/sonner.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/status-button.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/textarea.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/ui/tooltip.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/components/user-dropdown.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/entry.client.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/entry.server.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/02.problem.trace-viewer}/app/root.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/$.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/login.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/login.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/logout.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/signup.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/verify.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/about.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/index.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/support.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/admin+/cache.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/me.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/resources+/images.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/users+/$username.test.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/users+/$username.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{04.debugging => 05.debugging}/02.problem.trace-viewer/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/02.problem.trace-viewer}/app/routes/users+/index.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/styles/tailwind.css (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/auth.server.test.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/auth.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/cache.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/client-hints.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/connections.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/connections.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/db.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/email.server.ts (100%) rename exercises/{04.debugging => 05.debugging}/02.problem.trace-viewer/app/utils/env.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/headers.server.test.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/headers.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/honeypot.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/litefs.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/misc.error-message.test.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/misc.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/monitoring.client.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/nonce-provider.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/permissions.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/providers/constants.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/providers/github.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/providers/provider.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/request-info.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/session.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/storage.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/theme.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/timing.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/toast.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/totp.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/user-validation.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/user.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/app/utils/verification.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/components.json (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/eslint.config.js (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/fly.toml (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/index.js (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/Dockerfile (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/Dockerfile.dockerignore (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/README.md (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/build-server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/litefs.yml (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/sly/sly.json (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/sly/transform-icon.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/README.md (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/arrow-left.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/arrow-right.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/avatar.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/camera.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/check.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/clock.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/cross-1.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/download.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/exit.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/file-text.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/github-logo.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/laptop.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/link-2.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/lock-closed.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/moon.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/passkey.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/pencil-1.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/pencil-2.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/plus.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/reset.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/sun.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/trash.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/other/svg-icons/update.svg (100%) rename exercises/{03.guides/02.problem.test-annotations => 05.debugging/02.problem.trace-viewer}/package-lock.json (100%) rename exercises/{04.debugging => 05.debugging}/02.problem.trace-viewer/package.json (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/playwright.config.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/prisma/migrations/migration_lock.toml (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/prisma/schema.prisma (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/prisma/seed.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/prisma/sql/searchUsers.sql (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/public/favicon.ico (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/public/favicons/README.md (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/public/img/user.png (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/public/site.webmanifest (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/react-router.config.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/server/dev-server.js (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/server/index.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/server/utils/monitoring.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/tests/db-utils.ts (100%) rename exercises/{04.debugging => 05.debugging}/02.problem.trace-viewer/tests/e2e/notes-create.test.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/tests/setup/custom-matchers.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/tests/setup/db-setup.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/tests/setup/global-setup.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/tests/setup/setup-test-env.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/02.problem.trace-viewer}/tests/test-extend.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/tests/utils.ts (100%) rename exercises/{04.debugging => 05.debugging}/02.problem.trace-viewer/trace.zip (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/tsconfig.json (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/types/deps.d.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/types/env.env.d.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/types/icon-name.d.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/types/reset.d.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/02.problem.trace-viewer}/vite.config.ts (100%) rename exercises/{04.debugging => 05.debugging}/02.solution.trace-viewer/.env (100%) rename exercises/{04.debugging => 05.debugging}/02.solution.trace-viewer/.env.example (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/.github/workflows/deploy.yml (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/.gitignore (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/.npmrc (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/.prettierignore (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/.vscode/extensions.json (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/.vscode/remix.code-snippets (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/.vscode/settings.json (100%) rename exercises/{04.debugging => 05.debugging}/02.solution.trace-viewer/README.mdx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/assets/favicons/favicon.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/error-boundary.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/floating-toolbar.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/forms.tsx (100%) rename exercises/{04.debugging => 05.debugging}/02.solution.trace-viewer/app/components/newsletter-dialog.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/progress-bar.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/search-bar.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/spacer.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/toaster.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/README.md (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/button.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/checkbox.tsx (100%) rename exercises/{04.debugging => 05.debugging}/02.solution.trace-viewer/app/components/ui/dialog.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/icon.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/input-otp.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/input.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/label.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/sonner.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/status-button.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/textarea.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/ui/tooltip.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/components/user-dropdown.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/entry.client.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/entry.server.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/02.solution.trace-viewer}/app/root.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/$.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/login.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/login.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/logout.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/signup.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/verify.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/about.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/index.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/support.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/admin+/cache.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/me.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/resources+/images.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/users+/$username.test.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/users+/$username.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{04.debugging => 05.debugging}/02.solution.trace-viewer/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/02.solution.trace-viewer}/app/routes/users+/index.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/styles/tailwind.css (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/auth.server.test.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/auth.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/cache.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/client-hints.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/connections.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/connections.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/db.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/email.server.ts (100%) rename exercises/{04.debugging => 05.debugging}/02.solution.trace-viewer/app/utils/env.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/headers.server.test.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/headers.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/honeypot.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/litefs.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/misc.error-message.test.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/misc.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/monitoring.client.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/nonce-provider.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/permissions.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/providers/constants.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/providers/github.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/providers/provider.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/request-info.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/session.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/storage.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/theme.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/timing.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/toast.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/totp.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/user-validation.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/user.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/app/utils/verification.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/components.json (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/eslint.config.js (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/fly.toml (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/index.js (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/Dockerfile (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/Dockerfile.dockerignore (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/README.md (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/build-server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/litefs.yml (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/sly/sly.json (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/sly/transform-icon.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/README.md (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/arrow-left.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/arrow-right.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/avatar.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/camera.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/check.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/clock.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/cross-1.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/download.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/exit.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/file-text.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/github-logo.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/laptop.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/link-2.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/lock-closed.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/moon.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/passkey.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/pencil-1.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/pencil-2.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/plus.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/reset.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/sun.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/trash.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/other/svg-icons/update.svg (100%) rename exercises/{03.guides/02.solution.test-annotations => 05.debugging/02.solution.trace-viewer}/package-lock.json (100%) rename exercises/{04.debugging => 05.debugging}/02.solution.trace-viewer/package.json (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/playwright.config.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/prisma/migrations/migration_lock.toml (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/prisma/schema.prisma (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/prisma/seed.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/prisma/sql/searchUsers.sql (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/public/favicon.ico (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/public/favicons/README.md (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/public/img/user.png (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/public/site.webmanifest (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/react-router.config.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/server/dev-server.js (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/server/index.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/server/utils/monitoring.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/tests/db-utils.ts (100%) rename exercises/{04.debugging => 05.debugging}/02.solution.trace-viewer/tests/e2e/notes-create.test.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/tests/setup/custom-matchers.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/tests/setup/db-setup.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/tests/setup/global-setup.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/tests/setup/setup-test-env.ts (100%) rename exercises/{04.debugging/02.problem.trace-viewer => 05.debugging/02.solution.trace-viewer}/tests/test-extend.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/tests/utils.ts (100%) rename exercises/{04.debugging => 05.debugging}/02.solution.trace-viewer/trace.zip (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/tsconfig.json (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/types/deps.d.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/types/env.env.d.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/types/icon-name.d.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/types/reset.d.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/02.solution.trace-viewer}/vite.config.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/03.problem.live-debugging}/.env (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/03.problem.live-debugging}/.env.example (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/.github/workflows/deploy.yml (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/.gitignore (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/.npmrc (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/.prettierignore (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/.vscode/extensions.json (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/.vscode/remix.code-snippets (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/.vscode/settings.json (100%) rename exercises/{04.debugging => 05.debugging}/03.problem.live-debugging/README.mdx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/assets/favicons/favicon.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/error-boundary.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/floating-toolbar.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/forms.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/progress-bar.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/search-bar.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/spacer.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/toaster.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/README.md (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/button.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/checkbox.tsx (100%) rename exercises/{04.debugging => 05.debugging}/03.problem.live-debugging/app/components/ui/dialog.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/icon.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/input-otp.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/input.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/label.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/sonner.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/status-button.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/textarea.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/ui/tooltip.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/components/user-dropdown.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/entry.client.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/entry.server.tsx (100%) rename exercises/{04.debugging/02.problem.trace-viewer => 05.debugging/03.problem.live-debugging}/app/root.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/$.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/login.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/login.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/logout.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/signup.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/verify.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/about.tsx (100%) rename exercises/{04.debugging/02.problem.trace-viewer => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/index.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/support.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/admin+/cache.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/me.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/resources+/images.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/users+/$username.test.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/users+/$username.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/03.problem.live-debugging}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/03.problem.live-debugging}/app/routes/users+/index.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/styles/tailwind.css (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/auth.server.test.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/auth.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/cache.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/client-hints.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/connections.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/connections.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/db.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/email.server.ts (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/03.problem.live-debugging}/app/utils/env.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/headers.server.test.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/headers.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/honeypot.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/litefs.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/misc.error-message.test.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/misc.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/monitoring.client.tsx (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/nonce-provider.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/permissions.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/providers/constants.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/providers/github.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/providers/provider.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/request-info.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/session.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/storage.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/theme.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/timing.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/toast.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/totp.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/user-validation.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/user.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/app/utils/verification.server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/components.json (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/eslint.config.js (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/fly.toml (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/index.js (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/Dockerfile (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/Dockerfile.dockerignore (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/README.md (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/build-server.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/litefs.yml (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/sly/sly.json (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/sly/transform-icon.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/README.md (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/arrow-left.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/arrow-right.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/avatar.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/camera.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/check.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/clock.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/cross-1.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/download.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/exit.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/file-text.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/github-logo.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/laptop.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/link-2.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/lock-closed.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/moon.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/passkey.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/pencil-1.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/pencil-2.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/plus.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/reset.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/sun.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/trash.svg (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/other/svg-icons/update.svg (100%) rename exercises/{03.guides/03.problem.blocking-unneeded-requests => 05.debugging/03.problem.live-debugging}/package-lock.json (100%) rename exercises/{04.debugging => 05.debugging}/03.problem.live-debugging/package.json (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/playwright.config.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/prisma/migrations/migration_lock.toml (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/prisma/schema.prisma (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/prisma/seed.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/prisma/sql/searchUsers.sql (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/public/favicon.ico (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/public/favicons/README.md (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/public/img/user.png (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/public/site.webmanifest (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/react-router.config.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/server/dev-server.js (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/server/index.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/server/utils/monitoring.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/tests/db-utils.ts (100%) rename exercises/{04.debugging => 05.debugging}/03.problem.live-debugging/tests/e2e/logout.test.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/tests/setup/custom-matchers.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/tests/setup/db-setup.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/tests/setup/global-setup.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/tests/setup/setup-test-env.ts (100%) rename exercises/{04.debugging/02.solution.trace-viewer => 05.debugging/03.problem.live-debugging}/tests/test-extend.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/tests/utils.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/tsconfig.json (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/types/deps.d.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/types/env.env.d.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/types/icon-name.d.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/types/reset.d.ts (100%) rename exercises/{04.debugging/01.problem.ui-mode => 05.debugging/03.problem.live-debugging}/vite.config.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/03.solution.live-debugging}/.env (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/03.solution.live-debugging}/.env.example (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/.github/PULL_REQUEST_TEMPLATE.md (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/.github/workflows/deploy.yml (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/.gitignore (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/.npmrc (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/.prettierignore (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/.vscode/extensions.json (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/.vscode/remix.code-snippets (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/.vscode/settings.json (100%) rename exercises/{04.debugging => 05.debugging}/03.solution.live-debugging/README.mdx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/assets/favicons/apple-touch-icon.png (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/assets/favicons/favicon.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/error-boundary.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/floating-toolbar.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/forms.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/progress-bar.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/search-bar.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/spacer.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/toaster.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/README.md (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/button.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/checkbox.tsx (100%) rename exercises/{04.debugging => 05.debugging}/03.solution.live-debugging/app/components/ui/dialog.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/dropdown-menu.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/icon.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/input-otp.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/input.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/label.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/sonner.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/status-button.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/textarea.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/ui/tooltip.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/components/user-dropdown.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/entry.client.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/entry.server.tsx (100%) rename exercises/{04.debugging/02.solution.trace-viewer => 05.debugging/03.solution.live-debugging}/app/root.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/$.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/auth.$provider.callback.test.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/auth.$provider.callback.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/auth_.$provider.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/forgot-password.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/login.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/login.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/logout.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/onboarding.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/onboarding.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/onboarding_.$provider.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/onboarding_.$provider.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/reset-password.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/reset-password.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/signup.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/verify.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/verify.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/webauthn+/authentication.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/webauthn+/registration.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_auth+/webauthn+/utils.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/about.tsx (100%) rename exercises/{04.debugging/02.solution.trace-viewer => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/index.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/docker.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/eslint.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/faker.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/fly.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/github.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/logos.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/msw.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/playwright.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/prettier.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/prisma.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/radix.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/react-email.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/remix.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/resend.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/sentry.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/shadcn-ui.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/sqlite.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/stars.jpg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/tailwind.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/testing-library.png (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/typescript.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/vitest.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/logos/zod.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/privacy.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/support.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_marketing+/tos.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_seo+/robots[.]txt.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/_seo+/sitemap[.]xml.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/admin+/cache.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/admin+/cache_.lru.$cacheKey.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/admin+/cache_.sqlite.$cacheKey.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/admin+/cache_.sqlite.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/admin+/cache_.sqlite.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/me.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/resources+/download-user-data.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/resources+/healthcheck.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/resources+/images.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/resources+/theme-switch.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.change-email.server.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.change-email.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.connections.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.index.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.passkeys.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.password.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.password_.create.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.photo.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.two-factor.disable.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.two-factor.index.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.two-factor.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/settings+/profile.two-factor.verify.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/users+/$username.test.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/users+/$username.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/users+/$username_+/__note-editor.server.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/users+/$username_+/__note-editor.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/users+/$username_+/notes.$noteId.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/users+/$username_+/notes.$noteId_.edit.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/users+/$username_+/notes.index.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/routes/users+/$username_+/notes.new.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/03.solution.live-debugging}/app/routes/users+/$username_+/notes.tsx (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/03.solution.live-debugging}/app/routes/users+/index.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/styles/tailwind.css (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/auth.server.test.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/auth.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/cache.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/client-hints.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/connections.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/connections.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/db.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/email.server.ts (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/03.solution.live-debugging}/app/utils/env.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/headers.server.test.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/headers.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/honeypot.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/litefs.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/misc.error-message.test.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/misc.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/misc.use-double-check.test.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/monitoring.client.tsx (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/nonce-provider.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/permissions.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/providers/constants.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/providers/github.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/providers/provider.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/redirect-cookie.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/request-info.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/session.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/storage.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/theme.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/timing.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/toast.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/totp.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/user-validation.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/user.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/app/utils/verification.server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/components.json (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/eslint.config.js (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/fly.toml (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/index.js (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/Dockerfile (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/Dockerfile.dockerignore (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/README.md (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/build-server.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/litefs.yml (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/sly/sly.json (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/sly/transform-icon.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/README.md (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/arrow-left.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/arrow-right.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/avatar.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/camera.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/check.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/clock.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/cross-1.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/dots-horizontal.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/download.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/envelope-closed.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/exit.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/file-text.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/github-logo.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/laptop.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/link-2.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/lock-closed.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/lock-open-1.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/magnifying-glass.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/moon.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/passkey.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/pencil-1.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/pencil-2.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/plus.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/question-mark-circled.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/reset.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/sun.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/trash.svg (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/other/svg-icons/update.svg (100%) rename exercises/{03.guides/03.solution.blocking-unneeded-requests => 05.debugging/03.solution.live-debugging}/package-lock.json (100%) rename exercises/{04.debugging => 05.debugging}/03.solution.live-debugging/package.json (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/playwright.config.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/prisma/migrations/20250221233640_init/migration.sql (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/prisma/migrations/migration_lock.toml (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/prisma/schema.prisma (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/prisma/seed.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/prisma/sql/searchUsers.sql (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/public/favicon.ico (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/public/favicons/README.md (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/public/favicons/android-chrome-192x192.png (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/public/favicons/android-chrome-512x512.png (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/public/img/user.png (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/public/site.webmanifest (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/react-router.config.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/server/dev-server.js (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/server/index.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/server/utils/monitoring.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/tests/db-utils.ts (100%) rename exercises/{04.debugging => 05.debugging}/03.solution.live-debugging/tests/e2e/logout.test.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/tests/setup/custom-matchers.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/tests/setup/db-setup.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/tests/setup/global-setup.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/tests/setup/setup-test-env.ts (100%) rename exercises/{04.debugging/03.problem.live-debugging => 05.debugging/03.solution.live-debugging}/tests/test-extend.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/tests/utils.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/tsconfig.json (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/types/deps.d.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/types/env.env.d.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/types/icon-name.d.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/types/reset.d.ts (100%) rename exercises/{04.debugging/01.solution.ui-mode => 05.debugging/03.solution.live-debugging}/vite.config.ts (100%) rename exercises/{04.debugging => 05.debugging}/FINISHED.mdx (100%) rename exercises/{04.debugging => 05.debugging}/README.mdx (100%) diff --git a/exercises/01.basics/01.problem.install-and-configure/README.mdx b/exercises/01.setup/01.problem.install-and-configure/README.mdx similarity index 100% rename from exercises/01.basics/01.problem.install-and-configure/README.mdx rename to exercises/01.setup/01.problem.install-and-configure/README.mdx diff --git a/exercises/01.basics/01.problem.install-and-configure/package.json b/exercises/01.setup/01.problem.install-and-configure/package.json similarity index 100% rename from exercises/01.basics/01.problem.install-and-configure/package.json rename to exercises/01.setup/01.problem.install-and-configure/package.json diff --git a/exercises/01.basics/01.problem.install-and-configure/tsconfig.json b/exercises/01.setup/01.problem.install-and-configure/tsconfig.json similarity index 100% rename from exercises/01.basics/01.problem.install-and-configure/tsconfig.json rename to exercises/01.setup/01.problem.install-and-configure/tsconfig.json diff --git a/exercises/01.basics/01.solution.install-and-configure/README.mdx b/exercises/01.setup/01.solution.install-and-configure/README.mdx similarity index 100% rename from exercises/01.basics/01.solution.install-and-configure/README.mdx rename to exercises/01.setup/01.solution.install-and-configure/README.mdx diff --git a/exercises/01.basics/01.solution.install-and-configure/package.json b/exercises/01.setup/01.solution.install-and-configure/package.json similarity index 100% rename from exercises/01.basics/01.solution.install-and-configure/package.json rename to exercises/01.setup/01.solution.install-and-configure/package.json diff --git a/exercises/01.basics/01.solution.install-and-configure/playwright.config.ts b/exercises/01.setup/01.solution.install-and-configure/playwright.config.ts similarity index 100% rename from exercises/01.basics/01.solution.install-and-configure/playwright.config.ts rename to exercises/01.setup/01.solution.install-and-configure/playwright.config.ts diff --git a/exercises/01.basics/01.solution.install-and-configure/tests/epicweb.test.ts b/exercises/01.setup/01.solution.install-and-configure/tests/epicweb.test.ts similarity index 100% rename from exercises/01.basics/01.solution.install-and-configure/tests/epicweb.test.ts rename to exercises/01.setup/01.solution.install-and-configure/tests/epicweb.test.ts diff --git a/exercises/01.basics/01.solution.install-and-configure/tsconfig.json b/exercises/01.setup/01.solution.install-and-configure/tsconfig.json similarity index 100% rename from exercises/01.basics/01.solution.install-and-configure/tsconfig.json rename to exercises/01.setup/01.solution.install-and-configure/tsconfig.json diff --git a/exercises/01.basics/02.problem.running-the-app/.env b/exercises/01.setup/02.problem.running-the-app/.env similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/.env rename to exercises/01.setup/02.problem.running-the-app/.env diff --git a/exercises/01.basics/02.problem.running-the-app/.env.example b/exercises/01.setup/02.problem.running-the-app/.env.example similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/.env.example rename to exercises/01.setup/02.problem.running-the-app/.env.example diff --git a/exercises/01.basics/02.problem.running-the-app/.github/PULL_REQUEST_TEMPLATE.md b/exercises/01.setup/02.problem.running-the-app/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/.github/PULL_REQUEST_TEMPLATE.md rename to exercises/01.setup/02.problem.running-the-app/.github/PULL_REQUEST_TEMPLATE.md diff --git a/exercises/01.basics/02.problem.running-the-app/.github/workflows/deploy.yml b/exercises/01.setup/02.problem.running-the-app/.github/workflows/deploy.yml similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/.github/workflows/deploy.yml rename to exercises/01.setup/02.problem.running-the-app/.github/workflows/deploy.yml diff --git a/exercises/01.basics/02.problem.running-the-app/.gitignore b/exercises/01.setup/02.problem.running-the-app/.gitignore similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/.gitignore rename to exercises/01.setup/02.problem.running-the-app/.gitignore diff --git a/exercises/01.basics/02.problem.running-the-app/.npmrc b/exercises/01.setup/02.problem.running-the-app/.npmrc similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/.npmrc rename to exercises/01.setup/02.problem.running-the-app/.npmrc diff --git a/exercises/01.basics/02.problem.running-the-app/.prettierignore b/exercises/01.setup/02.problem.running-the-app/.prettierignore similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/.prettierignore rename to exercises/01.setup/02.problem.running-the-app/.prettierignore diff --git a/exercises/01.basics/02.problem.running-the-app/.vscode/extensions.json b/exercises/01.setup/02.problem.running-the-app/.vscode/extensions.json similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/.vscode/extensions.json rename to exercises/01.setup/02.problem.running-the-app/.vscode/extensions.json diff --git a/exercises/01.basics/02.problem.running-the-app/.vscode/remix.code-snippets b/exercises/01.setup/02.problem.running-the-app/.vscode/remix.code-snippets similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/.vscode/remix.code-snippets rename to exercises/01.setup/02.problem.running-the-app/.vscode/remix.code-snippets diff --git a/exercises/01.basics/02.problem.running-the-app/.vscode/settings.json b/exercises/01.setup/02.problem.running-the-app/.vscode/settings.json similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/.vscode/settings.json rename to exercises/01.setup/02.problem.running-the-app/.vscode/settings.json diff --git a/exercises/01.basics/02.problem.running-the-app/README.mdx b/exercises/01.setup/02.problem.running-the-app/README.mdx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/README.mdx rename to exercises/01.setup/02.problem.running-the-app/README.mdx diff --git a/exercises/01.basics/02.problem.running-the-app/app/assets/favicons/apple-touch-icon.png b/exercises/01.setup/02.problem.running-the-app/app/assets/favicons/apple-touch-icon.png similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/assets/favicons/apple-touch-icon.png rename to exercises/01.setup/02.problem.running-the-app/app/assets/favicons/apple-touch-icon.png diff --git a/exercises/01.basics/02.problem.running-the-app/app/assets/favicons/favicon.svg b/exercises/01.setup/02.problem.running-the-app/app/assets/favicons/favicon.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/assets/favicons/favicon.svg rename to exercises/01.setup/02.problem.running-the-app/app/assets/favicons/favicon.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/error-boundary.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/error-boundary.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/error-boundary.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/error-boundary.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/floating-toolbar.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/floating-toolbar.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/floating-toolbar.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/floating-toolbar.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/forms.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/forms.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/forms.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/forms.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/progress-bar.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/progress-bar.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/progress-bar.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/progress-bar.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/search-bar.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/search-bar.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/search-bar.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/search-bar.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/spacer.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/spacer.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/spacer.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/spacer.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/toaster.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/toaster.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/toaster.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/toaster.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/README.md b/exercises/01.setup/02.problem.running-the-app/app/components/ui/README.md similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/README.md rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/README.md diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/button.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/button.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/button.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/button.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/checkbox.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/checkbox.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/checkbox.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/checkbox.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/dropdown-menu.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/dropdown-menu.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/dropdown-menu.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/dropdown-menu.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/icon.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/icon.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/icon.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/icon.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/input-otp.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/input-otp.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/input-otp.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/input-otp.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/input.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/input.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/input.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/input.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/label.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/label.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/label.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/label.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/sonner.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/sonner.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/sonner.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/sonner.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/status-button.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/status-button.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/status-button.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/status-button.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/textarea.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/textarea.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/textarea.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/textarea.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/ui/tooltip.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/ui/tooltip.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/ui/tooltip.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/ui/tooltip.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/components/user-dropdown.tsx b/exercises/01.setup/02.problem.running-the-app/app/components/user-dropdown.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/components/user-dropdown.tsx rename to exercises/01.setup/02.problem.running-the-app/app/components/user-dropdown.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/entry.client.tsx b/exercises/01.setup/02.problem.running-the-app/app/entry.client.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/entry.client.tsx rename to exercises/01.setup/02.problem.running-the-app/app/entry.client.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/entry.server.tsx b/exercises/01.setup/02.problem.running-the-app/app/entry.server.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/entry.server.tsx rename to exercises/01.setup/02.problem.running-the-app/app/entry.server.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/root.tsx b/exercises/01.setup/02.problem.running-the-app/app/root.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/root.tsx rename to exercises/01.setup/02.problem.running-the-app/app/root.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes.ts b/exercises/01.setup/02.problem.running-the-app/app/routes.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/$.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/$.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/$.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/$.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/auth.$provider.callback.test.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/auth.$provider.callback.test.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/auth.$provider.callback.test.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/auth.$provider.callback.test.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/auth.$provider.callback.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/auth.$provider.callback.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/auth.$provider.callback.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/auth.$provider.callback.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/auth_.$provider.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/auth_.$provider.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/auth_.$provider.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/auth_.$provider.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/forgot-password.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/forgot-password.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/forgot-password.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/forgot-password.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/login.server.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/login.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/login.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/login.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/login.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/login.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/login.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/login.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/logout.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/logout.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/logout.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/logout.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/onboarding.server.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/onboarding.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/onboarding.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/onboarding.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/onboarding.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/onboarding.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/onboarding.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/onboarding.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/onboarding_.$provider.server.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/onboarding_.$provider.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/onboarding_.$provider.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/onboarding_.$provider.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/onboarding_.$provider.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/onboarding_.$provider.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/onboarding_.$provider.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/onboarding_.$provider.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/reset-password.server.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/reset-password.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/reset-password.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/reset-password.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/reset-password.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/reset-password.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/reset-password.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/reset-password.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/signup.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/signup.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/signup.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/signup.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/verify.server.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/verify.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/verify.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/verify.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/verify.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/verify.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/verify.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/verify.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/webauthn+/authentication.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/webauthn+/authentication.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/webauthn+/authentication.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/webauthn+/authentication.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/webauthn+/registration.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/webauthn+/registration.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/webauthn+/registration.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/webauthn+/registration.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/webauthn+/utils.server.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/webauthn+/utils.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_auth+/webauthn+/utils.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_auth+/webauthn+/utils.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/about.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/about.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/about.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/about.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/index.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/index.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/index.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/index.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/docker.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/docker.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/docker.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/docker.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/eslint.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/eslint.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/eslint.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/eslint.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/faker.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/faker.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/faker.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/faker.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/fly.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/fly.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/fly.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/fly.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/github.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/github.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/github.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/github.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/logos.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/logos.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/logos.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/logos.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/msw.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/msw.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/msw.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/msw.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/playwright.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/playwright.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/playwright.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/playwright.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/prettier.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/prettier.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/prettier.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/prettier.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/prisma.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/prisma.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/prisma.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/prisma.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/radix.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/radix.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/radix.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/radix.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/react-email.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/react-email.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/react-email.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/react-email.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/remix.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/remix.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/remix.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/remix.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/resend.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/resend.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/resend.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/resend.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/sentry.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/sentry.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/sentry.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/sentry.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/shadcn-ui.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/shadcn-ui.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/shadcn-ui.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/shadcn-ui.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/sqlite.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/sqlite.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/sqlite.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/sqlite.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/stars.jpg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/stars.jpg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/stars.jpg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/stars.jpg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/tailwind.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/tailwind.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/tailwind.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/tailwind.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/testing-library.png b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/testing-library.png similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/testing-library.png rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/testing-library.png diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/typescript.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/typescript.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/typescript.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/typescript.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/vitest.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/vitest.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/vitest.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/vitest.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/zod.svg b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/zod.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/logos/zod.svg rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/logos/zod.svg diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/privacy.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/privacy.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/privacy.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/privacy.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/support.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/support.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/support.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/support.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/tos.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/tos.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_marketing+/tos.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/_marketing+/tos.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_seo+/robots[.]txt.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_seo+/robots[.]txt.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_seo+/robots[.]txt.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_seo+/robots[.]txt.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/_seo+/sitemap[.]xml.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/_seo+/sitemap[.]xml.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/_seo+/sitemap[.]xml.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/_seo+/sitemap[.]xml.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/admin+/cache.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/admin+/cache.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/admin+/cache.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/admin+/cache.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/admin+/cache_.lru.$cacheKey.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/admin+/cache_.lru.$cacheKey.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/admin+/cache_.lru.$cacheKey.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/admin+/cache_.lru.$cacheKey.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.$cacheKey.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.$cacheKey.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.$cacheKey.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.$cacheKey.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.server.ts b/exercises/01.setup/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/admin+/cache_.sqlite.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/me.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/me.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/me.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/me.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/resources+/download-user-data.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/resources+/download-user-data.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/resources+/download-user-data.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/resources+/download-user-data.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/resources+/healthcheck.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/resources+/healthcheck.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/resources+/healthcheck.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/resources+/healthcheck.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/resources+/images.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/resources+/images.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/resources+/images.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/resources+/images.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/resources+/theme-switch.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/resources+/theme-switch.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/resources+/theme-switch.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/resources+/theme-switch.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.change-email.server.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.change-email.server.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.change-email.server.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.change-email.server.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.change-email.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.change-email.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.change-email.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.change-email.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.connections.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.connections.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.connections.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.connections.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.index.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.index.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.index.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.index.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.passkeys.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.passkeys.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.passkeys.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.passkeys.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.password.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.password.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.password.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.password.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.password_.create.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.password_.create.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.password_.create.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.password_.create.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.photo.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.photo.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.photo.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.photo.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.two-factor.disable.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.two-factor.disable.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.two-factor.disable.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.two-factor.disable.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.two-factor.index.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.two-factor.index.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.two-factor.index.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.two-factor.index.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.two-factor.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.two-factor.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.two-factor.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.two-factor.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.two-factor.verify.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.two-factor.verify.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/settings+/profile.two-factor.verify.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/settings+/profile.two-factor.verify.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username.test.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username.test.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username.test.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username.test.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/__note-editor.server.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/__note-editor.server.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/__note-editor.server.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/__note-editor.server.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/__note-editor.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/__note-editor.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/__note-editor.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/notes.$noteId.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/notes.$noteId.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/notes.$noteId.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/notes.$noteId.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/notes.$noteId_.edit.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/notes.$noteId_.edit.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/notes.$noteId_.edit.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/notes.$noteId_.edit.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/notes.index.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/notes.index.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/notes.index.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/notes.index.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/notes.new.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/notes.new.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/notes.new.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/notes.new.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/notes.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/notes.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/users+/$username_+/notes.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/users+/$username_+/notes.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/routes/users+/index.tsx b/exercises/01.setup/02.problem.running-the-app/app/routes/users+/index.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/routes/users+/index.tsx rename to exercises/01.setup/02.problem.running-the-app/app/routes/users+/index.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/styles/tailwind.css b/exercises/01.setup/02.problem.running-the-app/app/styles/tailwind.css similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/styles/tailwind.css rename to exercises/01.setup/02.problem.running-the-app/app/styles/tailwind.css diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/auth.server.test.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/auth.server.test.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/auth.server.test.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/auth.server.test.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/auth.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/auth.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/auth.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/auth.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/cache.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/cache.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/cache.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/cache.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/client-hints.tsx b/exercises/01.setup/02.problem.running-the-app/app/utils/client-hints.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/client-hints.tsx rename to exercises/01.setup/02.problem.running-the-app/app/utils/client-hints.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/connections.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/connections.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/connections.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/connections.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/connections.tsx b/exercises/01.setup/02.problem.running-the-app/app/utils/connections.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/connections.tsx rename to exercises/01.setup/02.problem.running-the-app/app/utils/connections.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/db.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/db.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/db.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/db.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/email.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/email.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/email.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/email.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/env.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/env.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/env.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/env.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/headers.server.test.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/headers.server.test.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/headers.server.test.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/headers.server.test.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/headers.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/headers.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/headers.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/headers.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/honeypot.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/honeypot.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/honeypot.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/honeypot.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/litefs.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/litefs.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/litefs.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/litefs.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/misc.error-message.test.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/misc.error-message.test.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/misc.error-message.test.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/misc.error-message.test.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/misc.tsx b/exercises/01.setup/02.problem.running-the-app/app/utils/misc.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/misc.tsx rename to exercises/01.setup/02.problem.running-the-app/app/utils/misc.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/misc.use-double-check.test.tsx b/exercises/01.setup/02.problem.running-the-app/app/utils/misc.use-double-check.test.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/misc.use-double-check.test.tsx rename to exercises/01.setup/02.problem.running-the-app/app/utils/misc.use-double-check.test.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/monitoring.client.tsx b/exercises/01.setup/02.problem.running-the-app/app/utils/monitoring.client.tsx similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/monitoring.client.tsx rename to exercises/01.setup/02.problem.running-the-app/app/utils/monitoring.client.tsx diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/nonce-provider.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/nonce-provider.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/nonce-provider.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/nonce-provider.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/permissions.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/permissions.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/permissions.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/permissions.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/providers/constants.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/providers/constants.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/providers/constants.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/providers/constants.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/providers/github.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/providers/github.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/providers/github.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/providers/github.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/providers/provider.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/providers/provider.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/providers/provider.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/providers/provider.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/redirect-cookie.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/redirect-cookie.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/redirect-cookie.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/redirect-cookie.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/request-info.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/request-info.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/request-info.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/request-info.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/session.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/session.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/session.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/session.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/storage.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/storage.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/storage.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/storage.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/theme.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/theme.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/theme.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/theme.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/timing.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/timing.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/timing.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/timing.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/toast.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/toast.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/toast.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/toast.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/totp.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/totp.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/totp.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/totp.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/user-validation.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/user-validation.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/user-validation.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/user-validation.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/user.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/user.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/user.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/user.ts diff --git a/exercises/01.basics/02.problem.running-the-app/app/utils/verification.server.ts b/exercises/01.setup/02.problem.running-the-app/app/utils/verification.server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/app/utils/verification.server.ts rename to exercises/01.setup/02.problem.running-the-app/app/utils/verification.server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/components.json b/exercises/01.setup/02.problem.running-the-app/components.json similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/components.json rename to exercises/01.setup/02.problem.running-the-app/components.json diff --git a/exercises/01.basics/02.problem.running-the-app/eslint.config.js b/exercises/01.setup/02.problem.running-the-app/eslint.config.js similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/eslint.config.js rename to exercises/01.setup/02.problem.running-the-app/eslint.config.js diff --git a/exercises/01.basics/02.problem.running-the-app/fly.toml b/exercises/01.setup/02.problem.running-the-app/fly.toml similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/fly.toml rename to exercises/01.setup/02.problem.running-the-app/fly.toml diff --git a/exercises/01.basics/02.problem.running-the-app/index.js b/exercises/01.setup/02.problem.running-the-app/index.js similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/index.js rename to exercises/01.setup/02.problem.running-the-app/index.js diff --git a/exercises/01.basics/02.problem.running-the-app/other/Dockerfile b/exercises/01.setup/02.problem.running-the-app/other/Dockerfile similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/Dockerfile rename to exercises/01.setup/02.problem.running-the-app/other/Dockerfile diff --git a/exercises/01.basics/02.problem.running-the-app/other/Dockerfile.dockerignore b/exercises/01.setup/02.problem.running-the-app/other/Dockerfile.dockerignore similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/Dockerfile.dockerignore rename to exercises/01.setup/02.problem.running-the-app/other/Dockerfile.dockerignore diff --git a/exercises/01.basics/02.problem.running-the-app/other/README.md b/exercises/01.setup/02.problem.running-the-app/other/README.md similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/README.md rename to exercises/01.setup/02.problem.running-the-app/other/README.md diff --git a/exercises/01.basics/02.problem.running-the-app/other/build-server.ts b/exercises/01.setup/02.problem.running-the-app/other/build-server.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/build-server.ts rename to exercises/01.setup/02.problem.running-the-app/other/build-server.ts diff --git a/exercises/01.basics/02.problem.running-the-app/other/litefs.yml b/exercises/01.setup/02.problem.running-the-app/other/litefs.yml similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/litefs.yml rename to exercises/01.setup/02.problem.running-the-app/other/litefs.yml diff --git a/exercises/01.basics/02.problem.running-the-app/other/sly/sly.json b/exercises/01.setup/02.problem.running-the-app/other/sly/sly.json similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/sly/sly.json rename to exercises/01.setup/02.problem.running-the-app/other/sly/sly.json diff --git a/exercises/01.basics/02.problem.running-the-app/other/sly/transform-icon.ts b/exercises/01.setup/02.problem.running-the-app/other/sly/transform-icon.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/sly/transform-icon.ts rename to exercises/01.setup/02.problem.running-the-app/other/sly/transform-icon.ts diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/README.md b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/README.md similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/README.md rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/README.md diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/arrow-left.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/arrow-left.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/arrow-left.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/arrow-left.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/arrow-right.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/arrow-right.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/arrow-right.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/arrow-right.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/avatar.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/avatar.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/avatar.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/avatar.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/camera.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/camera.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/camera.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/camera.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/check.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/check.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/check.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/check.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/clock.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/clock.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/clock.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/clock.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/cross-1.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/cross-1.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/cross-1.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/cross-1.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/dots-horizontal.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/dots-horizontal.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/dots-horizontal.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/dots-horizontal.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/download.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/download.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/download.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/download.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/envelope-closed.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/envelope-closed.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/envelope-closed.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/envelope-closed.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/exit.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/exit.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/exit.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/exit.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/file-text.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/file-text.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/file-text.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/file-text.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/github-logo.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/github-logo.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/github-logo.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/github-logo.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/laptop.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/laptop.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/laptop.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/laptop.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/link-2.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/link-2.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/link-2.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/link-2.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/lock-closed.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/lock-closed.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/lock-closed.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/lock-closed.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/lock-open-1.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/lock-open-1.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/lock-open-1.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/lock-open-1.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/magnifying-glass.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/magnifying-glass.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/magnifying-glass.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/magnifying-glass.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/moon.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/moon.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/moon.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/moon.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/passkey.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/passkey.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/passkey.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/passkey.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/pencil-1.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/pencil-1.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/pencil-1.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/pencil-1.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/pencil-2.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/pencil-2.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/pencil-2.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/pencil-2.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/plus.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/plus.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/plus.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/plus.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/question-mark-circled.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/question-mark-circled.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/question-mark-circled.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/question-mark-circled.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/reset.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/reset.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/reset.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/reset.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/sun.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/sun.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/sun.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/sun.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/trash.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/trash.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/trash.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/trash.svg diff --git a/exercises/01.basics/02.problem.running-the-app/other/svg-icons/update.svg b/exercises/01.setup/02.problem.running-the-app/other/svg-icons/update.svg similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/other/svg-icons/update.svg rename to exercises/01.setup/02.problem.running-the-app/other/svg-icons/update.svg diff --git a/exercises/01.basics/02.problem.running-the-app/package-lock.json b/exercises/01.setup/02.problem.running-the-app/package-lock.json similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/package-lock.json rename to exercises/01.setup/02.problem.running-the-app/package-lock.json diff --git a/exercises/01.basics/02.problem.running-the-app/package.json b/exercises/01.setup/02.problem.running-the-app/package.json similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/package.json rename to exercises/01.setup/02.problem.running-the-app/package.json diff --git a/exercises/01.basics/02.problem.running-the-app/playwright.config.ts b/exercises/01.setup/02.problem.running-the-app/playwright.config.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/playwright.config.ts rename to exercises/01.setup/02.problem.running-the-app/playwright.config.ts diff --git a/exercises/01.basics/02.problem.running-the-app/prisma/migrations/20250221233640_init/migration.sql b/exercises/01.setup/02.problem.running-the-app/prisma/migrations/20250221233640_init/migration.sql similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/prisma/migrations/20250221233640_init/migration.sql rename to exercises/01.setup/02.problem.running-the-app/prisma/migrations/20250221233640_init/migration.sql diff --git a/exercises/01.basics/02.problem.running-the-app/prisma/migrations/migration_lock.toml b/exercises/01.setup/02.problem.running-the-app/prisma/migrations/migration_lock.toml similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/prisma/migrations/migration_lock.toml rename to exercises/01.setup/02.problem.running-the-app/prisma/migrations/migration_lock.toml diff --git a/exercises/01.basics/02.problem.running-the-app/prisma/schema.prisma b/exercises/01.setup/02.problem.running-the-app/prisma/schema.prisma similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/prisma/schema.prisma rename to exercises/01.setup/02.problem.running-the-app/prisma/schema.prisma diff --git a/exercises/01.basics/02.problem.running-the-app/prisma/seed.ts b/exercises/01.setup/02.problem.running-the-app/prisma/seed.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/prisma/seed.ts rename to exercises/01.setup/02.problem.running-the-app/prisma/seed.ts diff --git a/exercises/01.basics/02.problem.running-the-app/prisma/sql/searchUsers.sql b/exercises/01.setup/02.problem.running-the-app/prisma/sql/searchUsers.sql similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/prisma/sql/searchUsers.sql rename to exercises/01.setup/02.problem.running-the-app/prisma/sql/searchUsers.sql diff --git a/exercises/01.basics/02.problem.running-the-app/public/favicon.ico b/exercises/01.setup/02.problem.running-the-app/public/favicon.ico similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/public/favicon.ico rename to exercises/01.setup/02.problem.running-the-app/public/favicon.ico diff --git a/exercises/01.basics/02.problem.running-the-app/public/favicons/README.md b/exercises/01.setup/02.problem.running-the-app/public/favicons/README.md similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/public/favicons/README.md rename to exercises/01.setup/02.problem.running-the-app/public/favicons/README.md diff --git a/exercises/01.basics/02.problem.running-the-app/public/favicons/android-chrome-192x192.png b/exercises/01.setup/02.problem.running-the-app/public/favicons/android-chrome-192x192.png similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/public/favicons/android-chrome-192x192.png rename to exercises/01.setup/02.problem.running-the-app/public/favicons/android-chrome-192x192.png diff --git a/exercises/01.basics/02.problem.running-the-app/public/favicons/android-chrome-512x512.png b/exercises/01.setup/02.problem.running-the-app/public/favicons/android-chrome-512x512.png similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/public/favicons/android-chrome-512x512.png rename to exercises/01.setup/02.problem.running-the-app/public/favicons/android-chrome-512x512.png diff --git a/exercises/01.basics/02.problem.running-the-app/public/img/user.png b/exercises/01.setup/02.problem.running-the-app/public/img/user.png similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/public/img/user.png rename to exercises/01.setup/02.problem.running-the-app/public/img/user.png diff --git a/exercises/01.basics/02.problem.running-the-app/public/site.webmanifest b/exercises/01.setup/02.problem.running-the-app/public/site.webmanifest similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/public/site.webmanifest rename to exercises/01.setup/02.problem.running-the-app/public/site.webmanifest diff --git a/exercises/01.basics/02.problem.running-the-app/react-router.config.ts b/exercises/01.setup/02.problem.running-the-app/react-router.config.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/react-router.config.ts rename to exercises/01.setup/02.problem.running-the-app/react-router.config.ts diff --git a/exercises/01.basics/02.problem.running-the-app/server/dev-server.js b/exercises/01.setup/02.problem.running-the-app/server/dev-server.js similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/server/dev-server.js rename to exercises/01.setup/02.problem.running-the-app/server/dev-server.js diff --git a/exercises/01.basics/02.problem.running-the-app/server/index.ts b/exercises/01.setup/02.problem.running-the-app/server/index.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/server/index.ts rename to exercises/01.setup/02.problem.running-the-app/server/index.ts diff --git a/exercises/01.basics/02.problem.running-the-app/server/utils/monitoring.ts b/exercises/01.setup/02.problem.running-the-app/server/utils/monitoring.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/server/utils/monitoring.ts rename to exercises/01.setup/02.problem.running-the-app/server/utils/monitoring.ts diff --git a/exercises/01.basics/02.problem.running-the-app/tests/db-utils.ts b/exercises/01.setup/02.problem.running-the-app/tests/db-utils.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/tests/db-utils.ts rename to exercises/01.setup/02.problem.running-the-app/tests/db-utils.ts diff --git a/exercises/01.basics/02.problem.running-the-app/tests/e2e/homepage.test.ts b/exercises/01.setup/02.problem.running-the-app/tests/e2e/homepage.test.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/tests/e2e/homepage.test.ts rename to exercises/01.setup/02.problem.running-the-app/tests/e2e/homepage.test.ts diff --git a/exercises/01.basics/02.problem.running-the-app/tests/setup/custom-matchers.ts b/exercises/01.setup/02.problem.running-the-app/tests/setup/custom-matchers.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/tests/setup/custom-matchers.ts rename to exercises/01.setup/02.problem.running-the-app/tests/setup/custom-matchers.ts diff --git a/exercises/01.basics/02.problem.running-the-app/tests/setup/db-setup.ts b/exercises/01.setup/02.problem.running-the-app/tests/setup/db-setup.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/tests/setup/db-setup.ts rename to exercises/01.setup/02.problem.running-the-app/tests/setup/db-setup.ts diff --git a/exercises/01.basics/02.problem.running-the-app/tests/setup/global-setup.ts b/exercises/01.setup/02.problem.running-the-app/tests/setup/global-setup.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/tests/setup/global-setup.ts rename to exercises/01.setup/02.problem.running-the-app/tests/setup/global-setup.ts diff --git a/exercises/01.basics/02.problem.running-the-app/tests/setup/setup-test-env.ts b/exercises/01.setup/02.problem.running-the-app/tests/setup/setup-test-env.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/tests/setup/setup-test-env.ts rename to exercises/01.setup/02.problem.running-the-app/tests/setup/setup-test-env.ts diff --git a/exercises/01.basics/02.problem.running-the-app/tests/utils.ts b/exercises/01.setup/02.problem.running-the-app/tests/utils.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/tests/utils.ts rename to exercises/01.setup/02.problem.running-the-app/tests/utils.ts diff --git a/exercises/01.basics/02.problem.running-the-app/tsconfig.json b/exercises/01.setup/02.problem.running-the-app/tsconfig.json similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/tsconfig.json rename to exercises/01.setup/02.problem.running-the-app/tsconfig.json diff --git a/exercises/01.basics/02.problem.running-the-app/types/deps.d.ts b/exercises/01.setup/02.problem.running-the-app/types/deps.d.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/types/deps.d.ts rename to exercises/01.setup/02.problem.running-the-app/types/deps.d.ts diff --git a/exercises/01.basics/02.problem.running-the-app/types/env.env.d.ts b/exercises/01.setup/02.problem.running-the-app/types/env.env.d.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/types/env.env.d.ts rename to exercises/01.setup/02.problem.running-the-app/types/env.env.d.ts diff --git a/exercises/01.basics/02.problem.running-the-app/types/icon-name.d.ts b/exercises/01.setup/02.problem.running-the-app/types/icon-name.d.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/types/icon-name.d.ts rename to exercises/01.setup/02.problem.running-the-app/types/icon-name.d.ts diff --git a/exercises/01.basics/02.problem.running-the-app/types/reset.d.ts b/exercises/01.setup/02.problem.running-the-app/types/reset.d.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/types/reset.d.ts rename to exercises/01.setup/02.problem.running-the-app/types/reset.d.ts diff --git a/exercises/01.basics/02.problem.running-the-app/vite.config.ts b/exercises/01.setup/02.problem.running-the-app/vite.config.ts similarity index 100% rename from exercises/01.basics/02.problem.running-the-app/vite.config.ts rename to exercises/01.setup/02.problem.running-the-app/vite.config.ts diff --git a/exercises/01.basics/02.solution.running-the-app/.env b/exercises/01.setup/02.solution.running-the-app/.env similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/.env rename to exercises/01.setup/02.solution.running-the-app/.env diff --git a/exercises/01.basics/02.solution.running-the-app/.env.example b/exercises/01.setup/02.solution.running-the-app/.env.example similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/.env.example rename to exercises/01.setup/02.solution.running-the-app/.env.example diff --git a/exercises/01.basics/02.solution.running-the-app/.github/PULL_REQUEST_TEMPLATE.md b/exercises/01.setup/02.solution.running-the-app/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/.github/PULL_REQUEST_TEMPLATE.md rename to exercises/01.setup/02.solution.running-the-app/.github/PULL_REQUEST_TEMPLATE.md diff --git a/exercises/01.basics/02.solution.running-the-app/.github/workflows/deploy.yml b/exercises/01.setup/02.solution.running-the-app/.github/workflows/deploy.yml similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/.github/workflows/deploy.yml rename to exercises/01.setup/02.solution.running-the-app/.github/workflows/deploy.yml diff --git a/exercises/01.basics/02.solution.running-the-app/.gitignore b/exercises/01.setup/02.solution.running-the-app/.gitignore similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/.gitignore rename to exercises/01.setup/02.solution.running-the-app/.gitignore diff --git a/exercises/01.basics/02.solution.running-the-app/.npmrc b/exercises/01.setup/02.solution.running-the-app/.npmrc similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/.npmrc rename to exercises/01.setup/02.solution.running-the-app/.npmrc diff --git a/exercises/01.basics/02.solution.running-the-app/.prettierignore b/exercises/01.setup/02.solution.running-the-app/.prettierignore similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/.prettierignore rename to exercises/01.setup/02.solution.running-the-app/.prettierignore diff --git a/exercises/01.basics/02.solution.running-the-app/.vscode/extensions.json b/exercises/01.setup/02.solution.running-the-app/.vscode/extensions.json similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/.vscode/extensions.json rename to exercises/01.setup/02.solution.running-the-app/.vscode/extensions.json diff --git a/exercises/01.basics/02.solution.running-the-app/.vscode/remix.code-snippets b/exercises/01.setup/02.solution.running-the-app/.vscode/remix.code-snippets similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/.vscode/remix.code-snippets rename to exercises/01.setup/02.solution.running-the-app/.vscode/remix.code-snippets diff --git a/exercises/01.basics/02.solution.running-the-app/.vscode/settings.json b/exercises/01.setup/02.solution.running-the-app/.vscode/settings.json similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/.vscode/settings.json rename to exercises/01.setup/02.solution.running-the-app/.vscode/settings.json diff --git a/exercises/01.basics/02.solution.running-the-app/README.mdx b/exercises/01.setup/02.solution.running-the-app/README.mdx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/README.mdx rename to exercises/01.setup/02.solution.running-the-app/README.mdx diff --git a/exercises/01.basics/02.solution.running-the-app/app/assets/favicons/apple-touch-icon.png b/exercises/01.setup/02.solution.running-the-app/app/assets/favicons/apple-touch-icon.png similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/assets/favicons/apple-touch-icon.png rename to exercises/01.setup/02.solution.running-the-app/app/assets/favicons/apple-touch-icon.png diff --git a/exercises/01.basics/02.solution.running-the-app/app/assets/favicons/favicon.svg b/exercises/01.setup/02.solution.running-the-app/app/assets/favicons/favicon.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/assets/favicons/favicon.svg rename to exercises/01.setup/02.solution.running-the-app/app/assets/favicons/favicon.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/error-boundary.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/error-boundary.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/error-boundary.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/error-boundary.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/floating-toolbar.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/floating-toolbar.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/floating-toolbar.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/floating-toolbar.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/forms.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/forms.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/forms.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/forms.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/progress-bar.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/progress-bar.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/progress-bar.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/progress-bar.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/search-bar.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/search-bar.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/search-bar.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/search-bar.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/spacer.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/spacer.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/spacer.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/spacer.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/toaster.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/toaster.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/toaster.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/toaster.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/README.md b/exercises/01.setup/02.solution.running-the-app/app/components/ui/README.md similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/README.md rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/README.md diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/button.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/button.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/button.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/button.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/checkbox.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/checkbox.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/checkbox.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/checkbox.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/dropdown-menu.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/dropdown-menu.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/dropdown-menu.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/dropdown-menu.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/icon.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/icon.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/icon.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/icon.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/input-otp.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/input-otp.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/input-otp.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/input-otp.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/input.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/input.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/input.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/input.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/label.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/label.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/label.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/label.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/sonner.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/sonner.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/sonner.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/sonner.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/status-button.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/status-button.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/status-button.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/status-button.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/textarea.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/textarea.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/textarea.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/textarea.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/ui/tooltip.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/ui/tooltip.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/ui/tooltip.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/ui/tooltip.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/components/user-dropdown.tsx b/exercises/01.setup/02.solution.running-the-app/app/components/user-dropdown.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/components/user-dropdown.tsx rename to exercises/01.setup/02.solution.running-the-app/app/components/user-dropdown.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/entry.client.tsx b/exercises/01.setup/02.solution.running-the-app/app/entry.client.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/entry.client.tsx rename to exercises/01.setup/02.solution.running-the-app/app/entry.client.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/entry.server.tsx b/exercises/01.setup/02.solution.running-the-app/app/entry.server.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/entry.server.tsx rename to exercises/01.setup/02.solution.running-the-app/app/entry.server.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/root.tsx b/exercises/01.setup/02.solution.running-the-app/app/root.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/root.tsx rename to exercises/01.setup/02.solution.running-the-app/app/root.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes.ts b/exercises/01.setup/02.solution.running-the-app/app/routes.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/$.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/$.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/$.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/$.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/auth.$provider.callback.test.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/auth.$provider.callback.test.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/auth.$provider.callback.test.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/auth.$provider.callback.test.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/auth.$provider.callback.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/auth.$provider.callback.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/auth.$provider.callback.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/auth.$provider.callback.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/auth_.$provider.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/auth_.$provider.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/auth_.$provider.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/auth_.$provider.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/forgot-password.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/forgot-password.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/forgot-password.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/forgot-password.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/login.server.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/login.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/login.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/login.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/login.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/login.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/login.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/login.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/logout.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/logout.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/logout.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/logout.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/onboarding.server.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/onboarding.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/onboarding.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/onboarding.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/onboarding.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/onboarding.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/onboarding.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/onboarding.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/onboarding_.$provider.server.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/onboarding_.$provider.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/onboarding_.$provider.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/onboarding_.$provider.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/onboarding_.$provider.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/onboarding_.$provider.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/onboarding_.$provider.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/onboarding_.$provider.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/reset-password.server.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/reset-password.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/reset-password.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/reset-password.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/reset-password.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/reset-password.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/reset-password.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/reset-password.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/signup.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/signup.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/signup.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/signup.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/verify.server.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/verify.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/verify.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/verify.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/verify.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/verify.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/verify.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/verify.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/webauthn+/authentication.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/webauthn+/authentication.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/webauthn+/authentication.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/webauthn+/authentication.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/webauthn+/registration.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/webauthn+/registration.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/webauthn+/registration.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/webauthn+/registration.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/webauthn+/utils.server.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/webauthn+/utils.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_auth+/webauthn+/utils.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_auth+/webauthn+/utils.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/about.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/about.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/about.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/about.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/index.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/index.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/index.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/index.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/docker.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/docker.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/docker.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/docker.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/eslint.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/eslint.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/eslint.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/eslint.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/faker.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/faker.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/faker.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/faker.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/fly.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/fly.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/fly.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/fly.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/github.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/github.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/github.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/github.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/logos.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/logos.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/logos.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/logos.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/msw.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/msw.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/msw.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/msw.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/playwright.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/playwright.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/playwright.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/playwright.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/prettier.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/prettier.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/prettier.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/prettier.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/prisma.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/prisma.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/prisma.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/prisma.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/radix.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/radix.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/radix.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/radix.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/react-email.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/react-email.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/react-email.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/react-email.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/remix.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/remix.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/remix.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/remix.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/resend.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/resend.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/resend.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/resend.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/sentry.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/sentry.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/sentry.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/sentry.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/shadcn-ui.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/shadcn-ui.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/shadcn-ui.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/shadcn-ui.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/sqlite.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/sqlite.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/sqlite.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/sqlite.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/stars.jpg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/stars.jpg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/stars.jpg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/stars.jpg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/tailwind.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/tailwind.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/tailwind.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/tailwind.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/testing-library.png b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/testing-library.png similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/testing-library.png rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/testing-library.png diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/typescript.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/typescript.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/typescript.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/typescript.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/vitest.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/vitest.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/vitest.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/vitest.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/zod.svg b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/zod.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/logos/zod.svg rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/logos/zod.svg diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/privacy.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/privacy.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/privacy.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/privacy.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/support.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/support.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/support.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/support.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/tos.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/tos.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_marketing+/tos.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/_marketing+/tos.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_seo+/robots[.]txt.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_seo+/robots[.]txt.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_seo+/robots[.]txt.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_seo+/robots[.]txt.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/_seo+/sitemap[.]xml.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/_seo+/sitemap[.]xml.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/_seo+/sitemap[.]xml.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/_seo+/sitemap[.]xml.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/admin+/cache.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/admin+/cache.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/admin+/cache.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/admin+/cache.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/admin+/cache_.lru.$cacheKey.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/admin+/cache_.lru.$cacheKey.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/admin+/cache_.lru.$cacheKey.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/admin+/cache_.lru.$cacheKey.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.$cacheKey.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.$cacheKey.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.$cacheKey.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.$cacheKey.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.server.ts b/exercises/01.setup/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/admin+/cache_.sqlite.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/me.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/me.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/me.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/me.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/resources+/download-user-data.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/resources+/download-user-data.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/resources+/download-user-data.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/resources+/download-user-data.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/resources+/healthcheck.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/resources+/healthcheck.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/resources+/healthcheck.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/resources+/healthcheck.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/resources+/images.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/resources+/images.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/resources+/images.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/resources+/images.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/resources+/theme-switch.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/resources+/theme-switch.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/resources+/theme-switch.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/resources+/theme-switch.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.change-email.server.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.change-email.server.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.change-email.server.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.change-email.server.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.change-email.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.change-email.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.change-email.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.change-email.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.connections.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.connections.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.connections.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.connections.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.index.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.index.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.index.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.index.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.passkeys.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.passkeys.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.passkeys.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.passkeys.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.password.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.password.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.password.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.password.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.password_.create.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.password_.create.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.password_.create.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.password_.create.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.photo.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.photo.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.photo.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.photo.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.two-factor.disable.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.two-factor.disable.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.two-factor.disable.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.two-factor.disable.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.two-factor.index.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.two-factor.index.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.two-factor.index.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.two-factor.index.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.two-factor.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.two-factor.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.two-factor.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.two-factor.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.two-factor.verify.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.two-factor.verify.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/settings+/profile.two-factor.verify.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/settings+/profile.two-factor.verify.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username.test.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username.test.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username.test.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username.test.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/__note-editor.server.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/__note-editor.server.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/__note-editor.server.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/__note-editor.server.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/__note-editor.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/__note-editor.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/__note-editor.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/notes.$noteId.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/notes.$noteId.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/notes.$noteId.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/notes.$noteId.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/notes.$noteId_.edit.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/notes.$noteId_.edit.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/notes.$noteId_.edit.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/notes.$noteId_.edit.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/notes.index.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/notes.index.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/notes.index.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/notes.index.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/notes.new.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/notes.new.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/notes.new.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/notes.new.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/notes.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/notes.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/users+/$username_+/notes.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/users+/$username_+/notes.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/routes/users+/index.tsx b/exercises/01.setup/02.solution.running-the-app/app/routes/users+/index.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/routes/users+/index.tsx rename to exercises/01.setup/02.solution.running-the-app/app/routes/users+/index.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/styles/tailwind.css b/exercises/01.setup/02.solution.running-the-app/app/styles/tailwind.css similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/styles/tailwind.css rename to exercises/01.setup/02.solution.running-the-app/app/styles/tailwind.css diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/auth.server.test.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/auth.server.test.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/auth.server.test.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/auth.server.test.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/auth.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/auth.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/auth.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/auth.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/cache.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/cache.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/cache.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/cache.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/client-hints.tsx b/exercises/01.setup/02.solution.running-the-app/app/utils/client-hints.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/client-hints.tsx rename to exercises/01.setup/02.solution.running-the-app/app/utils/client-hints.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/connections.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/connections.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/connections.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/connections.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/connections.tsx b/exercises/01.setup/02.solution.running-the-app/app/utils/connections.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/connections.tsx rename to exercises/01.setup/02.solution.running-the-app/app/utils/connections.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/db.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/db.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/db.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/db.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/email.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/email.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/email.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/email.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/env.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/env.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/env.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/env.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/headers.server.test.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/headers.server.test.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/headers.server.test.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/headers.server.test.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/headers.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/headers.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/headers.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/headers.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/honeypot.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/honeypot.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/honeypot.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/honeypot.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/litefs.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/litefs.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/litefs.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/litefs.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/misc.error-message.test.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/misc.error-message.test.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/misc.error-message.test.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/misc.error-message.test.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/misc.tsx b/exercises/01.setup/02.solution.running-the-app/app/utils/misc.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/misc.tsx rename to exercises/01.setup/02.solution.running-the-app/app/utils/misc.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/misc.use-double-check.test.tsx b/exercises/01.setup/02.solution.running-the-app/app/utils/misc.use-double-check.test.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/misc.use-double-check.test.tsx rename to exercises/01.setup/02.solution.running-the-app/app/utils/misc.use-double-check.test.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/monitoring.client.tsx b/exercises/01.setup/02.solution.running-the-app/app/utils/monitoring.client.tsx similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/monitoring.client.tsx rename to exercises/01.setup/02.solution.running-the-app/app/utils/monitoring.client.tsx diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/nonce-provider.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/nonce-provider.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/nonce-provider.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/nonce-provider.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/permissions.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/permissions.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/permissions.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/permissions.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/providers/constants.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/providers/constants.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/providers/constants.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/providers/constants.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/providers/github.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/providers/github.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/providers/github.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/providers/github.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/providers/provider.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/providers/provider.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/providers/provider.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/providers/provider.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/redirect-cookie.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/redirect-cookie.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/redirect-cookie.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/redirect-cookie.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/request-info.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/request-info.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/request-info.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/request-info.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/session.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/session.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/session.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/session.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/storage.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/storage.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/storage.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/storage.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/theme.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/theme.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/theme.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/theme.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/timing.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/timing.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/timing.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/timing.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/toast.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/toast.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/toast.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/toast.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/totp.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/totp.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/totp.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/totp.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/user-validation.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/user-validation.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/user-validation.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/user-validation.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/user.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/user.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/user.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/user.ts diff --git a/exercises/01.basics/02.solution.running-the-app/app/utils/verification.server.ts b/exercises/01.setup/02.solution.running-the-app/app/utils/verification.server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/app/utils/verification.server.ts rename to exercises/01.setup/02.solution.running-the-app/app/utils/verification.server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/components.json b/exercises/01.setup/02.solution.running-the-app/components.json similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/components.json rename to exercises/01.setup/02.solution.running-the-app/components.json diff --git a/exercises/01.basics/02.solution.running-the-app/eslint.config.js b/exercises/01.setup/02.solution.running-the-app/eslint.config.js similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/eslint.config.js rename to exercises/01.setup/02.solution.running-the-app/eslint.config.js diff --git a/exercises/01.basics/02.solution.running-the-app/fly.toml b/exercises/01.setup/02.solution.running-the-app/fly.toml similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/fly.toml rename to exercises/01.setup/02.solution.running-the-app/fly.toml diff --git a/exercises/01.basics/02.solution.running-the-app/index.js b/exercises/01.setup/02.solution.running-the-app/index.js similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/index.js rename to exercises/01.setup/02.solution.running-the-app/index.js diff --git a/exercises/01.basics/02.solution.running-the-app/other/Dockerfile b/exercises/01.setup/02.solution.running-the-app/other/Dockerfile similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/Dockerfile rename to exercises/01.setup/02.solution.running-the-app/other/Dockerfile diff --git a/exercises/01.basics/02.solution.running-the-app/other/Dockerfile.dockerignore b/exercises/01.setup/02.solution.running-the-app/other/Dockerfile.dockerignore similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/Dockerfile.dockerignore rename to exercises/01.setup/02.solution.running-the-app/other/Dockerfile.dockerignore diff --git a/exercises/01.basics/02.solution.running-the-app/other/README.md b/exercises/01.setup/02.solution.running-the-app/other/README.md similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/README.md rename to exercises/01.setup/02.solution.running-the-app/other/README.md diff --git a/exercises/01.basics/02.solution.running-the-app/other/build-server.ts b/exercises/01.setup/02.solution.running-the-app/other/build-server.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/build-server.ts rename to exercises/01.setup/02.solution.running-the-app/other/build-server.ts diff --git a/exercises/01.basics/02.solution.running-the-app/other/litefs.yml b/exercises/01.setup/02.solution.running-the-app/other/litefs.yml similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/litefs.yml rename to exercises/01.setup/02.solution.running-the-app/other/litefs.yml diff --git a/exercises/01.basics/02.solution.running-the-app/other/sly/sly.json b/exercises/01.setup/02.solution.running-the-app/other/sly/sly.json similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/sly/sly.json rename to exercises/01.setup/02.solution.running-the-app/other/sly/sly.json diff --git a/exercises/01.basics/02.solution.running-the-app/other/sly/transform-icon.ts b/exercises/01.setup/02.solution.running-the-app/other/sly/transform-icon.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/sly/transform-icon.ts rename to exercises/01.setup/02.solution.running-the-app/other/sly/transform-icon.ts diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/README.md b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/README.md similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/README.md rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/README.md diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/arrow-left.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/arrow-left.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/arrow-left.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/arrow-left.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/arrow-right.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/arrow-right.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/arrow-right.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/arrow-right.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/avatar.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/avatar.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/avatar.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/avatar.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/camera.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/camera.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/camera.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/camera.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/check.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/check.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/check.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/check.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/clock.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/clock.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/clock.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/clock.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/cross-1.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/cross-1.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/cross-1.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/cross-1.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/dots-horizontal.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/dots-horizontal.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/dots-horizontal.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/dots-horizontal.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/download.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/download.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/download.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/download.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/envelope-closed.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/envelope-closed.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/envelope-closed.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/envelope-closed.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/exit.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/exit.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/exit.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/exit.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/file-text.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/file-text.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/file-text.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/file-text.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/github-logo.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/github-logo.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/github-logo.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/github-logo.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/laptop.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/laptop.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/laptop.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/laptop.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/link-2.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/link-2.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/link-2.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/link-2.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/lock-closed.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/lock-closed.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/lock-closed.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/lock-closed.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/lock-open-1.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/lock-open-1.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/lock-open-1.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/lock-open-1.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/magnifying-glass.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/magnifying-glass.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/magnifying-glass.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/magnifying-glass.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/moon.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/moon.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/moon.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/moon.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/passkey.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/passkey.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/passkey.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/passkey.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/pencil-1.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/pencil-1.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/pencil-1.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/pencil-1.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/pencil-2.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/pencil-2.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/pencil-2.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/pencil-2.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/plus.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/plus.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/plus.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/plus.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/question-mark-circled.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/question-mark-circled.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/question-mark-circled.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/question-mark-circled.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/reset.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/reset.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/reset.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/reset.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/sun.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/sun.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/sun.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/sun.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/trash.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/trash.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/trash.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/trash.svg diff --git a/exercises/01.basics/02.solution.running-the-app/other/svg-icons/update.svg b/exercises/01.setup/02.solution.running-the-app/other/svg-icons/update.svg similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/other/svg-icons/update.svg rename to exercises/01.setup/02.solution.running-the-app/other/svg-icons/update.svg diff --git a/exercises/01.basics/02.solution.running-the-app/package-lock.json b/exercises/01.setup/02.solution.running-the-app/package-lock.json similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/package-lock.json rename to exercises/01.setup/02.solution.running-the-app/package-lock.json diff --git a/exercises/01.basics/02.solution.running-the-app/package.json b/exercises/01.setup/02.solution.running-the-app/package.json similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/package.json rename to exercises/01.setup/02.solution.running-the-app/package.json diff --git a/exercises/01.basics/02.solution.running-the-app/playwright.config.ts b/exercises/01.setup/02.solution.running-the-app/playwright.config.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/playwright.config.ts rename to exercises/01.setup/02.solution.running-the-app/playwright.config.ts diff --git a/exercises/01.basics/02.solution.running-the-app/prisma/migrations/20250221233640_init/migration.sql b/exercises/01.setup/02.solution.running-the-app/prisma/migrations/20250221233640_init/migration.sql similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/prisma/migrations/20250221233640_init/migration.sql rename to exercises/01.setup/02.solution.running-the-app/prisma/migrations/20250221233640_init/migration.sql diff --git a/exercises/01.basics/02.solution.running-the-app/prisma/migrations/migration_lock.toml b/exercises/01.setup/02.solution.running-the-app/prisma/migrations/migration_lock.toml similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/prisma/migrations/migration_lock.toml rename to exercises/01.setup/02.solution.running-the-app/prisma/migrations/migration_lock.toml diff --git a/exercises/01.basics/02.solution.running-the-app/prisma/schema.prisma b/exercises/01.setup/02.solution.running-the-app/prisma/schema.prisma similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/prisma/schema.prisma rename to exercises/01.setup/02.solution.running-the-app/prisma/schema.prisma diff --git a/exercises/01.basics/02.solution.running-the-app/prisma/seed.ts b/exercises/01.setup/02.solution.running-the-app/prisma/seed.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/prisma/seed.ts rename to exercises/01.setup/02.solution.running-the-app/prisma/seed.ts diff --git a/exercises/01.basics/02.solution.running-the-app/prisma/sql/searchUsers.sql b/exercises/01.setup/02.solution.running-the-app/prisma/sql/searchUsers.sql similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/prisma/sql/searchUsers.sql rename to exercises/01.setup/02.solution.running-the-app/prisma/sql/searchUsers.sql diff --git a/exercises/01.basics/02.solution.running-the-app/public/favicon.ico b/exercises/01.setup/02.solution.running-the-app/public/favicon.ico similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/public/favicon.ico rename to exercises/01.setup/02.solution.running-the-app/public/favicon.ico diff --git a/exercises/01.basics/02.solution.running-the-app/public/favicons/README.md b/exercises/01.setup/02.solution.running-the-app/public/favicons/README.md similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/public/favicons/README.md rename to exercises/01.setup/02.solution.running-the-app/public/favicons/README.md diff --git a/exercises/01.basics/02.solution.running-the-app/public/favicons/android-chrome-192x192.png b/exercises/01.setup/02.solution.running-the-app/public/favicons/android-chrome-192x192.png similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/public/favicons/android-chrome-192x192.png rename to exercises/01.setup/02.solution.running-the-app/public/favicons/android-chrome-192x192.png diff --git a/exercises/01.basics/02.solution.running-the-app/public/favicons/android-chrome-512x512.png b/exercises/01.setup/02.solution.running-the-app/public/favicons/android-chrome-512x512.png similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/public/favicons/android-chrome-512x512.png rename to exercises/01.setup/02.solution.running-the-app/public/favicons/android-chrome-512x512.png diff --git a/exercises/01.basics/02.solution.running-the-app/public/img/user.png b/exercises/01.setup/02.solution.running-the-app/public/img/user.png similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/public/img/user.png rename to exercises/01.setup/02.solution.running-the-app/public/img/user.png diff --git a/exercises/01.basics/02.solution.running-the-app/public/site.webmanifest b/exercises/01.setup/02.solution.running-the-app/public/site.webmanifest similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/public/site.webmanifest rename to exercises/01.setup/02.solution.running-the-app/public/site.webmanifest diff --git a/exercises/01.basics/02.solution.running-the-app/react-router.config.ts b/exercises/01.setup/02.solution.running-the-app/react-router.config.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/react-router.config.ts rename to exercises/01.setup/02.solution.running-the-app/react-router.config.ts diff --git a/exercises/01.basics/02.solution.running-the-app/server/dev-server.js b/exercises/01.setup/02.solution.running-the-app/server/dev-server.js similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/server/dev-server.js rename to exercises/01.setup/02.solution.running-the-app/server/dev-server.js diff --git a/exercises/01.basics/02.solution.running-the-app/server/index.ts b/exercises/01.setup/02.solution.running-the-app/server/index.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/server/index.ts rename to exercises/01.setup/02.solution.running-the-app/server/index.ts diff --git a/exercises/01.basics/02.solution.running-the-app/server/utils/monitoring.ts b/exercises/01.setup/02.solution.running-the-app/server/utils/monitoring.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/server/utils/monitoring.ts rename to exercises/01.setup/02.solution.running-the-app/server/utils/monitoring.ts diff --git a/exercises/01.basics/02.solution.running-the-app/tests/db-utils.ts b/exercises/01.setup/02.solution.running-the-app/tests/db-utils.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/tests/db-utils.ts rename to exercises/01.setup/02.solution.running-the-app/tests/db-utils.ts diff --git a/exercises/01.basics/02.solution.running-the-app/tests/e2e/homepage.test.ts b/exercises/01.setup/02.solution.running-the-app/tests/e2e/homepage.test.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/tests/e2e/homepage.test.ts rename to exercises/01.setup/02.solution.running-the-app/tests/e2e/homepage.test.ts diff --git a/exercises/01.basics/02.solution.running-the-app/tests/setup/custom-matchers.ts b/exercises/01.setup/02.solution.running-the-app/tests/setup/custom-matchers.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/tests/setup/custom-matchers.ts rename to exercises/01.setup/02.solution.running-the-app/tests/setup/custom-matchers.ts diff --git a/exercises/01.basics/02.solution.running-the-app/tests/setup/db-setup.ts b/exercises/01.setup/02.solution.running-the-app/tests/setup/db-setup.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/tests/setup/db-setup.ts rename to exercises/01.setup/02.solution.running-the-app/tests/setup/db-setup.ts diff --git a/exercises/01.basics/02.solution.running-the-app/tests/setup/global-setup.ts b/exercises/01.setup/02.solution.running-the-app/tests/setup/global-setup.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/tests/setup/global-setup.ts rename to exercises/01.setup/02.solution.running-the-app/tests/setup/global-setup.ts diff --git a/exercises/01.basics/02.solution.running-the-app/tests/setup/setup-test-env.ts b/exercises/01.setup/02.solution.running-the-app/tests/setup/setup-test-env.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/tests/setup/setup-test-env.ts rename to exercises/01.setup/02.solution.running-the-app/tests/setup/setup-test-env.ts diff --git a/exercises/01.basics/02.solution.running-the-app/tests/utils.ts b/exercises/01.setup/02.solution.running-the-app/tests/utils.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/tests/utils.ts rename to exercises/01.setup/02.solution.running-the-app/tests/utils.ts diff --git a/exercises/01.basics/02.solution.running-the-app/tsconfig.json b/exercises/01.setup/02.solution.running-the-app/tsconfig.json similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/tsconfig.json rename to exercises/01.setup/02.solution.running-the-app/tsconfig.json diff --git a/exercises/01.basics/02.solution.running-the-app/types/deps.d.ts b/exercises/01.setup/02.solution.running-the-app/types/deps.d.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/types/deps.d.ts rename to exercises/01.setup/02.solution.running-the-app/types/deps.d.ts diff --git a/exercises/01.basics/02.solution.running-the-app/types/env.env.d.ts b/exercises/01.setup/02.solution.running-the-app/types/env.env.d.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/types/env.env.d.ts rename to exercises/01.setup/02.solution.running-the-app/types/env.env.d.ts diff --git a/exercises/01.basics/02.solution.running-the-app/types/icon-name.d.ts b/exercises/01.setup/02.solution.running-the-app/types/icon-name.d.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/types/icon-name.d.ts rename to exercises/01.setup/02.solution.running-the-app/types/icon-name.d.ts diff --git a/exercises/01.basics/02.solution.running-the-app/types/reset.d.ts b/exercises/01.setup/02.solution.running-the-app/types/reset.d.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/types/reset.d.ts rename to exercises/01.setup/02.solution.running-the-app/types/reset.d.ts diff --git a/exercises/01.basics/02.solution.running-the-app/vite.config.ts b/exercises/01.setup/02.solution.running-the-app/vite.config.ts similarity index 100% rename from exercises/01.basics/02.solution.running-the-app/vite.config.ts rename to exercises/01.setup/02.solution.running-the-app/vite.config.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/.env b/exercises/01.setup/03.problem.custom-fixtures/.env similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/.env rename to exercises/01.setup/03.problem.custom-fixtures/.env diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/.env.example b/exercises/01.setup/03.problem.custom-fixtures/.env.example similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/.env.example rename to exercises/01.setup/03.problem.custom-fixtures/.env.example diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/.github/PULL_REQUEST_TEMPLATE.md b/exercises/01.setup/03.problem.custom-fixtures/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/.github/PULL_REQUEST_TEMPLATE.md rename to exercises/01.setup/03.problem.custom-fixtures/.github/PULL_REQUEST_TEMPLATE.md diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/.github/workflows/deploy.yml b/exercises/01.setup/03.problem.custom-fixtures/.github/workflows/deploy.yml similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/.github/workflows/deploy.yml rename to exercises/01.setup/03.problem.custom-fixtures/.github/workflows/deploy.yml diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/.gitignore b/exercises/01.setup/03.problem.custom-fixtures/.gitignore similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/.gitignore rename to exercises/01.setup/03.problem.custom-fixtures/.gitignore diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/.npmrc b/exercises/01.setup/03.problem.custom-fixtures/.npmrc similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/.npmrc rename to exercises/01.setup/03.problem.custom-fixtures/.npmrc diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/.prettierignore b/exercises/01.setup/03.problem.custom-fixtures/.prettierignore similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/.prettierignore rename to exercises/01.setup/03.problem.custom-fixtures/.prettierignore diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/.vscode/extensions.json b/exercises/01.setup/03.problem.custom-fixtures/.vscode/extensions.json similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/.vscode/extensions.json rename to exercises/01.setup/03.problem.custom-fixtures/.vscode/extensions.json diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/.vscode/remix.code-snippets b/exercises/01.setup/03.problem.custom-fixtures/.vscode/remix.code-snippets similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/.vscode/remix.code-snippets rename to exercises/01.setup/03.problem.custom-fixtures/.vscode/remix.code-snippets diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/.vscode/settings.json b/exercises/01.setup/03.problem.custom-fixtures/.vscode/settings.json similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/.vscode/settings.json rename to exercises/01.setup/03.problem.custom-fixtures/.vscode/settings.json diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/README.mdx b/exercises/01.setup/03.problem.custom-fixtures/README.mdx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/README.mdx rename to exercises/01.setup/03.problem.custom-fixtures/README.mdx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/assets/favicons/apple-touch-icon.png b/exercises/01.setup/03.problem.custom-fixtures/app/assets/favicons/apple-touch-icon.png similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/assets/favicons/apple-touch-icon.png rename to exercises/01.setup/03.problem.custom-fixtures/app/assets/favicons/apple-touch-icon.png diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/assets/favicons/favicon.svg b/exercises/01.setup/03.problem.custom-fixtures/app/assets/favicons/favicon.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/assets/favicons/favicon.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/assets/favicons/favicon.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/error-boundary.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/error-boundary.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/error-boundary.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/error-boundary.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/floating-toolbar.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/floating-toolbar.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/floating-toolbar.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/floating-toolbar.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/forms.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/forms.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/forms.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/forms.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/progress-bar.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/progress-bar.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/progress-bar.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/progress-bar.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/search-bar.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/search-bar.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/search-bar.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/search-bar.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/spacer.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/spacer.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/spacer.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/spacer.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/toaster.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/toaster.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/toaster.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/toaster.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/README.md b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/README.md similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/README.md rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/README.md diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/button.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/button.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/button.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/button.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/checkbox.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/checkbox.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/checkbox.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/checkbox.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/dropdown-menu.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/dropdown-menu.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/dropdown-menu.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/dropdown-menu.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/icon.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/icon.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/icon.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/icon.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/input-otp.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/input-otp.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/input-otp.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/input-otp.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/input.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/input.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/input.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/input.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/label.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/label.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/label.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/label.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/sonner.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/sonner.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/sonner.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/sonner.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/status-button.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/status-button.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/status-button.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/status-button.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/textarea.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/textarea.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/textarea.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/textarea.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/tooltip.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/ui/tooltip.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/ui/tooltip.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/ui/tooltip.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/components/user-dropdown.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/components/user-dropdown.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/components/user-dropdown.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/components/user-dropdown.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/entry.client.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/entry.client.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/entry.client.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/entry.client.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/entry.server.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/entry.server.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/entry.server.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/entry.server.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/root.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/root.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/root.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/root.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/$.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/$.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/$.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/$.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/auth.$provider.callback.test.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/auth.$provider.callback.test.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/auth.$provider.callback.test.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/auth.$provider.callback.test.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/auth.$provider.callback.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/auth.$provider.callback.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/auth.$provider.callback.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/auth.$provider.callback.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/auth_.$provider.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/auth_.$provider.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/auth_.$provider.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/auth_.$provider.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/forgot-password.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/forgot-password.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/forgot-password.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/forgot-password.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/login.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/login.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/login.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/login.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/login.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/login.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/login.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/login.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/logout.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/logout.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/logout.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/logout.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/onboarding.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/onboarding.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/onboarding.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/onboarding.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/onboarding.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/onboarding.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/onboarding.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/onboarding.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/onboarding_.$provider.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/onboarding_.$provider.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/onboarding_.$provider.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/onboarding_.$provider.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/onboarding_.$provider.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/onboarding_.$provider.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/onboarding_.$provider.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/onboarding_.$provider.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/reset-password.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/reset-password.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/reset-password.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/reset-password.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/reset-password.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/reset-password.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/reset-password.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/reset-password.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/signup.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/signup.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/signup.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/signup.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/verify.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/verify.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/verify.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/verify.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/verify.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/verify.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/verify.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/verify.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/webauthn+/authentication.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/webauthn+/authentication.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/webauthn+/authentication.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/webauthn+/authentication.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/webauthn+/registration.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/webauthn+/registration.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/webauthn+/registration.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/webauthn+/registration.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/webauthn+/utils.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/webauthn+/utils.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_auth+/webauthn+/utils.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_auth+/webauthn+/utils.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/about.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/about.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/about.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/about.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/index.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/index.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/index.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/index.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/docker.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/docker.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/docker.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/docker.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/eslint.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/eslint.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/eslint.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/eslint.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/faker.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/faker.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/faker.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/faker.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/fly.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/fly.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/fly.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/fly.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/github.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/github.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/github.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/github.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/logos.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/logos.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/logos.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/logos.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/msw.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/msw.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/msw.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/msw.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/playwright.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/playwright.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/playwright.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/playwright.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/prettier.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/prettier.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/prettier.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/prettier.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/prisma.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/prisma.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/prisma.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/prisma.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/radix.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/radix.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/radix.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/radix.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/react-email.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/react-email.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/react-email.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/react-email.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/remix.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/remix.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/remix.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/remix.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/resend.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/resend.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/resend.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/resend.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/sentry.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/sentry.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/sentry.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/sentry.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/shadcn-ui.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/shadcn-ui.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/shadcn-ui.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/shadcn-ui.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/sqlite.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/sqlite.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/sqlite.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/sqlite.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/stars.jpg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/stars.jpg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/stars.jpg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/stars.jpg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/tailwind.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/tailwind.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/tailwind.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/tailwind.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/testing-library.png b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/testing-library.png similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/testing-library.png rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/testing-library.png diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/typescript.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/typescript.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/typescript.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/typescript.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/vitest.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/vitest.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/vitest.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/vitest.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/zod.svg b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/zod.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/logos/zod.svg rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/logos/zod.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/privacy.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/privacy.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/privacy.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/privacy.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/support.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/support.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/support.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/support.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/tos.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/tos.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_marketing+/tos.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_marketing+/tos.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_seo+/robots[.]txt.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_seo+/robots[.]txt.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_seo+/robots[.]txt.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_seo+/robots[.]txt.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_seo+/sitemap[.]xml.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/_seo+/sitemap[.]xml.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/_seo+/sitemap[.]xml.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/_seo+/sitemap[.]xml.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/admin+/cache.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/admin+/cache.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/admin+/cache.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/admin+/cache.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/admin+/cache_.lru.$cacheKey.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/admin+/cache_.lru.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/admin+/cache_.lru.$cacheKey.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/admin+/cache_.lru.$cacheKey.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.$cacheKey.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.$cacheKey.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.$cacheKey.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/admin+/cache_.sqlite.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/me.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/me.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/me.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/me.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/resources+/download-user-data.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/resources+/download-user-data.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/resources+/download-user-data.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/resources+/download-user-data.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/resources+/healthcheck.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/resources+/healthcheck.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/resources+/healthcheck.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/resources+/healthcheck.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/resources+/images.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/resources+/images.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/resources+/images.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/resources+/images.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/resources+/theme-switch.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/resources+/theme-switch.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/resources+/theme-switch.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/resources+/theme-switch.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.change-email.server.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.change-email.server.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.change-email.server.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.change-email.server.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.change-email.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.change-email.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.change-email.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.change-email.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.connections.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.connections.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.connections.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.connections.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.index.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.index.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.index.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.index.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.passkeys.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.passkeys.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.passkeys.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.passkeys.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.password.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.password.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.password.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.password.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.password_.create.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.password_.create.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.password_.create.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.password_.create.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.photo.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.photo.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.photo.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.photo.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.two-factor.disable.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.two-factor.disable.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.two-factor.disable.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.two-factor.disable.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.two-factor.index.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.two-factor.index.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.two-factor.index.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.two-factor.index.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.two-factor.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.two-factor.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.two-factor.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.two-factor.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.two-factor.verify.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.two-factor.verify.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/settings+/profile.two-factor.verify.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/settings+/profile.two-factor.verify.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username.test.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username.test.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username.test.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username.test.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/__note-editor.server.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/__note-editor.server.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/__note-editor.server.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/__note-editor.server.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/__note-editor.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/__note-editor.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/__note-editor.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/notes.$noteId.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/notes.$noteId.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/notes.$noteId.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/notes.$noteId.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/notes.$noteId_.edit.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/notes.$noteId_.edit.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/notes.$noteId_.edit.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/notes.$noteId_.edit.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/notes.index.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/notes.index.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/notes.index.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/notes.index.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/notes.new.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/notes.new.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/notes.new.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/notes.new.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/notes.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/notes.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/$username_+/notes.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/$username_+/notes.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/index.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/index.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/routes/users+/index.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/routes/users+/index.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/styles/tailwind.css b/exercises/01.setup/03.problem.custom-fixtures/app/styles/tailwind.css similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/styles/tailwind.css rename to exercises/01.setup/03.problem.custom-fixtures/app/styles/tailwind.css diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/auth.server.test.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/auth.server.test.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/auth.server.test.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/auth.server.test.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/auth.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/auth.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/auth.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/auth.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/cache.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/cache.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/cache.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/cache.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/client-hints.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/utils/client-hints.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/client-hints.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/client-hints.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/connections.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/connections.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/connections.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/connections.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/connections.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/utils/connections.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/connections.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/connections.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/db.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/db.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/db.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/db.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/email.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/email.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/email.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/email.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/env.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/env.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/env.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/env.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/headers.server.test.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/headers.server.test.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/headers.server.test.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/headers.server.test.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/headers.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/headers.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/headers.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/headers.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/honeypot.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/honeypot.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/honeypot.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/honeypot.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/litefs.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/litefs.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/litefs.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/litefs.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/misc.error-message.test.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/misc.error-message.test.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/misc.error-message.test.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/misc.error-message.test.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/misc.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/utils/misc.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/misc.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/misc.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/misc.use-double-check.test.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/utils/misc.use-double-check.test.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/misc.use-double-check.test.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/misc.use-double-check.test.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/monitoring.client.tsx b/exercises/01.setup/03.problem.custom-fixtures/app/utils/monitoring.client.tsx similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/monitoring.client.tsx rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/monitoring.client.tsx diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/nonce-provider.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/nonce-provider.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/nonce-provider.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/nonce-provider.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/permissions.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/permissions.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/permissions.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/permissions.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/providers/constants.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/providers/constants.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/providers/constants.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/providers/constants.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/providers/github.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/providers/github.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/providers/github.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/providers/github.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/providers/provider.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/providers/provider.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/providers/provider.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/providers/provider.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/redirect-cookie.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/redirect-cookie.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/redirect-cookie.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/redirect-cookie.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/request-info.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/request-info.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/request-info.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/request-info.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/session.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/session.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/session.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/session.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/storage.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/storage.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/storage.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/storage.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/theme.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/theme.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/theme.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/theme.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/timing.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/timing.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/timing.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/timing.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/toast.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/toast.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/toast.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/toast.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/totp.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/totp.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/totp.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/totp.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/user-validation.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/user-validation.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/user-validation.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/user-validation.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/user.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/user.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/user.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/user.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/app/utils/verification.server.ts b/exercises/01.setup/03.problem.custom-fixtures/app/utils/verification.server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/app/utils/verification.server.ts rename to exercises/01.setup/03.problem.custom-fixtures/app/utils/verification.server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/components.json b/exercises/01.setup/03.problem.custom-fixtures/components.json similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/components.json rename to exercises/01.setup/03.problem.custom-fixtures/components.json diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/eslint.config.js b/exercises/01.setup/03.problem.custom-fixtures/eslint.config.js similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/eslint.config.js rename to exercises/01.setup/03.problem.custom-fixtures/eslint.config.js diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/fly.toml b/exercises/01.setup/03.problem.custom-fixtures/fly.toml similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/fly.toml rename to exercises/01.setup/03.problem.custom-fixtures/fly.toml diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/index.js b/exercises/01.setup/03.problem.custom-fixtures/index.js similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/index.js rename to exercises/01.setup/03.problem.custom-fixtures/index.js diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/Dockerfile b/exercises/01.setup/03.problem.custom-fixtures/other/Dockerfile similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/Dockerfile rename to exercises/01.setup/03.problem.custom-fixtures/other/Dockerfile diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/Dockerfile.dockerignore b/exercises/01.setup/03.problem.custom-fixtures/other/Dockerfile.dockerignore similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/Dockerfile.dockerignore rename to exercises/01.setup/03.problem.custom-fixtures/other/Dockerfile.dockerignore diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/README.md b/exercises/01.setup/03.problem.custom-fixtures/other/README.md similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/README.md rename to exercises/01.setup/03.problem.custom-fixtures/other/README.md diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/build-server.ts b/exercises/01.setup/03.problem.custom-fixtures/other/build-server.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/build-server.ts rename to exercises/01.setup/03.problem.custom-fixtures/other/build-server.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/litefs.yml b/exercises/01.setup/03.problem.custom-fixtures/other/litefs.yml similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/litefs.yml rename to exercises/01.setup/03.problem.custom-fixtures/other/litefs.yml diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/sly/sly.json b/exercises/01.setup/03.problem.custom-fixtures/other/sly/sly.json similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/sly/sly.json rename to exercises/01.setup/03.problem.custom-fixtures/other/sly/sly.json diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/sly/transform-icon.ts b/exercises/01.setup/03.problem.custom-fixtures/other/sly/transform-icon.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/sly/transform-icon.ts rename to exercises/01.setup/03.problem.custom-fixtures/other/sly/transform-icon.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/README.md b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/README.md similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/README.md rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/README.md diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/arrow-left.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/arrow-left.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/arrow-left.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/arrow-left.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/arrow-right.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/arrow-right.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/arrow-right.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/arrow-right.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/avatar.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/avatar.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/avatar.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/avatar.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/camera.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/camera.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/camera.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/camera.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/check.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/check.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/check.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/check.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/clock.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/clock.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/clock.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/clock.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/cross-1.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/cross-1.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/cross-1.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/cross-1.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/dots-horizontal.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/dots-horizontal.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/dots-horizontal.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/dots-horizontal.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/download.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/download.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/download.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/download.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/envelope-closed.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/envelope-closed.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/envelope-closed.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/envelope-closed.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/exit.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/exit.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/exit.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/exit.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/file-text.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/file-text.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/file-text.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/file-text.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/github-logo.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/github-logo.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/github-logo.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/github-logo.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/laptop.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/laptop.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/laptop.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/laptop.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/link-2.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/link-2.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/link-2.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/link-2.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/lock-closed.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/lock-closed.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/lock-closed.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/lock-closed.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/lock-open-1.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/lock-open-1.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/lock-open-1.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/lock-open-1.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/magnifying-glass.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/magnifying-glass.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/magnifying-glass.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/magnifying-glass.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/moon.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/moon.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/moon.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/moon.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/passkey.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/passkey.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/passkey.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/passkey.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/pencil-1.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/pencil-1.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/pencil-1.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/pencil-1.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/pencil-2.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/pencil-2.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/pencil-2.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/pencil-2.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/plus.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/plus.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/plus.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/plus.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/question-mark-circled.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/question-mark-circled.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/question-mark-circled.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/question-mark-circled.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/reset.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/reset.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/reset.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/reset.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/sun.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/sun.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/sun.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/sun.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/trash.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/trash.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/trash.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/trash.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/update.svg b/exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/update.svg similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/other/svg-icons/update.svg rename to exercises/01.setup/03.problem.custom-fixtures/other/svg-icons/update.svg diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/package-lock.json b/exercises/01.setup/03.problem.custom-fixtures/package-lock.json similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/package-lock.json rename to exercises/01.setup/03.problem.custom-fixtures/package-lock.json diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/package.json b/exercises/01.setup/03.problem.custom-fixtures/package.json similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/package.json rename to exercises/01.setup/03.problem.custom-fixtures/package.json diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/playwright.config.ts b/exercises/01.setup/03.problem.custom-fixtures/playwright.config.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/playwright.config.ts rename to exercises/01.setup/03.problem.custom-fixtures/playwright.config.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/prisma/migrations/20250221233640_init/migration.sql b/exercises/01.setup/03.problem.custom-fixtures/prisma/migrations/20250221233640_init/migration.sql similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/prisma/migrations/20250221233640_init/migration.sql rename to exercises/01.setup/03.problem.custom-fixtures/prisma/migrations/20250221233640_init/migration.sql diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/prisma/migrations/migration_lock.toml b/exercises/01.setup/03.problem.custom-fixtures/prisma/migrations/migration_lock.toml similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/prisma/migrations/migration_lock.toml rename to exercises/01.setup/03.problem.custom-fixtures/prisma/migrations/migration_lock.toml diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/prisma/schema.prisma b/exercises/01.setup/03.problem.custom-fixtures/prisma/schema.prisma similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/prisma/schema.prisma rename to exercises/01.setup/03.problem.custom-fixtures/prisma/schema.prisma diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/prisma/seed.ts b/exercises/01.setup/03.problem.custom-fixtures/prisma/seed.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/prisma/seed.ts rename to exercises/01.setup/03.problem.custom-fixtures/prisma/seed.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/prisma/sql/searchUsers.sql b/exercises/01.setup/03.problem.custom-fixtures/prisma/sql/searchUsers.sql similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/prisma/sql/searchUsers.sql rename to exercises/01.setup/03.problem.custom-fixtures/prisma/sql/searchUsers.sql diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/public/favicon.ico b/exercises/01.setup/03.problem.custom-fixtures/public/favicon.ico similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/public/favicon.ico rename to exercises/01.setup/03.problem.custom-fixtures/public/favicon.ico diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/public/favicons/README.md b/exercises/01.setup/03.problem.custom-fixtures/public/favicons/README.md similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/public/favicons/README.md rename to exercises/01.setup/03.problem.custom-fixtures/public/favicons/README.md diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/public/favicons/android-chrome-192x192.png b/exercises/01.setup/03.problem.custom-fixtures/public/favicons/android-chrome-192x192.png similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/public/favicons/android-chrome-192x192.png rename to exercises/01.setup/03.problem.custom-fixtures/public/favicons/android-chrome-192x192.png diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/public/favicons/android-chrome-512x512.png b/exercises/01.setup/03.problem.custom-fixtures/public/favicons/android-chrome-512x512.png similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/public/favicons/android-chrome-512x512.png rename to exercises/01.setup/03.problem.custom-fixtures/public/favicons/android-chrome-512x512.png diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/public/img/user.png b/exercises/01.setup/03.problem.custom-fixtures/public/img/user.png similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/public/img/user.png rename to exercises/01.setup/03.problem.custom-fixtures/public/img/user.png diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/public/site.webmanifest b/exercises/01.setup/03.problem.custom-fixtures/public/site.webmanifest similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/public/site.webmanifest rename to exercises/01.setup/03.problem.custom-fixtures/public/site.webmanifest diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/react-router.config.ts b/exercises/01.setup/03.problem.custom-fixtures/react-router.config.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/react-router.config.ts rename to exercises/01.setup/03.problem.custom-fixtures/react-router.config.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/server/dev-server.js b/exercises/01.setup/03.problem.custom-fixtures/server/dev-server.js similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/server/dev-server.js rename to exercises/01.setup/03.problem.custom-fixtures/server/dev-server.js diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/server/index.ts b/exercises/01.setup/03.problem.custom-fixtures/server/index.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/server/index.ts rename to exercises/01.setup/03.problem.custom-fixtures/server/index.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/server/utils/monitoring.ts b/exercises/01.setup/03.problem.custom-fixtures/server/utils/monitoring.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/server/utils/monitoring.ts rename to exercises/01.setup/03.problem.custom-fixtures/server/utils/monitoring.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/tests/db-utils.ts b/exercises/01.setup/03.problem.custom-fixtures/tests/db-utils.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/tests/db-utils.ts rename to exercises/01.setup/03.problem.custom-fixtures/tests/db-utils.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/tests/e2e/homepage.test.ts b/exercises/01.setup/03.problem.custom-fixtures/tests/e2e/homepage.test.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/tests/e2e/homepage.test.ts rename to exercises/01.setup/03.problem.custom-fixtures/tests/e2e/homepage.test.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/tests/setup/custom-matchers.ts b/exercises/01.setup/03.problem.custom-fixtures/tests/setup/custom-matchers.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/tests/setup/custom-matchers.ts rename to exercises/01.setup/03.problem.custom-fixtures/tests/setup/custom-matchers.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/tests/setup/db-setup.ts b/exercises/01.setup/03.problem.custom-fixtures/tests/setup/db-setup.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/tests/setup/db-setup.ts rename to exercises/01.setup/03.problem.custom-fixtures/tests/setup/db-setup.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/tests/setup/global-setup.ts b/exercises/01.setup/03.problem.custom-fixtures/tests/setup/global-setup.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/tests/setup/global-setup.ts rename to exercises/01.setup/03.problem.custom-fixtures/tests/setup/global-setup.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/tests/setup/setup-test-env.ts b/exercises/01.setup/03.problem.custom-fixtures/tests/setup/setup-test-env.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/tests/setup/setup-test-env.ts rename to exercises/01.setup/03.problem.custom-fixtures/tests/setup/setup-test-env.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/tests/test-extend.ts b/exercises/01.setup/03.problem.custom-fixtures/tests/test-extend.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/tests/test-extend.ts rename to exercises/01.setup/03.problem.custom-fixtures/tests/test-extend.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/tests/utils.ts b/exercises/01.setup/03.problem.custom-fixtures/tests/utils.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/tests/utils.ts rename to exercises/01.setup/03.problem.custom-fixtures/tests/utils.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/tsconfig.json b/exercises/01.setup/03.problem.custom-fixtures/tsconfig.json similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/tsconfig.json rename to exercises/01.setup/03.problem.custom-fixtures/tsconfig.json diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/types/deps.d.ts b/exercises/01.setup/03.problem.custom-fixtures/types/deps.d.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/types/deps.d.ts rename to exercises/01.setup/03.problem.custom-fixtures/types/deps.d.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/types/env.env.d.ts b/exercises/01.setup/03.problem.custom-fixtures/types/env.env.d.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/types/env.env.d.ts rename to exercises/01.setup/03.problem.custom-fixtures/types/env.env.d.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/types/icon-name.d.ts b/exercises/01.setup/03.problem.custom-fixtures/types/icon-name.d.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/types/icon-name.d.ts rename to exercises/01.setup/03.problem.custom-fixtures/types/icon-name.d.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/types/reset.d.ts b/exercises/01.setup/03.problem.custom-fixtures/types/reset.d.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/types/reset.d.ts rename to exercises/01.setup/03.problem.custom-fixtures/types/reset.d.ts diff --git a/exercises/02.test-setup/01.problem.custom-fixtures/vite.config.ts b/exercises/01.setup/03.problem.custom-fixtures/vite.config.ts similarity index 100% rename from exercises/02.test-setup/01.problem.custom-fixtures/vite.config.ts rename to exercises/01.setup/03.problem.custom-fixtures/vite.config.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/.env b/exercises/01.setup/03.solution.custom-fixtures/.env similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/.env rename to exercises/01.setup/03.solution.custom-fixtures/.env diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/.env.example b/exercises/01.setup/03.solution.custom-fixtures/.env.example similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/.env.example rename to exercises/01.setup/03.solution.custom-fixtures/.env.example diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/.github/PULL_REQUEST_TEMPLATE.md b/exercises/01.setup/03.solution.custom-fixtures/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/.github/PULL_REQUEST_TEMPLATE.md rename to exercises/01.setup/03.solution.custom-fixtures/.github/PULL_REQUEST_TEMPLATE.md diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/.github/workflows/deploy.yml b/exercises/01.setup/03.solution.custom-fixtures/.github/workflows/deploy.yml similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/.github/workflows/deploy.yml rename to exercises/01.setup/03.solution.custom-fixtures/.github/workflows/deploy.yml diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/.gitignore b/exercises/01.setup/03.solution.custom-fixtures/.gitignore similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/.gitignore rename to exercises/01.setup/03.solution.custom-fixtures/.gitignore diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/.npmrc b/exercises/01.setup/03.solution.custom-fixtures/.npmrc similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/.npmrc rename to exercises/01.setup/03.solution.custom-fixtures/.npmrc diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/.prettierignore b/exercises/01.setup/03.solution.custom-fixtures/.prettierignore similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/.prettierignore rename to exercises/01.setup/03.solution.custom-fixtures/.prettierignore diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/.vscode/extensions.json b/exercises/01.setup/03.solution.custom-fixtures/.vscode/extensions.json similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/.vscode/extensions.json rename to exercises/01.setup/03.solution.custom-fixtures/.vscode/extensions.json diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/.vscode/remix.code-snippets b/exercises/01.setup/03.solution.custom-fixtures/.vscode/remix.code-snippets similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/.vscode/remix.code-snippets rename to exercises/01.setup/03.solution.custom-fixtures/.vscode/remix.code-snippets diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/.vscode/settings.json b/exercises/01.setup/03.solution.custom-fixtures/.vscode/settings.json similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/.vscode/settings.json rename to exercises/01.setup/03.solution.custom-fixtures/.vscode/settings.json diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/README.mdx b/exercises/01.setup/03.solution.custom-fixtures/README.mdx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/README.mdx rename to exercises/01.setup/03.solution.custom-fixtures/README.mdx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/assets/favicons/apple-touch-icon.png b/exercises/01.setup/03.solution.custom-fixtures/app/assets/favicons/apple-touch-icon.png similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/assets/favicons/apple-touch-icon.png rename to exercises/01.setup/03.solution.custom-fixtures/app/assets/favicons/apple-touch-icon.png diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/assets/favicons/favicon.svg b/exercises/01.setup/03.solution.custom-fixtures/app/assets/favicons/favicon.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/assets/favicons/favicon.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/assets/favicons/favicon.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/error-boundary.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/error-boundary.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/error-boundary.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/error-boundary.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/floating-toolbar.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/floating-toolbar.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/floating-toolbar.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/floating-toolbar.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/forms.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/forms.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/forms.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/forms.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/progress-bar.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/progress-bar.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/progress-bar.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/progress-bar.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/search-bar.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/search-bar.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/search-bar.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/search-bar.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/spacer.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/spacer.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/spacer.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/spacer.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/toaster.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/toaster.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/toaster.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/toaster.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/README.md b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/README.md similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/README.md rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/README.md diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/button.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/button.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/button.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/button.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/checkbox.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/checkbox.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/checkbox.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/checkbox.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/dropdown-menu.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/dropdown-menu.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/dropdown-menu.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/dropdown-menu.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/icon.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/icon.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/icon.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/icon.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/input-otp.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/input-otp.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/input-otp.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/input-otp.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/input.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/input.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/input.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/input.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/label.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/label.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/label.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/label.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/sonner.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/sonner.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/sonner.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/sonner.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/status-button.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/status-button.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/status-button.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/status-button.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/textarea.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/textarea.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/textarea.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/textarea.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/tooltip.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/ui/tooltip.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/ui/tooltip.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/ui/tooltip.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/components/user-dropdown.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/components/user-dropdown.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/components/user-dropdown.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/components/user-dropdown.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/entry.client.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/entry.client.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/entry.client.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/entry.client.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/entry.server.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/entry.server.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/entry.server.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/entry.server.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/root.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/root.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/root.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/root.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/$.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/$.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/$.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/$.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/auth.$provider.callback.test.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/auth.$provider.callback.test.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/auth.$provider.callback.test.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/auth.$provider.callback.test.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/auth.$provider.callback.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/auth.$provider.callback.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/auth.$provider.callback.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/auth.$provider.callback.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/auth_.$provider.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/auth_.$provider.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/auth_.$provider.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/auth_.$provider.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/forgot-password.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/forgot-password.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/forgot-password.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/forgot-password.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/login.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/login.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/login.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/login.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/login.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/login.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/login.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/login.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/logout.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/logout.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/logout.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/logout.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/onboarding.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/onboarding.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/onboarding.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/onboarding.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/onboarding.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/onboarding.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/onboarding.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/onboarding.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/onboarding_.$provider.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/onboarding_.$provider.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/onboarding_.$provider.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/onboarding_.$provider.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/onboarding_.$provider.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/onboarding_.$provider.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/onboarding_.$provider.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/onboarding_.$provider.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/reset-password.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/reset-password.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/reset-password.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/reset-password.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/reset-password.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/reset-password.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/reset-password.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/reset-password.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/signup.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/signup.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/signup.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/signup.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/verify.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/verify.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/verify.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/verify.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/verify.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/verify.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/verify.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/verify.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/webauthn+/authentication.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/webauthn+/authentication.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/webauthn+/authentication.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/webauthn+/authentication.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/webauthn+/registration.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/webauthn+/registration.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/webauthn+/registration.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/webauthn+/registration.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/webauthn+/utils.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/webauthn+/utils.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_auth+/webauthn+/utils.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_auth+/webauthn+/utils.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/about.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/about.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/about.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/about.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/index.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/index.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/index.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/index.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/docker.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/docker.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/docker.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/docker.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/eslint.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/eslint.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/eslint.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/eslint.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/faker.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/faker.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/faker.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/faker.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/fly.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/fly.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/fly.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/fly.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/github.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/github.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/github.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/github.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/logos.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/logos.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/logos.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/logos.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/msw.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/msw.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/msw.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/msw.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/playwright.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/playwright.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/playwright.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/playwright.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/prettier.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/prettier.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/prettier.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/prettier.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/prisma.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/prisma.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/prisma.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/prisma.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/radix.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/radix.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/radix.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/radix.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/react-email.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/react-email.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/react-email.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/react-email.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/remix.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/remix.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/remix.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/remix.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/resend.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/resend.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/resend.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/resend.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/sentry.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/sentry.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/sentry.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/sentry.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/shadcn-ui.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/shadcn-ui.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/shadcn-ui.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/shadcn-ui.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/sqlite.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/sqlite.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/sqlite.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/sqlite.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/stars.jpg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/stars.jpg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/stars.jpg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/stars.jpg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/tailwind.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/tailwind.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/tailwind.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/tailwind.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/testing-library.png b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/testing-library.png similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/testing-library.png rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/testing-library.png diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/typescript.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/typescript.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/typescript.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/typescript.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/vitest.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/vitest.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/vitest.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/vitest.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/zod.svg b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/zod.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/logos/zod.svg rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/logos/zod.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/privacy.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/privacy.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/privacy.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/privacy.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/support.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/support.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/support.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/support.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/tos.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/tos.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_marketing+/tos.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_marketing+/tos.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_seo+/robots[.]txt.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_seo+/robots[.]txt.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_seo+/robots[.]txt.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_seo+/robots[.]txt.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_seo+/sitemap[.]xml.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/_seo+/sitemap[.]xml.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/_seo+/sitemap[.]xml.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/_seo+/sitemap[.]xml.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/admin+/cache.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/admin+/cache.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/admin+/cache.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/admin+/cache.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/admin+/cache_.lru.$cacheKey.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/admin+/cache_.lru.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/admin+/cache_.lru.$cacheKey.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/admin+/cache_.lru.$cacheKey.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.$cacheKey.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.$cacheKey.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.$cacheKey.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/admin+/cache_.sqlite.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/me.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/me.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/me.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/me.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/resources+/download-user-data.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/resources+/download-user-data.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/resources+/download-user-data.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/resources+/download-user-data.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/resources+/healthcheck.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/resources+/healthcheck.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/resources+/healthcheck.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/resources+/healthcheck.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/resources+/images.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/resources+/images.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/resources+/images.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/resources+/images.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/resources+/theme-switch.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/resources+/theme-switch.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/resources+/theme-switch.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/resources+/theme-switch.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.change-email.server.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.change-email.server.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.change-email.server.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.change-email.server.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.change-email.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.change-email.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.change-email.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.change-email.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.connections.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.connections.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.connections.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.connections.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.index.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.index.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.index.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.index.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.passkeys.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.passkeys.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.passkeys.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.passkeys.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.password.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.password.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.password.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.password.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.password_.create.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.password_.create.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.password_.create.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.password_.create.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.photo.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.photo.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.photo.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.photo.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.two-factor.disable.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.two-factor.disable.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.two-factor.disable.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.two-factor.disable.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.two-factor.index.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.two-factor.index.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.two-factor.index.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.two-factor.index.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.two-factor.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.two-factor.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.two-factor.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.two-factor.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.two-factor.verify.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.two-factor.verify.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/settings+/profile.two-factor.verify.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/settings+/profile.two-factor.verify.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username.test.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username.test.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username.test.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username.test.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/__note-editor.server.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/__note-editor.server.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/__note-editor.server.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/__note-editor.server.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/__note-editor.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/__note-editor.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/__note-editor.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/__note-editor.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/notes.$noteId.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/notes.$noteId.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/notes.$noteId.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/notes.$noteId.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/notes.$noteId_.edit.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/notes.$noteId_.edit.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/notes.$noteId_.edit.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/notes.$noteId_.edit.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/notes.index.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/notes.index.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/notes.index.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/notes.index.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/notes.new.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/notes.new.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/notes.new.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/notes.new.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/notes.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/notes.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/$username_+/notes.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/$username_+/notes.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/index.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/index.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/routes/users+/index.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/routes/users+/index.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/styles/tailwind.css b/exercises/01.setup/03.solution.custom-fixtures/app/styles/tailwind.css similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/styles/tailwind.css rename to exercises/01.setup/03.solution.custom-fixtures/app/styles/tailwind.css diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/auth.server.test.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/auth.server.test.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/auth.server.test.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/auth.server.test.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/auth.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/auth.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/auth.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/auth.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/cache.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/cache.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/cache.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/cache.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/client-hints.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/utils/client-hints.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/client-hints.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/client-hints.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/connections.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/connections.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/connections.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/connections.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/connections.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/utils/connections.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/connections.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/connections.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/db.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/db.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/db.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/db.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/email.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/email.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/email.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/email.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/env.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/env.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/env.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/env.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/headers.server.test.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/headers.server.test.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/headers.server.test.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/headers.server.test.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/headers.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/headers.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/headers.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/headers.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/honeypot.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/honeypot.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/honeypot.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/honeypot.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/litefs.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/litefs.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/litefs.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/litefs.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/misc.error-message.test.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/misc.error-message.test.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/misc.error-message.test.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/misc.error-message.test.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/misc.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/utils/misc.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/misc.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/misc.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/misc.use-double-check.test.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/utils/misc.use-double-check.test.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/misc.use-double-check.test.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/misc.use-double-check.test.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/monitoring.client.tsx b/exercises/01.setup/03.solution.custom-fixtures/app/utils/monitoring.client.tsx similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/monitoring.client.tsx rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/monitoring.client.tsx diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/nonce-provider.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/nonce-provider.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/nonce-provider.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/nonce-provider.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/permissions.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/permissions.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/permissions.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/permissions.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/providers/constants.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/providers/constants.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/providers/constants.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/providers/constants.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/providers/github.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/providers/github.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/providers/github.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/providers/github.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/providers/provider.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/providers/provider.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/providers/provider.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/providers/provider.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/redirect-cookie.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/redirect-cookie.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/redirect-cookie.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/redirect-cookie.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/request-info.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/request-info.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/request-info.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/request-info.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/session.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/session.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/session.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/session.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/storage.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/storage.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/storage.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/storage.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/theme.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/theme.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/theme.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/theme.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/timing.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/timing.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/timing.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/timing.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/toast.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/toast.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/toast.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/toast.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/totp.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/totp.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/totp.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/totp.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/user-validation.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/user-validation.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/user-validation.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/user-validation.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/user.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/user.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/user.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/user.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/app/utils/verification.server.ts b/exercises/01.setup/03.solution.custom-fixtures/app/utils/verification.server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/app/utils/verification.server.ts rename to exercises/01.setup/03.solution.custom-fixtures/app/utils/verification.server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/components.json b/exercises/01.setup/03.solution.custom-fixtures/components.json similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/components.json rename to exercises/01.setup/03.solution.custom-fixtures/components.json diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/eslint.config.js b/exercises/01.setup/03.solution.custom-fixtures/eslint.config.js similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/eslint.config.js rename to exercises/01.setup/03.solution.custom-fixtures/eslint.config.js diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/fly.toml b/exercises/01.setup/03.solution.custom-fixtures/fly.toml similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/fly.toml rename to exercises/01.setup/03.solution.custom-fixtures/fly.toml diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/index.js b/exercises/01.setup/03.solution.custom-fixtures/index.js similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/index.js rename to exercises/01.setup/03.solution.custom-fixtures/index.js diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/Dockerfile b/exercises/01.setup/03.solution.custom-fixtures/other/Dockerfile similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/Dockerfile rename to exercises/01.setup/03.solution.custom-fixtures/other/Dockerfile diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/Dockerfile.dockerignore b/exercises/01.setup/03.solution.custom-fixtures/other/Dockerfile.dockerignore similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/Dockerfile.dockerignore rename to exercises/01.setup/03.solution.custom-fixtures/other/Dockerfile.dockerignore diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/README.md b/exercises/01.setup/03.solution.custom-fixtures/other/README.md similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/README.md rename to exercises/01.setup/03.solution.custom-fixtures/other/README.md diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/build-server.ts b/exercises/01.setup/03.solution.custom-fixtures/other/build-server.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/build-server.ts rename to exercises/01.setup/03.solution.custom-fixtures/other/build-server.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/litefs.yml b/exercises/01.setup/03.solution.custom-fixtures/other/litefs.yml similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/litefs.yml rename to exercises/01.setup/03.solution.custom-fixtures/other/litefs.yml diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/sly/sly.json b/exercises/01.setup/03.solution.custom-fixtures/other/sly/sly.json similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/sly/sly.json rename to exercises/01.setup/03.solution.custom-fixtures/other/sly/sly.json diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/sly/transform-icon.ts b/exercises/01.setup/03.solution.custom-fixtures/other/sly/transform-icon.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/sly/transform-icon.ts rename to exercises/01.setup/03.solution.custom-fixtures/other/sly/transform-icon.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/README.md b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/README.md similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/README.md rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/README.md diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/arrow-left.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/arrow-left.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/arrow-left.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/arrow-left.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/arrow-right.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/arrow-right.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/arrow-right.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/arrow-right.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/avatar.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/avatar.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/avatar.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/avatar.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/camera.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/camera.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/camera.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/camera.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/check.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/check.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/check.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/check.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/clock.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/clock.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/clock.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/clock.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/cross-1.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/cross-1.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/cross-1.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/cross-1.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/dots-horizontal.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/dots-horizontal.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/dots-horizontal.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/dots-horizontal.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/download.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/download.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/download.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/download.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/envelope-closed.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/envelope-closed.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/envelope-closed.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/envelope-closed.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/exit.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/exit.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/exit.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/exit.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/file-text.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/file-text.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/file-text.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/file-text.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/github-logo.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/github-logo.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/github-logo.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/github-logo.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/laptop.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/laptop.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/laptop.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/laptop.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/link-2.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/link-2.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/link-2.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/link-2.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/lock-closed.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/lock-closed.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/lock-closed.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/lock-closed.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/lock-open-1.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/lock-open-1.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/lock-open-1.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/lock-open-1.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/magnifying-glass.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/magnifying-glass.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/magnifying-glass.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/magnifying-glass.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/moon.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/moon.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/moon.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/moon.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/passkey.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/passkey.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/passkey.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/passkey.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/pencil-1.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/pencil-1.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/pencil-1.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/pencil-1.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/pencil-2.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/pencil-2.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/pencil-2.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/pencil-2.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/plus.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/plus.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/plus.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/plus.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/question-mark-circled.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/question-mark-circled.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/question-mark-circled.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/question-mark-circled.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/reset.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/reset.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/reset.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/reset.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/sun.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/sun.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/sun.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/sun.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/trash.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/trash.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/trash.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/trash.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/update.svg b/exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/update.svg similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/other/svg-icons/update.svg rename to exercises/01.setup/03.solution.custom-fixtures/other/svg-icons/update.svg diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/package-lock.json b/exercises/01.setup/03.solution.custom-fixtures/package-lock.json similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/package-lock.json rename to exercises/01.setup/03.solution.custom-fixtures/package-lock.json diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/package.json b/exercises/01.setup/03.solution.custom-fixtures/package.json similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/package.json rename to exercises/01.setup/03.solution.custom-fixtures/package.json diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/playwright.config.ts b/exercises/01.setup/03.solution.custom-fixtures/playwright.config.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/playwright.config.ts rename to exercises/01.setup/03.solution.custom-fixtures/playwright.config.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/prisma/migrations/20250221233640_init/migration.sql b/exercises/01.setup/03.solution.custom-fixtures/prisma/migrations/20250221233640_init/migration.sql similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/prisma/migrations/20250221233640_init/migration.sql rename to exercises/01.setup/03.solution.custom-fixtures/prisma/migrations/20250221233640_init/migration.sql diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/prisma/migrations/migration_lock.toml b/exercises/01.setup/03.solution.custom-fixtures/prisma/migrations/migration_lock.toml similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/prisma/migrations/migration_lock.toml rename to exercises/01.setup/03.solution.custom-fixtures/prisma/migrations/migration_lock.toml diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/prisma/schema.prisma b/exercises/01.setup/03.solution.custom-fixtures/prisma/schema.prisma similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/prisma/schema.prisma rename to exercises/01.setup/03.solution.custom-fixtures/prisma/schema.prisma diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/prisma/seed.ts b/exercises/01.setup/03.solution.custom-fixtures/prisma/seed.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/prisma/seed.ts rename to exercises/01.setup/03.solution.custom-fixtures/prisma/seed.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/prisma/sql/searchUsers.sql b/exercises/01.setup/03.solution.custom-fixtures/prisma/sql/searchUsers.sql similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/prisma/sql/searchUsers.sql rename to exercises/01.setup/03.solution.custom-fixtures/prisma/sql/searchUsers.sql diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/public/favicon.ico b/exercises/01.setup/03.solution.custom-fixtures/public/favicon.ico similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/public/favicon.ico rename to exercises/01.setup/03.solution.custom-fixtures/public/favicon.ico diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/public/favicons/README.md b/exercises/01.setup/03.solution.custom-fixtures/public/favicons/README.md similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/public/favicons/README.md rename to exercises/01.setup/03.solution.custom-fixtures/public/favicons/README.md diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/public/favicons/android-chrome-192x192.png b/exercises/01.setup/03.solution.custom-fixtures/public/favicons/android-chrome-192x192.png similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/public/favicons/android-chrome-192x192.png rename to exercises/01.setup/03.solution.custom-fixtures/public/favicons/android-chrome-192x192.png diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/public/favicons/android-chrome-512x512.png b/exercises/01.setup/03.solution.custom-fixtures/public/favicons/android-chrome-512x512.png similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/public/favicons/android-chrome-512x512.png rename to exercises/01.setup/03.solution.custom-fixtures/public/favicons/android-chrome-512x512.png diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/public/img/user.png b/exercises/01.setup/03.solution.custom-fixtures/public/img/user.png similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/public/img/user.png rename to exercises/01.setup/03.solution.custom-fixtures/public/img/user.png diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/public/site.webmanifest b/exercises/01.setup/03.solution.custom-fixtures/public/site.webmanifest similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/public/site.webmanifest rename to exercises/01.setup/03.solution.custom-fixtures/public/site.webmanifest diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/react-router.config.ts b/exercises/01.setup/03.solution.custom-fixtures/react-router.config.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/react-router.config.ts rename to exercises/01.setup/03.solution.custom-fixtures/react-router.config.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/server/dev-server.js b/exercises/01.setup/03.solution.custom-fixtures/server/dev-server.js similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/server/dev-server.js rename to exercises/01.setup/03.solution.custom-fixtures/server/dev-server.js diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/server/index.ts b/exercises/01.setup/03.solution.custom-fixtures/server/index.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/server/index.ts rename to exercises/01.setup/03.solution.custom-fixtures/server/index.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/server/utils/monitoring.ts b/exercises/01.setup/03.solution.custom-fixtures/server/utils/monitoring.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/server/utils/monitoring.ts rename to exercises/01.setup/03.solution.custom-fixtures/server/utils/monitoring.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/tests/db-utils.ts b/exercises/01.setup/03.solution.custom-fixtures/tests/db-utils.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/tests/db-utils.ts rename to exercises/01.setup/03.solution.custom-fixtures/tests/db-utils.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/tests/e2e/homepage.test.ts b/exercises/01.setup/03.solution.custom-fixtures/tests/e2e/homepage.test.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/tests/e2e/homepage.test.ts rename to exercises/01.setup/03.solution.custom-fixtures/tests/e2e/homepage.test.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/tests/setup/custom-matchers.ts b/exercises/01.setup/03.solution.custom-fixtures/tests/setup/custom-matchers.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/tests/setup/custom-matchers.ts rename to exercises/01.setup/03.solution.custom-fixtures/tests/setup/custom-matchers.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/tests/setup/db-setup.ts b/exercises/01.setup/03.solution.custom-fixtures/tests/setup/db-setup.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/tests/setup/db-setup.ts rename to exercises/01.setup/03.solution.custom-fixtures/tests/setup/db-setup.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/tests/setup/global-setup.ts b/exercises/01.setup/03.solution.custom-fixtures/tests/setup/global-setup.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/tests/setup/global-setup.ts rename to exercises/01.setup/03.solution.custom-fixtures/tests/setup/global-setup.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/tests/setup/setup-test-env.ts b/exercises/01.setup/03.solution.custom-fixtures/tests/setup/setup-test-env.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/tests/setup/setup-test-env.ts rename to exercises/01.setup/03.solution.custom-fixtures/tests/setup/setup-test-env.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/tests/test-extend.ts b/exercises/01.setup/03.solution.custom-fixtures/tests/test-extend.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/tests/test-extend.ts rename to exercises/01.setup/03.solution.custom-fixtures/tests/test-extend.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/tests/utils.ts b/exercises/01.setup/03.solution.custom-fixtures/tests/utils.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/tests/utils.ts rename to exercises/01.setup/03.solution.custom-fixtures/tests/utils.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/tsconfig.json b/exercises/01.setup/03.solution.custom-fixtures/tsconfig.json similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/tsconfig.json rename to exercises/01.setup/03.solution.custom-fixtures/tsconfig.json diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/types/deps.d.ts b/exercises/01.setup/03.solution.custom-fixtures/types/deps.d.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/types/deps.d.ts rename to exercises/01.setup/03.solution.custom-fixtures/types/deps.d.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/types/env.env.d.ts b/exercises/01.setup/03.solution.custom-fixtures/types/env.env.d.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/types/env.env.d.ts rename to exercises/01.setup/03.solution.custom-fixtures/types/env.env.d.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/types/icon-name.d.ts b/exercises/01.setup/03.solution.custom-fixtures/types/icon-name.d.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/types/icon-name.d.ts rename to exercises/01.setup/03.solution.custom-fixtures/types/icon-name.d.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/types/reset.d.ts b/exercises/01.setup/03.solution.custom-fixtures/types/reset.d.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/types/reset.d.ts rename to exercises/01.setup/03.solution.custom-fixtures/types/reset.d.ts diff --git a/exercises/02.test-setup/01.solution.custom-fixtures/vite.config.ts b/exercises/01.setup/03.solution.custom-fixtures/vite.config.ts similarity index 100% rename from exercises/02.test-setup/01.solution.custom-fixtures/vite.config.ts rename to exercises/01.setup/03.solution.custom-fixtures/vite.config.ts diff --git a/exercises/01.basics/FINISHED.mdx b/exercises/01.setup/FINISHED.mdx similarity index 100% rename from exercises/01.basics/FINISHED.mdx rename to exercises/01.setup/FINISHED.mdx diff --git a/exercises/01.basics/README.mdx b/exercises/01.setup/README.mdx similarity index 100% rename from exercises/01.basics/README.mdx rename to exercises/01.setup/README.mdx diff --git a/exercises/02.test-setup/03.problem.authentication/.cursor/rules/avoid-use-effect.mdc b/exercises/02.authentication/01.problem.basic/.cursor/rules/avoid-use-effect.mdc similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.cursor/rules/avoid-use-effect.mdc rename to exercises/02.authentication/01.problem.basic/.cursor/rules/avoid-use-effect.mdc diff --git a/exercises/02.test-setup/03.problem.authentication/.env b/exercises/02.authentication/01.problem.basic/.env similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.env rename to exercises/02.authentication/01.problem.basic/.env diff --git a/exercises/02.test-setup/03.problem.authentication/.env.example b/exercises/02.authentication/01.problem.basic/.env.example similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.env.example rename to exercises/02.authentication/01.problem.basic/.env.example diff --git a/exercises/02.test-setup/03.problem.authentication/.github/PULL_REQUEST_TEMPLATE.md b/exercises/02.authentication/01.problem.basic/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.github/PULL_REQUEST_TEMPLATE.md rename to exercises/02.authentication/01.problem.basic/.github/PULL_REQUEST_TEMPLATE.md diff --git a/exercises/02.test-setup/03.problem.authentication/.github/workflows/deploy.yml b/exercises/02.authentication/01.problem.basic/.github/workflows/deploy.yml similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.github/workflows/deploy.yml rename to exercises/02.authentication/01.problem.basic/.github/workflows/deploy.yml diff --git a/exercises/02.test-setup/03.problem.authentication/.gitignore b/exercises/02.authentication/01.problem.basic/.gitignore similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.gitignore rename to exercises/02.authentication/01.problem.basic/.gitignore diff --git a/exercises/02.test-setup/03.problem.authentication/.npmrc b/exercises/02.authentication/01.problem.basic/.npmrc similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.npmrc rename to exercises/02.authentication/01.problem.basic/.npmrc diff --git a/exercises/02.test-setup/03.problem.authentication/.prettierignore b/exercises/02.authentication/01.problem.basic/.prettierignore similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.prettierignore rename to exercises/02.authentication/01.problem.basic/.prettierignore diff --git a/exercises/02.test-setup/03.problem.authentication/.vscode/extensions.json b/exercises/02.authentication/01.problem.basic/.vscode/extensions.json similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.vscode/extensions.json rename to exercises/02.authentication/01.problem.basic/.vscode/extensions.json diff --git a/exercises/02.test-setup/03.problem.authentication/.vscode/remix.code-snippets b/exercises/02.authentication/01.problem.basic/.vscode/remix.code-snippets similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.vscode/remix.code-snippets rename to exercises/02.authentication/01.problem.basic/.vscode/remix.code-snippets diff --git a/exercises/02.test-setup/03.problem.authentication/.vscode/settings.json b/exercises/02.authentication/01.problem.basic/.vscode/settings.json similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/.vscode/settings.json rename to exercises/02.authentication/01.problem.basic/.vscode/settings.json diff --git a/exercises/02.test-setup/03.problem.authentication/README.mdx b/exercises/02.authentication/01.problem.basic/README.mdx similarity index 98% rename from exercises/02.test-setup/03.problem.authentication/README.mdx rename to exercises/02.authentication/01.problem.basic/README.mdx index d28b90b..14a9dd2 100644 --- a/exercises/02.test-setup/03.problem.authentication/README.mdx +++ b/exercises/02.authentication/01.problem.basic/README.mdx @@ -1,4 +1,4 @@ -# Authentication +# Basic ## Your task diff --git a/exercises/02.test-setup/03.problem.authentication/app/assets/favicons/apple-touch-icon.png b/exercises/02.authentication/01.problem.basic/app/assets/favicons/apple-touch-icon.png similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/assets/favicons/apple-touch-icon.png rename to exercises/02.authentication/01.problem.basic/app/assets/favicons/apple-touch-icon.png diff --git a/exercises/02.test-setup/03.problem.authentication/app/assets/favicons/favicon.svg b/exercises/02.authentication/01.problem.basic/app/assets/favicons/favicon.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/assets/favicons/favicon.svg rename to exercises/02.authentication/01.problem.basic/app/assets/favicons/favicon.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/error-boundary.tsx b/exercises/02.authentication/01.problem.basic/app/components/error-boundary.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/error-boundary.tsx rename to exercises/02.authentication/01.problem.basic/app/components/error-boundary.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/floating-toolbar.tsx b/exercises/02.authentication/01.problem.basic/app/components/floating-toolbar.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/floating-toolbar.tsx rename to exercises/02.authentication/01.problem.basic/app/components/floating-toolbar.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/forms.tsx b/exercises/02.authentication/01.problem.basic/app/components/forms.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/forms.tsx rename to exercises/02.authentication/01.problem.basic/app/components/forms.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/progress-bar.tsx b/exercises/02.authentication/01.problem.basic/app/components/progress-bar.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/progress-bar.tsx rename to exercises/02.authentication/01.problem.basic/app/components/progress-bar.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/search-bar.tsx b/exercises/02.authentication/01.problem.basic/app/components/search-bar.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/search-bar.tsx rename to exercises/02.authentication/01.problem.basic/app/components/search-bar.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/spacer.tsx b/exercises/02.authentication/01.problem.basic/app/components/spacer.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/spacer.tsx rename to exercises/02.authentication/01.problem.basic/app/components/spacer.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/toaster.tsx b/exercises/02.authentication/01.problem.basic/app/components/toaster.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/toaster.tsx rename to exercises/02.authentication/01.problem.basic/app/components/toaster.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/README.md b/exercises/02.authentication/01.problem.basic/app/components/ui/README.md similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/README.md rename to exercises/02.authentication/01.problem.basic/app/components/ui/README.md diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/button.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/button.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/button.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/button.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/checkbox.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/checkbox.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/checkbox.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/checkbox.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/dropdown-menu.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/dropdown-menu.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/dropdown-menu.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/dropdown-menu.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/icon.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/icon.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/icon.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/icon.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/input-otp.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/input-otp.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/input-otp.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/input-otp.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/input.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/input.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/input.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/input.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/label.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/label.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/label.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/label.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/sonner.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/sonner.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/sonner.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/sonner.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/status-button.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/status-button.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/status-button.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/status-button.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/textarea.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/textarea.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/textarea.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/textarea.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/ui/tooltip.tsx b/exercises/02.authentication/01.problem.basic/app/components/ui/tooltip.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/ui/tooltip.tsx rename to exercises/02.authentication/01.problem.basic/app/components/ui/tooltip.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/components/user-dropdown.tsx b/exercises/02.authentication/01.problem.basic/app/components/user-dropdown.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/components/user-dropdown.tsx rename to exercises/02.authentication/01.problem.basic/app/components/user-dropdown.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/entry.client.tsx b/exercises/02.authentication/01.problem.basic/app/entry.client.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/entry.client.tsx rename to exercises/02.authentication/01.problem.basic/app/entry.client.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/entry.server.tsx b/exercises/02.authentication/01.problem.basic/app/entry.server.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/entry.server.tsx rename to exercises/02.authentication/01.problem.basic/app/entry.server.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/root.tsx b/exercises/02.authentication/01.problem.basic/app/root.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/root.tsx rename to exercises/02.authentication/01.problem.basic/app/root.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes.ts b/exercises/02.authentication/01.problem.basic/app/routes.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes.ts rename to exercises/02.authentication/01.problem.basic/app/routes.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/$.tsx b/exercises/02.authentication/01.problem.basic/app/routes/$.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/$.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/$.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/auth.$provider.callback.test.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/auth.$provider.callback.test.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/auth.$provider.callback.test.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/auth.$provider.callback.test.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/auth.$provider.callback.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/auth.$provider.callback.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/auth.$provider.callback.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/auth.$provider.callback.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/auth_.$provider.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/auth_.$provider.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/auth_.$provider.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/auth_.$provider.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/forgot-password.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/forgot-password.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/forgot-password.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/forgot-password.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/login.server.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/login.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/login.server.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/login.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/login.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/login.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/login.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/login.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/logout.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/logout.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/logout.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/logout.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/onboarding.server.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/onboarding.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/onboarding.server.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/onboarding.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/onboarding.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/onboarding.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/onboarding.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/onboarding.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/onboarding_.$provider.server.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/onboarding_.$provider.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/onboarding_.$provider.server.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/onboarding_.$provider.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/onboarding_.$provider.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/onboarding_.$provider.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/onboarding_.$provider.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/onboarding_.$provider.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/reset-password.server.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/reset-password.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/reset-password.server.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/reset-password.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/reset-password.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/reset-password.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/reset-password.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/reset-password.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/signup.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/signup.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/signup.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/signup.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/verify.server.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/verify.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/verify.server.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/verify.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/verify.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/verify.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/verify.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/verify.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/webauthn+/authentication.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/webauthn+/authentication.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/webauthn+/authentication.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/webauthn+/authentication.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/webauthn+/registration.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/webauthn+/registration.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/webauthn+/registration.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/webauthn+/registration.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/webauthn+/utils.server.ts b/exercises/02.authentication/01.problem.basic/app/routes/_auth+/webauthn+/utils.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_auth+/webauthn+/utils.server.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_auth+/webauthn+/utils.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/about.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/about.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/about.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/about.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/index.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/index.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/index.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/index.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/docker.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/docker.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/docker.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/docker.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/eslint.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/eslint.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/eslint.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/eslint.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/faker.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/faker.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/faker.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/faker.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/fly.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/fly.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/fly.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/fly.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/github.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/github.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/github.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/github.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/logos.ts b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/logos.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/logos.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/logos.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/msw.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/msw.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/msw.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/msw.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/playwright.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/playwright.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/playwright.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/playwright.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/prettier.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/prettier.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/prettier.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/prettier.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/prisma.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/prisma.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/prisma.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/prisma.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/radix.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/radix.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/radix.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/radix.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/react-email.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/react-email.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/react-email.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/react-email.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/remix.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/remix.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/remix.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/remix.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/resend.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/resend.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/resend.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/resend.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/sentry.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/sentry.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/sentry.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/sentry.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/shadcn-ui.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/shadcn-ui.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/shadcn-ui.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/shadcn-ui.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/sqlite.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/sqlite.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/sqlite.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/sqlite.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/stars.jpg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/stars.jpg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/stars.jpg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/stars.jpg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/tailwind.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/tailwind.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/tailwind.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/tailwind.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/testing-library.png b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/testing-library.png similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/testing-library.png rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/testing-library.png diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/typescript.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/typescript.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/typescript.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/typescript.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/vitest.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/vitest.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/vitest.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/vitest.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/zod.svg b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/zod.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/logos/zod.svg rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/logos/zod.svg diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/privacy.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/privacy.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/privacy.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/privacy.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/support.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/support.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/support.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/support.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/tos.tsx b/exercises/02.authentication/01.problem.basic/app/routes/_marketing+/tos.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_marketing+/tos.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/_marketing+/tos.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_seo+/robots[.]txt.ts b/exercises/02.authentication/01.problem.basic/app/routes/_seo+/robots[.]txt.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_seo+/robots[.]txt.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_seo+/robots[.]txt.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/_seo+/sitemap[.]xml.ts b/exercises/02.authentication/01.problem.basic/app/routes/_seo+/sitemap[.]xml.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/_seo+/sitemap[.]xml.ts rename to exercises/02.authentication/01.problem.basic/app/routes/_seo+/sitemap[.]xml.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/admin+/cache.tsx b/exercises/02.authentication/01.problem.basic/app/routes/admin+/cache.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/admin+/cache.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/admin+/cache.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/admin+/cache_.lru.$cacheKey.ts b/exercises/02.authentication/01.problem.basic/app/routes/admin+/cache_.lru.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/admin+/cache_.lru.$cacheKey.ts rename to exercises/02.authentication/01.problem.basic/app/routes/admin+/cache_.lru.$cacheKey.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/admin+/cache_.sqlite.$cacheKey.ts b/exercises/02.authentication/01.problem.basic/app/routes/admin+/cache_.sqlite.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/admin+/cache_.sqlite.$cacheKey.ts rename to exercises/02.authentication/01.problem.basic/app/routes/admin+/cache_.sqlite.$cacheKey.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/admin+/cache_.sqlite.server.ts b/exercises/02.authentication/01.problem.basic/app/routes/admin+/cache_.sqlite.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/admin+/cache_.sqlite.server.ts rename to exercises/02.authentication/01.problem.basic/app/routes/admin+/cache_.sqlite.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/admin+/cache_.sqlite.tsx b/exercises/02.authentication/01.problem.basic/app/routes/admin+/cache_.sqlite.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/admin+/cache_.sqlite.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/admin+/cache_.sqlite.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/me.tsx b/exercises/02.authentication/01.problem.basic/app/routes/me.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/me.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/me.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/resources+/download-user-data.tsx b/exercises/02.authentication/01.problem.basic/app/routes/resources+/download-user-data.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/resources+/download-user-data.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/resources+/download-user-data.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/resources+/healthcheck.tsx b/exercises/02.authentication/01.problem.basic/app/routes/resources+/healthcheck.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/resources+/healthcheck.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/resources+/healthcheck.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/resources+/images.tsx b/exercises/02.authentication/01.problem.basic/app/routes/resources+/images.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/resources+/images.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/resources+/images.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/resources+/theme-switch.tsx b/exercises/02.authentication/01.problem.basic/app/routes/resources+/theme-switch.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/resources+/theme-switch.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/resources+/theme-switch.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.change-email.server.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.change-email.server.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.change-email.server.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.change-email.server.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.change-email.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.change-email.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.change-email.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.change-email.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.connections.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.connections.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.connections.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.connections.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.index.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.index.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.index.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.index.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.passkeys.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.passkeys.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.passkeys.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.passkeys.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.password.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.password.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.password.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.password.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.password_.create.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.password_.create.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.password_.create.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.password_.create.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.photo.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.photo.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.photo.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.photo.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.two-factor.disable.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.two-factor.disable.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.two-factor.disable.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.two-factor.disable.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.two-factor.index.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.two-factor.index.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.two-factor.index.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.two-factor.index.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.two-factor.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.two-factor.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.two-factor.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.two-factor.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.two-factor.verify.tsx b/exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.two-factor.verify.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/settings+/profile.two-factor.verify.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/settings+/profile.two-factor.verify.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username.test.tsx b/exercises/02.authentication/01.problem.basic/app/routes/users+/$username.test.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username.test.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/users+/$username.test.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username.tsx b/exercises/02.authentication/01.problem.basic/app/routes/users+/$username.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/users+/$username.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/__note-editor.server.tsx b/exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/__note-editor.server.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/__note-editor.server.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/__note-editor.server.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/__note-editor.tsx b/exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/__note-editor.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/__note-editor.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/__note-editor.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/notes.$noteId.tsx b/exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/notes.$noteId.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/notes.$noteId.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/notes.$noteId.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/notes.$noteId_.edit.tsx b/exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/notes.$noteId_.edit.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/notes.$noteId_.edit.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/notes.$noteId_.edit.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/notes.index.tsx b/exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/notes.index.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/notes.index.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/notes.index.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/notes.new.tsx b/exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/notes.new.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/notes.new.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/notes.new.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/notes.tsx b/exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/notes.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/users+/$username_+/notes.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/users+/$username_+/notes.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/routes/users+/index.tsx b/exercises/02.authentication/01.problem.basic/app/routes/users+/index.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/routes/users+/index.tsx rename to exercises/02.authentication/01.problem.basic/app/routes/users+/index.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/styles/tailwind.css b/exercises/02.authentication/01.problem.basic/app/styles/tailwind.css similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/styles/tailwind.css rename to exercises/02.authentication/01.problem.basic/app/styles/tailwind.css diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/auth.server.test.ts b/exercises/02.authentication/01.problem.basic/app/utils/auth.server.test.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/auth.server.test.ts rename to exercises/02.authentication/01.problem.basic/app/utils/auth.server.test.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/auth.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/auth.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/auth.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/auth.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/cache.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/cache.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/cache.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/cache.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/client-hints.tsx b/exercises/02.authentication/01.problem.basic/app/utils/client-hints.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/client-hints.tsx rename to exercises/02.authentication/01.problem.basic/app/utils/client-hints.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/connections.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/connections.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/connections.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/connections.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/connections.tsx b/exercises/02.authentication/01.problem.basic/app/utils/connections.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/connections.tsx rename to exercises/02.authentication/01.problem.basic/app/utils/connections.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/db.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/db.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/db.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/db.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/email.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/email.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/email.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/email.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/env.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/env.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/env.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/env.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/headers.server.test.ts b/exercises/02.authentication/01.problem.basic/app/utils/headers.server.test.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/headers.server.test.ts rename to exercises/02.authentication/01.problem.basic/app/utils/headers.server.test.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/headers.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/headers.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/headers.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/headers.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/honeypot.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/honeypot.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/honeypot.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/honeypot.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/litefs.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/litefs.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/litefs.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/litefs.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/misc.error-message.test.ts b/exercises/02.authentication/01.problem.basic/app/utils/misc.error-message.test.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/misc.error-message.test.ts rename to exercises/02.authentication/01.problem.basic/app/utils/misc.error-message.test.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/misc.tsx b/exercises/02.authentication/01.problem.basic/app/utils/misc.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/misc.tsx rename to exercises/02.authentication/01.problem.basic/app/utils/misc.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/misc.use-double-check.test.tsx b/exercises/02.authentication/01.problem.basic/app/utils/misc.use-double-check.test.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/misc.use-double-check.test.tsx rename to exercises/02.authentication/01.problem.basic/app/utils/misc.use-double-check.test.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/monitoring.client.tsx b/exercises/02.authentication/01.problem.basic/app/utils/monitoring.client.tsx similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/monitoring.client.tsx rename to exercises/02.authentication/01.problem.basic/app/utils/monitoring.client.tsx diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/nonce-provider.ts b/exercises/02.authentication/01.problem.basic/app/utils/nonce-provider.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/nonce-provider.ts rename to exercises/02.authentication/01.problem.basic/app/utils/nonce-provider.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/permissions.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/permissions.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/permissions.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/permissions.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/providers/constants.ts b/exercises/02.authentication/01.problem.basic/app/utils/providers/constants.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/providers/constants.ts rename to exercises/02.authentication/01.problem.basic/app/utils/providers/constants.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/providers/github.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/providers/github.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/providers/github.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/providers/github.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/providers/provider.ts b/exercises/02.authentication/01.problem.basic/app/utils/providers/provider.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/providers/provider.ts rename to exercises/02.authentication/01.problem.basic/app/utils/providers/provider.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/redirect-cookie.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/redirect-cookie.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/redirect-cookie.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/redirect-cookie.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/request-info.ts b/exercises/02.authentication/01.problem.basic/app/utils/request-info.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/request-info.ts rename to exercises/02.authentication/01.problem.basic/app/utils/request-info.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/session.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/session.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/session.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/session.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/storage.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/storage.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/storage.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/storage.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/theme.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/theme.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/theme.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/theme.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/timing.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/timing.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/timing.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/timing.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/toast.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/toast.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/toast.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/toast.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/totp.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/totp.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/totp.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/totp.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/user-validation.ts b/exercises/02.authentication/01.problem.basic/app/utils/user-validation.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/user-validation.ts rename to exercises/02.authentication/01.problem.basic/app/utils/user-validation.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/user.ts b/exercises/02.authentication/01.problem.basic/app/utils/user.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/user.ts rename to exercises/02.authentication/01.problem.basic/app/utils/user.ts diff --git a/exercises/02.test-setup/03.problem.authentication/app/utils/verification.server.ts b/exercises/02.authentication/01.problem.basic/app/utils/verification.server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/app/utils/verification.server.ts rename to exercises/02.authentication/01.problem.basic/app/utils/verification.server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/components.json b/exercises/02.authentication/01.problem.basic/components.json similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/components.json rename to exercises/02.authentication/01.problem.basic/components.json diff --git a/exercises/02.test-setup/03.problem.authentication/eslint.config.js b/exercises/02.authentication/01.problem.basic/eslint.config.js similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/eslint.config.js rename to exercises/02.authentication/01.problem.basic/eslint.config.js diff --git a/exercises/02.test-setup/03.problem.authentication/fly.toml b/exercises/02.authentication/01.problem.basic/fly.toml similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/fly.toml rename to exercises/02.authentication/01.problem.basic/fly.toml diff --git a/exercises/02.test-setup/03.problem.authentication/index.js b/exercises/02.authentication/01.problem.basic/index.js similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/index.js rename to exercises/02.authentication/01.problem.basic/index.js diff --git a/exercises/02.test-setup/03.problem.authentication/other/Dockerfile b/exercises/02.authentication/01.problem.basic/other/Dockerfile similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/Dockerfile rename to exercises/02.authentication/01.problem.basic/other/Dockerfile diff --git a/exercises/02.test-setup/03.problem.authentication/other/Dockerfile.dockerignore b/exercises/02.authentication/01.problem.basic/other/Dockerfile.dockerignore similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/Dockerfile.dockerignore rename to exercises/02.authentication/01.problem.basic/other/Dockerfile.dockerignore diff --git a/exercises/02.test-setup/03.problem.authentication/other/README.md b/exercises/02.authentication/01.problem.basic/other/README.md similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/README.md rename to exercises/02.authentication/01.problem.basic/other/README.md diff --git a/exercises/02.test-setup/03.problem.authentication/other/build-server.ts b/exercises/02.authentication/01.problem.basic/other/build-server.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/build-server.ts rename to exercises/02.authentication/01.problem.basic/other/build-server.ts diff --git a/exercises/02.test-setup/03.problem.authentication/other/litefs.yml b/exercises/02.authentication/01.problem.basic/other/litefs.yml similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/litefs.yml rename to exercises/02.authentication/01.problem.basic/other/litefs.yml diff --git a/exercises/02.test-setup/03.problem.authentication/other/sly/sly.json b/exercises/02.authentication/01.problem.basic/other/sly/sly.json similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/sly/sly.json rename to exercises/02.authentication/01.problem.basic/other/sly/sly.json diff --git a/exercises/02.test-setup/03.problem.authentication/other/sly/transform-icon.ts b/exercises/02.authentication/01.problem.basic/other/sly/transform-icon.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/sly/transform-icon.ts rename to exercises/02.authentication/01.problem.basic/other/sly/transform-icon.ts diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/README.md b/exercises/02.authentication/01.problem.basic/other/svg-icons/README.md similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/README.md rename to exercises/02.authentication/01.problem.basic/other/svg-icons/README.md diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/arrow-left.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/arrow-left.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/arrow-left.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/arrow-left.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/arrow-right.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/arrow-right.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/arrow-right.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/arrow-right.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/avatar.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/avatar.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/avatar.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/avatar.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/camera.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/camera.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/camera.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/camera.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/check.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/check.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/check.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/check.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/clock.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/clock.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/clock.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/clock.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/cross-1.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/cross-1.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/cross-1.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/cross-1.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/dots-horizontal.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/dots-horizontal.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/dots-horizontal.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/dots-horizontal.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/download.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/download.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/download.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/download.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/envelope-closed.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/envelope-closed.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/envelope-closed.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/envelope-closed.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/exit.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/exit.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/exit.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/exit.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/file-text.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/file-text.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/file-text.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/file-text.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/github-logo.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/github-logo.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/github-logo.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/github-logo.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/laptop.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/laptop.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/laptop.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/laptop.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/link-2.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/link-2.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/link-2.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/link-2.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/lock-closed.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/lock-closed.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/lock-closed.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/lock-closed.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/lock-open-1.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/lock-open-1.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/lock-open-1.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/lock-open-1.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/magnifying-glass.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/magnifying-glass.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/magnifying-glass.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/magnifying-glass.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/moon.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/moon.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/moon.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/moon.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/passkey.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/passkey.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/passkey.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/passkey.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/pencil-1.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/pencil-1.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/pencil-1.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/pencil-1.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/pencil-2.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/pencil-2.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/pencil-2.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/pencil-2.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/plus.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/plus.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/plus.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/plus.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/question-mark-circled.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/question-mark-circled.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/question-mark-circled.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/question-mark-circled.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/reset.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/reset.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/reset.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/reset.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/sun.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/sun.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/sun.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/sun.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/trash.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/trash.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/trash.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/trash.svg diff --git a/exercises/02.test-setup/03.problem.authentication/other/svg-icons/update.svg b/exercises/02.authentication/01.problem.basic/other/svg-icons/update.svg similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/other/svg-icons/update.svg rename to exercises/02.authentication/01.problem.basic/other/svg-icons/update.svg diff --git a/exercises/02.test-setup/03.problem.authentication/package-lock.json b/exercises/02.authentication/01.problem.basic/package-lock.json similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/package-lock.json rename to exercises/02.authentication/01.problem.basic/package-lock.json diff --git a/exercises/02.test-setup/03.problem.authentication/package.json b/exercises/02.authentication/01.problem.basic/package.json similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/package.json rename to exercises/02.authentication/01.problem.basic/package.json diff --git a/exercises/02.test-setup/03.problem.authentication/playwright.config.ts b/exercises/02.authentication/01.problem.basic/playwright.config.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/playwright.config.ts rename to exercises/02.authentication/01.problem.basic/playwright.config.ts diff --git a/exercises/02.test-setup/03.problem.authentication/prisma/migrations/20250221233640_init/migration.sql b/exercises/02.authentication/01.problem.basic/prisma/migrations/20250221233640_init/migration.sql similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/prisma/migrations/20250221233640_init/migration.sql rename to exercises/02.authentication/01.problem.basic/prisma/migrations/20250221233640_init/migration.sql diff --git a/exercises/02.test-setup/03.problem.authentication/prisma/migrations/migration_lock.toml b/exercises/02.authentication/01.problem.basic/prisma/migrations/migration_lock.toml similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/prisma/migrations/migration_lock.toml rename to exercises/02.authentication/01.problem.basic/prisma/migrations/migration_lock.toml diff --git a/exercises/02.test-setup/03.problem.authentication/prisma/schema.prisma b/exercises/02.authentication/01.problem.basic/prisma/schema.prisma similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/prisma/schema.prisma rename to exercises/02.authentication/01.problem.basic/prisma/schema.prisma diff --git a/exercises/02.test-setup/03.problem.authentication/prisma/seed.ts b/exercises/02.authentication/01.problem.basic/prisma/seed.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/prisma/seed.ts rename to exercises/02.authentication/01.problem.basic/prisma/seed.ts diff --git a/exercises/02.test-setup/03.problem.authentication/prisma/sql/searchUsers.sql b/exercises/02.authentication/01.problem.basic/prisma/sql/searchUsers.sql similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/prisma/sql/searchUsers.sql rename to exercises/02.authentication/01.problem.basic/prisma/sql/searchUsers.sql diff --git a/exercises/02.test-setup/03.problem.authentication/public/favicon.ico b/exercises/02.authentication/01.problem.basic/public/favicon.ico similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/public/favicon.ico rename to exercises/02.authentication/01.problem.basic/public/favicon.ico diff --git a/exercises/02.test-setup/03.problem.authentication/public/favicons/README.md b/exercises/02.authentication/01.problem.basic/public/favicons/README.md similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/public/favicons/README.md rename to exercises/02.authentication/01.problem.basic/public/favicons/README.md diff --git a/exercises/02.test-setup/03.problem.authentication/public/favicons/android-chrome-192x192.png b/exercises/02.authentication/01.problem.basic/public/favicons/android-chrome-192x192.png similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/public/favicons/android-chrome-192x192.png rename to exercises/02.authentication/01.problem.basic/public/favicons/android-chrome-192x192.png diff --git a/exercises/02.test-setup/03.problem.authentication/public/favicons/android-chrome-512x512.png b/exercises/02.authentication/01.problem.basic/public/favicons/android-chrome-512x512.png similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/public/favicons/android-chrome-512x512.png rename to exercises/02.authentication/01.problem.basic/public/favicons/android-chrome-512x512.png diff --git a/exercises/02.test-setup/03.problem.authentication/public/img/user.png b/exercises/02.authentication/01.problem.basic/public/img/user.png similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/public/img/user.png rename to exercises/02.authentication/01.problem.basic/public/img/user.png diff --git a/exercises/02.test-setup/03.problem.authentication/public/site.webmanifest b/exercises/02.authentication/01.problem.basic/public/site.webmanifest similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/public/site.webmanifest rename to exercises/02.authentication/01.problem.basic/public/site.webmanifest diff --git a/exercises/02.test-setup/03.problem.authentication/react-router.config.ts b/exercises/02.authentication/01.problem.basic/react-router.config.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/react-router.config.ts rename to exercises/02.authentication/01.problem.basic/react-router.config.ts diff --git a/exercises/02.test-setup/03.problem.authentication/server/dev-server.js b/exercises/02.authentication/01.problem.basic/server/dev-server.js similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/server/dev-server.js rename to exercises/02.authentication/01.problem.basic/server/dev-server.js diff --git a/exercises/02.test-setup/03.problem.authentication/server/index.ts b/exercises/02.authentication/01.problem.basic/server/index.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/server/index.ts rename to exercises/02.authentication/01.problem.basic/server/index.ts diff --git a/exercises/02.test-setup/03.problem.authentication/server/utils/monitoring.ts b/exercises/02.authentication/01.problem.basic/server/utils/monitoring.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/server/utils/monitoring.ts rename to exercises/02.authentication/01.problem.basic/server/utils/monitoring.ts diff --git a/exercises/02.test-setup/03.problem.authentication/tests/db-utils.ts b/exercises/02.authentication/01.problem.basic/tests/db-utils.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/tests/db-utils.ts rename to exercises/02.authentication/01.problem.basic/tests/db-utils.ts diff --git a/exercises/02.test-setup/03.problem.authentication/tests/e2e/notes-create.test.ts b/exercises/02.authentication/01.problem.basic/tests/e2e/notes-create.test.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/tests/e2e/notes-create.test.ts rename to exercises/02.authentication/01.problem.basic/tests/e2e/notes-create.test.ts diff --git a/exercises/02.test-setup/03.problem.authentication/tests/setup/custom-matchers.ts b/exercises/02.authentication/01.problem.basic/tests/setup/custom-matchers.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/tests/setup/custom-matchers.ts rename to exercises/02.authentication/01.problem.basic/tests/setup/custom-matchers.ts diff --git a/exercises/02.test-setup/03.problem.authentication/tests/setup/db-setup.ts b/exercises/02.authentication/01.problem.basic/tests/setup/db-setup.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/tests/setup/db-setup.ts rename to exercises/02.authentication/01.problem.basic/tests/setup/db-setup.ts diff --git a/exercises/02.test-setup/03.problem.authentication/tests/setup/global-setup.ts b/exercises/02.authentication/01.problem.basic/tests/setup/global-setup.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/tests/setup/global-setup.ts rename to exercises/02.authentication/01.problem.basic/tests/setup/global-setup.ts diff --git a/exercises/02.test-setup/03.problem.authentication/tests/setup/setup-test-env.ts b/exercises/02.authentication/01.problem.basic/tests/setup/setup-test-env.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/tests/setup/setup-test-env.ts rename to exercises/02.authentication/01.problem.basic/tests/setup/setup-test-env.ts diff --git a/exercises/02.test-setup/03.problem.authentication/tests/test-extend.ts b/exercises/02.authentication/01.problem.basic/tests/test-extend.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/tests/test-extend.ts rename to exercises/02.authentication/01.problem.basic/tests/test-extend.ts diff --git a/exercises/02.test-setup/03.problem.authentication/tests/utils.ts b/exercises/02.authentication/01.problem.basic/tests/utils.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/tests/utils.ts rename to exercises/02.authentication/01.problem.basic/tests/utils.ts diff --git a/exercises/02.test-setup/03.problem.authentication/tsconfig.json b/exercises/02.authentication/01.problem.basic/tsconfig.json similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/tsconfig.json rename to exercises/02.authentication/01.problem.basic/tsconfig.json diff --git a/exercises/02.test-setup/03.problem.authentication/types/deps.d.ts b/exercises/02.authentication/01.problem.basic/types/deps.d.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/types/deps.d.ts rename to exercises/02.authentication/01.problem.basic/types/deps.d.ts diff --git a/exercises/02.test-setup/03.problem.authentication/types/env.env.d.ts b/exercises/02.authentication/01.problem.basic/types/env.env.d.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/types/env.env.d.ts rename to exercises/02.authentication/01.problem.basic/types/env.env.d.ts diff --git a/exercises/02.test-setup/03.problem.authentication/types/icon-name.d.ts b/exercises/02.authentication/01.problem.basic/types/icon-name.d.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/types/icon-name.d.ts rename to exercises/02.authentication/01.problem.basic/types/icon-name.d.ts diff --git a/exercises/02.test-setup/03.problem.authentication/types/reset.d.ts b/exercises/02.authentication/01.problem.basic/types/reset.d.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/types/reset.d.ts rename to exercises/02.authentication/01.problem.basic/types/reset.d.ts diff --git a/exercises/02.test-setup/03.problem.authentication/vite.config.ts b/exercises/02.authentication/01.problem.basic/vite.config.ts similarity index 100% rename from exercises/02.test-setup/03.problem.authentication/vite.config.ts rename to exercises/02.authentication/01.problem.basic/vite.config.ts diff --git a/exercises/02.test-setup/03.solution.authentication/.env b/exercises/02.authentication/01.solution.basic/.env similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/.env rename to exercises/02.authentication/01.solution.basic/.env diff --git a/exercises/02.test-setup/03.solution.authentication/.env.example b/exercises/02.authentication/01.solution.basic/.env.example similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/.env.example rename to exercises/02.authentication/01.solution.basic/.env.example diff --git a/exercises/02.test-setup/03.solution.authentication/.github/PULL_REQUEST_TEMPLATE.md b/exercises/02.authentication/01.solution.basic/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/.github/PULL_REQUEST_TEMPLATE.md rename to exercises/02.authentication/01.solution.basic/.github/PULL_REQUEST_TEMPLATE.md diff --git a/exercises/02.test-setup/03.solution.authentication/.github/workflows/deploy.yml b/exercises/02.authentication/01.solution.basic/.github/workflows/deploy.yml similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/.github/workflows/deploy.yml rename to exercises/02.authentication/01.solution.basic/.github/workflows/deploy.yml diff --git a/exercises/02.test-setup/03.solution.authentication/.gitignore b/exercises/02.authentication/01.solution.basic/.gitignore similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/.gitignore rename to exercises/02.authentication/01.solution.basic/.gitignore diff --git a/exercises/02.test-setup/03.solution.authentication/.npmrc b/exercises/02.authentication/01.solution.basic/.npmrc similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/.npmrc rename to exercises/02.authentication/01.solution.basic/.npmrc diff --git a/exercises/02.test-setup/03.solution.authentication/.prettierignore b/exercises/02.authentication/01.solution.basic/.prettierignore similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/.prettierignore rename to exercises/02.authentication/01.solution.basic/.prettierignore diff --git a/exercises/02.test-setup/03.solution.authentication/.vscode/extensions.json b/exercises/02.authentication/01.solution.basic/.vscode/extensions.json similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/.vscode/extensions.json rename to exercises/02.authentication/01.solution.basic/.vscode/extensions.json diff --git a/exercises/02.test-setup/03.solution.authentication/.vscode/remix.code-snippets b/exercises/02.authentication/01.solution.basic/.vscode/remix.code-snippets similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/.vscode/remix.code-snippets rename to exercises/02.authentication/01.solution.basic/.vscode/remix.code-snippets diff --git a/exercises/02.test-setup/03.solution.authentication/.vscode/settings.json b/exercises/02.authentication/01.solution.basic/.vscode/settings.json similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/.vscode/settings.json rename to exercises/02.authentication/01.solution.basic/.vscode/settings.json diff --git a/exercises/02.test-setup/03.solution.authentication/README.mdx b/exercises/02.authentication/01.solution.basic/README.mdx similarity index 87% rename from exercises/02.test-setup/03.solution.authentication/README.mdx rename to exercises/02.authentication/01.solution.basic/README.mdx index a03787c..8af34c3 100644 --- a/exercises/02.test-setup/03.solution.authentication/README.mdx +++ b/exercises/02.authentication/01.solution.basic/README.mdx @@ -1,4 +1,4 @@ -# Authentication +# Basic Good job! 👏 diff --git a/exercises/02.test-setup/03.solution.authentication/app/assets/favicons/apple-touch-icon.png b/exercises/02.authentication/01.solution.basic/app/assets/favicons/apple-touch-icon.png similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/assets/favicons/apple-touch-icon.png rename to exercises/02.authentication/01.solution.basic/app/assets/favicons/apple-touch-icon.png diff --git a/exercises/02.test-setup/03.solution.authentication/app/assets/favicons/favicon.svg b/exercises/02.authentication/01.solution.basic/app/assets/favicons/favicon.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/assets/favicons/favicon.svg rename to exercises/02.authentication/01.solution.basic/app/assets/favicons/favicon.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/error-boundary.tsx b/exercises/02.authentication/01.solution.basic/app/components/error-boundary.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/error-boundary.tsx rename to exercises/02.authentication/01.solution.basic/app/components/error-boundary.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/floating-toolbar.tsx b/exercises/02.authentication/01.solution.basic/app/components/floating-toolbar.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/floating-toolbar.tsx rename to exercises/02.authentication/01.solution.basic/app/components/floating-toolbar.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/forms.tsx b/exercises/02.authentication/01.solution.basic/app/components/forms.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/forms.tsx rename to exercises/02.authentication/01.solution.basic/app/components/forms.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/progress-bar.tsx b/exercises/02.authentication/01.solution.basic/app/components/progress-bar.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/progress-bar.tsx rename to exercises/02.authentication/01.solution.basic/app/components/progress-bar.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/search-bar.tsx b/exercises/02.authentication/01.solution.basic/app/components/search-bar.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/search-bar.tsx rename to exercises/02.authentication/01.solution.basic/app/components/search-bar.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/spacer.tsx b/exercises/02.authentication/01.solution.basic/app/components/spacer.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/spacer.tsx rename to exercises/02.authentication/01.solution.basic/app/components/spacer.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/toaster.tsx b/exercises/02.authentication/01.solution.basic/app/components/toaster.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/toaster.tsx rename to exercises/02.authentication/01.solution.basic/app/components/toaster.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/README.md b/exercises/02.authentication/01.solution.basic/app/components/ui/README.md similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/README.md rename to exercises/02.authentication/01.solution.basic/app/components/ui/README.md diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/button.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/button.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/button.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/button.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/checkbox.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/checkbox.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/checkbox.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/checkbox.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/dropdown-menu.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/dropdown-menu.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/dropdown-menu.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/dropdown-menu.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/icon.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/icon.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/icon.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/icon.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/input-otp.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/input-otp.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/input-otp.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/input-otp.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/input.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/input.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/input.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/input.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/label.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/label.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/label.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/label.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/sonner.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/sonner.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/sonner.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/sonner.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/status-button.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/status-button.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/status-button.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/status-button.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/textarea.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/textarea.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/textarea.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/textarea.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/ui/tooltip.tsx b/exercises/02.authentication/01.solution.basic/app/components/ui/tooltip.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/ui/tooltip.tsx rename to exercises/02.authentication/01.solution.basic/app/components/ui/tooltip.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/components/user-dropdown.tsx b/exercises/02.authentication/01.solution.basic/app/components/user-dropdown.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/components/user-dropdown.tsx rename to exercises/02.authentication/01.solution.basic/app/components/user-dropdown.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/entry.client.tsx b/exercises/02.authentication/01.solution.basic/app/entry.client.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/entry.client.tsx rename to exercises/02.authentication/01.solution.basic/app/entry.client.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/entry.server.tsx b/exercises/02.authentication/01.solution.basic/app/entry.server.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/entry.server.tsx rename to exercises/02.authentication/01.solution.basic/app/entry.server.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/root.tsx b/exercises/02.authentication/01.solution.basic/app/root.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/root.tsx rename to exercises/02.authentication/01.solution.basic/app/root.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes.ts b/exercises/02.authentication/01.solution.basic/app/routes.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes.ts rename to exercises/02.authentication/01.solution.basic/app/routes.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/$.tsx b/exercises/02.authentication/01.solution.basic/app/routes/$.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/$.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/$.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/auth.$provider.callback.test.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/auth.$provider.callback.test.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/auth.$provider.callback.test.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/auth.$provider.callback.test.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/auth.$provider.callback.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/auth.$provider.callback.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/auth.$provider.callback.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/auth.$provider.callback.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/auth_.$provider.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/auth_.$provider.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/auth_.$provider.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/auth_.$provider.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/forgot-password.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/forgot-password.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/forgot-password.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/forgot-password.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/login.server.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/login.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/login.server.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/login.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/login.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/login.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/login.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/login.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/logout.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/logout.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/logout.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/logout.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/onboarding.server.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/onboarding.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/onboarding.server.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/onboarding.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/onboarding.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/onboarding.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/onboarding.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/onboarding.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/onboarding_.$provider.server.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/onboarding_.$provider.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/onboarding_.$provider.server.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/onboarding_.$provider.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/onboarding_.$provider.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/onboarding_.$provider.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/onboarding_.$provider.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/onboarding_.$provider.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/reset-password.server.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/reset-password.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/reset-password.server.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/reset-password.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/reset-password.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/reset-password.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/reset-password.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/reset-password.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/signup.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/signup.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/signup.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/signup.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/verify.server.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/verify.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/verify.server.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/verify.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/verify.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/verify.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/verify.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/verify.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/webauthn+/authentication.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/webauthn+/authentication.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/webauthn+/authentication.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/webauthn+/authentication.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/webauthn+/registration.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/webauthn+/registration.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/webauthn+/registration.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/webauthn+/registration.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/webauthn+/utils.server.ts b/exercises/02.authentication/01.solution.basic/app/routes/_auth+/webauthn+/utils.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_auth+/webauthn+/utils.server.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_auth+/webauthn+/utils.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/about.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/about.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/about.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/about.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/index.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/index.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/index.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/index.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/docker.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/docker.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/docker.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/docker.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/eslint.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/eslint.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/eslint.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/eslint.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/faker.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/faker.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/faker.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/faker.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/fly.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/fly.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/fly.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/fly.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/github.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/github.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/github.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/github.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/logos.ts b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/logos.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/logos.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/logos.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/msw.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/msw.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/msw.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/msw.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/playwright.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/playwright.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/playwright.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/playwright.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/prettier.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/prettier.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/prettier.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/prettier.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/prisma.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/prisma.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/prisma.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/prisma.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/radix.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/radix.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/radix.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/radix.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/react-email.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/react-email.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/react-email.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/react-email.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/remix.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/remix.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/remix.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/remix.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/resend.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/resend.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/resend.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/resend.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/sentry.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/sentry.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/sentry.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/sentry.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/shadcn-ui.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/shadcn-ui.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/shadcn-ui.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/shadcn-ui.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/sqlite.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/sqlite.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/sqlite.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/sqlite.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/stars.jpg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/stars.jpg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/stars.jpg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/stars.jpg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/tailwind.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/tailwind.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/tailwind.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/tailwind.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/testing-library.png b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/testing-library.png similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/testing-library.png rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/testing-library.png diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/typescript.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/typescript.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/typescript.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/typescript.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/vitest.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/vitest.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/vitest.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/vitest.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/zod.svg b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/zod.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/logos/zod.svg rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/logos/zod.svg diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/privacy.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/privacy.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/privacy.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/privacy.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/support.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/support.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/support.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/support.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/tos.tsx b/exercises/02.authentication/01.solution.basic/app/routes/_marketing+/tos.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_marketing+/tos.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/_marketing+/tos.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_seo+/robots[.]txt.ts b/exercises/02.authentication/01.solution.basic/app/routes/_seo+/robots[.]txt.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_seo+/robots[.]txt.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_seo+/robots[.]txt.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/_seo+/sitemap[.]xml.ts b/exercises/02.authentication/01.solution.basic/app/routes/_seo+/sitemap[.]xml.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/_seo+/sitemap[.]xml.ts rename to exercises/02.authentication/01.solution.basic/app/routes/_seo+/sitemap[.]xml.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/admin+/cache.tsx b/exercises/02.authentication/01.solution.basic/app/routes/admin+/cache.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/admin+/cache.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/admin+/cache.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/admin+/cache_.lru.$cacheKey.ts b/exercises/02.authentication/01.solution.basic/app/routes/admin+/cache_.lru.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/admin+/cache_.lru.$cacheKey.ts rename to exercises/02.authentication/01.solution.basic/app/routes/admin+/cache_.lru.$cacheKey.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/admin+/cache_.sqlite.$cacheKey.ts b/exercises/02.authentication/01.solution.basic/app/routes/admin+/cache_.sqlite.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/admin+/cache_.sqlite.$cacheKey.ts rename to exercises/02.authentication/01.solution.basic/app/routes/admin+/cache_.sqlite.$cacheKey.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/admin+/cache_.sqlite.server.ts b/exercises/02.authentication/01.solution.basic/app/routes/admin+/cache_.sqlite.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/admin+/cache_.sqlite.server.ts rename to exercises/02.authentication/01.solution.basic/app/routes/admin+/cache_.sqlite.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/admin+/cache_.sqlite.tsx b/exercises/02.authentication/01.solution.basic/app/routes/admin+/cache_.sqlite.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/admin+/cache_.sqlite.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/admin+/cache_.sqlite.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/me.tsx b/exercises/02.authentication/01.solution.basic/app/routes/me.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/me.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/me.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/resources+/download-user-data.tsx b/exercises/02.authentication/01.solution.basic/app/routes/resources+/download-user-data.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/resources+/download-user-data.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/resources+/download-user-data.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/resources+/healthcheck.tsx b/exercises/02.authentication/01.solution.basic/app/routes/resources+/healthcheck.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/resources+/healthcheck.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/resources+/healthcheck.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/resources+/images.tsx b/exercises/02.authentication/01.solution.basic/app/routes/resources+/images.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/resources+/images.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/resources+/images.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/resources+/theme-switch.tsx b/exercises/02.authentication/01.solution.basic/app/routes/resources+/theme-switch.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/resources+/theme-switch.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/resources+/theme-switch.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.change-email.server.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.change-email.server.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.change-email.server.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.change-email.server.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.change-email.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.change-email.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.change-email.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.change-email.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.connections.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.connections.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.connections.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.connections.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.index.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.index.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.index.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.index.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.passkeys.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.passkeys.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.passkeys.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.passkeys.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.password.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.password.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.password.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.password.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.password_.create.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.password_.create.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.password_.create.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.password_.create.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.photo.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.photo.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.photo.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.photo.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.two-factor.disable.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.two-factor.disable.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.two-factor.disable.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.two-factor.disable.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.two-factor.index.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.two-factor.index.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.two-factor.index.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.two-factor.index.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.two-factor.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.two-factor.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.two-factor.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.two-factor.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.two-factor.verify.tsx b/exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.two-factor.verify.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/settings+/profile.two-factor.verify.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/settings+/profile.two-factor.verify.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username.test.tsx b/exercises/02.authentication/01.solution.basic/app/routes/users+/$username.test.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username.test.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/users+/$username.test.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username.tsx b/exercises/02.authentication/01.solution.basic/app/routes/users+/$username.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/users+/$username.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/__note-editor.server.tsx b/exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/__note-editor.server.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/__note-editor.server.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/__note-editor.server.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/__note-editor.tsx b/exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/__note-editor.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/__note-editor.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/__note-editor.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/notes.$noteId.tsx b/exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/notes.$noteId.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/notes.$noteId.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/notes.$noteId.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/notes.$noteId_.edit.tsx b/exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/notes.$noteId_.edit.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/notes.$noteId_.edit.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/notes.$noteId_.edit.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/notes.index.tsx b/exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/notes.index.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/notes.index.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/notes.index.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/notes.new.tsx b/exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/notes.new.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/notes.new.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/notes.new.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/notes.tsx b/exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/notes.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/users+/$username_+/notes.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/users+/$username_+/notes.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/routes/users+/index.tsx b/exercises/02.authentication/01.solution.basic/app/routes/users+/index.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/routes/users+/index.tsx rename to exercises/02.authentication/01.solution.basic/app/routes/users+/index.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/styles/tailwind.css b/exercises/02.authentication/01.solution.basic/app/styles/tailwind.css similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/styles/tailwind.css rename to exercises/02.authentication/01.solution.basic/app/styles/tailwind.css diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/auth.server.test.ts b/exercises/02.authentication/01.solution.basic/app/utils/auth.server.test.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/auth.server.test.ts rename to exercises/02.authentication/01.solution.basic/app/utils/auth.server.test.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/auth.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/auth.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/auth.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/auth.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/cache.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/cache.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/cache.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/cache.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/client-hints.tsx b/exercises/02.authentication/01.solution.basic/app/utils/client-hints.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/client-hints.tsx rename to exercises/02.authentication/01.solution.basic/app/utils/client-hints.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/connections.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/connections.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/connections.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/connections.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/connections.tsx b/exercises/02.authentication/01.solution.basic/app/utils/connections.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/connections.tsx rename to exercises/02.authentication/01.solution.basic/app/utils/connections.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/db.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/db.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/db.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/db.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/email.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/email.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/email.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/email.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/env.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/env.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/env.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/env.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/headers.server.test.ts b/exercises/02.authentication/01.solution.basic/app/utils/headers.server.test.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/headers.server.test.ts rename to exercises/02.authentication/01.solution.basic/app/utils/headers.server.test.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/headers.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/headers.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/headers.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/headers.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/honeypot.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/honeypot.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/honeypot.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/honeypot.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/litefs.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/litefs.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/litefs.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/litefs.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/misc.error-message.test.ts b/exercises/02.authentication/01.solution.basic/app/utils/misc.error-message.test.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/misc.error-message.test.ts rename to exercises/02.authentication/01.solution.basic/app/utils/misc.error-message.test.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/misc.tsx b/exercises/02.authentication/01.solution.basic/app/utils/misc.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/misc.tsx rename to exercises/02.authentication/01.solution.basic/app/utils/misc.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/misc.use-double-check.test.tsx b/exercises/02.authentication/01.solution.basic/app/utils/misc.use-double-check.test.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/misc.use-double-check.test.tsx rename to exercises/02.authentication/01.solution.basic/app/utils/misc.use-double-check.test.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/monitoring.client.tsx b/exercises/02.authentication/01.solution.basic/app/utils/monitoring.client.tsx similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/monitoring.client.tsx rename to exercises/02.authentication/01.solution.basic/app/utils/monitoring.client.tsx diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/nonce-provider.ts b/exercises/02.authentication/01.solution.basic/app/utils/nonce-provider.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/nonce-provider.ts rename to exercises/02.authentication/01.solution.basic/app/utils/nonce-provider.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/permissions.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/permissions.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/permissions.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/permissions.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/providers/constants.ts b/exercises/02.authentication/01.solution.basic/app/utils/providers/constants.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/providers/constants.ts rename to exercises/02.authentication/01.solution.basic/app/utils/providers/constants.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/providers/github.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/providers/github.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/providers/github.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/providers/github.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/providers/provider.ts b/exercises/02.authentication/01.solution.basic/app/utils/providers/provider.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/providers/provider.ts rename to exercises/02.authentication/01.solution.basic/app/utils/providers/provider.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/redirect-cookie.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/redirect-cookie.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/redirect-cookie.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/redirect-cookie.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/request-info.ts b/exercises/02.authentication/01.solution.basic/app/utils/request-info.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/request-info.ts rename to exercises/02.authentication/01.solution.basic/app/utils/request-info.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/session.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/session.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/session.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/session.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/storage.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/storage.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/storage.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/storage.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/theme.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/theme.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/theme.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/theme.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/timing.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/timing.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/timing.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/timing.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/toast.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/toast.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/toast.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/toast.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/totp.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/totp.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/totp.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/totp.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/user-validation.ts b/exercises/02.authentication/01.solution.basic/app/utils/user-validation.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/user-validation.ts rename to exercises/02.authentication/01.solution.basic/app/utils/user-validation.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/user.ts b/exercises/02.authentication/01.solution.basic/app/utils/user.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/user.ts rename to exercises/02.authentication/01.solution.basic/app/utils/user.ts diff --git a/exercises/02.test-setup/03.solution.authentication/app/utils/verification.server.ts b/exercises/02.authentication/01.solution.basic/app/utils/verification.server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/app/utils/verification.server.ts rename to exercises/02.authentication/01.solution.basic/app/utils/verification.server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/components.json b/exercises/02.authentication/01.solution.basic/components.json similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/components.json rename to exercises/02.authentication/01.solution.basic/components.json diff --git a/exercises/02.test-setup/03.solution.authentication/eslint.config.js b/exercises/02.authentication/01.solution.basic/eslint.config.js similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/eslint.config.js rename to exercises/02.authentication/01.solution.basic/eslint.config.js diff --git a/exercises/02.test-setup/03.solution.authentication/fly.toml b/exercises/02.authentication/01.solution.basic/fly.toml similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/fly.toml rename to exercises/02.authentication/01.solution.basic/fly.toml diff --git a/exercises/02.test-setup/03.solution.authentication/index.js b/exercises/02.authentication/01.solution.basic/index.js similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/index.js rename to exercises/02.authentication/01.solution.basic/index.js diff --git a/exercises/02.test-setup/03.solution.authentication/other/Dockerfile b/exercises/02.authentication/01.solution.basic/other/Dockerfile similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/Dockerfile rename to exercises/02.authentication/01.solution.basic/other/Dockerfile diff --git a/exercises/02.test-setup/03.solution.authentication/other/Dockerfile.dockerignore b/exercises/02.authentication/01.solution.basic/other/Dockerfile.dockerignore similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/Dockerfile.dockerignore rename to exercises/02.authentication/01.solution.basic/other/Dockerfile.dockerignore diff --git a/exercises/02.test-setup/03.solution.authentication/other/README.md b/exercises/02.authentication/01.solution.basic/other/README.md similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/README.md rename to exercises/02.authentication/01.solution.basic/other/README.md diff --git a/exercises/02.test-setup/03.solution.authentication/other/build-server.ts b/exercises/02.authentication/01.solution.basic/other/build-server.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/build-server.ts rename to exercises/02.authentication/01.solution.basic/other/build-server.ts diff --git a/exercises/02.test-setup/03.solution.authentication/other/litefs.yml b/exercises/02.authentication/01.solution.basic/other/litefs.yml similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/litefs.yml rename to exercises/02.authentication/01.solution.basic/other/litefs.yml diff --git a/exercises/02.test-setup/03.solution.authentication/other/sly/sly.json b/exercises/02.authentication/01.solution.basic/other/sly/sly.json similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/sly/sly.json rename to exercises/02.authentication/01.solution.basic/other/sly/sly.json diff --git a/exercises/02.test-setup/03.solution.authentication/other/sly/transform-icon.ts b/exercises/02.authentication/01.solution.basic/other/sly/transform-icon.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/sly/transform-icon.ts rename to exercises/02.authentication/01.solution.basic/other/sly/transform-icon.ts diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/README.md b/exercises/02.authentication/01.solution.basic/other/svg-icons/README.md similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/README.md rename to exercises/02.authentication/01.solution.basic/other/svg-icons/README.md diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/arrow-left.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/arrow-left.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/arrow-left.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/arrow-left.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/arrow-right.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/arrow-right.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/arrow-right.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/arrow-right.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/avatar.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/avatar.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/avatar.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/avatar.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/camera.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/camera.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/camera.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/camera.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/check.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/check.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/check.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/check.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/clock.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/clock.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/clock.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/clock.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/cross-1.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/cross-1.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/cross-1.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/cross-1.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/dots-horizontal.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/dots-horizontal.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/dots-horizontal.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/dots-horizontal.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/download.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/download.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/download.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/download.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/envelope-closed.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/envelope-closed.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/envelope-closed.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/envelope-closed.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/exit.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/exit.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/exit.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/exit.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/file-text.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/file-text.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/file-text.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/file-text.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/github-logo.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/github-logo.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/github-logo.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/github-logo.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/laptop.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/laptop.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/laptop.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/laptop.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/link-2.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/link-2.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/link-2.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/link-2.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/lock-closed.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/lock-closed.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/lock-closed.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/lock-closed.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/lock-open-1.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/lock-open-1.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/lock-open-1.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/lock-open-1.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/magnifying-glass.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/magnifying-glass.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/magnifying-glass.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/magnifying-glass.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/moon.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/moon.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/moon.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/moon.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/passkey.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/passkey.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/passkey.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/passkey.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/pencil-1.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/pencil-1.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/pencil-1.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/pencil-1.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/pencil-2.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/pencil-2.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/pencil-2.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/pencil-2.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/plus.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/plus.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/plus.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/plus.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/question-mark-circled.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/question-mark-circled.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/question-mark-circled.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/question-mark-circled.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/reset.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/reset.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/reset.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/reset.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/sun.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/sun.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/sun.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/sun.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/trash.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/trash.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/trash.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/trash.svg diff --git a/exercises/02.test-setup/03.solution.authentication/other/svg-icons/update.svg b/exercises/02.authentication/01.solution.basic/other/svg-icons/update.svg similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/other/svg-icons/update.svg rename to exercises/02.authentication/01.solution.basic/other/svg-icons/update.svg diff --git a/exercises/02.test-setup/03.solution.authentication/package-lock.json b/exercises/02.authentication/01.solution.basic/package-lock.json similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/package-lock.json rename to exercises/02.authentication/01.solution.basic/package-lock.json diff --git a/exercises/02.test-setup/03.solution.authentication/package.json b/exercises/02.authentication/01.solution.basic/package.json similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/package.json rename to exercises/02.authentication/01.solution.basic/package.json diff --git a/exercises/02.test-setup/03.solution.authentication/playwright.config.ts b/exercises/02.authentication/01.solution.basic/playwright.config.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/playwright.config.ts rename to exercises/02.authentication/01.solution.basic/playwright.config.ts diff --git a/exercises/02.test-setup/03.solution.authentication/prisma/migrations/20250221233640_init/migration.sql b/exercises/02.authentication/01.solution.basic/prisma/migrations/20250221233640_init/migration.sql similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/prisma/migrations/20250221233640_init/migration.sql rename to exercises/02.authentication/01.solution.basic/prisma/migrations/20250221233640_init/migration.sql diff --git a/exercises/02.test-setup/03.solution.authentication/prisma/migrations/migration_lock.toml b/exercises/02.authentication/01.solution.basic/prisma/migrations/migration_lock.toml similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/prisma/migrations/migration_lock.toml rename to exercises/02.authentication/01.solution.basic/prisma/migrations/migration_lock.toml diff --git a/exercises/02.test-setup/03.solution.authentication/prisma/schema.prisma b/exercises/02.authentication/01.solution.basic/prisma/schema.prisma similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/prisma/schema.prisma rename to exercises/02.authentication/01.solution.basic/prisma/schema.prisma diff --git a/exercises/02.test-setup/03.solution.authentication/prisma/seed.ts b/exercises/02.authentication/01.solution.basic/prisma/seed.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/prisma/seed.ts rename to exercises/02.authentication/01.solution.basic/prisma/seed.ts diff --git a/exercises/02.test-setup/03.solution.authentication/prisma/sql/searchUsers.sql b/exercises/02.authentication/01.solution.basic/prisma/sql/searchUsers.sql similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/prisma/sql/searchUsers.sql rename to exercises/02.authentication/01.solution.basic/prisma/sql/searchUsers.sql diff --git a/exercises/02.test-setup/03.solution.authentication/public/favicon.ico b/exercises/02.authentication/01.solution.basic/public/favicon.ico similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/public/favicon.ico rename to exercises/02.authentication/01.solution.basic/public/favicon.ico diff --git a/exercises/02.test-setup/03.solution.authentication/public/favicons/README.md b/exercises/02.authentication/01.solution.basic/public/favicons/README.md similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/public/favicons/README.md rename to exercises/02.authentication/01.solution.basic/public/favicons/README.md diff --git a/exercises/02.test-setup/03.solution.authentication/public/favicons/android-chrome-192x192.png b/exercises/02.authentication/01.solution.basic/public/favicons/android-chrome-192x192.png similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/public/favicons/android-chrome-192x192.png rename to exercises/02.authentication/01.solution.basic/public/favicons/android-chrome-192x192.png diff --git a/exercises/02.test-setup/03.solution.authentication/public/favicons/android-chrome-512x512.png b/exercises/02.authentication/01.solution.basic/public/favicons/android-chrome-512x512.png similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/public/favicons/android-chrome-512x512.png rename to exercises/02.authentication/01.solution.basic/public/favicons/android-chrome-512x512.png diff --git a/exercises/02.test-setup/03.solution.authentication/public/img/user.png b/exercises/02.authentication/01.solution.basic/public/img/user.png similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/public/img/user.png rename to exercises/02.authentication/01.solution.basic/public/img/user.png diff --git a/exercises/02.test-setup/03.solution.authentication/public/site.webmanifest b/exercises/02.authentication/01.solution.basic/public/site.webmanifest similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/public/site.webmanifest rename to exercises/02.authentication/01.solution.basic/public/site.webmanifest diff --git a/exercises/02.test-setup/03.solution.authentication/react-router.config.ts b/exercises/02.authentication/01.solution.basic/react-router.config.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/react-router.config.ts rename to exercises/02.authentication/01.solution.basic/react-router.config.ts diff --git a/exercises/02.test-setup/03.solution.authentication/server/dev-server.js b/exercises/02.authentication/01.solution.basic/server/dev-server.js similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/server/dev-server.js rename to exercises/02.authentication/01.solution.basic/server/dev-server.js diff --git a/exercises/02.test-setup/03.solution.authentication/server/index.ts b/exercises/02.authentication/01.solution.basic/server/index.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/server/index.ts rename to exercises/02.authentication/01.solution.basic/server/index.ts diff --git a/exercises/02.test-setup/03.solution.authentication/server/utils/monitoring.ts b/exercises/02.authentication/01.solution.basic/server/utils/monitoring.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/server/utils/monitoring.ts rename to exercises/02.authentication/01.solution.basic/server/utils/monitoring.ts diff --git a/exercises/02.test-setup/03.solution.authentication/tests/db-utils.ts b/exercises/02.authentication/01.solution.basic/tests/db-utils.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/tests/db-utils.ts rename to exercises/02.authentication/01.solution.basic/tests/db-utils.ts diff --git a/exercises/02.test-setup/03.solution.authentication/tests/e2e/notes-create.test.ts b/exercises/02.authentication/01.solution.basic/tests/e2e/notes-create.test.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/tests/e2e/notes-create.test.ts rename to exercises/02.authentication/01.solution.basic/tests/e2e/notes-create.test.ts diff --git a/exercises/02.test-setup/03.solution.authentication/tests/setup/custom-matchers.ts b/exercises/02.authentication/01.solution.basic/tests/setup/custom-matchers.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/tests/setup/custom-matchers.ts rename to exercises/02.authentication/01.solution.basic/tests/setup/custom-matchers.ts diff --git a/exercises/02.test-setup/03.solution.authentication/tests/setup/db-setup.ts b/exercises/02.authentication/01.solution.basic/tests/setup/db-setup.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/tests/setup/db-setup.ts rename to exercises/02.authentication/01.solution.basic/tests/setup/db-setup.ts diff --git a/exercises/02.test-setup/03.solution.authentication/tests/setup/global-setup.ts b/exercises/02.authentication/01.solution.basic/tests/setup/global-setup.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/tests/setup/global-setup.ts rename to exercises/02.authentication/01.solution.basic/tests/setup/global-setup.ts diff --git a/exercises/02.test-setup/03.solution.authentication/tests/setup/setup-test-env.ts b/exercises/02.authentication/01.solution.basic/tests/setup/setup-test-env.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/tests/setup/setup-test-env.ts rename to exercises/02.authentication/01.solution.basic/tests/setup/setup-test-env.ts diff --git a/exercises/02.test-setup/03.solution.authentication/tests/test-extend.ts b/exercises/02.authentication/01.solution.basic/tests/test-extend.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/tests/test-extend.ts rename to exercises/02.authentication/01.solution.basic/tests/test-extend.ts diff --git a/exercises/02.test-setup/03.solution.authentication/tests/utils.ts b/exercises/02.authentication/01.solution.basic/tests/utils.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/tests/utils.ts rename to exercises/02.authentication/01.solution.basic/tests/utils.ts diff --git a/exercises/02.test-setup/03.solution.authentication/tsconfig.json b/exercises/02.authentication/01.solution.basic/tsconfig.json similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/tsconfig.json rename to exercises/02.authentication/01.solution.basic/tsconfig.json diff --git a/exercises/02.test-setup/03.solution.authentication/types/deps.d.ts b/exercises/02.authentication/01.solution.basic/types/deps.d.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/types/deps.d.ts rename to exercises/02.authentication/01.solution.basic/types/deps.d.ts diff --git a/exercises/02.test-setup/03.solution.authentication/types/env.env.d.ts b/exercises/02.authentication/01.solution.basic/types/env.env.d.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/types/env.env.d.ts rename to exercises/02.authentication/01.solution.basic/types/env.env.d.ts diff --git a/exercises/02.test-setup/03.solution.authentication/types/icon-name.d.ts b/exercises/02.authentication/01.solution.basic/types/icon-name.d.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/types/icon-name.d.ts rename to exercises/02.authentication/01.solution.basic/types/icon-name.d.ts diff --git a/exercises/02.test-setup/03.solution.authentication/types/reset.d.ts b/exercises/02.authentication/01.solution.basic/types/reset.d.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/types/reset.d.ts rename to exercises/02.authentication/01.solution.basic/types/reset.d.ts diff --git a/exercises/02.test-setup/03.solution.authentication/vite.config.ts b/exercises/02.authentication/01.solution.basic/vite.config.ts similarity index 100% rename from exercises/02.test-setup/03.solution.authentication/vite.config.ts rename to exercises/02.authentication/01.solution.basic/vite.config.ts diff --git a/exercises/02.authentication/02.solution.2fa/README.mdx b/exercises/02.authentication/02.solution.2fa/README.mdx new file mode 100644 index 0000000..05a3ec6 --- /dev/null +++ b/exercises/02.authentication/02.solution.2fa/README.mdx @@ -0,0 +1 @@ +# Two-factor authentication \ No newline at end of file diff --git a/exercises/02.authentication/03.solution.passkeys/README.mdx b/exercises/02.authentication/03.solution.passkeys/README.mdx new file mode 100644 index 0000000..a13a75f --- /dev/null +++ b/exercises/02.authentication/03.solution.passkeys/README.mdx @@ -0,0 +1 @@ +# Passkeys \ No newline at end of file diff --git a/exercises/02.authentication/04.solution.captcha/README.mdx b/exercises/02.authentication/04.solution.captcha/README.mdx new file mode 100644 index 0000000..369af68 --- /dev/null +++ b/exercises/02.authentication/04.solution.captcha/README.mdx @@ -0,0 +1 @@ +# CAPTCHA \ No newline at end of file diff --git a/exercises/02.authentication/FINISHED.mdx b/exercises/02.authentication/FINISHED.mdx new file mode 100644 index 0000000..66a783b --- /dev/null +++ b/exercises/02.authentication/FINISHED.mdx @@ -0,0 +1 @@ +# Authentication \ No newline at end of file diff --git a/exercises/02.authentication/README.mdx b/exercises/02.authentication/README.mdx new file mode 100644 index 0000000..66a783b --- /dev/null +++ b/exercises/02.authentication/README.mdx @@ -0,0 +1 @@ +# Authentication \ No newline at end of file diff --git a/exercises/02.test-setup/02.problem.mock-databases/README.mdx b/exercises/02.test-setup/02.problem.mock-databases/README.mdx deleted file mode 100644 index 33411d5..0000000 --- a/exercises/02.test-setup/02.problem.mock-databases/README.mdx +++ /dev/null @@ -1,11 +0,0 @@ -# Mock databases - -Problem: Your app under test **must not** communicate with the actual database. - -Mocking database connections is database-specific. There are serveral kinds of databases you might be using: - -- **File-based** (SQLite). Just point it to a local file; -- **Server-based** (Postgres). You can run that DB instance locally in a Docker image and point your DB client to that locally running DB instance. -- **In-memory databases** (Redis). Run database locally (that's usually easier and doesn't require Docker), connect to the locally running instance. - -> Some database clients, like Supabase, might also expose an additional layer between your application and the database. You might decide to tap into that, too. diff --git a/exercises/02.test-setup/02.problem.mock-databases/package.json b/exercises/02.test-setup/02.problem.mock-databases/package.json deleted file mode 100644 index bf797b9..0000000 --- a/exercises/02.test-setup/02.problem.mock-databases/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "exercises_02.test-setup_02.problem.mock-databases" -} diff --git a/exercises/02.test-setup/02.solution.mock-databases/README.mdx b/exercises/02.test-setup/02.solution.mock-databases/README.mdx deleted file mode 100644 index e3f649a..0000000 --- a/exercises/02.test-setup/02.solution.mock-databases/README.mdx +++ /dev/null @@ -1,10 +0,0 @@ -# Mock databases - -Good job! 👏 - -Take a quick rest and let's continue. - -## Related materials - -- [PostgreSQL test setup with Prisma](https://www.prisma.io/docs/orm/prisma-client/testing/integration-testing) -- [Redus test setup (Node.js)](https://redis.io/docs/latest/develop/clients/nodejs/) diff --git a/exercises/02.test-setup/02.solution.mock-databases/package.json b/exercises/02.test-setup/02.solution.mock-databases/package.json deleted file mode 100644 index 334bcf0..0000000 --- a/exercises/02.test-setup/02.solution.mock-databases/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "exercises_02.test-setup_02.solution.mock-databases" -} diff --git a/exercises/02.test-setup/FINISHED.mdx b/exercises/02.test-setup/FINISHED.mdx deleted file mode 100644 index f593c92..0000000 --- a/exercises/02.test-setup/FINISHED.mdx +++ /dev/null @@ -1,5 +0,0 @@ -# Test setup - -Congratulations, you've completed this exercise block! 🥳 Let's have a short rest and continue. - -Meanwhile, I would be grateful if you _filled out the feedback form_ on your right. Your feedback helps me polish the exercises and improve the workshop before recording it. Thank you! diff --git a/exercises/02.test-setup/README.mdx b/exercises/02.test-setup/README.mdx deleted file mode 100644 index 5263799..0000000 --- a/exercises/02.test-setup/README.mdx +++ /dev/null @@ -1 +0,0 @@ -# Test setup diff --git a/exercises/03.databases/01.solution.file-based/README.mdx b/exercises/03.databases/01.solution.file-based/README.mdx new file mode 100644 index 0000000..ed81fc7 --- /dev/null +++ b/exercises/03.databases/01.solution.file-based/README.mdx @@ -0,0 +1 @@ +# File-based \ No newline at end of file diff --git a/exercises/03.databases/02.solution.in-memory/README.mdx b/exercises/03.databases/02.solution.in-memory/README.mdx new file mode 100644 index 0000000..6c76b4c --- /dev/null +++ b/exercises/03.databases/02.solution.in-memory/README.mdx @@ -0,0 +1 @@ +# In-memory \ No newline at end of file diff --git a/exercises/03.databases/03.solution.dockerized/README.mdx b/exercises/03.databases/03.solution.dockerized/README.mdx new file mode 100644 index 0000000..ec1b971 --- /dev/null +++ b/exercises/03.databases/03.solution.dockerized/README.mdx @@ -0,0 +1 @@ +# Dockerized \ No newline at end of file diff --git a/exercises/02.test-setup/04.problem.api-mocking/.env b/exercises/03.databases/04.problem.test-data/.env similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/.env rename to exercises/03.databases/04.problem.test-data/.env diff --git a/exercises/02.test-setup/04.problem.api-mocking/.env.example b/exercises/03.databases/04.problem.test-data/.env.example similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/.env.example rename to exercises/03.databases/04.problem.test-data/.env.example diff --git a/exercises/02.test-setup/04.problem.api-mocking/.github/PULL_REQUEST_TEMPLATE.md b/exercises/03.databases/04.problem.test-data/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/.github/PULL_REQUEST_TEMPLATE.md rename to exercises/03.databases/04.problem.test-data/.github/PULL_REQUEST_TEMPLATE.md diff --git a/exercises/02.test-setup/04.problem.api-mocking/.github/workflows/deploy.yml b/exercises/03.databases/04.problem.test-data/.github/workflows/deploy.yml similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/.github/workflows/deploy.yml rename to exercises/03.databases/04.problem.test-data/.github/workflows/deploy.yml diff --git a/exercises/02.test-setup/04.problem.api-mocking/.gitignore b/exercises/03.databases/04.problem.test-data/.gitignore similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/.gitignore rename to exercises/03.databases/04.problem.test-data/.gitignore diff --git a/exercises/02.test-setup/04.problem.api-mocking/.npmrc b/exercises/03.databases/04.problem.test-data/.npmrc similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/.npmrc rename to exercises/03.databases/04.problem.test-data/.npmrc diff --git a/exercises/02.test-setup/04.problem.api-mocking/.prettierignore b/exercises/03.databases/04.problem.test-data/.prettierignore similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/.prettierignore rename to exercises/03.databases/04.problem.test-data/.prettierignore diff --git a/exercises/02.test-setup/04.problem.api-mocking/.vscode/extensions.json b/exercises/03.databases/04.problem.test-data/.vscode/extensions.json similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/.vscode/extensions.json rename to exercises/03.databases/04.problem.test-data/.vscode/extensions.json diff --git a/exercises/02.test-setup/04.problem.api-mocking/.vscode/remix.code-snippets b/exercises/03.databases/04.problem.test-data/.vscode/remix.code-snippets similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/.vscode/remix.code-snippets rename to exercises/03.databases/04.problem.test-data/.vscode/remix.code-snippets diff --git a/exercises/02.test-setup/04.problem.api-mocking/.vscode/settings.json b/exercises/03.databases/04.problem.test-data/.vscode/settings.json similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/.vscode/settings.json rename to exercises/03.databases/04.problem.test-data/.vscode/settings.json diff --git a/exercises/02.test-setup/05.problem.test-data/README.mdx b/exercises/03.databases/04.problem.test-data/README.mdx similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/README.mdx rename to exercises/03.databases/04.problem.test-data/README.mdx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/assets/favicons/apple-touch-icon.png b/exercises/03.databases/04.problem.test-data/app/assets/favicons/apple-touch-icon.png similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/assets/favicons/apple-touch-icon.png rename to exercises/03.databases/04.problem.test-data/app/assets/favicons/apple-touch-icon.png diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/assets/favicons/favicon.svg b/exercises/03.databases/04.problem.test-data/app/assets/favicons/favicon.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/assets/favicons/favicon.svg rename to exercises/03.databases/04.problem.test-data/app/assets/favicons/favicon.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/error-boundary.tsx b/exercises/03.databases/04.problem.test-data/app/components/error-boundary.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/error-boundary.tsx rename to exercises/03.databases/04.problem.test-data/app/components/error-boundary.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/floating-toolbar.tsx b/exercises/03.databases/04.problem.test-data/app/components/floating-toolbar.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/floating-toolbar.tsx rename to exercises/03.databases/04.problem.test-data/app/components/floating-toolbar.tsx diff --git a/exercises/02.test-setup/05.problem.test-data/app/components/forms.tsx b/exercises/03.databases/04.problem.test-data/app/components/forms.tsx similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/app/components/forms.tsx rename to exercises/03.databases/04.problem.test-data/app/components/forms.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/progress-bar.tsx b/exercises/03.databases/04.problem.test-data/app/components/progress-bar.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/progress-bar.tsx rename to exercises/03.databases/04.problem.test-data/app/components/progress-bar.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/search-bar.tsx b/exercises/03.databases/04.problem.test-data/app/components/search-bar.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/search-bar.tsx rename to exercises/03.databases/04.problem.test-data/app/components/search-bar.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/spacer.tsx b/exercises/03.databases/04.problem.test-data/app/components/spacer.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/spacer.tsx rename to exercises/03.databases/04.problem.test-data/app/components/spacer.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/toaster.tsx b/exercises/03.databases/04.problem.test-data/app/components/toaster.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/toaster.tsx rename to exercises/03.databases/04.problem.test-data/app/components/toaster.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/README.md b/exercises/03.databases/04.problem.test-data/app/components/ui/README.md similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/README.md rename to exercises/03.databases/04.problem.test-data/app/components/ui/README.md diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/button.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/button.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/button.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/button.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/checkbox.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/checkbox.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/checkbox.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/checkbox.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/dropdown-menu.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/dropdown-menu.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/dropdown-menu.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/dropdown-menu.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/icon.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/icon.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/icon.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/icon.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/input-otp.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/input-otp.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/input-otp.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/input-otp.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/input.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/input.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/input.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/input.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/label.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/label.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/label.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/label.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/sonner.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/sonner.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/sonner.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/sonner.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/status-button.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/status-button.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/status-button.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/status-button.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/textarea.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/textarea.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/textarea.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/textarea.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/ui/tooltip.tsx b/exercises/03.databases/04.problem.test-data/app/components/ui/tooltip.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/ui/tooltip.tsx rename to exercises/03.databases/04.problem.test-data/app/components/ui/tooltip.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/components/user-dropdown.tsx b/exercises/03.databases/04.problem.test-data/app/components/user-dropdown.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/components/user-dropdown.tsx rename to exercises/03.databases/04.problem.test-data/app/components/user-dropdown.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/entry.client.tsx b/exercises/03.databases/04.problem.test-data/app/entry.client.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/entry.client.tsx rename to exercises/03.databases/04.problem.test-data/app/entry.client.tsx diff --git a/exercises/02.test-setup/05.problem.test-data/app/entry.server.tsx b/exercises/03.databases/04.problem.test-data/app/entry.server.tsx similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/app/entry.server.tsx rename to exercises/03.databases/04.problem.test-data/app/entry.server.tsx diff --git a/exercises/02.test-setup/05.problem.test-data/app/root.tsx b/exercises/03.databases/04.problem.test-data/app/root.tsx similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/app/root.tsx rename to exercises/03.databases/04.problem.test-data/app/root.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes.ts b/exercises/03.databases/04.problem.test-data/app/routes.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes.ts rename to exercises/03.databases/04.problem.test-data/app/routes.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/$.tsx b/exercises/03.databases/04.problem.test-data/app/routes/$.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/$.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/$.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/auth.$provider.callback.test.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/auth.$provider.callback.test.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/auth.$provider.callback.test.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/auth.$provider.callback.test.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/auth.$provider.callback.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/auth.$provider.callback.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/auth.$provider.callback.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/auth.$provider.callback.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/auth_.$provider.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/auth_.$provider.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/auth_.$provider.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/auth_.$provider.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/forgot-password.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/forgot-password.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/forgot-password.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/forgot-password.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/login.server.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/login.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/login.server.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/login.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/login.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/login.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/login.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/login.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/logout.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/logout.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/logout.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/logout.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/onboarding.server.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/onboarding.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/onboarding.server.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/onboarding.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/onboarding.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/onboarding.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/onboarding.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/onboarding.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/onboarding_.$provider.server.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/onboarding_.$provider.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/onboarding_.$provider.server.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/onboarding_.$provider.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/onboarding_.$provider.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/onboarding_.$provider.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/onboarding_.$provider.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/onboarding_.$provider.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/reset-password.server.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/reset-password.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/reset-password.server.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/reset-password.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/reset-password.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/reset-password.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/reset-password.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/reset-password.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/signup.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/signup.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/signup.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/signup.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/verify.server.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/verify.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/verify.server.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/verify.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/verify.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/verify.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/verify.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/verify.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/webauthn+/authentication.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/webauthn+/authentication.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/webauthn+/authentication.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/webauthn+/authentication.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/webauthn+/registration.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/webauthn+/registration.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/webauthn+/registration.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/webauthn+/registration.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/webauthn+/utils.server.ts b/exercises/03.databases/04.problem.test-data/app/routes/_auth+/webauthn+/utils.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_auth+/webauthn+/utils.server.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_auth+/webauthn+/utils.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/about.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/about.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/about.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/about.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/index.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/index.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/index.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/index.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/docker.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/docker.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/docker.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/docker.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/eslint.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/eslint.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/eslint.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/eslint.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/faker.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/faker.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/faker.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/faker.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/fly.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/fly.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/fly.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/fly.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/github.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/github.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/github.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/github.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/logos.ts b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/logos.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/logos.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/logos.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/msw.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/msw.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/msw.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/msw.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/playwright.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/playwright.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/playwright.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/playwright.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/prettier.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/prettier.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/prettier.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/prettier.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/prisma.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/prisma.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/prisma.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/prisma.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/radix.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/radix.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/radix.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/radix.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/react-email.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/react-email.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/react-email.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/react-email.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/remix.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/remix.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/remix.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/remix.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/resend.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/resend.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/resend.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/resend.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/sentry.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/sentry.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/sentry.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/sentry.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/shadcn-ui.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/shadcn-ui.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/shadcn-ui.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/shadcn-ui.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/sqlite.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/sqlite.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/sqlite.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/sqlite.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/stars.jpg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/stars.jpg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/stars.jpg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/stars.jpg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/tailwind.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/tailwind.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/tailwind.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/tailwind.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/testing-library.png b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/testing-library.png similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/testing-library.png rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/testing-library.png diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/typescript.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/typescript.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/typescript.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/typescript.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/vitest.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/vitest.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/vitest.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/vitest.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/zod.svg b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/zod.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/logos/zod.svg rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/logos/zod.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/privacy.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/privacy.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/privacy.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/privacy.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/support.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/support.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/support.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/support.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/tos.tsx b/exercises/03.databases/04.problem.test-data/app/routes/_marketing+/tos.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_marketing+/tos.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/_marketing+/tos.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_seo+/robots[.]txt.ts b/exercises/03.databases/04.problem.test-data/app/routes/_seo+/robots[.]txt.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_seo+/robots[.]txt.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_seo+/robots[.]txt.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/_seo+/sitemap[.]xml.ts b/exercises/03.databases/04.problem.test-data/app/routes/_seo+/sitemap[.]xml.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/_seo+/sitemap[.]xml.ts rename to exercises/03.databases/04.problem.test-data/app/routes/_seo+/sitemap[.]xml.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/admin+/cache.tsx b/exercises/03.databases/04.problem.test-data/app/routes/admin+/cache.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/admin+/cache.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/admin+/cache.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/admin+/cache_.lru.$cacheKey.ts b/exercises/03.databases/04.problem.test-data/app/routes/admin+/cache_.lru.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/admin+/cache_.lru.$cacheKey.ts rename to exercises/03.databases/04.problem.test-data/app/routes/admin+/cache_.lru.$cacheKey.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/admin+/cache_.sqlite.$cacheKey.ts b/exercises/03.databases/04.problem.test-data/app/routes/admin+/cache_.sqlite.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/admin+/cache_.sqlite.$cacheKey.ts rename to exercises/03.databases/04.problem.test-data/app/routes/admin+/cache_.sqlite.$cacheKey.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/admin+/cache_.sqlite.server.ts b/exercises/03.databases/04.problem.test-data/app/routes/admin+/cache_.sqlite.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/admin+/cache_.sqlite.server.ts rename to exercises/03.databases/04.problem.test-data/app/routes/admin+/cache_.sqlite.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/admin+/cache_.sqlite.tsx b/exercises/03.databases/04.problem.test-data/app/routes/admin+/cache_.sqlite.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/admin+/cache_.sqlite.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/admin+/cache_.sqlite.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/me.tsx b/exercises/03.databases/04.problem.test-data/app/routes/me.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/me.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/me.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/resources+/download-user-data.tsx b/exercises/03.databases/04.problem.test-data/app/routes/resources+/download-user-data.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/resources+/download-user-data.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/resources+/download-user-data.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/resources+/healthcheck.tsx b/exercises/03.databases/04.problem.test-data/app/routes/resources+/healthcheck.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/resources+/healthcheck.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/resources+/healthcheck.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/resources+/images.tsx b/exercises/03.databases/04.problem.test-data/app/routes/resources+/images.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/resources+/images.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/resources+/images.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/resources+/theme-switch.tsx b/exercises/03.databases/04.problem.test-data/app/routes/resources+/theme-switch.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/resources+/theme-switch.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/resources+/theme-switch.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.change-email.server.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.change-email.server.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.change-email.server.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.change-email.server.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.change-email.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.change-email.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.change-email.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.change-email.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.connections.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.connections.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.connections.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.connections.tsx diff --git a/exercises/02.test-setup/05.problem.test-data/app/routes/settings+/profile.index.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.index.tsx similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/app/routes/settings+/profile.index.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.index.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.passkeys.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.passkeys.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.passkeys.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.passkeys.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.password.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.password.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.password.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.password.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.password_.create.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.password_.create.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.password_.create.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.password_.create.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.photo.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.photo.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.photo.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.photo.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.two-factor.disable.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.two-factor.disable.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.two-factor.disable.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.two-factor.disable.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.two-factor.index.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.two-factor.index.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.two-factor.index.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.two-factor.index.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.two-factor.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.two-factor.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.two-factor.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.two-factor.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.two-factor.verify.tsx b/exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.two-factor.verify.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/settings+/profile.two-factor.verify.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/settings+/profile.two-factor.verify.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username.test.tsx b/exercises/03.databases/04.problem.test-data/app/routes/users+/$username.test.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username.test.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/users+/$username.test.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username.tsx b/exercises/03.databases/04.problem.test-data/app/routes/users+/$username.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/users+/$username.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username_+/__note-editor.server.tsx b/exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/__note-editor.server.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username_+/__note-editor.server.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/__note-editor.server.tsx diff --git a/exercises/02.test-setup/05.problem.test-data/app/routes/users+/$username_+/__note-editor.tsx b/exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/__note-editor.tsx similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/app/routes/users+/$username_+/__note-editor.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/__note-editor.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username_+/notes.$noteId.tsx b/exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/notes.$noteId.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username_+/notes.$noteId.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/notes.$noteId.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username_+/notes.$noteId_.edit.tsx b/exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/notes.$noteId_.edit.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username_+/notes.$noteId_.edit.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/notes.$noteId_.edit.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username_+/notes.index.tsx b/exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/notes.index.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username_+/notes.index.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/notes.index.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username_+/notes.new.tsx b/exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/notes.new.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/$username_+/notes.new.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/notes.new.tsx diff --git a/exercises/02.test-setup/05.problem.test-data/app/routes/users+/$username_+/notes.tsx b/exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/notes.tsx similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/app/routes/users+/$username_+/notes.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/users+/$username_+/notes.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/index.tsx b/exercises/03.databases/04.problem.test-data/app/routes/users+/index.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/routes/users+/index.tsx rename to exercises/03.databases/04.problem.test-data/app/routes/users+/index.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/styles/tailwind.css b/exercises/03.databases/04.problem.test-data/app/styles/tailwind.css similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/styles/tailwind.css rename to exercises/03.databases/04.problem.test-data/app/styles/tailwind.css diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/auth.server.test.ts b/exercises/03.databases/04.problem.test-data/app/utils/auth.server.test.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/auth.server.test.ts rename to exercises/03.databases/04.problem.test-data/app/utils/auth.server.test.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/auth.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/auth.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/auth.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/auth.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/cache.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/cache.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/cache.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/cache.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/client-hints.tsx b/exercises/03.databases/04.problem.test-data/app/utils/client-hints.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/client-hints.tsx rename to exercises/03.databases/04.problem.test-data/app/utils/client-hints.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/connections.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/connections.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/connections.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/connections.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/connections.tsx b/exercises/03.databases/04.problem.test-data/app/utils/connections.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/connections.tsx rename to exercises/03.databases/04.problem.test-data/app/utils/connections.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/db.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/db.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/db.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/db.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/email.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/email.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/email.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/email.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/env.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/env.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/env.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/env.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/headers.server.test.ts b/exercises/03.databases/04.problem.test-data/app/utils/headers.server.test.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/headers.server.test.ts rename to exercises/03.databases/04.problem.test-data/app/utils/headers.server.test.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/headers.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/headers.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/headers.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/headers.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/honeypot.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/honeypot.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/honeypot.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/honeypot.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/litefs.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/litefs.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/litefs.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/litefs.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/misc.error-message.test.ts b/exercises/03.databases/04.problem.test-data/app/utils/misc.error-message.test.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/misc.error-message.test.ts rename to exercises/03.databases/04.problem.test-data/app/utils/misc.error-message.test.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/misc.tsx b/exercises/03.databases/04.problem.test-data/app/utils/misc.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/misc.tsx rename to exercises/03.databases/04.problem.test-data/app/utils/misc.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/misc.use-double-check.test.tsx b/exercises/03.databases/04.problem.test-data/app/utils/misc.use-double-check.test.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/misc.use-double-check.test.tsx rename to exercises/03.databases/04.problem.test-data/app/utils/misc.use-double-check.test.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/monitoring.client.tsx b/exercises/03.databases/04.problem.test-data/app/utils/monitoring.client.tsx similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/monitoring.client.tsx rename to exercises/03.databases/04.problem.test-data/app/utils/monitoring.client.tsx diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/nonce-provider.ts b/exercises/03.databases/04.problem.test-data/app/utils/nonce-provider.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/nonce-provider.ts rename to exercises/03.databases/04.problem.test-data/app/utils/nonce-provider.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/permissions.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/permissions.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/permissions.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/permissions.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/providers/constants.ts b/exercises/03.databases/04.problem.test-data/app/utils/providers/constants.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/providers/constants.ts rename to exercises/03.databases/04.problem.test-data/app/utils/providers/constants.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/providers/github.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/providers/github.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/providers/github.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/providers/github.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/providers/provider.ts b/exercises/03.databases/04.problem.test-data/app/utils/providers/provider.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/providers/provider.ts rename to exercises/03.databases/04.problem.test-data/app/utils/providers/provider.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/redirect-cookie.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/redirect-cookie.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/redirect-cookie.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/redirect-cookie.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/request-info.ts b/exercises/03.databases/04.problem.test-data/app/utils/request-info.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/request-info.ts rename to exercises/03.databases/04.problem.test-data/app/utils/request-info.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/session.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/session.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/session.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/session.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/storage.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/storage.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/storage.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/storage.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/theme.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/theme.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/theme.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/theme.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/timing.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/timing.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/timing.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/timing.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/toast.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/toast.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/toast.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/toast.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/totp.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/totp.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/totp.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/totp.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/user-validation.ts b/exercises/03.databases/04.problem.test-data/app/utils/user-validation.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/user-validation.ts rename to exercises/03.databases/04.problem.test-data/app/utils/user-validation.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/user.ts b/exercises/03.databases/04.problem.test-data/app/utils/user.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/user.ts rename to exercises/03.databases/04.problem.test-data/app/utils/user.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/app/utils/verification.server.ts b/exercises/03.databases/04.problem.test-data/app/utils/verification.server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/app/utils/verification.server.ts rename to exercises/03.databases/04.problem.test-data/app/utils/verification.server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/components.json b/exercises/03.databases/04.problem.test-data/components.json similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/components.json rename to exercises/03.databases/04.problem.test-data/components.json diff --git a/exercises/02.test-setup/04.problem.api-mocking/eslint.config.js b/exercises/03.databases/04.problem.test-data/eslint.config.js similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/eslint.config.js rename to exercises/03.databases/04.problem.test-data/eslint.config.js diff --git a/exercises/02.test-setup/04.problem.api-mocking/fly.toml b/exercises/03.databases/04.problem.test-data/fly.toml similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/fly.toml rename to exercises/03.databases/04.problem.test-data/fly.toml diff --git a/exercises/02.test-setup/04.problem.api-mocking/index.js b/exercises/03.databases/04.problem.test-data/index.js similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/index.js rename to exercises/03.databases/04.problem.test-data/index.js diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/Dockerfile b/exercises/03.databases/04.problem.test-data/other/Dockerfile similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/Dockerfile rename to exercises/03.databases/04.problem.test-data/other/Dockerfile diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/Dockerfile.dockerignore b/exercises/03.databases/04.problem.test-data/other/Dockerfile.dockerignore similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/Dockerfile.dockerignore rename to exercises/03.databases/04.problem.test-data/other/Dockerfile.dockerignore diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/README.md b/exercises/03.databases/04.problem.test-data/other/README.md similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/README.md rename to exercises/03.databases/04.problem.test-data/other/README.md diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/build-server.ts b/exercises/03.databases/04.problem.test-data/other/build-server.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/build-server.ts rename to exercises/03.databases/04.problem.test-data/other/build-server.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/litefs.yml b/exercises/03.databases/04.problem.test-data/other/litefs.yml similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/litefs.yml rename to exercises/03.databases/04.problem.test-data/other/litefs.yml diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/sly/sly.json b/exercises/03.databases/04.problem.test-data/other/sly/sly.json similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/sly/sly.json rename to exercises/03.databases/04.problem.test-data/other/sly/sly.json diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/sly/transform-icon.ts b/exercises/03.databases/04.problem.test-data/other/sly/transform-icon.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/sly/transform-icon.ts rename to exercises/03.databases/04.problem.test-data/other/sly/transform-icon.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/README.md b/exercises/03.databases/04.problem.test-data/other/svg-icons/README.md similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/README.md rename to exercises/03.databases/04.problem.test-data/other/svg-icons/README.md diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/arrow-left.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/arrow-left.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/arrow-left.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/arrow-left.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/arrow-right.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/arrow-right.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/arrow-right.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/arrow-right.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/avatar.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/avatar.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/avatar.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/avatar.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/camera.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/camera.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/camera.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/camera.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/check.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/check.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/check.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/check.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/clock.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/clock.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/clock.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/clock.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/cross-1.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/cross-1.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/cross-1.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/cross-1.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/dots-horizontal.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/dots-horizontal.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/dots-horizontal.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/dots-horizontal.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/download.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/download.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/download.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/download.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/envelope-closed.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/envelope-closed.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/envelope-closed.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/envelope-closed.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/exit.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/exit.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/exit.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/exit.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/file-text.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/file-text.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/file-text.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/file-text.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/github-logo.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/github-logo.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/github-logo.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/github-logo.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/laptop.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/laptop.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/laptop.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/laptop.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/link-2.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/link-2.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/link-2.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/link-2.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/lock-closed.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/lock-closed.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/lock-closed.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/lock-closed.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/lock-open-1.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/lock-open-1.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/lock-open-1.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/lock-open-1.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/magnifying-glass.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/magnifying-glass.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/magnifying-glass.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/magnifying-glass.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/moon.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/moon.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/moon.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/moon.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/passkey.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/passkey.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/passkey.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/passkey.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/pencil-1.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/pencil-1.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/pencil-1.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/pencil-1.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/pencil-2.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/pencil-2.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/pencil-2.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/pencil-2.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/plus.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/plus.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/plus.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/plus.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/question-mark-circled.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/question-mark-circled.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/question-mark-circled.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/question-mark-circled.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/reset.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/reset.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/reset.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/reset.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/sun.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/sun.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/sun.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/sun.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/trash.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/trash.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/trash.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/trash.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/update.svg b/exercises/03.databases/04.problem.test-data/other/svg-icons/update.svg similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/other/svg-icons/update.svg rename to exercises/03.databases/04.problem.test-data/other/svg-icons/update.svg diff --git a/exercises/02.test-setup/04.problem.api-mocking/package-lock.json b/exercises/03.databases/04.problem.test-data/package-lock.json similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/package-lock.json rename to exercises/03.databases/04.problem.test-data/package-lock.json diff --git a/exercises/02.test-setup/05.problem.test-data/package.json b/exercises/03.databases/04.problem.test-data/package.json similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/package.json rename to exercises/03.databases/04.problem.test-data/package.json diff --git a/exercises/02.test-setup/04.problem.api-mocking/playwright.config.ts b/exercises/03.databases/04.problem.test-data/playwright.config.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/playwright.config.ts rename to exercises/03.databases/04.problem.test-data/playwright.config.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/prisma/migrations/20250221233640_init/migration.sql b/exercises/03.databases/04.problem.test-data/prisma/migrations/20250221233640_init/migration.sql similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/prisma/migrations/20250221233640_init/migration.sql rename to exercises/03.databases/04.problem.test-data/prisma/migrations/20250221233640_init/migration.sql diff --git a/exercises/02.test-setup/04.problem.api-mocking/prisma/migrations/migration_lock.toml b/exercises/03.databases/04.problem.test-data/prisma/migrations/migration_lock.toml similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/prisma/migrations/migration_lock.toml rename to exercises/03.databases/04.problem.test-data/prisma/migrations/migration_lock.toml diff --git a/exercises/02.test-setup/04.problem.api-mocking/prisma/schema.prisma b/exercises/03.databases/04.problem.test-data/prisma/schema.prisma similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/prisma/schema.prisma rename to exercises/03.databases/04.problem.test-data/prisma/schema.prisma diff --git a/exercises/02.test-setup/04.problem.api-mocking/prisma/seed.ts b/exercises/03.databases/04.problem.test-data/prisma/seed.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/prisma/seed.ts rename to exercises/03.databases/04.problem.test-data/prisma/seed.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/prisma/sql/searchUsers.sql b/exercises/03.databases/04.problem.test-data/prisma/sql/searchUsers.sql similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/prisma/sql/searchUsers.sql rename to exercises/03.databases/04.problem.test-data/prisma/sql/searchUsers.sql diff --git a/exercises/02.test-setup/04.problem.api-mocking/public/favicon.ico b/exercises/03.databases/04.problem.test-data/public/favicon.ico similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/public/favicon.ico rename to exercises/03.databases/04.problem.test-data/public/favicon.ico diff --git a/exercises/02.test-setup/04.problem.api-mocking/public/favicons/README.md b/exercises/03.databases/04.problem.test-data/public/favicons/README.md similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/public/favicons/README.md rename to exercises/03.databases/04.problem.test-data/public/favicons/README.md diff --git a/exercises/02.test-setup/04.problem.api-mocking/public/favicons/android-chrome-192x192.png b/exercises/03.databases/04.problem.test-data/public/favicons/android-chrome-192x192.png similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/public/favicons/android-chrome-192x192.png rename to exercises/03.databases/04.problem.test-data/public/favicons/android-chrome-192x192.png diff --git a/exercises/02.test-setup/04.problem.api-mocking/public/favicons/android-chrome-512x512.png b/exercises/03.databases/04.problem.test-data/public/favicons/android-chrome-512x512.png similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/public/favicons/android-chrome-512x512.png rename to exercises/03.databases/04.problem.test-data/public/favicons/android-chrome-512x512.png diff --git a/exercises/02.test-setup/04.problem.api-mocking/public/img/user.png b/exercises/03.databases/04.problem.test-data/public/img/user.png similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/public/img/user.png rename to exercises/03.databases/04.problem.test-data/public/img/user.png diff --git a/exercises/02.test-setup/04.problem.api-mocking/public/site.webmanifest b/exercises/03.databases/04.problem.test-data/public/site.webmanifest similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/public/site.webmanifest rename to exercises/03.databases/04.problem.test-data/public/site.webmanifest diff --git a/exercises/02.test-setup/04.problem.api-mocking/react-router.config.ts b/exercises/03.databases/04.problem.test-data/react-router.config.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/react-router.config.ts rename to exercises/03.databases/04.problem.test-data/react-router.config.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/server/dev-server.js b/exercises/03.databases/04.problem.test-data/server/dev-server.js similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/server/dev-server.js rename to exercises/03.databases/04.problem.test-data/server/dev-server.js diff --git a/exercises/02.test-setup/04.problem.api-mocking/server/index.ts b/exercises/03.databases/04.problem.test-data/server/index.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/server/index.ts rename to exercises/03.databases/04.problem.test-data/server/index.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/server/utils/monitoring.ts b/exercises/03.databases/04.problem.test-data/server/utils/monitoring.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/server/utils/monitoring.ts rename to exercises/03.databases/04.problem.test-data/server/utils/monitoring.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/tests/db-utils.ts b/exercises/03.databases/04.problem.test-data/tests/db-utils.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/tests/db-utils.ts rename to exercises/03.databases/04.problem.test-data/tests/db-utils.ts diff --git a/exercises/02.test-setup/05.problem.test-data/tests/e2e/notes-list.test.ts b/exercises/03.databases/04.problem.test-data/tests/e2e/notes-list.test.ts similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/tests/e2e/notes-list.test.ts rename to exercises/03.databases/04.problem.test-data/tests/e2e/notes-list.test.ts diff --git a/exercises/02.test-setup/05.problem.test-data/tests/e2e/utils.ts b/exercises/03.databases/04.problem.test-data/tests/e2e/utils.ts similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/tests/e2e/utils.ts rename to exercises/03.databases/04.problem.test-data/tests/e2e/utils.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/tests/setup/custom-matchers.ts b/exercises/03.databases/04.problem.test-data/tests/setup/custom-matchers.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/tests/setup/custom-matchers.ts rename to exercises/03.databases/04.problem.test-data/tests/setup/custom-matchers.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/tests/setup/db-setup.ts b/exercises/03.databases/04.problem.test-data/tests/setup/db-setup.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/tests/setup/db-setup.ts rename to exercises/03.databases/04.problem.test-data/tests/setup/db-setup.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/tests/setup/global-setup.ts b/exercises/03.databases/04.problem.test-data/tests/setup/global-setup.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/tests/setup/global-setup.ts rename to exercises/03.databases/04.problem.test-data/tests/setup/global-setup.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/tests/setup/setup-test-env.ts b/exercises/03.databases/04.problem.test-data/tests/setup/setup-test-env.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/tests/setup/setup-test-env.ts rename to exercises/03.databases/04.problem.test-data/tests/setup/setup-test-env.ts diff --git a/exercises/02.test-setup/05.problem.test-data/tests/test-extend.ts b/exercises/03.databases/04.problem.test-data/tests/test-extend.ts similarity index 100% rename from exercises/02.test-setup/05.problem.test-data/tests/test-extend.ts rename to exercises/03.databases/04.problem.test-data/tests/test-extend.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/tests/utils.ts b/exercises/03.databases/04.problem.test-data/tests/utils.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/tests/utils.ts rename to exercises/03.databases/04.problem.test-data/tests/utils.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/tsconfig.json b/exercises/03.databases/04.problem.test-data/tsconfig.json similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/tsconfig.json rename to exercises/03.databases/04.problem.test-data/tsconfig.json diff --git a/exercises/02.test-setup/04.problem.api-mocking/types/deps.d.ts b/exercises/03.databases/04.problem.test-data/types/deps.d.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/types/deps.d.ts rename to exercises/03.databases/04.problem.test-data/types/deps.d.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/types/env.env.d.ts b/exercises/03.databases/04.problem.test-data/types/env.env.d.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/types/env.env.d.ts rename to exercises/03.databases/04.problem.test-data/types/env.env.d.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/types/icon-name.d.ts b/exercises/03.databases/04.problem.test-data/types/icon-name.d.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/types/icon-name.d.ts rename to exercises/03.databases/04.problem.test-data/types/icon-name.d.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/types/reset.d.ts b/exercises/03.databases/04.problem.test-data/types/reset.d.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/types/reset.d.ts rename to exercises/03.databases/04.problem.test-data/types/reset.d.ts diff --git a/exercises/02.test-setup/04.problem.api-mocking/vite.config.ts b/exercises/03.databases/04.problem.test-data/vite.config.ts similarity index 100% rename from exercises/02.test-setup/04.problem.api-mocking/vite.config.ts rename to exercises/03.databases/04.problem.test-data/vite.config.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/.env b/exercises/03.databases/04.solution.test-data/.env similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/.env rename to exercises/03.databases/04.solution.test-data/.env diff --git a/exercises/02.test-setup/04.solution.api-mocking/.env.example b/exercises/03.databases/04.solution.test-data/.env.example similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/.env.example rename to exercises/03.databases/04.solution.test-data/.env.example diff --git a/exercises/02.test-setup/04.solution.api-mocking/.github/PULL_REQUEST_TEMPLATE.md b/exercises/03.databases/04.solution.test-data/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/.github/PULL_REQUEST_TEMPLATE.md rename to exercises/03.databases/04.solution.test-data/.github/PULL_REQUEST_TEMPLATE.md diff --git a/exercises/02.test-setup/04.solution.api-mocking/.github/workflows/deploy.yml b/exercises/03.databases/04.solution.test-data/.github/workflows/deploy.yml similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/.github/workflows/deploy.yml rename to exercises/03.databases/04.solution.test-data/.github/workflows/deploy.yml diff --git a/exercises/02.test-setup/04.solution.api-mocking/.gitignore b/exercises/03.databases/04.solution.test-data/.gitignore similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/.gitignore rename to exercises/03.databases/04.solution.test-data/.gitignore diff --git a/exercises/02.test-setup/04.solution.api-mocking/.npmrc b/exercises/03.databases/04.solution.test-data/.npmrc similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/.npmrc rename to exercises/03.databases/04.solution.test-data/.npmrc diff --git a/exercises/02.test-setup/04.solution.api-mocking/.prettierignore b/exercises/03.databases/04.solution.test-data/.prettierignore similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/.prettierignore rename to exercises/03.databases/04.solution.test-data/.prettierignore diff --git a/exercises/02.test-setup/04.solution.api-mocking/.vscode/extensions.json b/exercises/03.databases/04.solution.test-data/.vscode/extensions.json similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/.vscode/extensions.json rename to exercises/03.databases/04.solution.test-data/.vscode/extensions.json diff --git a/exercises/02.test-setup/04.solution.api-mocking/.vscode/remix.code-snippets b/exercises/03.databases/04.solution.test-data/.vscode/remix.code-snippets similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/.vscode/remix.code-snippets rename to exercises/03.databases/04.solution.test-data/.vscode/remix.code-snippets diff --git a/exercises/02.test-setup/04.solution.api-mocking/.vscode/settings.json b/exercises/03.databases/04.solution.test-data/.vscode/settings.json similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/.vscode/settings.json rename to exercises/03.databases/04.solution.test-data/.vscode/settings.json diff --git a/exercises/02.test-setup/05.solution.test-data/README.mdx b/exercises/03.databases/04.solution.test-data/README.mdx similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/README.mdx rename to exercises/03.databases/04.solution.test-data/README.mdx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/assets/favicons/apple-touch-icon.png b/exercises/03.databases/04.solution.test-data/app/assets/favicons/apple-touch-icon.png similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/assets/favicons/apple-touch-icon.png rename to exercises/03.databases/04.solution.test-data/app/assets/favicons/apple-touch-icon.png diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/assets/favicons/favicon.svg b/exercises/03.databases/04.solution.test-data/app/assets/favicons/favicon.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/assets/favicons/favicon.svg rename to exercises/03.databases/04.solution.test-data/app/assets/favicons/favicon.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/error-boundary.tsx b/exercises/03.databases/04.solution.test-data/app/components/error-boundary.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/error-boundary.tsx rename to exercises/03.databases/04.solution.test-data/app/components/error-boundary.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/floating-toolbar.tsx b/exercises/03.databases/04.solution.test-data/app/components/floating-toolbar.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/floating-toolbar.tsx rename to exercises/03.databases/04.solution.test-data/app/components/floating-toolbar.tsx diff --git a/exercises/02.test-setup/05.solution.test-data/app/components/forms.tsx b/exercises/03.databases/04.solution.test-data/app/components/forms.tsx similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/app/components/forms.tsx rename to exercises/03.databases/04.solution.test-data/app/components/forms.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/progress-bar.tsx b/exercises/03.databases/04.solution.test-data/app/components/progress-bar.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/progress-bar.tsx rename to exercises/03.databases/04.solution.test-data/app/components/progress-bar.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/search-bar.tsx b/exercises/03.databases/04.solution.test-data/app/components/search-bar.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/search-bar.tsx rename to exercises/03.databases/04.solution.test-data/app/components/search-bar.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/spacer.tsx b/exercises/03.databases/04.solution.test-data/app/components/spacer.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/spacer.tsx rename to exercises/03.databases/04.solution.test-data/app/components/spacer.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/toaster.tsx b/exercises/03.databases/04.solution.test-data/app/components/toaster.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/toaster.tsx rename to exercises/03.databases/04.solution.test-data/app/components/toaster.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/README.md b/exercises/03.databases/04.solution.test-data/app/components/ui/README.md similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/README.md rename to exercises/03.databases/04.solution.test-data/app/components/ui/README.md diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/button.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/button.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/button.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/button.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/checkbox.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/checkbox.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/checkbox.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/checkbox.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/dropdown-menu.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/dropdown-menu.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/dropdown-menu.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/dropdown-menu.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/icon.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/icon.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/icon.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/icon.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/input-otp.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/input-otp.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/input-otp.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/input-otp.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/input.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/input.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/input.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/input.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/label.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/label.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/label.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/label.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/sonner.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/sonner.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/sonner.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/sonner.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/status-button.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/status-button.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/status-button.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/status-button.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/textarea.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/textarea.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/textarea.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/textarea.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/ui/tooltip.tsx b/exercises/03.databases/04.solution.test-data/app/components/ui/tooltip.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/ui/tooltip.tsx rename to exercises/03.databases/04.solution.test-data/app/components/ui/tooltip.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/components/user-dropdown.tsx b/exercises/03.databases/04.solution.test-data/app/components/user-dropdown.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/components/user-dropdown.tsx rename to exercises/03.databases/04.solution.test-data/app/components/user-dropdown.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/entry.client.tsx b/exercises/03.databases/04.solution.test-data/app/entry.client.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/entry.client.tsx rename to exercises/03.databases/04.solution.test-data/app/entry.client.tsx diff --git a/exercises/02.test-setup/05.solution.test-data/app/entry.server.tsx b/exercises/03.databases/04.solution.test-data/app/entry.server.tsx similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/app/entry.server.tsx rename to exercises/03.databases/04.solution.test-data/app/entry.server.tsx diff --git a/exercises/02.test-setup/05.solution.test-data/app/root.tsx b/exercises/03.databases/04.solution.test-data/app/root.tsx similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/app/root.tsx rename to exercises/03.databases/04.solution.test-data/app/root.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes.ts b/exercises/03.databases/04.solution.test-data/app/routes.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes.ts rename to exercises/03.databases/04.solution.test-data/app/routes.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/$.tsx b/exercises/03.databases/04.solution.test-data/app/routes/$.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/$.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/$.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/auth.$provider.callback.test.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/auth.$provider.callback.test.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/auth.$provider.callback.test.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/auth.$provider.callback.test.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/auth.$provider.callback.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/auth.$provider.callback.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/auth.$provider.callback.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/auth.$provider.callback.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/auth_.$provider.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/auth_.$provider.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/auth_.$provider.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/auth_.$provider.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/forgot-password.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/forgot-password.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/forgot-password.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/forgot-password.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/login.server.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/login.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/login.server.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/login.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/login.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/login.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/login.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/login.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/logout.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/logout.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/logout.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/logout.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/onboarding.server.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/onboarding.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/onboarding.server.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/onboarding.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/onboarding.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/onboarding.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/onboarding.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/onboarding.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/onboarding_.$provider.server.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/onboarding_.$provider.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/onboarding_.$provider.server.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/onboarding_.$provider.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/onboarding_.$provider.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/onboarding_.$provider.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/onboarding_.$provider.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/onboarding_.$provider.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/reset-password.server.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/reset-password.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/reset-password.server.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/reset-password.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/reset-password.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/reset-password.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/reset-password.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/reset-password.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/signup.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/signup.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/signup.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/signup.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/verify.server.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/verify.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/verify.server.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/verify.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/verify.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/verify.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/verify.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/verify.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/webauthn+/authentication.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/webauthn+/authentication.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/webauthn+/authentication.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/webauthn+/authentication.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/webauthn+/registration.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/webauthn+/registration.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/webauthn+/registration.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/webauthn+/registration.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/webauthn+/utils.server.ts b/exercises/03.databases/04.solution.test-data/app/routes/_auth+/webauthn+/utils.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_auth+/webauthn+/utils.server.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_auth+/webauthn+/utils.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/about.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/about.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/about.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/about.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/index.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/index.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/index.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/index.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/docker.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/docker.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/docker.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/docker.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/eslint.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/eslint.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/eslint.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/eslint.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/faker.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/faker.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/faker.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/faker.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/fly.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/fly.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/fly.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/fly.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/github.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/github.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/github.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/github.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/logos.ts b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/logos.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/logos.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/logos.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/msw.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/msw.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/msw.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/msw.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/playwright.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/playwright.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/playwright.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/playwright.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/prettier.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/prettier.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/prettier.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/prettier.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/prisma.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/prisma.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/prisma.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/prisma.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/radix.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/radix.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/radix.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/radix.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/react-email.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/react-email.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/react-email.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/react-email.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/remix.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/remix.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/remix.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/remix.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/resend.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/resend.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/resend.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/resend.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/sentry.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/sentry.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/sentry.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/sentry.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/shadcn-ui.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/shadcn-ui.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/shadcn-ui.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/shadcn-ui.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/sqlite.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/sqlite.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/sqlite.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/sqlite.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/stars.jpg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/stars.jpg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/stars.jpg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/stars.jpg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/tailwind.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/tailwind.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/tailwind.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/tailwind.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/testing-library.png b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/testing-library.png similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/testing-library.png rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/testing-library.png diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/typescript.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/typescript.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/typescript.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/typescript.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/vitest.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/vitest.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/vitest.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/vitest.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/zod.svg b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/zod.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/logos/zod.svg rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/logos/zod.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/privacy.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/privacy.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/privacy.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/privacy.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/support.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/support.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/support.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/support.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/tos.tsx b/exercises/03.databases/04.solution.test-data/app/routes/_marketing+/tos.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_marketing+/tos.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/_marketing+/tos.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_seo+/robots[.]txt.ts b/exercises/03.databases/04.solution.test-data/app/routes/_seo+/robots[.]txt.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_seo+/robots[.]txt.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_seo+/robots[.]txt.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/_seo+/sitemap[.]xml.ts b/exercises/03.databases/04.solution.test-data/app/routes/_seo+/sitemap[.]xml.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/_seo+/sitemap[.]xml.ts rename to exercises/03.databases/04.solution.test-data/app/routes/_seo+/sitemap[.]xml.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/admin+/cache.tsx b/exercises/03.databases/04.solution.test-data/app/routes/admin+/cache.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/admin+/cache.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/admin+/cache.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/admin+/cache_.lru.$cacheKey.ts b/exercises/03.databases/04.solution.test-data/app/routes/admin+/cache_.lru.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/admin+/cache_.lru.$cacheKey.ts rename to exercises/03.databases/04.solution.test-data/app/routes/admin+/cache_.lru.$cacheKey.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/admin+/cache_.sqlite.$cacheKey.ts b/exercises/03.databases/04.solution.test-data/app/routes/admin+/cache_.sqlite.$cacheKey.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/admin+/cache_.sqlite.$cacheKey.ts rename to exercises/03.databases/04.solution.test-data/app/routes/admin+/cache_.sqlite.$cacheKey.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/admin+/cache_.sqlite.server.ts b/exercises/03.databases/04.solution.test-data/app/routes/admin+/cache_.sqlite.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/admin+/cache_.sqlite.server.ts rename to exercises/03.databases/04.solution.test-data/app/routes/admin+/cache_.sqlite.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/admin+/cache_.sqlite.tsx b/exercises/03.databases/04.solution.test-data/app/routes/admin+/cache_.sqlite.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/admin+/cache_.sqlite.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/admin+/cache_.sqlite.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/me.tsx b/exercises/03.databases/04.solution.test-data/app/routes/me.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/me.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/me.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/resources+/download-user-data.tsx b/exercises/03.databases/04.solution.test-data/app/routes/resources+/download-user-data.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/resources+/download-user-data.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/resources+/download-user-data.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/resources+/healthcheck.tsx b/exercises/03.databases/04.solution.test-data/app/routes/resources+/healthcheck.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/resources+/healthcheck.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/resources+/healthcheck.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/resources+/images.tsx b/exercises/03.databases/04.solution.test-data/app/routes/resources+/images.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/resources+/images.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/resources+/images.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/resources+/theme-switch.tsx b/exercises/03.databases/04.solution.test-data/app/routes/resources+/theme-switch.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/resources+/theme-switch.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/resources+/theme-switch.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.change-email.server.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.change-email.server.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.change-email.server.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.change-email.server.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.change-email.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.change-email.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.change-email.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.change-email.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.connections.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.connections.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.connections.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.connections.tsx diff --git a/exercises/02.test-setup/05.solution.test-data/app/routes/settings+/profile.index.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.index.tsx similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/app/routes/settings+/profile.index.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.index.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.passkeys.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.passkeys.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.passkeys.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.passkeys.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.password.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.password.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.password.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.password.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.password_.create.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.password_.create.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.password_.create.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.password_.create.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.photo.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.photo.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.photo.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.photo.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.two-factor.disable.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.two-factor.disable.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.two-factor.disable.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.two-factor.disable.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.two-factor.index.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.two-factor.index.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.two-factor.index.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.two-factor.index.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.two-factor.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.two-factor.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.two-factor.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.two-factor.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.two-factor.verify.tsx b/exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.two-factor.verify.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/settings+/profile.two-factor.verify.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/settings+/profile.two-factor.verify.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username.test.tsx b/exercises/03.databases/04.solution.test-data/app/routes/users+/$username.test.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username.test.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/users+/$username.test.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username.tsx b/exercises/03.databases/04.solution.test-data/app/routes/users+/$username.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/users+/$username.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username_+/__note-editor.server.tsx b/exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/__note-editor.server.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username_+/__note-editor.server.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/__note-editor.server.tsx diff --git a/exercises/02.test-setup/05.solution.test-data/app/routes/users+/$username_+/__note-editor.tsx b/exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/__note-editor.tsx similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/app/routes/users+/$username_+/__note-editor.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/__note-editor.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username_+/notes.$noteId.tsx b/exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/notes.$noteId.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username_+/notes.$noteId.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/notes.$noteId.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username_+/notes.$noteId_.edit.tsx b/exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/notes.$noteId_.edit.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username_+/notes.$noteId_.edit.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/notes.$noteId_.edit.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username_+/notes.index.tsx b/exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/notes.index.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username_+/notes.index.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/notes.index.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username_+/notes.new.tsx b/exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/notes.new.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/$username_+/notes.new.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/notes.new.tsx diff --git a/exercises/02.test-setup/05.solution.test-data/app/routes/users+/$username_+/notes.tsx b/exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/notes.tsx similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/app/routes/users+/$username_+/notes.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/users+/$username_+/notes.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/index.tsx b/exercises/03.databases/04.solution.test-data/app/routes/users+/index.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/routes/users+/index.tsx rename to exercises/03.databases/04.solution.test-data/app/routes/users+/index.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/styles/tailwind.css b/exercises/03.databases/04.solution.test-data/app/styles/tailwind.css similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/styles/tailwind.css rename to exercises/03.databases/04.solution.test-data/app/styles/tailwind.css diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/auth.server.test.ts b/exercises/03.databases/04.solution.test-data/app/utils/auth.server.test.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/auth.server.test.ts rename to exercises/03.databases/04.solution.test-data/app/utils/auth.server.test.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/auth.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/auth.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/auth.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/auth.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/cache.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/cache.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/cache.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/cache.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/client-hints.tsx b/exercises/03.databases/04.solution.test-data/app/utils/client-hints.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/client-hints.tsx rename to exercises/03.databases/04.solution.test-data/app/utils/client-hints.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/connections.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/connections.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/connections.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/connections.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/connections.tsx b/exercises/03.databases/04.solution.test-data/app/utils/connections.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/connections.tsx rename to exercises/03.databases/04.solution.test-data/app/utils/connections.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/db.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/db.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/db.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/db.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/email.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/email.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/email.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/email.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/env.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/env.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/env.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/env.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/headers.server.test.ts b/exercises/03.databases/04.solution.test-data/app/utils/headers.server.test.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/headers.server.test.ts rename to exercises/03.databases/04.solution.test-data/app/utils/headers.server.test.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/headers.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/headers.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/headers.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/headers.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/honeypot.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/honeypot.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/honeypot.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/honeypot.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/litefs.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/litefs.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/litefs.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/litefs.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/misc.error-message.test.ts b/exercises/03.databases/04.solution.test-data/app/utils/misc.error-message.test.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/misc.error-message.test.ts rename to exercises/03.databases/04.solution.test-data/app/utils/misc.error-message.test.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/misc.tsx b/exercises/03.databases/04.solution.test-data/app/utils/misc.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/misc.tsx rename to exercises/03.databases/04.solution.test-data/app/utils/misc.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/misc.use-double-check.test.tsx b/exercises/03.databases/04.solution.test-data/app/utils/misc.use-double-check.test.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/misc.use-double-check.test.tsx rename to exercises/03.databases/04.solution.test-data/app/utils/misc.use-double-check.test.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/monitoring.client.tsx b/exercises/03.databases/04.solution.test-data/app/utils/monitoring.client.tsx similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/monitoring.client.tsx rename to exercises/03.databases/04.solution.test-data/app/utils/monitoring.client.tsx diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/nonce-provider.ts b/exercises/03.databases/04.solution.test-data/app/utils/nonce-provider.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/nonce-provider.ts rename to exercises/03.databases/04.solution.test-data/app/utils/nonce-provider.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/permissions.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/permissions.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/permissions.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/permissions.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/providers/constants.ts b/exercises/03.databases/04.solution.test-data/app/utils/providers/constants.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/providers/constants.ts rename to exercises/03.databases/04.solution.test-data/app/utils/providers/constants.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/providers/github.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/providers/github.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/providers/github.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/providers/github.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/providers/provider.ts b/exercises/03.databases/04.solution.test-data/app/utils/providers/provider.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/providers/provider.ts rename to exercises/03.databases/04.solution.test-data/app/utils/providers/provider.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/redirect-cookie.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/redirect-cookie.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/redirect-cookie.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/redirect-cookie.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/request-info.ts b/exercises/03.databases/04.solution.test-data/app/utils/request-info.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/request-info.ts rename to exercises/03.databases/04.solution.test-data/app/utils/request-info.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/session.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/session.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/session.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/session.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/storage.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/storage.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/storage.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/storage.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/theme.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/theme.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/theme.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/theme.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/timing.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/timing.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/timing.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/timing.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/toast.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/toast.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/toast.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/toast.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/totp.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/totp.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/totp.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/totp.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/user-validation.ts b/exercises/03.databases/04.solution.test-data/app/utils/user-validation.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/user-validation.ts rename to exercises/03.databases/04.solution.test-data/app/utils/user-validation.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/user.ts b/exercises/03.databases/04.solution.test-data/app/utils/user.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/user.ts rename to exercises/03.databases/04.solution.test-data/app/utils/user.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/app/utils/verification.server.ts b/exercises/03.databases/04.solution.test-data/app/utils/verification.server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/app/utils/verification.server.ts rename to exercises/03.databases/04.solution.test-data/app/utils/verification.server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/components.json b/exercises/03.databases/04.solution.test-data/components.json similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/components.json rename to exercises/03.databases/04.solution.test-data/components.json diff --git a/exercises/02.test-setup/04.solution.api-mocking/eslint.config.js b/exercises/03.databases/04.solution.test-data/eslint.config.js similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/eslint.config.js rename to exercises/03.databases/04.solution.test-data/eslint.config.js diff --git a/exercises/02.test-setup/04.solution.api-mocking/fly.toml b/exercises/03.databases/04.solution.test-data/fly.toml similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/fly.toml rename to exercises/03.databases/04.solution.test-data/fly.toml diff --git a/exercises/02.test-setup/04.solution.api-mocking/index.js b/exercises/03.databases/04.solution.test-data/index.js similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/index.js rename to exercises/03.databases/04.solution.test-data/index.js diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/Dockerfile b/exercises/03.databases/04.solution.test-data/other/Dockerfile similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/Dockerfile rename to exercises/03.databases/04.solution.test-data/other/Dockerfile diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/Dockerfile.dockerignore b/exercises/03.databases/04.solution.test-data/other/Dockerfile.dockerignore similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/Dockerfile.dockerignore rename to exercises/03.databases/04.solution.test-data/other/Dockerfile.dockerignore diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/README.md b/exercises/03.databases/04.solution.test-data/other/README.md similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/README.md rename to exercises/03.databases/04.solution.test-data/other/README.md diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/build-server.ts b/exercises/03.databases/04.solution.test-data/other/build-server.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/build-server.ts rename to exercises/03.databases/04.solution.test-data/other/build-server.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/litefs.yml b/exercises/03.databases/04.solution.test-data/other/litefs.yml similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/litefs.yml rename to exercises/03.databases/04.solution.test-data/other/litefs.yml diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/sly/sly.json b/exercises/03.databases/04.solution.test-data/other/sly/sly.json similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/sly/sly.json rename to exercises/03.databases/04.solution.test-data/other/sly/sly.json diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/sly/transform-icon.ts b/exercises/03.databases/04.solution.test-data/other/sly/transform-icon.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/sly/transform-icon.ts rename to exercises/03.databases/04.solution.test-data/other/sly/transform-icon.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/README.md b/exercises/03.databases/04.solution.test-data/other/svg-icons/README.md similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/README.md rename to exercises/03.databases/04.solution.test-data/other/svg-icons/README.md diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/arrow-left.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/arrow-left.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/arrow-left.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/arrow-left.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/arrow-right.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/arrow-right.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/arrow-right.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/arrow-right.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/avatar.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/avatar.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/avatar.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/avatar.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/camera.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/camera.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/camera.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/camera.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/check.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/check.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/check.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/check.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/clock.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/clock.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/clock.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/clock.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/cross-1.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/cross-1.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/cross-1.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/cross-1.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/dots-horizontal.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/dots-horizontal.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/dots-horizontal.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/dots-horizontal.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/download.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/download.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/download.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/download.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/envelope-closed.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/envelope-closed.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/envelope-closed.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/envelope-closed.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/exit.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/exit.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/exit.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/exit.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/file-text.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/file-text.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/file-text.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/file-text.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/github-logo.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/github-logo.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/github-logo.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/github-logo.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/laptop.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/laptop.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/laptop.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/laptop.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/link-2.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/link-2.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/link-2.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/link-2.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/lock-closed.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/lock-closed.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/lock-closed.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/lock-closed.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/lock-open-1.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/lock-open-1.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/lock-open-1.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/lock-open-1.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/magnifying-glass.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/magnifying-glass.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/magnifying-glass.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/magnifying-glass.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/moon.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/moon.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/moon.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/moon.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/passkey.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/passkey.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/passkey.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/passkey.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/pencil-1.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/pencil-1.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/pencil-1.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/pencil-1.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/pencil-2.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/pencil-2.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/pencil-2.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/pencil-2.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/plus.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/plus.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/plus.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/plus.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/question-mark-circled.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/question-mark-circled.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/question-mark-circled.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/question-mark-circled.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/reset.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/reset.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/reset.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/reset.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/sun.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/sun.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/sun.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/sun.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/trash.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/trash.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/trash.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/trash.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/update.svg b/exercises/03.databases/04.solution.test-data/other/svg-icons/update.svg similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/other/svg-icons/update.svg rename to exercises/03.databases/04.solution.test-data/other/svg-icons/update.svg diff --git a/exercises/02.test-setup/04.solution.api-mocking/package-lock.json b/exercises/03.databases/04.solution.test-data/package-lock.json similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/package-lock.json rename to exercises/03.databases/04.solution.test-data/package-lock.json diff --git a/exercises/02.test-setup/05.solution.test-data/package.json b/exercises/03.databases/04.solution.test-data/package.json similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/package.json rename to exercises/03.databases/04.solution.test-data/package.json diff --git a/exercises/02.test-setup/04.solution.api-mocking/playwright.config.ts b/exercises/03.databases/04.solution.test-data/playwright.config.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/playwright.config.ts rename to exercises/03.databases/04.solution.test-data/playwright.config.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/prisma/migrations/20250221233640_init/migration.sql b/exercises/03.databases/04.solution.test-data/prisma/migrations/20250221233640_init/migration.sql similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/prisma/migrations/20250221233640_init/migration.sql rename to exercises/03.databases/04.solution.test-data/prisma/migrations/20250221233640_init/migration.sql diff --git a/exercises/02.test-setup/04.solution.api-mocking/prisma/migrations/migration_lock.toml b/exercises/03.databases/04.solution.test-data/prisma/migrations/migration_lock.toml similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/prisma/migrations/migration_lock.toml rename to exercises/03.databases/04.solution.test-data/prisma/migrations/migration_lock.toml diff --git a/exercises/02.test-setup/04.solution.api-mocking/prisma/schema.prisma b/exercises/03.databases/04.solution.test-data/prisma/schema.prisma similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/prisma/schema.prisma rename to exercises/03.databases/04.solution.test-data/prisma/schema.prisma diff --git a/exercises/02.test-setup/04.solution.api-mocking/prisma/seed.ts b/exercises/03.databases/04.solution.test-data/prisma/seed.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/prisma/seed.ts rename to exercises/03.databases/04.solution.test-data/prisma/seed.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/prisma/sql/searchUsers.sql b/exercises/03.databases/04.solution.test-data/prisma/sql/searchUsers.sql similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/prisma/sql/searchUsers.sql rename to exercises/03.databases/04.solution.test-data/prisma/sql/searchUsers.sql diff --git a/exercises/02.test-setup/04.solution.api-mocking/public/favicon.ico b/exercises/03.databases/04.solution.test-data/public/favicon.ico similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/public/favicon.ico rename to exercises/03.databases/04.solution.test-data/public/favicon.ico diff --git a/exercises/02.test-setup/04.solution.api-mocking/public/favicons/README.md b/exercises/03.databases/04.solution.test-data/public/favicons/README.md similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/public/favicons/README.md rename to exercises/03.databases/04.solution.test-data/public/favicons/README.md diff --git a/exercises/02.test-setup/04.solution.api-mocking/public/favicons/android-chrome-192x192.png b/exercises/03.databases/04.solution.test-data/public/favicons/android-chrome-192x192.png similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/public/favicons/android-chrome-192x192.png rename to exercises/03.databases/04.solution.test-data/public/favicons/android-chrome-192x192.png diff --git a/exercises/02.test-setup/04.solution.api-mocking/public/favicons/android-chrome-512x512.png b/exercises/03.databases/04.solution.test-data/public/favicons/android-chrome-512x512.png similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/public/favicons/android-chrome-512x512.png rename to exercises/03.databases/04.solution.test-data/public/favicons/android-chrome-512x512.png diff --git a/exercises/02.test-setup/04.solution.api-mocking/public/img/user.png b/exercises/03.databases/04.solution.test-data/public/img/user.png similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/public/img/user.png rename to exercises/03.databases/04.solution.test-data/public/img/user.png diff --git a/exercises/02.test-setup/04.solution.api-mocking/public/site.webmanifest b/exercises/03.databases/04.solution.test-data/public/site.webmanifest similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/public/site.webmanifest rename to exercises/03.databases/04.solution.test-data/public/site.webmanifest diff --git a/exercises/02.test-setup/04.solution.api-mocking/react-router.config.ts b/exercises/03.databases/04.solution.test-data/react-router.config.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/react-router.config.ts rename to exercises/03.databases/04.solution.test-data/react-router.config.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/server/dev-server.js b/exercises/03.databases/04.solution.test-data/server/dev-server.js similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/server/dev-server.js rename to exercises/03.databases/04.solution.test-data/server/dev-server.js diff --git a/exercises/02.test-setup/04.solution.api-mocking/server/index.ts b/exercises/03.databases/04.solution.test-data/server/index.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/server/index.ts rename to exercises/03.databases/04.solution.test-data/server/index.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/server/utils/monitoring.ts b/exercises/03.databases/04.solution.test-data/server/utils/monitoring.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/server/utils/monitoring.ts rename to exercises/03.databases/04.solution.test-data/server/utils/monitoring.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/tests/db-utils.ts b/exercises/03.databases/04.solution.test-data/tests/db-utils.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/tests/db-utils.ts rename to exercises/03.databases/04.solution.test-data/tests/db-utils.ts diff --git a/exercises/02.test-setup/05.solution.test-data/tests/e2e/notes-list.test.ts b/exercises/03.databases/04.solution.test-data/tests/e2e/notes-list.test.ts similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/tests/e2e/notes-list.test.ts rename to exercises/03.databases/04.solution.test-data/tests/e2e/notes-list.test.ts diff --git a/exercises/02.test-setup/05.solution.test-data/tests/e2e/utils.ts b/exercises/03.databases/04.solution.test-data/tests/e2e/utils.ts similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/tests/e2e/utils.ts rename to exercises/03.databases/04.solution.test-data/tests/e2e/utils.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/tests/setup/custom-matchers.ts b/exercises/03.databases/04.solution.test-data/tests/setup/custom-matchers.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/tests/setup/custom-matchers.ts rename to exercises/03.databases/04.solution.test-data/tests/setup/custom-matchers.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/tests/setup/db-setup.ts b/exercises/03.databases/04.solution.test-data/tests/setup/db-setup.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/tests/setup/db-setup.ts rename to exercises/03.databases/04.solution.test-data/tests/setup/db-setup.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/tests/setup/global-setup.ts b/exercises/03.databases/04.solution.test-data/tests/setup/global-setup.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/tests/setup/global-setup.ts rename to exercises/03.databases/04.solution.test-data/tests/setup/global-setup.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/tests/setup/setup-test-env.ts b/exercises/03.databases/04.solution.test-data/tests/setup/setup-test-env.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/tests/setup/setup-test-env.ts rename to exercises/03.databases/04.solution.test-data/tests/setup/setup-test-env.ts diff --git a/exercises/02.test-setup/05.solution.test-data/tests/test-extend.ts b/exercises/03.databases/04.solution.test-data/tests/test-extend.ts similarity index 100% rename from exercises/02.test-setup/05.solution.test-data/tests/test-extend.ts rename to exercises/03.databases/04.solution.test-data/tests/test-extend.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/tests/utils.ts b/exercises/03.databases/04.solution.test-data/tests/utils.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/tests/utils.ts rename to exercises/03.databases/04.solution.test-data/tests/utils.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/tsconfig.json b/exercises/03.databases/04.solution.test-data/tsconfig.json similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/tsconfig.json rename to exercises/03.databases/04.solution.test-data/tsconfig.json diff --git a/exercises/02.test-setup/04.solution.api-mocking/types/deps.d.ts b/exercises/03.databases/04.solution.test-data/types/deps.d.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/types/deps.d.ts rename to exercises/03.databases/04.solution.test-data/types/deps.d.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/types/env.env.d.ts b/exercises/03.databases/04.solution.test-data/types/env.env.d.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/types/env.env.d.ts rename to exercises/03.databases/04.solution.test-data/types/env.env.d.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/types/icon-name.d.ts b/exercises/03.databases/04.solution.test-data/types/icon-name.d.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/types/icon-name.d.ts rename to exercises/03.databases/04.solution.test-data/types/icon-name.d.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/types/reset.d.ts b/exercises/03.databases/04.solution.test-data/types/reset.d.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/types/reset.d.ts rename to exercises/03.databases/04.solution.test-data/types/reset.d.ts diff --git a/exercises/02.test-setup/04.solution.api-mocking/vite.config.ts b/exercises/03.databases/04.solution.test-data/vite.config.ts similarity index 100% rename from exercises/02.test-setup/04.solution.api-mocking/vite.config.ts rename to exercises/03.databases/04.solution.test-data/vite.config.ts diff --git a/exercises/03.databases/FINISHED.mdx b/exercises/03.databases/FINISHED.mdx new file mode 100644 index 0000000..602f6d8 --- /dev/null +++ b/exercises/03.databases/FINISHED.mdx @@ -0,0 +1 @@ +# Databases \ No newline at end of file diff --git a/exercises/03.databases/README.mdx b/exercises/03.databases/README.mdx new file mode 100644 index 0000000..602f6d8 --- /dev/null +++ b/exercises/03.databases/README.mdx @@ -0,0 +1 @@ +# Databases \ No newline at end of file diff --git a/exercises/03.guides/02.problem.test-annotations/README.mdx b/exercises/03.guides/02.problem.test-annotations/README.mdx deleted file mode 100644 index 47723f6..0000000 --- a/exercises/03.guides/02.problem.test-annotations/README.mdx +++ /dev/null @@ -1,88 +0,0 @@ -# Test annotations - -## Your task - -👨‍💼 In this one, your task is to use [Annotations](https://playwright.dev/docs/test-annotations) in Playwright to improve the developer experience of your test suite. You will focus on two types of annotations today: _tags_ and _custom annotations_. Please follow the steps below. - -### Tags - -Let's start with the tags. You can add a tag to any test case by providing a test details object as the second argument of your test case (after the test name but before the test callback) and specifying the `tag` property in that object: - -```ts highlight=3-5 -test( - 'displays a user greeting', - { - tag: ['@user'], - }, - async ({ page }) => {}, -) -``` - -🐨 Equipped with this knowledge, head to the following test cases and mark them with their respective tags: - -| Test file | Test case | Tags | -| ------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------- | -| `tests/e2e/homepage.test.ts` | "creates a new note" | `@homepage` | -| `tests/e2e/notes-create.test.ts` | "creates a new note" | `@user`, `@notes` | -| `tests/e2e/profile-edit.test.ts` | "displays the user profile page" | `@user`, `@profile` | -| `tests/e2e/profile-edit.test.ts` | "saves changes to the name of the user" | `@user`, `@profile` | - -Note that tags in Playwright _must_ begin with an at sign "@" (e.g. `@user`, `@dashboard`, etc). - -🐨 Once you've marked those tests with their tags, try running a subset of your test suite based on a tag. For example, to run only the test cases realted to the user profile, include its tag `@profile` as the value of the `--grep` option of Playwright's CLI: - -```sh -npx playwright test --grep=@profile -``` - -You can use tags to filter out tests and test reports as well. Explore them in the UI mode as well as in the test report (`npx playwright show-report`). - -### Custom annotations - -Now, it's time for you to improve the failure experience of your tests. One of the ways to do that is by including additional data next to individual test cases. That data is referred to as "annotations" in Playwright. Each annotation allows you to define its `type` and `description`, and is defined in the test details object as well: - -```ts highlight=3-8 -test( - 'displays a user greeting', - { - annotation: { - type: 'issue', - description: 'https://epicweb.dev/', - }, - }, - async ({ page }) => {}, -) -``` - -Let's use annotations in action! - -🐨 First, run the test cases for the homepage, using the `@homepage` tag you've defined earlier. Once you do that, you will see a test case failing: - -``` -Error: Timed out 5000ms waiting for expect(locator).toBeVisible() - -Locator: getByRole('heading', { name: 'The Most Epic of Stacks' }) -Expected: visible -Received: -Call log: - - Expect "toBeVisible" with timeout 5000ms - - waiting for getByRole('heading', { name: 'The Most Epic of Stacks' }) - - - 6 | await expect( - 7 | page.getByRole('heading', { name: 'The Most Epic of Stacks' }), -> 8 | ).toBeVisible() - | ^ - 9 | }) - 10 | -``` - -It looks like it cannot find the given element on the page! Actually, I think I've had this issue before. Yeah, definitely, there's even a [GitHub issue about it](https://github.com/epicweb-dev/epic-stack/issues/1020). - -🐨 Before you fix the problem, annotate this failing test, providing `issue` as the annotation's type and the GitHub issue URL I've linked above as the annotation's description. - -Annotating your tests helps you (and your colleagues) debug and fix them faster when they fail. The more context you have on the issue, the more efficient you are as a developer. - -🐨 Try re-running the same test again. If you preview the test report via `npx playwright show-report`, you will now spot your custom annotation right above the test result! - -🐨 Read through the [GitHub issue](https://github.com/epicweb-dev/epic-stack/issues/1020) and see if you can find any recommendations on how to fix this failing test. Once you do, fix it and have it passing again. diff --git a/exercises/03.guides/02.problem.test-annotations/app/root.tsx b/exercises/03.guides/02.problem.test-annotations/app/root.tsx deleted file mode 100644 index 0f0d1cb..0000000 --- a/exercises/03.guides/02.problem.test-annotations/app/root.tsx +++ /dev/null @@ -1,263 +0,0 @@ -import { OpenImgContextProvider } from 'openimg/react' -import { - data, - Link, - Links, - Meta, - Outlet, - Scripts, - ScrollRestoration, - useLoaderData, - useMatches, -} from 'react-router' -import { HoneypotProvider } from 'remix-utils/honeypot/react' -import { type Route } from './+types/root.ts' -import appleTouchIconAssetUrl from './assets/favicons/apple-touch-icon.png' -import faviconAssetUrl from './assets/favicons/favicon.svg' -import { GeneralErrorBoundary } from './components/error-boundary.tsx' -import { EpicProgress } from './components/progress-bar.tsx' -import { SearchBar } from './components/search-bar.tsx' -import { useToast } from './components/toaster.tsx' -import { Button } from './components/ui/button.tsx' -import { href as iconsHref } from './components/ui/icon.tsx' -import { EpicToaster } from './components/ui/sonner.tsx' -import { UserDropdown } from './components/user-dropdown.tsx' -import { - ThemeSwitch, - useOptionalTheme, - useTheme, -} from './routes/resources+/theme-switch.tsx' -import tailwindStyleSheetUrl from './styles/tailwind.css?url' -import { getUserId, logout } from './utils/auth.server.ts' -import { ClientHintCheck, getHints } from './utils/client-hints.tsx' -import { prisma } from './utils/db.server.ts' -import { getEnv } from './utils/env.server.ts' -import { pipeHeaders } from './utils/headers.server.ts' -import { honeypot } from './utils/honeypot.server.ts' -import { combineHeaders, getDomainUrl, getImgSrc } from './utils/misc.tsx' -import { useNonce } from './utils/nonce-provider.ts' -import { type Theme, getTheme } from './utils/theme.server.ts' -import { makeTimings, time } from './utils/timing.server.ts' -import { getToast } from './utils/toast.server.ts' -import { useOptionalUser } from './utils/user.ts' - -export const links: Route.LinksFunction = () => { - return [ - // Preload svg sprite as a resource to avoid render blocking - { rel: 'preload', href: iconsHref, as: 'image' }, - { - rel: 'icon', - href: '/favicon.ico', - sizes: '48x48', - }, - { rel: 'icon', type: 'image/svg+xml', href: faviconAssetUrl }, - { rel: 'apple-touch-icon', href: appleTouchIconAssetUrl }, - { - rel: 'manifest', - href: '/site.webmanifest', - crossOrigin: 'use-credentials', - } as const, // necessary to make typescript happy - { rel: 'stylesheet', href: tailwindStyleSheetUrl }, - ].filter(Boolean) -} - -export const meta: Route.MetaFunction = ({ data }) => { - return [ - { title: data ? 'Epic Notes' : 'Error | Epic Notes' }, - { name: 'description', content: `Your own captain's log` }, - ] -} - -export async function loader({ request }: Route.LoaderArgs) { - const timings = makeTimings('root loader') - const userId = await time(() => getUserId(request), { - timings, - type: 'getUserId', - desc: 'getUserId in root', - }) - - const user = userId - ? await time( - () => - prisma.user.findUnique({ - select: { - id: true, - name: true, - username: true, - image: { select: { objectKey: true } }, - roles: { - select: { - name: true, - permissions: { - select: { entity: true, action: true, access: true }, - }, - }, - }, - }, - where: { id: userId }, - }), - { timings, type: 'find user', desc: 'find user in root' }, - ) - : null - if (userId && !user) { - console.info('something weird happened') - // something weird happened... The user is authenticated but we can't find - // them in the database. Maybe they were deleted? Let's log them out. - await logout({ request, redirectTo: '/' }) - } - const { toast, headers: toastHeaders } = await getToast(request) - const honeyProps = await honeypot.getInputProps() - - return data( - { - user, - requestInfo: { - hints: getHints(request), - origin: getDomainUrl(request), - path: new URL(request.url).pathname, - userPrefs: { - theme: getTheme(request), - }, - }, - ENV: getEnv(), - toast, - honeyProps, - }, - { - headers: combineHeaders( - { 'Server-Timing': timings.toString() }, - toastHeaders, - ), - }, - ) -} - -export const headers: Route.HeadersFunction = pipeHeaders - -function Document({ - children, - nonce, - theme = 'light', - env = {}, -}: { - children: React.ReactNode - nonce: string - theme?: Theme - env?: Record -}) { - const allowIndexing = ENV.ALLOW_INDEXING !== 'false' - return ( - - - - - - - {allowIndexing ? null : ( - - )} - - - - {children} - -``` - -🐨 Go to the `tests/test-extend.ts` file and follow the instructions to intercept the problematic request and handle its response. - -🐨 Finally, it would be great to verify your solution and make sure that the request in question indeed receives a mocked response during the test. To do that, run your tests in a UI mode: - -```sh -npm test -- --ui -``` - -In the UI mode window, open the "Network" tab and find the request that you have intercepted (`GET /stonks.js`). You should see it having a mocked response! diff --git a/exercises/03.guides/03.problem.blocking-unneeded-requests/package.json b/exercises/03.guides/03.problem.blocking-unneeded-requests/package.json deleted file mode 100644 index ff892f4..0000000 --- a/exercises/03.guides/03.problem.blocking-unneeded-requests/package.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "name": "exercises_03.guides_03.problem.blocking-unneeded-requests", - "private": true, - "sideEffects": false, - "type": "module", - "imports": { - "#app/*": "./app/*", - "#tests/*": "./tests/*" - }, - "scripts": { - "build": "run-s build:*", - "build:remix": "react-router build", - "build:server": "tsx ./other/build-server.ts", - "dev": "cross-env NODE_ENV=development MOCKS=true node ./server/dev-server.js", - "dev:no-mocks": "cross-env NODE_ENV=development node ./server/dev-server.js", - "format": "prettier --write .", - "lint": "eslint .", - "setup": "npm run build && prisma migrate deploy && prisma generate --sql && playwright install", - "start": "cross-env NODE_ENV=production node .", - "start:mocks": "cross-env NODE_ENV=production MOCKS=true tsx .", - "test": "npx playwright test", - "coverage": "vitest run --coverage", - "test:e2e": "npm run test:e2e:dev --silent", - "test:e2e:dev": "npx playwright test --ui", - "pretest:e2e:run": "npm run build", - "test:e2e:run": "npx cross-env CI=true npx playwright test", - "test:e2e:install": "npx playwright install --with-deps chromium", - "typecheck": "react-router typegen && tsc", - "validate": "run-p \"test -- --run\" lint typecheck test:e2e:run", - "post:playground": "npx react-router typegen && prisma migrate deploy && prisma generate --sql" - }, - "prettier": "@epic-web/config/prettier", - "eslintIgnore": [ - "/node_modules", - "/build", - "/public/build", - "/playwright-report", - "/server-build" - ], - "dependencies": { - "@conform-to/react": "^1.5.0", - "@conform-to/zod": "^1.5.0", - "@epic-web/cachified": "^5.5.2", - "@epic-web/client-hints": "^1.3.5", - "@epic-web/invariant": "^1.0.0", - "@epic-web/remember": "^1.1.0", - "@epic-web/totp": "^4.0.1", - "@mjackson/form-data-parser": "^0.7.0", - "@mjackson/headers": "^0.10.0", - "@nasa-gcn/remix-seo": "^2.0.1", - "@nichtsam/helmet": "^0.3.1", - "@oslojs/crypto": "^1.0.1", - "@oslojs/encoding": "^1.1.0", - "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^6.7.0", - "@prisma/instrumentation": "^6.7.0", - "@radix-ui/react-checkbox": "^1.2.3", - "@radix-ui/react-dropdown-menu": "^2.1.12", - "@radix-ui/react-label": "^2.1.4", - "@radix-ui/react-slot": "^1.2.0", - "@radix-ui/react-toast": "^1.2.11", - "@radix-ui/react-tooltip": "^1.2.4", - "@react-email/components": "0.0.38", - "@react-router/express": "^7.5.3", - "@react-router/node": "^7.5.3", - "@react-router/remix-routes-option-adapter": "^7.5.3", - "@remix-run/server-runtime": "^2.16.5", - "@sentry/profiling-node": "^9.32.0", - "@sentry/react-router": "^9.32.0", - "@simplewebauthn/browser": "^13.1.0", - "@simplewebauthn/server": "^13.1.1", - "@tailwindcss/vite": "^4.1.5", - "@tusbar/cache-control": "1.0.2", - "address": "^2.0.3", - "bcryptjs": "^3.0.2", - "class-variance-authority": "^0.7.1", - "close-with-grace": "^2.2.0", - "clsx": "^2.1.1", - "compression": "^1.8.0", - "cookie": "^1.0.2", - "cross-env": "^7.0.3", - "date-fns": "^4.1.0", - "dotenv": "^16.5.0", - "execa": "^9.5.2", - "express": "^4.21.2", - "express-rate-limit": "^7.5.0", - "get-port": "^7.1.0", - "glob": "^11.0.2", - "input-otp": "^1.4.2", - "intl-parse-accept-language": "^1.0.0", - "isbot": "^5.1.27", - "litefs-js": "^2.0.2", - "lru-cache": "^11.1.0", - "mime-types": "^3.0.1", - "morgan": "^1.10.0", - "openimg": "^1.1.0", - "prisma": "^6.7.0", - "qrcode": "^1.5.4", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-router": "^7.5.3", - "remix-auth": "^4.2.0", - "remix-auth-github": "^3.0.2", - "remix-utils": "^8.5.0", - "set-cookie-parser": "^2.7.1", - "sharp": "^0.34.2", - "sonner": "^2.0.3", - "source-map-support": "^0.5.21", - "spin-delay": "^2.0.1", - "tailwind-merge": "^3.2.0", - "tailwindcss": "^4.1.5", - "vite-env-only": "^3.0.3", - "zod": "^3.24.4" - }, - "devDependencies": { - "@epic-web/config": "^1.20.1", - "@faker-js/faker": "^9.7.0", - "@msw/playwright": "^0.4.2", - "@playwright/test": "^1.52.0", - "@react-router/dev": "^7.5.3", - "@sly-cli/sly": "^2.1.1", - "@testing-library/dom": "^10.4.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "@total-typescript/ts-reset": "^0.6.1", - "@types/compression": "^1.7.5", - "@types/eslint": "^9.6.1", - "@types/express": "^4.17.21", - "@types/fs-extra": "^11.0.4", - "@types/glob": "^8.1.0", - "@types/mime-types": "^2.1.4", - "@types/morgan": "^1.9.9", - "@types/node": "^22.15.3", - "@types/qrcode": "^1.5.5", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.3", - "@types/set-cookie-parser": "^2.4.10", - "@types/source-map-support": "^0.5.10", - "@vitejs/plugin-react": "^4.4.1", - "@vitest/coverage-v8": "^3.1.3", - "enforce-unique": "^1.3.0", - "esbuild": "^0.25.3", - "eslint": "^9.26.0", - "fs-extra": "^11.3.0", - "jsdom": "^25.0.1", - "msw": "^2.7.6", - "npm-run-all": "^4.1.5", - "playwright-persona": "^0.2.5", - "prettier": "^3.5.3", - "prettier-plugin-sql": "^0.19.0", - "prettier-plugin-tailwindcss": "^0.6.11", - "react-router-devtools": "^5.0.5", - "remix-flat-routes": "^0.8.5", - "tsx": "^4.19.4", - "tw-animate-css": "^1.2.9", - "typescript": "^5.8.3", - "vite": "^6.3.5", - "vite-plugin-icons-spritesheet": "^3.0.1", - "vitest": "^3.1.3" - }, - "engines": { - "node": "22.14.0" - }, - "prisma": { - "seed": "tsx prisma/seed.ts" - }, - "epic-stack": { - "head": "4e6532d08219cef41299615ad7556b205aa0b77d", - "date": "2025-07-02T03:11:12Z" - } -} diff --git a/exercises/03.guides/03.problem.blocking-unneeded-requests/tests/e2e/homepage.test.ts b/exercises/03.guides/03.problem.blocking-unneeded-requests/tests/e2e/homepage.test.ts deleted file mode 100644 index b7c8d34..0000000 --- a/exercises/03.guides/03.problem.blocking-unneeded-requests/tests/e2e/homepage.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { test, expect } from '#tests/test-extend' - -test('displays the welcome heading', async ({ navigate, page }) => { - await navigate('/') - - await expect( - page.getByRole('heading', { name: 'The Epic Stack' }), - ).toBeVisible() -}) diff --git a/exercises/03.guides/03.problem.blocking-unneeded-requests/tests/test-extend.ts b/exercises/03.guides/03.problem.blocking-unneeded-requests/tests/test-extend.ts deleted file mode 100644 index 597ae96..0000000 --- a/exercises/03.guides/03.problem.blocking-unneeded-requests/tests/test-extend.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { createNetworkFixture, type NetworkFixture } from '@msw/playwright' -import { test as testBase, expect } from '@playwright/test' -// 🐨 Imoprt the `http` object and the `HttpResponse` class from "msw". -// 💰 import { this, that } from 'package' -import { - definePersona, - combinePersonas, - type AuthenticateFunction, -} from 'playwright-persona' -import { href, type Register } from 'react-router' -import { getPasswordHash } from '#app/utils/auth.server.ts' -import { prisma } from '#app/utils/db.server.ts' -import { createUser } from '#tests/db-utils' - -interface Fixtures { - navigate: ( - ...args: Parameters> - ) => Promise - authenticate: AuthenticateFunction<[typeof user]> - network: NetworkFixture -} - -const user = definePersona('user', { - async createSession({ page }) { - const user = await prisma.user.create({ - data: { - ...createUser(), - roles: { connect: { name: 'user' } }, - password: { create: { hash: await getPasswordHash('supersecret') } }, - }, - }) - - await page.goto('/login') - await page.getByLabel('Username').fill(user.username) - await page.getByLabel('Password').fill('supersecret') - await page.getByRole('button', { name: 'Log in' }).click() - await page.getByText(user.name!).waitFor({ state: 'visible' }) - - return { user } - }, - async verifySession({ page, session }) { - await page.goto('/') - await expect(page.getByText(session.user.name!)).toBeVisible({ - timeout: 100, - }) - }, - async destroySession({ session }) { - await prisma.user.deleteMany({ where: { id: session.user.id } }) - }, -}) - -export const test = testBase.extend({ - async navigate({ page }, use) { - await use(async (...args) => { - await page.goto(href(...args)) - }) - }, - authenticate: combinePersonas(user), - network: createNetworkFixture({ - initialHandlers: [ - // 🐨 Add a new handler for a GET request to the "https://assets.onedollarstats.com" URL. - // Capture all the requests to that URL by using a wildcard "*". - // 💰 http.get(path, resolver) - // - // 🐨 In the resolver for that handler, return an empty response. - // 💰 new HttpResponse() - ], - }), -}) - -export { expect } diff --git a/exercises/03.guides/03.solution.blocking-unneeded-requests/README.mdx b/exercises/03.guides/03.solution.blocking-unneeded-requests/README.mdx deleted file mode 100644 index 9a4e527..0000000 --- a/exercises/03.guides/03.solution.blocking-unneeded-requests/README.mdx +++ /dev/null @@ -1,5 +0,0 @@ -# Blocking unneeded requests - -Good job! 👏 - -Please wait for the others to finish so we could go through the solution to this exercise together. diff --git a/exercises/03.guides/03.solution.blocking-unneeded-requests/package.json b/exercises/03.guides/03.solution.blocking-unneeded-requests/package.json deleted file mode 100644 index 6128622..0000000 --- a/exercises/03.guides/03.solution.blocking-unneeded-requests/package.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "name": "exercises_03.guides_03.solution.blocking-unneeded-requests", - "private": true, - "sideEffects": false, - "type": "module", - "imports": { - "#app/*": "./app/*", - "#tests/*": "./tests/*" - }, - "scripts": { - "build": "run-s build:*", - "build:remix": "react-router build", - "build:server": "tsx ./other/build-server.ts", - "dev": "cross-env NODE_ENV=development MOCKS=true node ./server/dev-server.js", - "dev:no-mocks": "cross-env NODE_ENV=development node ./server/dev-server.js", - "format": "prettier --write .", - "lint": "eslint .", - "setup": "npm run build && prisma migrate deploy && prisma generate --sql && playwright install", - "start": "cross-env NODE_ENV=production node .", - "start:mocks": "cross-env NODE_ENV=production MOCKS=true tsx .", - "test": "npx playwright test", - "coverage": "vitest run --coverage", - "test:e2e": "npm run test:e2e:dev --silent", - "test:e2e:dev": "npx playwright test --ui", - "pretest:e2e:run": "npm run build", - "test:e2e:run": "npx cross-env CI=true npx playwright test", - "test:e2e:install": "npx playwright install --with-deps chromium", - "typecheck": "react-router typegen && tsc", - "validate": "run-p \"test -- --run\" lint typecheck test:e2e:run", - "post:playground": "npx react-router typegen && prisma migrate deploy && prisma generate --sql" - }, - "prettier": "@epic-web/config/prettier", - "eslintIgnore": [ - "/node_modules", - "/build", - "/public/build", - "/playwright-report", - "/server-build" - ], - "dependencies": { - "@conform-to/react": "^1.5.0", - "@conform-to/zod": "^1.5.0", - "@epic-web/cachified": "^5.5.2", - "@epic-web/client-hints": "^1.3.5", - "@epic-web/invariant": "^1.0.0", - "@epic-web/remember": "^1.1.0", - "@epic-web/totp": "^4.0.1", - "@mjackson/form-data-parser": "^0.7.0", - "@mjackson/headers": "^0.10.0", - "@nasa-gcn/remix-seo": "^2.0.1", - "@nichtsam/helmet": "^0.3.1", - "@oslojs/crypto": "^1.0.1", - "@oslojs/encoding": "^1.1.0", - "@paralleldrive/cuid2": "^2.2.2", - "@prisma/client": "^6.7.0", - "@prisma/instrumentation": "^6.7.0", - "@radix-ui/react-checkbox": "^1.2.3", - "@radix-ui/react-dropdown-menu": "^2.1.12", - "@radix-ui/react-label": "^2.1.4", - "@radix-ui/react-slot": "^1.2.0", - "@radix-ui/react-toast": "^1.2.11", - "@radix-ui/react-tooltip": "^1.2.4", - "@react-email/components": "0.0.38", - "@react-router/express": "^7.5.3", - "@react-router/node": "^7.5.3", - "@react-router/remix-routes-option-adapter": "^7.5.3", - "@remix-run/server-runtime": "^2.16.5", - "@sentry/profiling-node": "^9.32.0", - "@sentry/react-router": "^9.32.0", - "@simplewebauthn/browser": "^13.1.0", - "@simplewebauthn/server": "^13.1.1", - "@tailwindcss/vite": "^4.1.5", - "@tusbar/cache-control": "1.0.2", - "address": "^2.0.3", - "bcryptjs": "^3.0.2", - "class-variance-authority": "^0.7.1", - "close-with-grace": "^2.2.0", - "clsx": "^2.1.1", - "compression": "^1.8.0", - "cookie": "^1.0.2", - "cross-env": "^7.0.3", - "date-fns": "^4.1.0", - "dotenv": "^16.5.0", - "execa": "^9.5.2", - "express": "^4.21.2", - "express-rate-limit": "^7.5.0", - "get-port": "^7.1.0", - "glob": "^11.0.2", - "input-otp": "^1.4.2", - "intl-parse-accept-language": "^1.0.0", - "isbot": "^5.1.27", - "litefs-js": "^2.0.2", - "lru-cache": "^11.1.0", - "mime-types": "^3.0.1", - "morgan": "^1.10.0", - "openimg": "^1.1.0", - "prisma": "^6.7.0", - "qrcode": "^1.5.4", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-router": "^7.5.3", - "remix-auth": "^4.2.0", - "remix-auth-github": "^3.0.2", - "remix-utils": "^8.5.0", - "set-cookie-parser": "^2.7.1", - "sharp": "^0.34.2", - "sonner": "^2.0.3", - "source-map-support": "^0.5.21", - "spin-delay": "^2.0.1", - "tailwind-merge": "^3.2.0", - "tailwindcss": "^4.1.5", - "vite-env-only": "^3.0.3", - "zod": "^3.24.4" - }, - "devDependencies": { - "@epic-web/config": "^1.20.1", - "@faker-js/faker": "^9.7.0", - "@msw/playwright": "^0.4.2", - "@playwright/test": "^1.52.0", - "@react-router/dev": "^7.5.3", - "@sly-cli/sly": "^2.1.1", - "@testing-library/dom": "^10.4.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "@total-typescript/ts-reset": "^0.6.1", - "@types/compression": "^1.7.5", - "@types/eslint": "^9.6.1", - "@types/express": "^4.17.21", - "@types/fs-extra": "^11.0.4", - "@types/glob": "^8.1.0", - "@types/mime-types": "^2.1.4", - "@types/morgan": "^1.9.9", - "@types/node": "^22.15.3", - "@types/qrcode": "^1.5.5", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.3", - "@types/set-cookie-parser": "^2.4.10", - "@types/source-map-support": "^0.5.10", - "@vitejs/plugin-react": "^4.4.1", - "@vitest/coverage-v8": "^3.1.3", - "enforce-unique": "^1.3.0", - "esbuild": "^0.25.3", - "eslint": "^9.26.0", - "fs-extra": "^11.3.0", - "jsdom": "^25.0.1", - "msw": "^2.7.6", - "npm-run-all": "^4.1.5", - "playwright-persona": "^0.2.5", - "prettier": "^3.5.3", - "prettier-plugin-sql": "^0.19.0", - "prettier-plugin-tailwindcss": "^0.6.11", - "react-router-devtools": "^5.0.5", - "remix-flat-routes": "^0.8.5", - "tsx": "^4.19.4", - "tw-animate-css": "^1.2.9", - "typescript": "^5.8.3", - "vite": "^6.3.5", - "vite-plugin-icons-spritesheet": "^3.0.1", - "vitest": "^3.1.3" - }, - "engines": { - "node": "22.14.0" - }, - "prisma": { - "seed": "tsx prisma/seed.ts" - }, - "epic-stack": { - "head": "4e6532d08219cef41299615ad7556b205aa0b77d", - "date": "2025-07-02T03:11:12Z" - } -} diff --git a/exercises/03.guides/03.solution.blocking-unneeded-requests/tests/e2e/homepage.test.ts b/exercises/03.guides/03.solution.blocking-unneeded-requests/tests/e2e/homepage.test.ts deleted file mode 100644 index b7c8d34..0000000 --- a/exercises/03.guides/03.solution.blocking-unneeded-requests/tests/e2e/homepage.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { test, expect } from '#tests/test-extend' - -test('displays the welcome heading', async ({ navigate, page }) => { - await navigate('/') - - await expect( - page.getByRole('heading', { name: 'The Epic Stack' }), - ).toBeVisible() -}) diff --git a/exercises/04.debugging/01.problem.ui-mode/.env b/exercises/04.debugging/01.problem.ui-mode/.env deleted file mode 100644 index e45c443..0000000 --- a/exercises/04.debugging/01.problem.ui-mode/.env +++ /dev/null @@ -1,29 +0,0 @@ -LITEFS_DIR="/litefs/data" -DATABASE_PATH="./prisma/data.db" -DATABASE_URL="file:./data.db?connection_limit=1" -CACHE_DATABASE_PATH="./other/cache.db" -SESSION_SECRET="dcfaa48e7e20dce686b8636a68fa26f0" -HONEYPOT_SECRET="super-duper-s3cret" -RESEND_API_KEY="re_blAh_blaHBlaHblahBLAhBlAh" -SENTRY_DSN="your-dsn" - -# this is set to a random value in the Dockerfile -INTERNAL_COMMAND_TOKEN="some-made-up-token" - -# the mocks and some code rely on these two being prefixed with "MOCK_" -# if they aren't then the real github api will be attempted -GITHUB_CLIENT_ID="MOCK_GITHUB_CLIENT_ID" -GITHUB_CLIENT_SECRET="MOCK_GITHUB_CLIENT_SECRET" -GITHUB_TOKEN="MOCK_GITHUB_TOKEN" -GITHUB_REDIRECT_URI="https://example.com/auth/github/callback" - -# set this to false to prevent search engines from indexing the website -# default to allow indexing for seo safety -ALLOW_INDEXING="true" - -# Tigris Object Storage (S3-compatible) Configuration -AWS_ACCESS_KEY_ID="mock-access-key" -AWS_SECRET_ACCESS_KEY="mock-secret-key" -AWS_REGION="auto" -AWS_ENDPOINT_URL_S3="https://fly.storage.tigris.dev" -BUCKET_NAME="mock-bucket" diff --git a/exercises/04.debugging/01.problem.ui-mode/.env.example b/exercises/04.debugging/01.problem.ui-mode/.env.example deleted file mode 100644 index c5daeb2..0000000 --- a/exercises/04.debugging/01.problem.ui-mode/.env.example +++ /dev/null @@ -1,29 +0,0 @@ -LITEFS_DIR="/litefs/data" -DATABASE_PATH="./prisma/data.db" -DATABASE_URL="file:./data.db?connection_limit=1" -CACHE_DATABASE_PATH="./other/cache.db" -SESSION_SECRET="super-duper-s3cret" -HONEYPOT_SECRET="super-duper-s3cret" -RESEND_API_KEY="re_blAh_blaHBlaHblahBLAhBlAh" -SENTRY_DSN="your-dsn" - -# this is set to a random value in the Dockerfile -INTERNAL_COMMAND_TOKEN="some-made-up-token" - -# the mocks and some code rely on these two being prefixed with "MOCK_" -# if they aren't then the real github api will be attempted -GITHUB_CLIENT_ID="MOCK_GITHUB_CLIENT_ID" -GITHUB_CLIENT_SECRET="MOCK_GITHUB_CLIENT_SECRET" -GITHUB_TOKEN="MOCK_GITHUB_TOKEN" -GITHUB_REDIRECT_URI="https://example.com/auth/github/callback" - -# set this to false to prevent search engines from indexing the website -# default to allow indexing for seo safety -ALLOW_INDEXING="true" - -# Tigris Object Storage (S3-compatible) Configuration -AWS_ACCESS_KEY_ID="mock-access-key" -AWS_SECRET_ACCESS_KEY="mock-secret-key" -AWS_REGION="auto" -AWS_ENDPOINT_URL_S3="https://fly.storage.tigris.dev" -BUCKET_NAME="mock-bucket" diff --git a/exercises/04.debugging/01.problem.ui-mode/app/routes/users+/$username_+/notes.tsx b/exercises/04.debugging/01.problem.ui-mode/app/routes/users+/$username_+/notes.tsx deleted file mode 100644 index 90e7b3c..0000000 --- a/exercises/04.debugging/01.problem.ui-mode/app/routes/users+/$username_+/notes.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { invariantResponse } from '@epic-web/invariant' -import { Img } from 'openimg/react' -import { Link, NavLink, Outlet } from 'react-router' -import { GeneralErrorBoundary } from '#app/components/error-boundary.tsx' -import { Icon } from '#app/components/ui/icon.tsx' -import { prisma } from '#app/utils/db.server.ts' -import { cn, getUserImgSrc } from '#app/utils/misc.tsx' -import { useOptionalUser } from '#app/utils/user.ts' -import { type Route } from './+types/notes.ts' - -export async function loader({ params }: Route.LoaderArgs) { - const owner = await prisma.user.findFirst({ - select: { - id: true, - name: true, - username: true, - image: { select: { objectKey: true } }, - notes: { select: { id: true, title: true } }, - }, - where: { username: params.username }, - }) - - invariantResponse(owner, 'Owner not found', { status: 404 }) - - return { owner } -} - -export default function NotesRoute({ loaderData }: Route.ComponentProps) { - const user = useOptionalUser() - const isOwner = user?.id === loaderData.owner.id - const ownerDisplayName = loaderData.owner.name ?? loaderData.owner.username - const navLinkDefaultClassName = - 'line-clamp-2 block rounded-l-full py-2 pl-8 pr-6 text-base lg:text-xl' - return ( -
-
-
-
- - {ownerDisplayName} -

- {ownerDisplayName}'s Notes -

- -
    - {isOwner ? ( -
  • - - cn(navLinkDefaultClassName, isActive && 'bg-accent') - } - > - New Note - -
  • - ) : null} - {loaderData.owner.notes.map((note) => ( -
  • - - cn(navLinkDefaultClassName, isActive && 'bg-accent') - } - > - {note.title} - -
  • - ))} -
-
-
-
- -
-
-
- ) -} - -export function ErrorBoundary() { - return ( - ( -

No user with the username "{params.username}" exists

- ), - }} - /> - ) -} diff --git a/exercises/04.debugging/01.problem.ui-mode/app/utils/env.server.ts b/exercises/04.debugging/01.problem.ui-mode/app/utils/env.server.ts deleted file mode 100644 index e762b1e..0000000 --- a/exercises/04.debugging/01.problem.ui-mode/app/utils/env.server.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { z } from 'zod' - -const schema = z.object({ - NODE_ENV: z.enum(['production', 'development', 'test'] as const), - DATABASE_PATH: z.string(), - DATABASE_URL: z.string(), - SESSION_SECRET: z.string(), - INTERNAL_COMMAND_TOKEN: z.string(), - HONEYPOT_SECRET: z.string(), - CACHE_DATABASE_PATH: z.string(), - // If you plan on using Sentry, remove the .optional() - SENTRY_DSN: z.string().optional(), - // If you plan to use Resend, remove the .optional() - RESEND_API_KEY: z.string().optional(), - // If you plan to use GitHub auth, remove the .optional() - GITHUB_CLIENT_ID: z.string().optional(), - GITHUB_CLIENT_SECRET: z.string().optional(), - GITHUB_REDIRECT_URI: z.string().optional(), - GITHUB_TOKEN: z.string().optional(), - - ALLOW_INDEXING: z.enum(['true', 'false']).optional(), - - // Tigris Object Storage Configuration - AWS_ACCESS_KEY_ID: z.string(), - AWS_SECRET_ACCESS_KEY: z.string(), - AWS_REGION: z.string(), - AWS_ENDPOINT_URL_S3: z.string().url(), - BUCKET_NAME: z.string(), -}) - -declare global { - namespace NodeJS { - interface ProcessEnv extends z.infer {} - } -} - -export function init() { - const parsed = schema.safeParse(process.env) - - if (parsed.success === false) { - console.error( - '❌ Invalid environment variables:', - parsed.error.flatten().fieldErrors, - ) - - throw new Error('Invalid environment variables') - } -} - -/** - * This is used in both `entry.server.ts` and `root.tsx` to ensure that - * the environment variables are set and globally available before the app is - * started. - * - * NOTE: Do *not* add any environment variables in here that you do not wish to - * be included in the client. - * @returns all public ENV variables - */ -export function getEnv() { - return { - MODE: process.env.NODE_ENV, - SENTRY_DSN: process.env.SENTRY_DSN, - ALLOW_INDEXING: process.env.ALLOW_INDEXING, - } -} - -type ENV = ReturnType - -declare global { - var ENV: ENV - interface Window { - ENV: ENV - } -} diff --git a/exercises/04.debugging/01.solution.ui-mode/.env b/exercises/04.debugging/01.solution.ui-mode/.env deleted file mode 100644 index e45c443..0000000 --- a/exercises/04.debugging/01.solution.ui-mode/.env +++ /dev/null @@ -1,29 +0,0 @@ -LITEFS_DIR="/litefs/data" -DATABASE_PATH="./prisma/data.db" -DATABASE_URL="file:./data.db?connection_limit=1" -CACHE_DATABASE_PATH="./other/cache.db" -SESSION_SECRET="dcfaa48e7e20dce686b8636a68fa26f0" -HONEYPOT_SECRET="super-duper-s3cret" -RESEND_API_KEY="re_blAh_blaHBlaHblahBLAhBlAh" -SENTRY_DSN="your-dsn" - -# this is set to a random value in the Dockerfile -INTERNAL_COMMAND_TOKEN="some-made-up-token" - -# the mocks and some code rely on these two being prefixed with "MOCK_" -# if they aren't then the real github api will be attempted -GITHUB_CLIENT_ID="MOCK_GITHUB_CLIENT_ID" -GITHUB_CLIENT_SECRET="MOCK_GITHUB_CLIENT_SECRET" -GITHUB_TOKEN="MOCK_GITHUB_TOKEN" -GITHUB_REDIRECT_URI="https://example.com/auth/github/callback" - -# set this to false to prevent search engines from indexing the website -# default to allow indexing for seo safety -ALLOW_INDEXING="true" - -# Tigris Object Storage (S3-compatible) Configuration -AWS_ACCESS_KEY_ID="mock-access-key" -AWS_SECRET_ACCESS_KEY="mock-secret-key" -AWS_REGION="auto" -AWS_ENDPOINT_URL_S3="https://fly.storage.tigris.dev" -BUCKET_NAME="mock-bucket" diff --git a/exercises/04.debugging/01.solution.ui-mode/.env.example b/exercises/04.debugging/01.solution.ui-mode/.env.example deleted file mode 100644 index c5daeb2..0000000 --- a/exercises/04.debugging/01.solution.ui-mode/.env.example +++ /dev/null @@ -1,29 +0,0 @@ -LITEFS_DIR="/litefs/data" -DATABASE_PATH="./prisma/data.db" -DATABASE_URL="file:./data.db?connection_limit=1" -CACHE_DATABASE_PATH="./other/cache.db" -SESSION_SECRET="super-duper-s3cret" -HONEYPOT_SECRET="super-duper-s3cret" -RESEND_API_KEY="re_blAh_blaHBlaHblahBLAhBlAh" -SENTRY_DSN="your-dsn" - -# this is set to a random value in the Dockerfile -INTERNAL_COMMAND_TOKEN="some-made-up-token" - -# the mocks and some code rely on these two being prefixed with "MOCK_" -# if they aren't then the real github api will be attempted -GITHUB_CLIENT_ID="MOCK_GITHUB_CLIENT_ID" -GITHUB_CLIENT_SECRET="MOCK_GITHUB_CLIENT_SECRET" -GITHUB_TOKEN="MOCK_GITHUB_TOKEN" -GITHUB_REDIRECT_URI="https://example.com/auth/github/callback" - -# set this to false to prevent search engines from indexing the website -# default to allow indexing for seo safety -ALLOW_INDEXING="true" - -# Tigris Object Storage (S3-compatible) Configuration -AWS_ACCESS_KEY_ID="mock-access-key" -AWS_SECRET_ACCESS_KEY="mock-secret-key" -AWS_REGION="auto" -AWS_ENDPOINT_URL_S3="https://fly.storage.tigris.dev" -BUCKET_NAME="mock-bucket" diff --git a/exercises/04.debugging/01.solution.ui-mode/app/routes/users+/$username_+/notes.tsx b/exercises/04.debugging/01.solution.ui-mode/app/routes/users+/$username_+/notes.tsx deleted file mode 100644 index 90e7b3c..0000000 --- a/exercises/04.debugging/01.solution.ui-mode/app/routes/users+/$username_+/notes.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { invariantResponse } from '@epic-web/invariant' -import { Img } from 'openimg/react' -import { Link, NavLink, Outlet } from 'react-router' -import { GeneralErrorBoundary } from '#app/components/error-boundary.tsx' -import { Icon } from '#app/components/ui/icon.tsx' -import { prisma } from '#app/utils/db.server.ts' -import { cn, getUserImgSrc } from '#app/utils/misc.tsx' -import { useOptionalUser } from '#app/utils/user.ts' -import { type Route } from './+types/notes.ts' - -export async function loader({ params }: Route.LoaderArgs) { - const owner = await prisma.user.findFirst({ - select: { - id: true, - name: true, - username: true, - image: { select: { objectKey: true } }, - notes: { select: { id: true, title: true } }, - }, - where: { username: params.username }, - }) - - invariantResponse(owner, 'Owner not found', { status: 404 }) - - return { owner } -} - -export default function NotesRoute({ loaderData }: Route.ComponentProps) { - const user = useOptionalUser() - const isOwner = user?.id === loaderData.owner.id - const ownerDisplayName = loaderData.owner.name ?? loaderData.owner.username - const navLinkDefaultClassName = - 'line-clamp-2 block rounded-l-full py-2 pl-8 pr-6 text-base lg:text-xl' - return ( -
-
-
-
- - {ownerDisplayName} -

- {ownerDisplayName}'s Notes -

- -
    - {isOwner ? ( -
  • - - cn(navLinkDefaultClassName, isActive && 'bg-accent') - } - > - New Note - -
  • - ) : null} - {loaderData.owner.notes.map((note) => ( -
  • - - cn(navLinkDefaultClassName, isActive && 'bg-accent') - } - > - {note.title} - -
  • - ))} -
-
-
-
- -
-
-
- ) -} - -export function ErrorBoundary() { - return ( - ( -

No user with the username "{params.username}" exists

- ), - }} - /> - ) -} diff --git a/exercises/04.debugging/01.solution.ui-mode/app/utils/env.server.ts b/exercises/04.debugging/01.solution.ui-mode/app/utils/env.server.ts deleted file mode 100644 index e762b1e..0000000 --- a/exercises/04.debugging/01.solution.ui-mode/app/utils/env.server.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { z } from 'zod' - -const schema = z.object({ - NODE_ENV: z.enum(['production', 'development', 'test'] as const), - DATABASE_PATH: z.string(), - DATABASE_URL: z.string(), - SESSION_SECRET: z.string(), - INTERNAL_COMMAND_TOKEN: z.string(), - HONEYPOT_SECRET: z.string(), - CACHE_DATABASE_PATH: z.string(), - // If you plan on using Sentry, remove the .optional() - SENTRY_DSN: z.string().optional(), - // If you plan to use Resend, remove the .optional() - RESEND_API_KEY: z.string().optional(), - // If you plan to use GitHub auth, remove the .optional() - GITHUB_CLIENT_ID: z.string().optional(), - GITHUB_CLIENT_SECRET: z.string().optional(), - GITHUB_REDIRECT_URI: z.string().optional(), - GITHUB_TOKEN: z.string().optional(), - - ALLOW_INDEXING: z.enum(['true', 'false']).optional(), - - // Tigris Object Storage Configuration - AWS_ACCESS_KEY_ID: z.string(), - AWS_SECRET_ACCESS_KEY: z.string(), - AWS_REGION: z.string(), - AWS_ENDPOINT_URL_S3: z.string().url(), - BUCKET_NAME: z.string(), -}) - -declare global { - namespace NodeJS { - interface ProcessEnv extends z.infer {} - } -} - -export function init() { - const parsed = schema.safeParse(process.env) - - if (parsed.success === false) { - console.error( - '❌ Invalid environment variables:', - parsed.error.flatten().fieldErrors, - ) - - throw new Error('Invalid environment variables') - } -} - -/** - * This is used in both `entry.server.ts` and `root.tsx` to ensure that - * the environment variables are set and globally available before the app is - * started. - * - * NOTE: Do *not* add any environment variables in here that you do not wish to - * be included in the client. - * @returns all public ENV variables - */ -export function getEnv() { - return { - MODE: process.env.NODE_ENV, - SENTRY_DSN: process.env.SENTRY_DSN, - ALLOW_INDEXING: process.env.ALLOW_INDEXING, - } -} - -type ENV = ReturnType - -declare global { - var ENV: ENV - interface Window { - ENV: ENV - } -} diff --git a/exercises/04.debugging/02.problem.trace-viewer/.github/PULL_REQUEST_TEMPLATE.md b/exercises/04.debugging/02.problem.trace-viewer/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 84a2084..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,15 +0,0 @@ - - -## Test Plan - - - -## Checklist - -- [ ] Tests updated -- [ ] Docs updated - -## Screenshots - - diff --git a/exercises/04.debugging/02.problem.trace-viewer/.github/workflows/deploy.yml b/exercises/04.debugging/02.problem.trace-viewer/.github/workflows/deploy.yml deleted file mode 100644 index 49cbbad..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/.github/workflows/deploy.yml +++ /dev/null @@ -1,229 +0,0 @@ -name: 🚀 Deploy -on: - push: - branches: - - main - - dev - pull_request: {} - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - actions: write - contents: read - -jobs: - lint: - name: ⬣ ESLint - runs-on: ubuntu-22.04 - steps: - - name: ⬇️ Checkout repo - uses: actions/checkout@v4 - - - name: ⎔ Setup node - uses: actions/setup-node@v4 - with: - node-version: 22 - - - name: 📥 Download deps - uses: bahmutov/npm-install@v1 - - - name: 🏄 Copy test env vars - run: cp .env.example .env - - - name: 🛠 Setup Database - run: npx prisma migrate deploy && npx prisma generate --sql - - - name: 🔬 Lint - run: npm run lint - - typecheck: - name: ʦ TypeScript - runs-on: ubuntu-22.04 - steps: - - name: ⬇️ Checkout repo - uses: actions/checkout@v4 - - - name: ⎔ Setup node - uses: actions/setup-node@v4 - with: - node-version: 22 - - - name: 📥 Download deps - uses: bahmutov/npm-install@v1 - - - name: 🏗 Build - run: npm run build - - - name: 🏄 Copy test env vars - run: cp .env.example .env - - - name: 🛠 Setup Database - run: npx prisma migrate deploy && npx prisma generate --sql - - - name: 🔎 Type check - run: npm run typecheck --if-present - - vitest: - name: ⚡ Vitest - runs-on: ubuntu-22.04 - steps: - - name: ⬇️ Checkout repo - uses: actions/checkout@v4 - - - name: ⎔ Setup node - uses: actions/setup-node@v4 - with: - node-version: 22 - - - name: 📥 Download deps - uses: bahmutov/npm-install@v1 - - - name: 🏄 Copy test env vars - run: cp .env.example .env - - - name: 🛠 Setup Database - run: npx prisma migrate deploy && npx prisma generate --sql - - - name: ⚡ Run vitest - run: npm run test -- --coverage - - playwright: - name: 🎭 Playwright - runs-on: ubuntu-22.04 - timeout-minutes: 60 - steps: - - name: ⬇️ Checkout repo - uses: actions/checkout@v4 - - - name: 🏄 Copy test env vars - run: cp .env.example .env - - - name: ⎔ Setup node - uses: actions/setup-node@v4 - with: - node-version: 22 - - - name: 📥 Download deps - uses: bahmutov/npm-install@v1 - - - name: 📥 Install Playwright Browsers - run: npm run test:e2e:install - - - name: 🛠 Setup Database - run: npx prisma migrate deploy && npx prisma generate --sql - - - name: 🏦 Cache Database - id: db-cache - uses: actions/cache@v4 - with: - path: prisma/data.db - key: - db-cache-schema_${{ hashFiles('./prisma/schema.prisma') - }}-migrations_${{ hashFiles('./prisma/migrations/*/migration.sql') - }} - - - name: 🌱 Seed Database - if: steps.db-cache.outputs.cache-hit != 'true' - run: npx prisma migrate reset --force - - - name: 🏗 Build - run: npm run build - - - name: 🎭 Playwright tests - run: npx playwright test - - - name: 📊 Upload report - uses: actions/upload-artifact@v4 - if: always() - with: - name: playwright-report - path: playwright-report/ - retention-days: 30 - - container: - name: 📦 Prepare Container - runs-on: ubuntu-24.04 - # only prepare container on pushes - if: ${{ github.event_name == 'push' }} - steps: - - name: ⬇️ Checkout repo - uses: actions/checkout@v4 - with: - fetch-depth: 50 - - - name: 👀 Read app name - uses: SebRollen/toml-action@v1.2.0 - id: app_name - with: - file: 'fly.toml' - field: 'app' - - - name: 🎈 Setup Fly - uses: superfly/flyctl-actions/setup-flyctl@1.5 - - - name: 📦 Build Staging Container - if: ${{ github.ref == 'refs/heads/dev' }} - run: | - flyctl deploy \ - --build-only \ - --push \ - --image-label ${{ github.sha }} \ - --build-arg COMMIT_SHA=${{ github.sha }} \ - --app ${{ steps.app_name.outputs.value }}-staging - env: - FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} - - - name: 📦 Build Production Container - if: ${{ github.ref == 'refs/heads/main' }} - run: | - flyctl deploy \ - --build-only \ - --push \ - --image-label ${{ github.sha }} \ - --build-arg COMMIT_SHA=${{ github.sha }} \ - --build-secret SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }} \ - --app ${{ steps.app_name.outputs.value }} - env: - FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} - - deploy: - name: 🚀 Deploy - runs-on: ubuntu-24.04 - needs: [lint, typecheck, vitest, playwright, container] - # only deploy on pushes - if: ${{ github.event_name == 'push' }} - steps: - - name: ⬇️ Checkout repo - uses: actions/checkout@v4 - with: - fetch-depth: '50' - - - name: 👀 Read app name - uses: SebRollen/toml-action@v1.2.0 - id: app_name - with: - file: 'fly.toml' - field: 'app' - - - name: 🎈 Setup Fly - uses: superfly/flyctl-actions/setup-flyctl@1.5 - - - name: 🚀 Deploy Staging - if: ${{ github.ref == 'refs/heads/dev' }} - run: | - flyctl deploy \ - --image "registry.fly.io/${{ steps.app_name.outputs.value }}-staging:${{ github.sha }}" \ - --app ${{ steps.app_name.outputs.value }}-staging - env: - FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} - - - name: 🚀 Deploy Production - if: ${{ github.ref == 'refs/heads/main' }} - run: | - flyctl deploy \ - --image "registry.fly.io/${{ steps.app_name.outputs.value }}:${{ github.sha }}" - env: - FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} diff --git a/exercises/04.debugging/02.problem.trace-viewer/.gitignore b/exercises/04.debugging/02.problem.trace-viewer/.gitignore deleted file mode 100644 index e39d8e3..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -node_modules -.DS_store - -/build -/server-build - -.cache - -/prisma/data.db -/prisma/data.db-journal -/tests/prisma - -/test-results/ -/playwright-report/ -/playwright/.cache/ -/tests/fixtures/email/ -/tests/fixtures/uploaded/ -/tests/fixtures/openimg/ -/coverage - -/other/cache.db - -# Easy way to create temporary files/folders that won't accidentally be added to git -*.local.* - -# generated files -/app/components/ui/icons -.react-router/ diff --git a/exercises/04.debugging/02.problem.trace-viewer/.npmrc b/exercises/04.debugging/02.problem.trace-viewer/.npmrc deleted file mode 100644 index 668efa1..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -legacy-peer-deps=true -registry=https://registry.npmjs.org/ diff --git a/exercises/04.debugging/02.problem.trace-viewer/.prettierignore b/exercises/04.debugging/02.problem.trace-viewer/.prettierignore deleted file mode 100644 index f022d02..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/.prettierignore +++ /dev/null @@ -1,15 +0,0 @@ -node_modules - -/build -/public/build -/server-build -.env - -/test-results/ -/playwright-report/ -/playwright/.cache/ -/tests/fixtures/email/*.json -/coverage -/prisma/migrations - -package-lock.json diff --git a/exercises/04.debugging/02.problem.trace-viewer/.vscode/extensions.json b/exercises/04.debugging/02.problem.trace-viewer/.vscode/extensions.json deleted file mode 100644 index f724eea..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/.vscode/extensions.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "recommendations": [ - "bradlc.vscode-tailwindcss", - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "prisma.prisma", - "qwtel.sqlite-viewer", - "yoavbls.pretty-ts-errors", - "github.vscode-github-actions", - "ms-playwright.playwright" - ] -} diff --git a/exercises/04.debugging/02.problem.trace-viewer/.vscode/remix.code-snippets b/exercises/04.debugging/02.problem.trace-viewer/.vscode/remix.code-snippets deleted file mode 100644 index 079bee5..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/.vscode/remix.code-snippets +++ /dev/null @@ -1,80 +0,0 @@ -{ - "loader": { - "prefix": "/loader", - "scope": "typescriptreact,javascriptreact,typescript,javascript", - "body": [ - "import { type Route } from \"./+types/${TM_FILENAME_BASE}.ts\"", - "", - "export async function loader({ request }: Route.LoaderArgs) {", - " return {}", - "}", - ], - }, - "action": { - "prefix": "/action", - "scope": "typescriptreact,javascriptreact,typescript,javascript", - "body": [ - "import { type Route } from \"./+types/${TM_FILENAME_BASE}.ts\"", - "", - "export async function action({ request }: Route.ActionArgs) {", - " return {}", - "}", - ], - }, - "default": { - "prefix": "/default", - "scope": "typescriptreact,javascriptreact,typescript,javascript", - "body": [ - "export default function ${TM_FILENAME_BASE/[^a-zA-Z0-9]*([a-zA-Z0-9])([a-zA-Z0-9]*)/${1:/capitalize}${2}/g}() {", - " return (", - "
", - "

Unknown Route

", - "
", - " )", - "}", - ], - }, - "headers": { - "prefix": "/headers", - "scope": "typescriptreact,javascriptreact,typescript,javascript", - "body": [ - "import { type Route } from \"./+types/${TM_FILENAME_BASE}.ts\"", - "export const headers: Route.HeadersFunction = ({ loaderHeaders }) => ({", - " 'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',", - "})", - ], - }, - "links": { - "prefix": "/links", - "scope": "typescriptreact,javascriptreact,typescript,javascript", - "body": [ - "import { type Route } from \"./+types/${TM_FILENAME_BASE}.ts\"", - "", - "export const links: Route.LinksFunction = () => {", - " return []", - "}", - ], - }, - "meta": { - "prefix": "/meta", - "scope": "typescriptreact,javascriptreact,typescript,javascript", - "body": [ - "import { type Route } from \"./+types/${TM_FILENAME_BASE}.ts\"", - "", - "export const meta: Route.MetaFunction = ({ data }) => [{", - " title: 'Title',", - "}]", - ], - }, - "shouldRevalidate": { - "prefix": "/shouldRevalidate", - "scope": "typescriptreact,javascriptreact,typescript,javascript", - "body": [ - "import { type ShouldRevalidateFunctionArgs } from 'react-router'", - "", - "export function shouldRevalidate({ defaultShouldRevalidate }: ShouldRevalidateFunctionArgs) {", - " return defaultShouldRevalidate", - "}", - ], - }, -} diff --git a/exercises/04.debugging/02.problem.trace-viewer/.vscode/settings.json b/exercises/04.debugging/02.problem.trace-viewer/.vscode/settings.json deleted file mode 100644 index 9ec5cad..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/.vscode/settings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "typescript.preferences.autoImportFileExcludePatterns": [ - "@remix-run/server-runtime", - "express", - "@radix-ui/**", - "@react-email/**", - "node:stream/consumers", - "node:test", - "node:console" - ], - "workbench.editorAssociations": { - "*.db": "sqlite-viewer.view" - } -} diff --git a/exercises/04.debugging/02.problem.trace-viewer/app/assets/favicons/apple-touch-icon.png b/exercises/04.debugging/02.problem.trace-viewer/app/assets/favicons/apple-touch-icon.png deleted file mode 100644 index 8bf4632e7f5e38c2938bf0892a18c98b21a8f1d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8986 zcmV+#BjwzQP)PyA07*naRCr$PT?crM*BAepMa-Hl{vE`oc2Lw-TM&CURFF1C5*e~&NX#~f5_^k1 zYb%P_wFzBl?Y-y!Id9O6Z@lB)_kF)F?|Gg+)OW|Z=lbz0Mm0%&diLw3mn}=BTwI*f#{|x@z}o%(fu`ZW1s6 z%}umM!&*py381z3xTqm4ljE}2!Kxup75ZQTXchR>ybA-zBBwxOL8S(CQie2UPNWEp zVul3XOTgHn#el))7PieXEM^u&l`#Mda}}yMNCRzD^~e{s)R*kGXQ@ zLfO(~us436XlYvobW(PygJ8cPY}m8``{MWF!J|i_J2DCy5)dna><$j7I&a zSdjS*)Wlk{3h4j*A&E!xO&T=9_X9m}F5w(z&7X}Er%s6F(D`)iR+#Q)SXU4%JhY%1NfJYLw0IPsDHB?$f6Go30Iwm@M z{w!9kUV&{px8udj7urh4=-s9ykSSv(G_2PE?b@_MsS>3G-f5#8GGeH#ufHrnQ>Q(< z_JnJ%Z{7><_3PI-cKjH^$421#jq5fgRD)SSnu zB5(Qf<`Z`1j_o=kf4=<58asRLEQb4e;{JpCvcx7E(4_Y?Y0wxx!+nyiF5-fA>kGeM zz|`2EaOmhES&SK#EJ#2ifb=BGs+Fo@fa|v?{&{hexQQ4WAsB*k&pc!UnuL@wV@8Y# zjY5@5Rm{q4^}5wqx-t%zuUwYRq@E_k;6=IwX!9#lxClBryP!?WHf9?*eDp9p{k`z= zUg|2>h?;|HSnDzRc}Ax3OvKCXhq@#S2?J zY2*(YNdi@|aHdR|gafvwjhf=aJReHx`R_}A!za*3a2kjs>vCoaXtH2CcjyE+S2uC| zr6~39)qgQAdOUtR{u`b>e^razi{cg`;o=2Zf=aWMtZ!gUMB`YjIJ&rWLCxwl zL2fxYM7K1({Jrt$aq=t3N{7H4&@{M0g+9Wpm>B}N<hOJGV)xCaG*9psgWE zQj`A`rcafhr!N{eXe_gZ)Ya(n_lZ*{F=OrwoIHJ!S-ZM#h|?UI8h5!eY?##zQAU=QLJXWq* zi7h*}+UTJSbFoNnkW|9P^&7#twKGZ-FJaN>ll!5Vzj!`o%$>>H5KPGrcR-VL>1cG` zw7Do;m~=7ex|g*XB48i=?Wk~*@8+#r)`}ayCy_wDym^Hiah1NPq{w?=NvK!;xq=@3 zda81@K@~vLV5?THiV(kGWY3;us;4TMc3eXzLL9{L{}ddHf{V$E8vPLTbpG^=lBfY8ftF zzLe&TMl$+}7AXpswjI#AMQd*AMbbH<6Tv}42IKcXf0r_Kipnwsv^YLmeBA<`-w#)G zf+(&h2p}f?ZT+SVLNXjWPEU(O$JCU>rA5=`DEx6@RlrOqf@6Oei*-M*S5@Sy1DZZ@ zk)uYVdX?&`4)oNSQ;3`piOW~6sA8O`Iyf_(kuhGRaA9~4@kZIwmcyV}^Lya%0eFub z!Q881jZcMuwytKFV!)}Y6N3GNM1|*A8-SGGA3l1B4VyM1Ze^Sh*QgtkCq|3xQ#_xG zvkRIxZHDX){0wnZOi-9zU}zBH55=o4VugT~$1j~A`VR9!lSX_EL{r?68bWtN#z&9G z)}7n9omz3gs3>6zVNmrNVyOF2;qJw|C~Hxb85P>Rbu+@pMR1d?B{nqyG%=JjXHLXS zoPwf-i!u_Uv}Rtse2Lw^?n2zkWkM!ZCAlD^^~|RoXp&<1`t@-Y z!l3fxrgz)5A&N4J93P3TJNR8bvNkg1fR?$Eh%wUbg8TwiHxNw;g}fm@#zf=rvBRqQ zOs!3h#ZN1MOqnyIO2sPp&dpu$UT95Z2nK}(gKQOUWCd@^0j-ep(j`md$1y+PgAcUZ zrQZ#K!oLn2I)M307vRFh3%d1PlU`iBSaEdk*bUXIR#(NZZ*7{NJ$r`lJio`8b7!m- z<@&qkfTqz=l55xAu6zv`30HXOKwxU@RBYV55zloNg`PQ6CNyi(3hBobvxmC;%r$@+g6{pL738jlNeqMfjcjjqLMe6G ziIXQVefD(Wy+)oy@ALKR-4Er z&FkvM{aT|Go>G>j-H0ME7A#!|vhG?%a~&{s>ZMAvjF^AU>_xU$D+VgcxC zho*s1ezeF@ktpd{LiRY-s7MLA`@4S&%FD-+X#CTne=?guo@HN3+B%nT9^NCpnU7xy zPgGZTfF`CW+IZ5qXmt!knG)Rn>u&gk_{*$qxms92DC&G!hfCWm8YSaz@Gy5-&#tlP zKd}wd`iU+9P3*c4a7Tx>?UjLAhVds>-~pk5*tvVB*y57P)vHqvA^yQ4>Tn#OncfM^ z%T_H%^wek({Hb3=JfLML?Ba)$y73|(7slw2(UMd1itkf?NeUEb-KmYZBXSvXqj0q~ zOI9n&AD3)&3~^5>a7P4;z~z6g$QK~Tn&JU1h6x#yXRcZDP1Ai|ihWb(3Z(d1|7FiF z7&$6Hj6`IY88tElU)BCfc6}Zd-{1`<|1?FoPp$`_v#Bv!0JIo%iYX&sv{|!c#pqEH zs8pfS+stYDIOe4rWg9kcls_;LHJdkSCfr0+XEBRl2*A)V+`o!T2;x+hE1o1UjAMnE1xHkmnSMTO4M~wzS~OTDCuR_0pGdd@;_p; z?emn5`L=ZrXo^9k1BNaxo%!rm;x!FHif7K9g?E5A?sCq8nmc!H;eJc$l8FzxYe}SD zEQ(t!94P7bIli~6+9aUWSn<{-C@BwlKg^4H)8}$cQe%yucfXUWF?!r+vBedY8!>DI zNcGT~C|L|;KDu>V|5>SYzeB&9Ofry0diyiYhG_~YNf(l-h0W7lmy#dx?mK>vrvx#h zB11uju&&9{4y{MV$vE;E=7X;rH`R>2=P#b4Z6{~G5gAF23@D;!)smISoGG)4V@|Gv z{k&xpBF07N)~k_HFkE+N)~XAo<_!-D2PGI(n`kV%_U?gSu%D`3hXsbAPOaLi_W7;lPFnC=*Us1R;8M1-O~Ftf#E@_ zrNCu5Fl~2enX8a8&U+2<;+~o}sh}4wU5KA%PE*}DB4ha5zWvd)V^?PLZcXfz0ykfpe>*kOcALZbj4JS6GS>pAa~vFy}K1~EWT<=z}2Z$N4R~*JC`$YNGF1HHI!5i zTO^wWGzpuMr~7*Pnm<8gWHV7zN~d0(HM`7Cm;RT`S79e9O zG+-3yW*#q6^K{VM7^IyVO8+#`4Lbjjks#yOmPy7A&2Pt*D@dQ=K4{kXYm?RGa7#M# z%U3Uj2=BEU)?wG)U0mE(Qg|c%xo)kxXw|%>5D88X$+Og{H*WbE5o06dPJwRf$pEx& zcz@3bx$nq8{Ops@WHU#`P{PFoBwV-v%JxsM)avyz4*90(wO7i@?^wJz9E&+BGLHZF z>kq*Yw1?-W?E=t*;`(*#!`IVCQfl6puU_Hs(ZkrhbrX&rKL*M?Pkv^-Mq{L0t>n@p zKXtaO*-)uMMKo#D6jdr!K}HELTTu$!@G%kCv1^Cy%|K5T?FP_vktfh65Kh(1zuiJf zxUXKjioY)Xh5ZNPg-oOO?rWcqjU^y*<;*2yB&|`+37-`G1ceF~5|YcCBg%Xf91+6( z!WGLgT53xtfR>_7nja3On2nh*C7FARTyBSs9>%@{`;c%U0oQL_!|gkFY-Sgh3k2G| zKg^Q{1@ae!V{u2+tX>mUD^*D)8@C|?h19|JLOKC7J8@EEONTb?ap8}P*t%mYcJJK- zO1Nkbq;%O+qDQ*9*QkCY6#J|gmakqeM55Re$pf@h$x13Osc@>fpcDW(vggpPL8lk+ zkYV}Y;RA8081%xl2tMQiT13M}5wQ|bwt&U5Fq=|aXh`iTpwKH1F~fR-&fJF93XE5YsnZ3M}RTWCg*tT;JwEG2FW>HId0 zLBhog*t&fS_U!)^l$*mK2st@w*Z2~R8Z?GuvEo>^dN~%`avB2@kg%&A+Ek($O6_&% z=ppQj--m?XFW~z1>$rRGE|)|z;+C8`ON$cC;8e}YY+V8}r2_louRjrga6c&TGrf{(Pn11-b|H_nQ?(lS?2}K0 zRA2;bb7XU=z^v>VcC$m*uUk*Z=Kn$F4@Beh#fuk0emlxof8x{$AyFgcNme~sqs*;c zNYqAz^lkHiHlCzlf&)R- zN~2Fwun{1OR!CP24G2Ze>UC z6SMx=mQnlR&7klg{IX{k+d+tI?W@{#5#$@h^pPNQT^kQ?ikuWC#olhKT0D)sXxU;+ zjh(8xOOIT016&87ONY)(L@1^a<7s3uQc_SRrFuXoUcr9qK3-3c3;BikB;1Aqg6MC<&M{808Or|k=`Rg7x+aJ z8%-lwcOj!guyuzzYDc5`4G}PcvAQ8qCeNQg$Ee6rnz<}R&-L4aHUa1lKg^5y)8~S& zM)LZ+iWMBWw8Emo-|FRJYso2>4t`#~!VNmDiLTi8=+{%TgC!~Bw+v{J=n+{=3SaNb zk|Efyw=251bOEUyTGP3NbMPKHg8NN8x=|N7YBWkZmehL4g1WINZV{%>j@7+^sQVqd z@W+Mm(~nb;Gl%*2s@0rvdK=u+&r7zUBzEzW0X!xw3ZzHtf#?MB+wTV8%0E~1z>ZlS zbPZ^_ydDt}fy!T0(v=X$OdNx?8`p8=sa3O<@bvIx(}zU8*<7bbeme@E03YFIo_rF! zq~-OXTR@X~;o{r@gZdBBg{qNMynFWUfp4&1Dv7h4s_?)t)UH)q-mG$}MXJZ-X_FDR za+yT0N1|j{%E#Ogbqi=xH6lYs<9|i}$7y=xH~Zx2Q?%~bI#o0|s|lm%>@`c*AZwN^ z@|omR^Y2T4!#iMvZdDKc06GO4+y@LshqfJ5*`2Kd(ZnY^C_EV3f7#9jHVwXNfFR#M zE^W(cG^u=OmtMAN8KS37lG7CTI{E>0lA%(-XY{yeq}PF0!`uw~y6;!`1o?8ApopMw zd|C5LE^V`Dlt4Xrn7a^ItT(a%Xsi1cm$4+et0Ga-u>_a)Sv7k7#&z^}|CYJ?j>bPN z`X>~~Uw{>>T-rI8a30{X~8#r@7_Jhe6g;e z3qX?rL>G|saQTP?{OHjmAs}|cmW`nNcX}cU5N_VMnGiVZ;NYMsYws2b?b38{i40}a z#CADZYE5%Mmo8ZvKaTlLmWJG5c8KVz=ew!bnyu_#WyW{N*&z2V>eW* zS`CzWRcoT$CEs~|k2B}aXv&JFfToEE@(V=uD%CX=0(DNe$bO88#^Ga!L6_QXfhgFa zO2sPp&dnWkRX}SxaQFa%!h%5?gI1&|peX>?E&Wzm|+4Jy#&v(wA?j`%obfx)z4^rmdS1F)l(A*{TER6bNvt zS{=du!N`_1Te4r++QO+}N4njHO&bxnA`aJXT$7DUC44HWD}~{L`3u6OoeP>bZKk@> z`1r|V1cnA8{?Gv_EHf#qI-n^=kbKVcbb@43;EFzZ`XnMJL9&8ink1SV!-kQze9 zqW2Illq*wCvbdF0pr<~_H?4M}c+~;jqG=0wdJG4B8hI0`7X;vSn>Jw8+Lfy3rQAkaVG|X%v3`>F1a{ev&E&0tDvO z>(>ZI-=!;;bn8=AYqkl*MGF^22j>oG)1tL1pr!+=K|=@Q_dkDEYnbZ2u|hsm3i{-d zXCjFzLZ7%l|N0Y?rcDNA3^gdV1Spf~;QoU^Ikrg! zToftH=QNAdi=)SmVpLS9O=S1s1s*x=(sLIhz5G$BVkK^B$mJ_n(6fI}Rg7`&fTmAc z-=2NZqjPsT^0ruqfP6mTJXWk-A>^CW+eISg1Lo8qU3j8AdhJ@ZLkY(cT!1}q@qEmj zJCnQDgFB#0l_-gbpa|q;oC24?yI{!ztX#W_+uPlo@T1FS-@Og)+^Q|Qb?PSRHCizP zx^?Roe1d#%_WU_9#buY_3TSf8`40C*lZK7|V^D!FnHnME;`pf(!fGeqvVD;_HyrOV zlh2yIsujwXmzM3-3S*nMZ9(|ha7HJHre(zy&<*P~5CARZ?P*IgA)oTB`LjUp>CrnN z2Jw>sJvUA7KlbU~N6}5bq_Cr}Dgk=iPCofeNE*xm{cZphh95h5x}rCz-%S_Yz1SDO z9}{CH;_ltM{ASVSTIRo_=gyrQ9&R3}=~P3w8={oxO?B5n{Xl6Tco1_y6O&{J_V3dV zo!WO&bRtMb-@7oV_=E9`K2gZI>>3#T@l9NU{L0qzY38u}O&c#6F0_Z}8 z3Sm~vOgLndA0kB0r^Uoh#rmJugK|I^#9so|_It{e(&FnDaC031I!>2Mj~+ilAGf}^ zdiAQACaiH{zGvoucF2|uk)ct7K_Q3exOCrveOS135ib0GK~59u)e$Lok;T;GTVYSd zKQE519lM}r^_mv0F<7?#$*}kK_rfE_?>;gGG<}LXcjyE+S2tNA`}gX<7#BSrza9S# z&z?V%)rL_?9SKl|r!UHXfnn}L@lm0VWOW)78-vBmmN30%!xYd(3KzlX;0VbnaBtta zjZG8=HD`v+hCxZ2QTy4mh48Ol-=JyZrl7ohQixLXjtKO@7C8=|WXj>Q~>dm(jeix2-Iqkq-9RhTeo zA~TMe0lIR;X+XF|A9c98H6F}2#t%%@oQ7<-8c+Q&jYq5Owa!|6rq+|ey$((B52qoKW-=;lU zw`i3r%+3^Z6r}7E=*#4WBojc>r^cDjgMqsQZe%$bEw&z?JrO!)_ZAN6CQkVQTefeJ#H1uZ=gOH2!G1x4PkC?rUOY^> zdL(si6gDJaS_0V}98k-tmf*V%3=6`&`{Lhjkp$>kPBn%1`J{AUOqwA9xe}lal-_IH z8^2F<6QTi4dXAwZiSMfMOsp@CmPVk44IICU8>Z!Jt$oP+O|b$EP3e?U_axQ z0nNTY>0>r(FqDA(PpH)$+Wtkr5HI%9lnqb1RY2Rz99bHN4bNX%m>x-E)H$FHs7abl zqcHnaV1`UnNWfT=szO5L9Xj>w@|$l?EpuvC)mgXW&eG+}Ugu3>D36Vi0W2GvFg4hH zgLJtZ%Du^yj^2m1K~Sq9Bcl%+k-!_gcykB;2hp+Voa+tA-~a#s07*qoM6N<$f&hU( AU;qFB diff --git a/exercises/04.debugging/02.problem.trace-viewer/app/assets/favicons/favicon.svg b/exercises/04.debugging/02.problem.trace-viewer/app/assets/favicons/favicon.svg deleted file mode 100644 index 72be6f0..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/app/assets/favicons/favicon.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/exercises/04.debugging/02.problem.trace-viewer/app/components/error-boundary.tsx b/exercises/04.debugging/02.problem.trace-viewer/app/components/error-boundary.tsx deleted file mode 100644 index b881ed9..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/app/components/error-boundary.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { captureException } from '@sentry/react-router' -import { useEffect, type ReactElement } from 'react' -import { - type ErrorResponse, - isRouteErrorResponse, - useParams, - useRouteError, -} from 'react-router' -import { getErrorMessage } from '#app/utils/misc' - -type StatusHandler = (info: { - error: ErrorResponse - params: Record -}) => ReactElement | null - -export function GeneralErrorBoundary({ - defaultStatusHandler = ({ error }) => ( -

- {error.status} {error.data} -

- ), - statusHandlers, - unexpectedErrorHandler = (error) =>

{getErrorMessage(error)}

, -}: { - defaultStatusHandler?: StatusHandler - statusHandlers?: Record - unexpectedErrorHandler?: (error: unknown) => ReactElement | null -}) { - const error = useRouteError() - const params = useParams() - const isResponse = isRouteErrorResponse(error) - - if (typeof document !== 'undefined') { - console.error(error) - } - - useEffect(() => { - if (isResponse) return - - captureException(error) - }, [error, isResponse]) - - return ( -
- {isResponse - ? (statusHandlers?.[error.status] ?? defaultStatusHandler)({ - error, - params, - }) - : unexpectedErrorHandler(error)} -
- ) -} diff --git a/exercises/04.debugging/02.problem.trace-viewer/app/components/floating-toolbar.tsx b/exercises/04.debugging/02.problem.trace-viewer/app/components/floating-toolbar.tsx deleted file mode 100644 index 5e0e823..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/app/components/floating-toolbar.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export const floatingToolbarClassName = - 'absolute bottom-3 inset-x-3 flex items-center gap-2 rounded-lg bg-muted/80 p-4 pl-5 shadow-xl shadow-accent backdrop-blur-xs md:gap-4 md:pl-7 justify-end' diff --git a/exercises/04.debugging/02.problem.trace-viewer/app/components/forms.tsx b/exercises/04.debugging/02.problem.trace-viewer/app/components/forms.tsx deleted file mode 100644 index abaabf7..0000000 --- a/exercises/04.debugging/02.problem.trace-viewer/app/components/forms.tsx +++ /dev/null @@ -1,202 +0,0 @@ -import { useInputControl } from '@conform-to/react' -import { REGEXP_ONLY_DIGITS_AND_CHARS, type OTPInputProps } from 'input-otp' -import React, { useId } from 'react' -import { Checkbox, type CheckboxProps } from './ui/checkbox.tsx' -import { - InputOTP, - InputOTPGroup, - InputOTPSeparator, - InputOTPSlot, -} from './ui/input-otp.tsx' -import { Input } from './ui/input.tsx' -import { Label } from './ui/label.tsx' -import { Textarea } from './ui/textarea.tsx' - -export type ListOfErrors = Array | null | undefined - -export function ErrorList({ - id, - errors, -}: { - errors?: ListOfErrors - id?: string -}) { - const errorsToRender = errors?.filter(Boolean) - if (!errorsToRender?.length) return null - return ( -
    - {errorsToRender.map((e) => ( -
  • - {e} -
  • - ))} -
- ) -} - -export function Field({ - labelProps, - inputProps, - errors, - className, -}: { - labelProps: React.LabelHTMLAttributes - inputProps: React.InputHTMLAttributes - errors?: ListOfErrors - className?: string -}) { - const fallbackId = useId() - const id = inputProps.id ?? fallbackId - const errorId = errors?.length ? `${id}-error` : undefined - return ( -
-
- ) -} - -export function OTPField({ - labelProps, - inputProps, - errors, - className, -}: { - labelProps: React.LabelHTMLAttributes - inputProps: Partial - errors?: ListOfErrors - className?: string -}) { - const fallbackId = useId() - const id = inputProps.id ?? fallbackId - const errorId = errors?.length ? `${id}-error` : undefined - return ( -
-
- ) -} - -export function TextareaField({ - labelProps, - textareaProps, - errors, - className, -}: { - labelProps: React.LabelHTMLAttributes - textareaProps: React.TextareaHTMLAttributes - errors?: ListOfErrors - className?: string -}) { - const fallbackId = useId() - const id = textareaProps.id ?? textareaProps.name ?? fallbackId - const errorId = errors?.length ? `${id}-error` : undefined - return ( -
-