Doodlr is a collaborative, zoomable pixel-art canvas with a 6-level hierarchical grid. It uses a FastAPI backend with SQLite for storage and an Expo (React Native + Web) frontend. You can draw pixels, zoom into sections, and view the canvas across levels while maintaining consistent pixel positions.
- 6-level hierarchical canvas (729×729 total)
- Zoom between levels 1–6 in a 3×3 grid per level
- Paint pixels with multiple colors
- Consistent pixel alignment across zoom levels
- Web (Expo web) and mobile (Expo Go) development flows
- Backend: FastAPI, Uvicorn, SQLAlchemy, SQLite
- Frontend: Expo, React Native, React Native Web
- E2E: Playwright (browser)
- Python 3.8+
- Node.js 18+ and npm
bash ./start-backend.shThe backend will run at http://localhost:8000.
If port 8000 is in use:
lsof -ti:8000 | xargs -r killbash ./start-frontend.shExpo will start in the foreground so you can use keys like w (open web), s (switch build), r (reload).
backend/: FastAPI app, models, and routesfrontend/: Expo app (React Native + Web)shared/: Shared types/helpers (if any)
GET /— Service rootGET /health— Health checkGET /colors— Available colorsGET /level/{level}— Canvas data for the given level; for levels 2–6, passsection_x,section_yPOST /paint— Paint a pixel{ x, y, color }POST /zoom— Validate zoom target{ level, section_x, section_y }
- Keys in the Expo terminal:
wopen webrreload?list all commands
- Webpack dev server serves at
http://localhost:19006
- Section grid lines have slightly increased contrast for visibility.
- Pixel positions are aggregated per true section span to remain consistent across zoom levels.
The current version is stored in the VERSION file and follows Semantic Versioning.
Current: 1.0.0
This project is licensed under the GNU General Public License v3.0 or later (GPL-3.0-or-later).
See LICENSE for the full text.