Getting started
Sign-up takes an email and a password. We send a confirmation link to that address; you have 24 hours to click it. Until you do, your account exists but can't host pins or RSVP — only the public map is visible to you.
Sign-in uses the same email + password. A six-digit two-factor code is then sent to your inbox; entering it gives you a session that survives across page reloads. You can request a new code if the first one didn't arrive (check spam) or expired.
- No social login. Pinmate does not federate with Facebook, Google, Apple or any other third-party identity provider.
- Password reset works through the same email-link flow. The reset link expires after one hour for safety.
- Your home location defaults to Szczecin and can be moved at any time from Settings. It's a private setting used only to filter the map for you.
- If you stop using Pinmate, you can soft-delete the account from Settings. Hard-delete (GDPR Article 17) is admin-confirmed and removes every row tied to your id.
The map (dashboard)
The dashboard is the home screen for signed-in users. It loads up to 200 active pins inside your observation radius, sorted by start time. Pins outside the radius do not load — neighbouring cities won't surface unless you widen the radius in the filter panel.
Markers carry two pieces of information at a glance: the sport (encoded as the dot's fill colour) and the timing state. Live pins pulse in a lime ring; pins starting soon get a static violet ring; expired pins fade to half opacity. Selecting a marker adds a soft violet halo on top so you can tell which one the side panel is describing.
Filters live in a right-side panel that's collapsible on mobile. Changes apply client-side immediately — the map redraws without a round-trip to the server. URL state is not synced, so refreshing the page resets filters to your saved defaults.
- Categories: a multi-select of the nine sport types. Empty selection means "show all".
- Difficulty and audience: independent toggles. Audience defaults to all three (mixed/women/men) so single-gender pins still surface.
- Radius: a slider from 1 to 100 km centred on your home location. Saved to your account when changed.
Creating pins
Tap any point on the map to start placing a pin, or use the "place a pin" button which arms a crosshair cursor and waits for your next click. The modal that opens is pre-filled with the chosen lat/lng — you can re-pick the spot from the modal header.
Required fields: title (max 120 chars), category, audience, start time, duration. Optional: description (up to 2,000 chars), discipline (40-char free-text sub-type like "MTB" or "5v5"), and visibility (public vs group). Social links from your profile are auto-attached — you don't need to paste them per pin.
Editing an existing pin keeps the same form. Some fields stay locked once the pin exists: the location can be edited only by deleting and re-creating, and visibility cannot be flipped between public and group (that would surprise RSVPed members).
- Start time must be at least five minutes in the future. Backdating past that is rejected server-side.
- Duration is clamped to 15 minutes minimum and 24 hours maximum.
- Deleting a pin shows a 15-second undo snackbar before the server actually removes the row. Click anywhere on the snackbar to keep the pin.
- Group pins require you to be a member of the chosen group at submit time — the server re-checks before insert.
- Pin coordinates are private at the meeting-point level only. Your home location is never used as a default — you always pick the spot.
RSVP and reminders
Each pin shows two RSVP buttons: Going (a commitment, with a hard count) and Interested (a soft watchlist signal, separate count). You can switch between them or clear your RSVP entirely at any time before the pin starts.
RSVP counts are visible to anyone who can see the pin — including non-RSVPed viewers. Names of who's going aren't listed unless the host explicitly enables that (a future setting). Your own RSVP is highlighted with a sage badge.
- Reminders fire X minutes before start, where X is set per-user in Settings (default 30). Set X to 0 to disable reminders for that channel entirely.
- Push and email are independent. Push works when you've installed Pinmate to your home screen (PWA); email works always but defaults to off for some flows.
- Reminders only go to people who RSVPed Going. Interested does not get reminders — it's a watchlist, not a calendar entry.
Your activities
The Activities page is your personal calendar across all pins. It splits into three buckets: Upcoming Going, Watching (Interested), and Past Going. Each bucket is server-paged.
Past Interested is intentionally not surfaced — if you only watched and didn't commit, there's nothing to remember afterwards. Pins you hosted appear here too, alongside ones you joined.
- Each row links to the original pin on the map (deep link). Expired pins still render but their RSVP buttons are gone.
- Group pins you've left or been removed from disappear from your activities list — server-side visibility filter applies here too.
- The list updates on page reload; there's no live socket.
Profile
Your public profile lives at /profile/[your-id]. It shows your display name, avatar, bio, social handles, verification badge (if you have one), follower count, and your upcoming public pins. Group-only pins are hidden from non-members even on your own profile.
Edit profile fields from Settings → Profile. The avatar can be a photo you upload or one of the eight Trail Mix colours with your initial. Verified badges ("organizer" or "creator") are admin-curated trust signals — the auto-verify cron promotes you to "creator" once you've hosted five pins.
Follows and the network tile
Tap Follow on someone's profile to surface their upcoming pins in your Network tile on the dashboard. The follow is one-directional — they don't need to accept and they aren't notified that you started following them. The reverse direction (who follows you) is shown only on your own profile.
Per-follow preferences live in the /network page. You can mute a follow (suppresses notifications without unfollowing), toggle email vs push channel independently, restrict notifications to specific categories, and add a geographic radius so distant pins from the followed user don't surface in your local feed.
Notifications for follows fire on a 12-minute delay after the pin is created. This is intentional: it absorbs the create-edit-delete loop that hosts often go through in the first few minutes, so you don't get spammed about a pin that no longer exists.
Private groups
Groups are invite-only circles that share private pins. Currently only the secret mode is available — discoverable closed groups (request-to-join) and public open groups are deferred. Pins dropped in a group are invisible to non-members at every layer, including the public map and search.
Create a group from /groups. You become its owner. Invite members by generating a shareable link with an optional expiry and use cap, or invite a specific user by id. Direct user invites notify the recipient in-app.
Leaving a group is one click. If you're the only member and you leave, the group is deleted. If you're the owner with other members, you must transfer ownership or remove the other members first — the action will refuse otherwise to prevent ownerless groups.
- Group pins are marked on the map with a violet ring and a small padlock in the top-left corner — visible to members only.
- There's currently no member cap enforced for non-paying users (everyone has Pro-equivalent features during the early stage).
- Owners can remove members at any time. Removed users lose access to all group pins immediately, including ones they previously RSVPed to.
- When monetization returns, groups will become a paid feature for hosts (joining stays free). Existing groups will not be retroactively gated.
Notifications
Pinmate has two channels: push (web push via service worker, requires browser permission) and email (sent via SMTP in dev, Elastic Email in production). They're independent — turn either one off without affecting the other.
Channels are configurable per-pin (your RSVP reminders), per-follow (notifications for someone else's new pin), and globally in Settings (master toggles, reminder timing offset). When a follow's notification fires, the server re-checks that the pin still exists, hasn't expired, and is still visible to you before sending — late deletions or visibility flips don't produce ghost notifications.
Privacy and your data
Pinmate is built around the idea that your local map stays local. Concretely, the server enforces visibility scopes for every pin query, your home location is never broadcast, and there is no third-party tracker shipped with the default build.
Cookies are categorised into strictly necessary (session, locale, theme), analytics (off by default, opt-in via banner), and marketing (off by default). The cookie banner is the canonical source of truth; flipping a switch there immediately revokes consent on the next page load.
- Your email is never shown publicly. Profile pages show the local-part of your email (before the @) only when you haven't set a display name.
- Group pins are filtered server-side in every list endpoint — there's no client-side hide, so non-members never receive them in the payload.
- Reminder emails contain the pin title, time, and a link to the map — never your home location or other recipients' identities.
- Account deletion soft-deletes immediately (pins anonymised, profile hidden) and the row is hard-deleted by an admin within 30 days, per GDPR commitments.