Files
427e7578-d7bf-49c8-aee9-2dd…/specs/009-public-sharing
2026-03-16 22:44:21 +13:00
..
2026-03-16 22:44:21 +13:00

status, created, tags, priority, created_at, depends_on, updated_at, related
status created tags priority created_at depends_on updated_at related
planned 2026-03-16
sharing
web
medium 2026-03-16T07:51:51.015Z
005-poll-creation-management
008-voting-system
012-lightweight-server
2026-03-16T07:57:41.176Z
011-mobile-first-ui

Public Sharing & Read-Only View

Status: 🗓️ Planned · Priority: Medium · Created: 2026-03-16 · Tags: sharing, web

Overview

Make polls shareable via URL to anyone on the web—even non-users. A public link shows poll results in a read-only view. If the poll owner is online, results update live via WebRTC. If offline, the page shows a cached snapshot.

Design

Shareable URL

  • Format: https://evocracy.app/p/[pollId]
  • Anyone with the link can view (no identity required)
  • The page fetches the snapshot from the server (includes ownerPeerId), then attempts a PeerJS connection for live data
  • Falls back to a static snapshot if owner is offline

Snapshot Strategy

  • When a poll is shared publicly, the owner's client pushes a JSON snapshot to the lightweight server (same server as spec 007 directory)
  • Endpoint: PUT /api/polls/:id/snapshot (authenticated by owner's signature)
  • Public fetch: GET /api/polls/:id/snapshot (no auth required)
  • Snapshot is updated whenever poll state changes while owner is online
  • Snapshot includes: title, description, options, vote counts, status (no voter identities even for non-anonymous)

Public View Page

  • Read-only: title, description, options with vote counts/percentages
  • Visual bar chart of results
  • "Owner offline" indicator if can't connect
  • Open Graph meta tags for social media previews
  • Optional: "Join to vote" CTA linking to app

Plan

  • Create /p/[id] public route (SvelteKit SSR or client-side)
  • Implement PeerJS connection attempt for live data
  • Build read-only results view
  • Add Open Graph meta tags for link previews
  • Implement snapshot fallback (based on decision above)
  • Add "Share" button to poll management page (copy link)

Test

  • Public URL shows poll results without authentication
  • Live updates work when owner is online
  • Graceful fallback when owner is offline
  • Social media link preview shows poll title/description