PARKKEEPER
Sign in to continue
A 6-digit verification code has been sent to your email.
Demo mode — your code
000000
This is your first sign-in. Please set a new password.
Demo: admin / admin123
PARKKEEPER
Operations Team
— active profiles
Overview
Dashboard
Parking 0
Profiles
Pending0
Recently deleted
Residence 0
Residence cards
Visitors 0
Onsite0
Watch list
Block list
Group alerts0
Operations
Park maintenance
Embeds
Admin
Users
Settings
Analytics
Audit log
PII access log
Feature request
v0.5 · Prototype
MFA verified — USER
U
0 profile(s) scheduled to be unblocked today or earlier.
Recently viewed

Team profiles

Loading…

— Session encrypted · Role-based access

Pending profiles

Form submissions awaiting review. Approve to create profiles — Skidata entry is confirmed on approval.

Wiring this up in production: Microsoft Forms → Power Automate → POST to your backend's /queue endpoint with profile data, then this tab pulls from there. For now, "Simulate submission" generates a random pending profile for testing.

Residence cards

Residence records — separate from parking profiles. Link a parking profile to a residence in one click from either side.

Park maintenance

Track device cleaning across the car park. Flagged if not cleaned within the scheduled interval.

Watch list

Track guests with outstanding fees. Auto-archived after the retention period set in Settings.

Onsite

Watchlist visitors currently on-site. Use the Mark onsite button on any watchlist entry to add them here.

No visitors currently onsite
Drag watchlist entries here, or click Mark onsite on a watchlist card

Block list

Visitors banned from on-site parking. Separate from staff profile blocks.

Group alerts

Shared blocked-rego alerts from other sites in your group. Each site decides independently what to do with these.

Recently deleted

Profiles deleted in the last 30 days. Permanently removed after that.

Audit log

Every action across the system is recorded here.

System users

Manage who can sign in to ParkKeeper and what they can do.

Dashboard

Overview of profiles, blocks, and recent activity.

Settings

Configure the system to suit your operation.

General
Modules
Parking
Visitors
Operations

Embed

🔒
This site can't be embedded
The website has blocked embedding (X-Frame-Options). You can still open it directly.
Open in new tab

PII access log

Every time a Skidata ID or card number was revealed, recorded here. Super admin only.

Analytics

Population, compliance, activity and maintenance insights across the operation.

+
Add
photo
Profile photo
×

Blocked from on-site parking
Changes save automatically
+
Add
photo
Residence photo
×
Changes save automatically
New residence
Fields marked * are required.
New profile
Fields marked * are required.

Identity

System access

Vehicles — 0 of 7 license plates
Will be logged to audit trail
New user
Set up a person who can sign in to ParkKeeper.
The user will be required to change this password on first sign-in.
Module access
Which sections of the app this user can see.
Permissions
Repeat block detected
Action required: This staff member has now been blocked multiple times. Their manager should be contacted to recover any outstanding payments. Repeated blocks indicate the on-site parking is being used as informal credit.
Manager follow-up email
Block history
Add widget
Pick a type, choose a size, and configure — preview updates live.
Choose a type from the left.
Edit note
Supports **bold**, *italic*, [link](url) and line breaks.
Changes are saved for everyone
Important notice
Please read before continuing.
Shift briefing
Here's where things stand right now.
Import SKIDATA report
Upload a SKIDATA PDF, choose columns, edit rows, then export CSV.
Team calendar
Carpark maintenance + team tasks. Click any day to see what's on.
Day
New team task
Fields marked * are required.
Bulk import profiles from CSV
Upload a CSV file to add multiple profiles at once.
CSV format
Required columns: Staff ID, Full name, Department, Level (1 or 4).
Optional: Skidata ID, Has card (Yes/No), Card number, Vehicle 1 type, Vehicle 1 rego, ... up to Vehicle 7.
Upload file
Preview
Block on-site parking
Leave blank for manual unblock. The team will be alerted on the morning of this date.
This reason will trigger an immediate manager-escalation email.
Park maintenance
Edit devices & schedule
Help & reference
Quick reference for ParkKeeper v0.6 — dashboard customisation, team calendar, embeds
⌨️ Shortcuts
📊 Dashboard
📅 Calendar & tasks
🟢 Status & Kuma
🌐 Embeds
👤 Profiles
🔍 Search & filters
🎨 Indicators
📥 Form intake
🧰 Maintenance
🌐 Group alerts
🔐 Roles & access
Navigation
Focus search bar/
Open this help?
Toggle dark modeD
Close any modalEsc
Go to… (press G, then a key)
DashboardG+H
ProfilesG+P
Recently deletedG+R
Audit logG+A
UsersG+U
SettingsG+S
Profiles
New profileN
Customising the dashboard

Superadmins only. The dashboard is a grid of widgets that everyone in your team sees. Customising the layout is a superadmin action, so changes apply to all users.

To enter customise mode: click the Customise button in the dashboard header. Each widget gets a drag handle, a width selector, an edit pencil, and a remove X. An Add widget slot appears at the bottom.

