POST
Calendar-First Personal Knowledge OS Architecture
The data model and operational design behind the calendar, posts, reminders, privacy controls, and SEO.
Homepage model
The homepage now has three layers:
- A single identity statement.
- A month calendar.
- Recent public posts.
The calendar is intentionally the primary navigation surface. Each day has distinct Schedule and Posts regions and can be filtered to show all entries, schedule only, or posts only.
Private post titles remain visible on the calendar. Their body content does not. Clicking a private post without an administrator session redirects to login and then returns to the requested post after authentication.
Private schedule entries are more sensitive, so they are hidden from anonymous visitors and visible only to the administrator.
Data model
The site uses one SQLite database with schema versioning through PRAGMA user_version.
There are exactly three application tables:
| Level | Table | Purpose |
|---|---|---|
| L1 | users |
Administrator identity and password hash |
| L2 | posts |
Markdown posts, publication time, and public/private state |
| L2 | calendar_events |
Schedule entries, time zone, privacy, and fixed reminder state |
The design deliberately does not create separate tables for SEO, reminders, SMTP settings, migrations, calendar display state, or sitemap data.
- SEO is derived from the canonical post fields.
- Reminder state belongs to the calendar event because the current requirement is one fixed reminder per event.
- SMTP credentials are operational configuration, not application-domain data.
- Schema versioning uses SQLite metadata rather than a migrations table.
- Sitemap and robots output are generated dynamically.
This prevents table proliferation and keeps feature work from turning into schema sprawl.
Reminder delivery
Every schedule entry created through the management path receives:
- a default 120-minute reminder
- recipient
jintae.mckal.choi@gmail.com - retry/error state stored on the event itself
A separate low-resource reminder worker container polls due events and sends email through SMTP.
The Gmail credential is never stored in source control. The administrator enters a Gmail App Password through the HTTPS settings page. The stored password token is encrypted with a server-side Fernet key kept in the root-owned service environment.
MCP scheduling path
The project includes a deterministic management command rather than having MCP write directly to SQLite.
The intended path is:
GPT request
→ MCP tool
→ manage.py event-add
→ validated calendar_events insert
→ calendar reflects the event
→ reminder worker picks it up 2 hours before start
This preserves the data model boundary and prevents arbitrary SQL from becoming the normal operational interface.
SEO
Public posts automatically receive:
- title metadata
- description generated from summary/body
- canonical URL
- Open Graph metadata
- Twitter summary metadata
- BlogPosting JSON-LD
Only public posts are included in the XML sitemap. Private, login, dashboard, and admin paths are excluded from indexing through robots rules and page-level noindex directives.
Mobile behavior
The desktop calendar is a seven-column month grid. On small screens it transforms into a vertical day list, hides out-of-month cells, and preserves separate Schedule and Posts sections so the calendar remains readable rather than shrinking into unusable boxes.