DB Home Planner is a planning dashboard that recommends when to leave home for Deutsche Bahn departures, factoring in delays and cancellations. The UI is an Angular 21 app deployed to Cloudflare Pages, backed by a Cloudflare Workers API with shared TypeScript utilities.
apps/web: Angular frontend (Cloudflare Pages)workers/api: Cloudflare Workers API (TypeScript)packages/shared: Shared types/utilities/modelsdocs: Project documentation
- Prefer clarity and maintainability over cleverness.
- Keep features modular and scoped to a single responsibility.
- Optimize for accessibility and performance from the start.
- Follow Cloudflare Worker constraints and best practices.
- Use strict type checking.
- Prefer type inference when the type is obvious.
- Avoid the
anytype; useunknownwhen type is uncertain.
- Always use standalone components over NgModules.
- Must NOT set
standalone: trueinside Angular decorators. It is the default in Angular v20+ and applies to Angular 21. - Use signals for state management.
- Implement lazy loading for feature routes.
- Do NOT use the
@HostBindingand@HostListenerdecorators. Put host bindings inside thehostobject of the@Componentor@Directivedecorator instead. - Use
NgOptimizedImagefor all static images.NgOptimizedImagedoes not work for inline base64 images.
- Keep components small and focused on a single responsibility.
- Use
input()andoutput()functions instead of decorators. - Use
computed()for derived state. - Set
changeDetection: ChangeDetectionStrategy.OnPushin@Componentdecorator. - Prefer inline templates for small components.
- Prefer Reactive forms instead of Template-driven ones.
- Do NOT use
ngClass; useclassbindings instead. - Do NOT use
ngStyle; usestylebindings instead. - When using external templates/styles, use paths relative to the component TS file.
- Use signals for local component state.
- Use
computed()for derived state. - Keep state transformations pure and predictable.
- Do NOT use
mutateon signals; useupdateorsetinstead.
- Keep templates simple and avoid complex logic.
- Use native control flow (
@if,@for,@switch) instead of*ngIf,*ngFor,*ngSwitch. - Use the async pipe to handle observables.
- Do not assume globals like (
new Date()) are available. - Do not write arrow functions in templates (they are not supported).
- Design services around a single responsibility.
- Use the
providedIn: 'root'option for singleton services. - Use the
inject()function instead of constructor injection.
- It MUST pass all AXE checks.
- It MUST follow all WCAG AA minimums, including focus management, color contrast, and ARIA attributes.
- Look for additional
AGENTS.mdfiles in subdirectories; deeper instructions override this one. - Keep documentation updates minimal unless requested.
- After making changes or implementing TODO items, update
TODOS.mdto reflect the latest status.