To add a widget: click Add widget → pick a type from the left rail of the picker → preview updates live → choose a size → configure → Add to dashboard.

To edit a widget: click the pencil icon. Same picker opens in edit mode.

To reorder: drag a widget by its body and drop it onto another widget — they swap positions.

To resize quickly: tap a widget in customise mode to bring up the bottom popover with six iOS-style sizes (Small / Wide / Tall / Medium / Large / Full), plus height and colour. The Wide size is a short rectangle (½ width, half the usual height) for compact status tiles.

To reset everything: click Reset in customise mode → confirms and restores the default layout.

To exit: click Done. Edits save automatically as you go.

Widget types

NOC banner — full-width status from Uptime Kuma. Green = up, red = down.

Status card — compact Kuma status. Each card can point at a different Kuma status page.

Stat card — a single number (profiles, blocks, pending, maintenance overdue, onsite, etc). Clickable in view mode to deep-link to that filter.

Chart — bar charts (departments, vehicles, top-blocked) or the maintenance calendar (week / 14-day / month).

Live feed — recent audit, pending submissions queue, or onsite list. Configurable item count (1–20).

Notes — markdown text. Supports **bold**, *italic*, [link](url), and newlines. Good for shift handover or links.

Embed — any URL from Settings → Operations → Embeds. Use for BOM radar, weather, vendor portals, internal dashboards.

The team calendar

The maintenance calendar is a dashboard widget with three view modes — Week, 14 days, and Month. It shows carpark maintenance (set in Settings → Operations → Carpark) and team tasks side by side.

To pick the view: in customise mode, click the pencil on the calendar widget. The picker has a "Calendar view" dropdown.

To open the full calendar: click anywhere on the widget. A big modal opens with the same view switcher in its header. From there, click any day to see what's on.

Team tasks

Anyone can view tasks. Only superadmins can add, edit, or delete them. They're a single shared list across the whole team.

To add a task: open the calendar (any view), click a day, click Add task. Fields: title (required), date (required), time, assignee, repeats (none / weekly / monthly), repeat-until date, notes.

To edit a task: click it in the day-detail panel. Same form opens with the task's data. Delete button is at the bottom-left.

