OTodo is a full-stack todo application with an Ionic/Angular PWA client and a Spring Boot backend. The client stores todos locally with Dexie/IndexedDB and syncs them with the backend when online.
- Client: Angular 22, Ionic 8, Dexie, RxJS, date-fns
- Server: Spring Boot 4, Spring Security, jOOQ, Flyway, PostgreSQL
- Tests: JUnit 5, Testcontainers, GreenMail, Spring Boot test support
- Node.js and npm compatible with Angular 22
- Java 25 or newer
- Docker for the local PostgreSQL 18 Alpine container and backend integration tests
cd client
npm install
npm startThe dev server uses proxy.conf.json to forward /be requests to the backend at http://localhost:8080.
Useful client commands:
npm run lint
npm run build
npm run serve-distnpm run build updates src/environments/environment.prod.ts, collects used Ionicons, builds the production app into client/dist/app, and runs bread-compressor on the output.
Start PostgreSQL:
cd server
docker compose up -dThe default backend configuration uses:
- JDBC URL:
jdbc:postgresql://localhost:5432/otodo - Database:
otodo - User/password:
postgres/postgres - Server port:
8080
Run the backend:
cd server
.\mvnw.cmd spring-boot:runRun backend tests:
cd server
.\mvnw.cmd test- API routes are served under
/be. - The client application URL used by backend emails is configured as
app.url=http://localhost:8100. - Local email delivery expects an SMTP server on
localhost:25; tests use GreenMail. - jOOQ sources are checked into
server/src/main/java/ch/rasc/otodo/db. Regenerate them with the providedgeneratejooq*.batscripts when the schema changes.
Current health checks:
cd client && npm run lint
cd client && npm run build
cd server && .\mvnw.cmd testmvn verify also builds the installed client dependencies and runs the browser
integration tests with PostgreSQL, nginx and Playwright containers. Run
npm install in client first.
The browser container and its Playwright server use the version declared by the Java Playwright library, so dependency updates keep both ends of the connection on the same protocol version.
If the Playwright container registry is unavailable, the same browser tests can use Chromium installed on the host. PostgreSQL and nginx still run in Docker:
cd server
./mvnw verify -Dplaywright.local=true -Dplaywright.chromium.executable=/path/to/chromeOmit playwright.chromium.executable to use Playwright's installed Chromium.
This option runs all browser assertions; it does not skip the browser tests.