TodoPet is a study full-stack app for learning product development end to end. It is a training project, not a production-ready service.
Live preview: https://todopet.netlify.app/login
TodoPet is a task manager where you can:
- create and organize tasks in folders
- complete and restore tasks
- manage sorting/reordering
- view a global
Completedpage with filters - use auth flows (
sign in,sign up,logout)
The core goal is learning through iteration: build, break, test, refactor.
Frontend:
- Vue 3 + TypeScript
- Vite
- Apollo Client (GraphQL)
- Vitest + Playwright
Backend:
- Ruby on Rails
- GraphQL
- PostgreSQL (for production setup)
- RSpec (request/graphql coverage), plus legacy Rails test folder still present
/frontend— Vue client app/server— Rails + GraphQL API
Prerequisites:
- Node.js 20+
- Ruby/Bundler (project Ruby from
/server/.ruby-version) - PostgreSQL
- Backend setup
cd server
bundle install
bin/rails db:prepare
bin/rails s- Frontend setup
cd frontend
npm install
npm run dev- Open app
- Frontend:
http://127.0.0.1:5173(or Vite printed URL) - Backend GraphQL:
http://127.0.0.1:3001/graphql(depending on your Rails port config)
Frontend:
cd frontend
npm run test:unit
npm run test:e2eBackend:
cd server
bundle exec rspec- This project is built for learning and portfolio/interview demonstration.
- No warranty, no SLA, and no responsibility for production use.
- Some workflows/configs may evolve while experiments are in progress.
If you find a bug, have questions, or want to review architecture decisions, open an issue or contact me through the repository profile.
-
GraphQL as the single API layer
Frontend and backend communicate through typed GraphQL contracts, which keeps feature work focused and predictable. -
Resolver-level filtering for todos
Todo filtering is handled in backend resolvers, so business rules are centralized and consistent across views. -
Explicit Inbox semantics
Inbox is treated as “unassigned tasks only” (folder_id = null) instead of “all active tasks”. -
Reusable Apollo cache utilities
Cache list operations are abstracted into shared helpers to reduce mutation-specific boilerplate. -
Type-first frontend code
The UI layer is written with TypeScript-first assumptions to reduce runtime bugs and improve maintainability. -
Split test strategy
Unit tests (Vitest) cover component/composable behavior, request specs cover GraphQL mutation contracts, and Playwright is used for smoke e2e flows.