Recurrence: "Weekly" means the same weekday every week from the start date. "Monthly" means the same day-of-month every month (months that don't have that day skip, e.g. a 31st task skips February).

Editing a recurring task: changes apply to the whole series. There's no "edit only this instance" — to make one instance different, delete and re-add as a one-off.

What appears on each view: tasks show on all three. Week and Month show task titles; the compact 14-day view shows coloured dots and count badges.

Colour legend

Accent (blue) — carpark maintenance scheduled by the system

Green — team tasks added by humans

How status checking works

The dashboard's NOC banner and Status card widgets read live data from Uptime Kuma — a free, self-hosted uptime monitor that runs on your own server.

Browsers can't reliably check arbitrary websites for HTTP 200 from JavaScript (CORS blocks the response). Kuma does the checking server-side and exposes a JSON endpoint your dashboard can safely read. This is the standard architecture; not a workaround.

Each status widget polls every 60 seconds. Green = all monitors on that Kuma status page report status 1. Red = at least one is down, or the fetch failed.

Setting up Kuma (one-time)
  1. Install: on a server with Docker, run docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1
  2. Open: visit http://your-server:3001 and create an admin account.
  3. Add monitors: "Add New Monitor" → HTTP(s) → enter a URL like Skidata Validate, Booking Site, etc. Interval 60s. Repeat for each service.
  4. Create a status page: "Status Pages" → "New Status Page". Give it a slug like parkkeeper and add the monitors.
  5. Get the heartbeat URL: the format is https://your-kuma-host/api/status-page/heartbeat/<slug>
Adding a status widget

Dashboard → Customise → Add widget → NOC banner (full-width) or Status card (compact). Each widget gets its own Kuma URL, so you can have several widgets pointing at different status pages.

Paste your heartbeat URL into the configure form. The preview turns green or red within a few seconds.

Troubleshooting

Widget stays red with "Failed to fetch": usually a CORS issue. If Kuma sits behind nginx, Caddy, or Traefik, check the proxy isn't stripping CORS headers. Kuma's status-page API sets them by default.

Widget shows "timeout": Kuma is unreachable from the browser. Make sure the Kuma host is open to the network where ParkKeeper is being viewed.

Multiple widgets, same URL: they share a single fetch — no extra load on Kuma.

What embeds are

An embed is a registered URL that can be displayed as an iframe on the dashboard or in the Embeds settings page. Useful for: BOM radar, traffic cameras, weather sites, vendor portals, internal status pages.

To register an embed: Settings → Operations → Embeds → "+ Add embed". Provide name, URL, optional icon emoji, and a default height.

To add an embed to the dashboard: Customise → Add widget → Embed → pick the embed from the dropdown → choose height.

Sites that won't embed

Many websites send an X-Frame-Options: deny or SAMEORIGIN header that tells browsers to refuse to render them in an iframe. This is a clickjacking protection — your dashboard can't override it.

Common sites that block embedding: Google, Windy.com (main site), most banks, most news sites.

What to do instead: many sites offer dedicated embed URLs. For Windy: https://embed.windy.com/embed2.html?.... Use windy.com/widget to generate one.

If a widget loads blank, the embed includes an "Open in new tab" link as a fallback.

Opening & editing

Opening a profile: Click any profile card. The panel opens with full details. If you have edit permissions, fields are editable inline — just click and type. Changes save automatically as you type.

Recently viewed: The bar above the grid shows your 8 most recently opened profiles, persisted across sessions per user account.

Creating a profile: Press N or click "New profile". Required: Staff ID, full name, department, and level. Vehicles and card details can be added after.

Deleting: Deleted profiles move to "Recently deleted" for 30 days, then are removed permanently. They can be recovered during that window.

Blocking & parking suspension

Suspending parking: Open a profile and toggle "On-site parking permitted" off. You'll be prompted for a reason. Blocked profiles get a thick black border on their card.

Escalation: After a profile has been blocked 3 or more times, an escalation dialog automatically opens with a pre-filled manager email ready to send.

Unblocking: Toggle parking back on in the profile. You can also set a scheduled release date.

Comments

All roles can add comments. Use the quick-fill buttons for common notes (e.g. "Outstanding parking debt", "Access card misuse"). Comments show a yellow flag icon on the profile card.

Comments are timestamped and attributed to the user who posted them.

Search

The search bar matches against: Staff ID, full name, Skidata user ID, and vehicle rego plates. Press / to focus it from anywhere.

Filter dropdowns
DepartmentFilter by team or department
LevelL1 only, L4 only, or both
Card statusHas access card / no card
Block statusCurrently blocked or active only
VehicleHas car, has motorbike, or no vehicles
SortDefault (Moto → L1 → L4), A–Z, Z–A, or by ID
Clearing filters

When any filter or search is active, a ✕ Clear filters button appears at the right of the toolbar. Clicking it resets all filters and the search box at once.

Card background colours
PinkLevel 1 access
YellowLevel 4 access
Pink/yellow splitHas both L1 and L4 access
PurpleMotorbike profile
Thick black borderParking currently suspended / blocked
Dots and icons
Green dotHas an access card
Red dotNo access card issued
Yellow commentProfile has one or more comments
🔴Profile has an urgent alert (e.g. expired card, duplicate rego)
⚠️Profile has a warning
How form intake works

When someone submits a Microsoft Form (or any external system POSTing JSON to /api/intake), the submission lands in the Pending queue for a reviewer to approve.

  1. Field mappings in Settings → Form intake tell the app which form question maps to which profile field (Name, ID, Department, etc).
  2. Rules can then auto-assign access types, departments, card status, or attach a comment based on values in the form.
  3. Multiple matching rules stack — if motorbike and "senior staff" both match, both apply.
  4. The reviewer sees the result in the queue, can edit, then approves to create the profile.
Testing without a real form

Click Simulate submission in Settings → Form intake to drop a fake submission into the queue using your current rules.

Status pills
Done todayCleaned today
On scheduleCleaned within its schedule window
OverduePast its schedule, needs attention
Not cleanedHas never been cleaned
Schedules

Each block has a schedule: Daily, Weekly, Every 2 weeks, or Monthly. For non-daily recurrences you can pick specific days of the week (e.g. "Weekly on Mon, Wed, Fri").

Manage schedules in Settings → Carpark.

Calendar view

Toggle between list and calendar at the top of the Maintenance page. The calendar shows scheduled/cleaned/missed counts per day; click any day for the full breakdown.

Also see: dashboard calendar & team tasks

The dashboard has a maintenance calendar widget (week / 14-day / month views) that also shows team tasks — meetings, vendor visits, one-off jobs — added by superadmins.

See 📅 Calendar & tasks in this help menu for details.

What are group alerts?

If your site belongs to a group (e.g. a national network), you can share blocked-rego info with other sites in the group. Each site decides what to do with the info — there's no auto-blocking.

  1. Superadmin clicks Share to group on a blocked profile.
  2. It lands in the group's pending queue.
  3. A group admin reviews and approves (or rejects, or edits).
  4. Approved alerts appear on the Group Alerts tab of every subscribed site.
  5. Your site decides per alert: acknowledge, watchlist locally, block locally, or dismiss.
Subscriptions

In Settings → System (when in a group), choose which categories you want to see: drive-off, damage, threats, fraud, anti-social, trespass, other. Sites only see alerts in their subscribed categories.

Privacy

Shared alerts contain rego + category + free-text description only. No staff IDs, names, or other PII. Max expiry is 360 days.

Role permissions
Permission User Admin Super admin
View profiles✅✅✅
Add comments✅✅✅
Edit profiles—✅✅
Create & delete profiles—✅✅
Block / suspend parking—✅✅
Export data (CSV)—✅✅
View audit log—✅✅
Manage users——✅
PII access log & settings——✅
Sessions

You are automatically signed out after 30 minutes of inactivity. This timer resets on mouse movement, clicks, or key presses. Recently viewed profiles persist across sessions per user account.

v0.5 · Prototype