Recursive todo application built for the Comuneo intro task with Remix, TypeScript, Tailwind CSS, and Appwrite.
/signuproute with server-side validation and Appwrite email/password auth- Recursive todo tree where each item can own unlimited nested sub-tasks
- Appwrite database persistence through Remix loaders and actions
- Root-level pagination with smooth scroll-to-item behavior after updates
- Vitest + Testing Library UI tests for the recursive todo component
- Appwrite Function scaffold for a welcome email after registration
- Docker + Render deployment files and a CI/CD plan
- Remix with the Vite toolchain
- TypeScript
- Tailwind CSS
- Appwrite Cloud
- Vitest and Testing Library
- Install dependencies:
npm install-
Copy
.env.exampleto.envif needed and review the values. -
In Appwrite, create the database and collection used by the app:
- Database ID:
todo_web_db - Collection ID:
todos - Attributes:
title: string, size 120, requiredcompleted: boolean, requiredownerId: string, size 64, requiredparentId: string, size 64, required
- Start the app:
npm run dev- Open
http://localhost:3000.
| Variable | Purpose |
|---|---|
PUBLIC_APPWRITE_ENDPOINT |
Public Appwrite API endpoint |
PUBLIC_APPWRITE_PROJECT_ID |
Appwrite project ID |
APPWRITE_API_KEY |
Server-side API key for database operations |
APPWRITE_DATABASE_ID |
Appwrite database ID |
APPWRITE_TODOS_COLLECTION_ID |
Todos collection ID |
SESSION_SECRET |
Remix cookie signing secret |
APPWRITE_WELCOME_EMAIL_ID |
Appwrite message/template ID used by the function |
APPWRITE_FUNCTION_API_KEY |
Function-scoped Appwrite API key |
APPWRITE_EMAIL_FROM_NAME |
Sender name for welcome emails |
APPWRITE_EMAIL_FROM_ADDRESS |
Sender address for welcome emails |
app/routes/signup.tsxvalidates the form with Zod.- The action creates an Appwrite user or logs an existing user in.
- The Appwrite session secret is stored in a signed Remix cookie.
app/routes/_index.tsxloads the authenticated user and fetches their todo documents from Appwrite.- Todo creation, completion changes, and deletion all go through Remix actions.
- Deletion is recursive and removes the full descendant branch.
The function scaffold lives in appwrite-functions/welcome-email/src/main.js.
Recommended setup:
- Create an Appwrite Function named
welcome-email. - Use the Node.js runtime.
- Point the entry file to
src/main.js. - Add the function environment variables listed above.
- Trigger it from the user creation event in Appwrite.
Run the UI tests:
npm testThe current suite verifies:
- recursive rendering of nested tasks
- add-sub-task interactions
- completion toggling
- deletion triggers
The repository includes a production Dockerfile and a simple render.yaml.
You can deploy to Render, Railway, Fly.io, or any container platform by:
- Building the image
- Providing the environment variables
- Exposing port
3000 - Running
npm run start
Actual cloud deployment was not executed from this workspace because there is no cloud account access in the current environment.
GitHub Actions is the most practical option for a project this size.
Suggested pipeline:
- Checkout repository
- Install dependencies with
npm ci - Run
npm run typecheck - Run
npm test - Run
npm run build - Build Docker image
- Deploy only from the main branch
Recommended tools:
- GitHub Actions for CI orchestration
- Render or Railway for deployment
- Dependabot for dependency updates
- Sentry or Appwrite logs for runtime monitoring
- The provided
.envcontains the supplied Appwrite project values for local development. Rotate secrets before publishing the repository. - Pagination is intentionally applied to root todos so nested context remains readable.
- Smooth scrolling targets the last updated todo via the
focusquery parameter.