PunctuOwlity revolves around its event grid, where each upcoming item appears as a compact card showing the weekday abbreviation, day number, event title, scheduled time, and an alarm indicator. You can add as many events as you need, jump back to edit any of them, or remove them with a single tap on the delete icon. The add and edit flow shares one form — the distinction is determined by whether an event ID is present in the URL (web) or the Activity Intent (Android).Documentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/PunctuOwlity/llms.txt
Use this file to discover all available pages before exploring further.
Event Form Fields
Open the Add/Edit An Event screen via the floating action button (+) on the events grid, or tap the edit icon on any existing card. The same page handles both creating and updating.A short label for the event, e.g.
"Dentist" or "Jessica's Wedding". The title is also used for auto-category detection (see below) and for case-insensitive search matching on the events screen.The calendar date of the event, entered via a native date picker. Stored internally as YYYY-MM-DD (e.g.
2025-04-14).The time of day, entered via a native time picker in HH:MM 24-hour format. Displayed on the card in 12-hour format with AM/PM (e.g.
01:30PM).A checkbox labelled “Would you like to be reminded of this event?” When enabled, the web app fires a browser notification on the event day (provided
Notification.permission is 'granted'). On Android, SMS permission is requested on app launch regardless of this field. Defaults to false.How Dates and Times Are Stored and Displayed
PunctuOwlity normalises every event through thenormalizeEvent function before saving or rendering, ensuring a consistent display format regardless of how the raw value was entered.
| Value | Storage format | Display format |
|---|---|---|
| Date | YYYY-MM-DD (e.g. 2025-04-14) | Three-letter weekday (MON) + zero-padded day number (14) |
| Time | HH:MM 24-hour (e.g. 13:30) | 12-hour with AM/PM, zero-padded hour (e.g. 01:30PM) |
| All-day event (no time) | Empty rawTime | ALL DAY |
Date.toLocaleDateString('en-US', { weekday: 'short' }) called on the parsed YYYY-MM-DD date, then uppercased (e.g. 'Sat' → 'SAT').
Auto-Category Detection
When a new event is saved without an explicitly chosen category, PunctuOwlity inspects the title and assigns one of the built-in categories automatically. This keeps the category tabs useful without requiring manual selection for common event types.| Title pattern (case-insensitive) | Assigned category |
|---|---|
Contains birthday | birthday |
Matches /(appointment|dentist|dental|doctor)/ | appointment |
Matches /(trip|travel|vacation)/ | trip |
| No match | general |
Event Card Layout
Each card in the grid displays the following elements:Header row
Three-letter weekday abbreviation on the left (e.g.
MON) and an alarm icon on the right — teal when the alert is active, red when it is off.Action row
Edit button (pencil icon) and Delete button (trash icon) side by side.
Date
Zero-padded day number in large text (e.g.
14).Title & time
Event title on one line and the formatted time (or
ALL DAY) below it.Editing an Event
Tapping the edit button on a card navigates toadd-event.html with the event’s ID appended as a query parameter:
app.js reads ?id from URLSearchParams and, if a matching event is found in localStorage, pre-fills all four form fields with the existing values. Submitting the form overwrites the matching entry in the event array (matched by id) and shows the toast “Event Updated” before redirecting back to the events grid.
On Android, the same flow passes the integer event_id through an Intent extra:
AddEventActivity then calls db.getEventById(eventId) and populates the fields via setText.
Deleting an Event
Click or tap the delete icon on any event card. The app filters the card’sdata-id out of the stored events array, saves the updated list back to localStorage, re-renders the grid, and shows the toast “Event Deleted”.
db.deleteEvent(event.getId()) followed by a full reload of the grid via loadEvents().
Web vs Android Comparison
- Web App
- Android App
Events are persisted as a JSON array in The
localStorage under the key punctuowlity-events. The full event object stored for each item is:normalizeEvent helper re-derives day, date, and time from fullDate and rawTime on every read, so display values stay consistent even if the underlying data was entered in an older format.