Skip to main content

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.

PunctuOwlity uses a lightweight, local-only account system — no server or network connection is needed. On the web app, credentials are persisted in the browser’s localStorage, while the Android app stores them in a local SQLite database. Either way, you register once, log in from the same device, and your session is maintained until you close the browser tab.

Signing Up

Navigate to Sign Up from the login screen to open the registration form. All fields except phone number are required. When you submit the form, the app checks for duplicate usernames and emails before saving the new account.
firstName
string
required
Your given name.
lastName
string
required
Your family name.
email
string
required
A valid email address. Must be unique across all registered accounts stored in this browser.
phone
string
Phone number — optional, collected for potential SMS alert use. Stored in the user object but not actively used for delivery in the current release.
username
string
required
A unique handle used to log in. Stored and compared in lowercase.
password
string
required
Your chosen password. Must be typed identically in both the Password and Confirm Password fields.
confirmPassword
string
required
Must exactly match the Password field. If the two values differ, sign-up is blocked with the toast message “Passwords do not match!”

Validation Rules

RuleError message
Any required field left blankAll required fields must be completed
Password and confirm password differPasswords do not match!
Username or email already registeredThat username or email is already registered
Storage write fails (e.g., private browsing quota)Account creation failed!
On success, a “Account Created Successfully” toast appears and the app redirects to the login screen after 900 ms.

Logging In

The login form accepts either your username or your email address alongside your password. Both are compared case-insensitively against the saved user list.
const matched = getUsers().some(user => {
  const username = String(user.username || '').trim().toLowerCase();
  const email    = String(user.email    || '').trim().toLowerCase();
  return (identity === username || identity === email)
      && password === String(user.password || '');
});
If the credentials match, the session flag is written and you are redirected to the events screen. Submitting with either field empty shows the toast “Enter your username and password”. An unrecognised combination shows the toast “Invalid Username or Password”.

Session Management

A successful login writes the string 'true' to sessionStorage under the key punctuowlity-authenticated. The events screen (events.html) checks this key on load and redirects to index.html if it is absent or not equal to 'true'. The session ends automatically when the browser tab or window is closed, because sessionStorage does not persist across sessions.
// Guarding a protected page (web app)
if (sessionStorage.getItem('punctuowlity-authenticated') !== 'true') {
  location.replace('index.html');
}

Web vs Android Storage

All user accounts are saved as a JSON array under the localStorage key punctuowlity-users. Each entry follows this shape:
{
  id:        "1713820800000",   // Date.now() string
  firstName: "Jane",
  lastName:  "Doe",
  email:     "jane@example.com",
  phone:     "555-0100",        // may be empty string
  username:  "janedoe",
  password:  "hunter2"          // plain text
}
Because localStorage is scoped to the origin and survives page refreshes, your account persists until you clear site data. The app attempts to write to both localStorage and sessionStorage for resilience, falling back silently if either is unavailable.
Passwords are stored in plain text in both the web app (localStorage) and the Android app (SQLite). This design is suitable only for local demonstration purposes. Do not register with a password you use on any other service.

Build docs developers (and LLMs) love