Developer documentation
Product and binding decisions
That's My Dash 0.8.1 is a personal, web-based start page for multiple users. PHP 8.2+, SQLite and HTTPS are required. MySQL, command-line installation and manual database imports must not become requirements. Existing databases are upgraded additively; config.php and the complete storage directory must survive upgrades.
The interface supports Danish, English, German, French, Spanish, Polish, Russian and Simplified Chinese. English is the technical fallback language. The HTML title on every product page is exactly “That's My Dash”.
Architecture
- public is the intended web root.
- src contains request handling, database access, security, external HTTP calls and presentation helpers.
- views contains templates and must not change the database.
- storage contains SQLite, cache and local language overrides and must never be publicly downloadable.
- public/index.php invokes actions, page context and views in that order.
Coding and data rules
- Use strict types and PSR-12 where templates permit it.
- Use prepared PDO statements and include the current user id in personal-data updates.
- Escape user content in HTML and never allow user-supplied HTML.
- All writes use POST, CSRF protection, validation and ownership checks.
- Database migrations are additive, idempotent and backwards compatible.
- Core editing must work without JavaScript.
External services and privacy
RSS, iCal, weather and favicon requests go through the server-side HTTP layer. Only HTTPS is accepted. Private addresses are blocked, redirects are validated, and response size and time are limited. Google Calendar is optional; local calendar features work without Google. Secrets and OAuth tokens are encrypted with the installation key.
Accessibility
WCAG 2.2 AA is the technical target. Use semantic HTML before ARIA, logical headings, visible keyboard focus, sufficient target sizes, reduced-motion support and forced-colours support. Moving content must never depend on dragging. Test keyboard, NVDA or VoiceOver, 200/400 percent zoom, 320 CSS pixels, long text and error states.
Languages
Bundled JSON language files live in languages. Local overrides belong in storage/languages and survive upgrades. Placeholders such as :place and {query} must never be translated. Run the language coverage and synchronisation tools after changes.
Release control
Before release, run the PHP quality check, PHP/JavaScript/JSON syntax checks and the language checker. Test a clean installation and an upgraded copy of an existing database, light and dark themes, mobile and desktop, accessibility, user separation and roles. Update VERSION, README, CHANGELOG, PROJECT_STATUS and the release audit. Never package config.php, databases or installation data.