From 71f7050f41d49a25ac40d2e0d2f20defbf2df55f Mon Sep 17 00:00:00 2001 From: prosolis <5590409+prosolis@users.noreply.github.com> Date: Tue, 7 Jul 2026 00:07:19 -0700 Subject: [PATCH] Add personalization, outbound feeds, and PWA/push to the web UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A multi-session build turning Pete's read-only web UI into something people return to. Five phases, signed-in features keyed off the OIDC subject; anonymous visitors keep the reverse-chron feed and localStorage-only state. Phase 1 — per-user read + bookmark state: user_story_state table + storage/userstate.go; auth-gated /api/read, /api/bookmark, /api/state and a /bookmarks page; reader.js syncs state server-side for signed-in users. Also hides the Matrix-posting UI when posting.enabled=false (web-only mode). Phase 2 — outbound feeds: storage.ListForFeed + web/feed.go hand-build RSS 2.0 (content:encoded) and JSON Feed 1.1 (no new dep); /feed.xml, /feed.json and per-channel variants; discovery tags. Phase 3 — "For you" + related: storage/rank.go scores recent unread candidates by channel/source affinity + recency decay; RelatedStories via FTS5. ForYou rail + /for-you page; public /api/related feeds the reader's "You might also like". Phase 4 — source-health dashboard: source_health table + storage/sourcehealth.go (RecordPollResult, ListSourceHealth, SourceContentStats), written by the poller; admin-gated /status page behind web.admin_subs. Phase 5 — PWA + offline reader + Web Push: root-scoped manifest.webmanifest and sw.js (app-shell precache, /api/article runtime cache for offline reading, offline fallback, push/notificationclick handlers); PNG icons from pete.avif; pwa.js registers the SW and drives a notifications toggle. Web Push adds webpush-go, a [web.push] config block (pete -genvapid mints VAPID keys), a push_subscriptions table, auth-gated subscribe/unsubscribe endpoints, and a digest sender that pings each subscriber "N new stories" past their watermark, honoring disabled-sources and pruning gone endpoints. Tests added beside each new storage/web file; go test ./... and go vet clean. --- config.example.toml | 24 ++ go.mod | 10 +- go.sum | 4 + internal/config/config.go | 43 +++ internal/config/config_test.go | 37 +++ internal/ingestion/poller.go | 8 + internal/storage/db.go | 5 + internal/storage/push.go | 101 +++++++ internal/storage/push_test.go | 105 +++++++ internal/storage/queries.go | 49 +++ internal/storage/rank.go | 275 +++++++++++++++++ internal/storage/rank_test.go | 141 +++++++++ internal/storage/schema.go | 44 +++ internal/storage/sourcehealth.go | 149 +++++++++ internal/storage/sourcehealth_test.go | 104 +++++++ internal/storage/userstate.go | 139 +++++++++ internal/storage/userstate_test.go | 126 ++++++++ internal/web/feed.go | 303 +++++++++++++++++++ internal/web/feed_test.go | 210 +++++++++++++ internal/web/handlers.go | 197 ++++++++++-- internal/web/push_sender.go | 199 ++++++++++++ internal/web/push_sender_test.go | 58 ++++ internal/web/pwa.go | 106 +++++++ internal/web/reader_test.go | 2 +- internal/web/server.go | 42 ++- internal/web/static/css/input.css | 56 ++++ internal/web/static/css/output.css | 2 +- internal/web/static/img/apple-touch-icon.png | Bin 0 -> 25986 bytes internal/web/static/img/icon-192.png | Bin 0 -> 38154 bytes internal/web/static/img/icon-512.png | Bin 0 -> 157981 bytes internal/web/static/img/maskable-512.png | Bin 0 -> 102170 bytes internal/web/static/js/pwa.js | 116 +++++++ internal/web/static/js/reader.js | 199 ++++++++++++ internal/web/static/manifest.webmanifest | 22 ++ internal/web/static/sw.js | 198 ++++++++++++ internal/web/status.go | 128 ++++++++ internal/web/status_render_test.go | 38 +++ internal/web/templates/_card.html | 7 + internal/web/templates/bookmarks.html | 37 +++ internal/web/templates/for-you.html | 26 ++ internal/web/templates/index.html | 26 +- internal/web/templates/layout.html | 57 ++++ internal/web/templates/status.html | 80 +++++ internal/web/userstate_api.go | 159 ++++++++++ main.go | 26 +- 45 files changed, 3622 insertions(+), 36 deletions(-) create mode 100644 internal/storage/push.go create mode 100644 internal/storage/push_test.go create mode 100644 internal/storage/rank.go create mode 100644 internal/storage/rank_test.go create mode 100644 internal/storage/sourcehealth.go create mode 100644 internal/storage/sourcehealth_test.go create mode 100644 internal/storage/userstate.go create mode 100644 internal/storage/userstate_test.go create mode 100644 internal/web/feed.go create mode 100644 internal/web/feed_test.go create mode 100644 internal/web/push_sender.go create mode 100644 internal/web/push_sender_test.go create mode 100644 internal/web/pwa.go create mode 100644 internal/web/static/img/apple-touch-icon.png create mode 100644 internal/web/static/img/icon-192.png create mode 100644 internal/web/static/img/icon-512.png create mode 100644 internal/web/static/img/maskable-512.png create mode 100644 internal/web/static/js/pwa.js create mode 100644 internal/web/static/manifest.webmanifest create mode 100644 internal/web/static/sw.js create mode 100644 internal/web/status.go create mode 100644 internal/web/status_render_test.go create mode 100644 internal/web/templates/bookmarks.html create mode 100644 internal/web/templates/for-you.html create mode 100644 internal/web/templates/status.html create mode 100644 internal/web/userstate_api.go diff --git a/config.example.toml b/config.example.toml index 125d39f..bb5a826 100644 --- a/config.example.toml +++ b/config.example.toml @@ -37,6 +37,12 @@ listen_addr = ":8080" site_title = "Pete" base_url = "https://news.parodia.dev" +# OIDC subjects allowed to view the owner-facing source-health dashboard at +# /status (per-feed poll status, failures, content stats). Requires web.auth +# below. Empty = /status returns 404 for everyone. Find a user's subject in the +# server logs ("auth: user signed in" sub=...) after they sign in once. +admin_subs = [] + # Optional OIDC sign-in (Authentik). When enabled, signed-in users get their # preferences (hidden feeds, weather location, toggles) stored server-side keyed # by their OIDC subject and synced across devices. Anonymous visitors keep using @@ -53,6 +59,24 @@ redirect_url = "https://news.parodia.dev/auth/callback" # HMAC key that signs the session cookie. Generate with: openssl rand -hex 32 session_secret = "${PETE_SESSION_SECRET}" +# Optional Web Push digests. When enabled, signed-in users can opt in (from the +# feed-settings panel) to a periodic "N new stories" notification, delivered via +# a service worker so it also works when the site is installed as a PWA. Push is +# signed-in only, so it needs web.auth above; it does nothing otherwise. +# Generate the VAPID keypair once with: pete -genvapid +# then paste the two keys here (the private key is a secret — treat it like a +# password). subject identifies you to the push service (a mailto: or https: URL). +[web.push] +enabled = false +vapid_public_key = "${PETE_VAPID_PUBLIC_KEY}" +vapid_private_key = "${PETE_VAPID_PRIVATE_KEY}" +subject = "mailto:admin@parodia.dev" +# How often the sender wakes to look for new stories per subscriber (minutes). +interval_minutes = 360 +# Smallest number of new (non-hidden) stories that triggers a digest, so a lone +# item doesn't ping everyone. +min_stories = 3 + # Every enabled source MUST set direct_route to a key from [matrix.channels] above. # There is no automatic classification — Pete posts each story to its configured channel. # Optional: language = "en" drops feed items whose per-item tag is diff --git a/go.mod b/go.mod index 83caa26..9c2151b 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,12 @@ go 1.25.0 require ( github.com/BurntSushi/toml v1.6.0 github.com/PuerkitoBio/goquery v1.12.0 + github.com/SherClockHolmes/webpush-go v1.4.0 + github.com/coreos/go-oidc/v3 v3.19.0 github.com/mmcdole/gofeed v1.3.0 + go.mau.fi/util v0.9.9 + golang.org/x/image v0.41.0 + golang.org/x/oauth2 v0.36.0 maunium.net/go/mautrix v0.28.0 modernc.org/sqlite v1.50.1 ) @@ -13,9 +18,9 @@ require ( require ( filippo.io/edwards25519 v1.2.0 // indirect github.com/andybalholm/cascadia v1.3.3 // indirect - github.com/coreos/go-oidc/v3 v3.19.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/go-jose/go-jose/v4 v4.1.4 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/google/uuid v1.6.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mattn/go-colorable v0.1.14 // indirect @@ -32,12 +37,9 @@ require ( github.com/tidwall/match v1.2.0 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect - go.mau.fi/util v0.9.9 // indirect golang.org/x/crypto v0.52.0 // indirect golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a // indirect - golang.org/x/image v0.41.0 // indirect golang.org/x/net v0.55.0 // indirect - golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sys v0.45.0 // indirect golang.org/x/text v0.37.0 // indirect modernc.org/libc v1.72.3 // indirect diff --git a/go.sum b/go.sum index 5898a0a..a287e45 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7Oputl github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/PuerkitoBio/goquery v1.12.0 h1:pAcL4g3WRXekcB9AU/y1mbKez2dbY2AajVhtkO8RIBo= github.com/PuerkitoBio/goquery v1.12.0/go.mod h1:802ej+gV2y7bbIhOIoPY5sT183ZW0YFofScC4q/hIpQ= +github.com/SherClockHolmes/webpush-go v1.4.0 h1:ocnzNKWN23T9nvHi6IfyrQjkIc0oJWv1B1pULsf9i3s= +github.com/SherClockHolmes/webpush-go v1.4.0/go.mod h1:XSq8pKX11vNV8MJEMwjrlTkxhAj1zKfxmyhdV7Pd6UA= github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/coreos/go-oidc/v3 v3.19.0 h1:F/xyOi3x1UnG1U27YVnM1N6bHiL1K2upi6U/0qr8r+I= @@ -17,6 +19,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= diff --git a/internal/config/config.go b/internal/config/config.go index 3ad5177..e39b4c7 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -27,6 +27,30 @@ type WebConfig struct { SiteTitle string `toml:"site_title"` // display name in the header BaseURL string `toml:"base_url"` // public URL (used in metadata only) Auth AuthConfig `toml:"auth"` // optional OIDC sign-in (Authentik) + Push PushConfig `toml:"push"` // optional Web Push digests (VAPID) + // AdminSubs is the allowlist of OIDC subjects allowed to view the + // owner-facing source-health dashboard at /status. Empty means the page is + // inaccessible to everyone (returns 404). Requires auth to be enabled. + AdminSubs []string `toml:"admin_subs"` +} + +// PushConfig wires the Web Push digest sender. Push is signed-in only (it keys +// off the OIDC subject) so it does nothing unless auth is also enabled. Generate +// a VAPID keypair once with `pete -genvapid` and paste the two keys here. +type PushConfig struct { + Enabled bool `toml:"enabled"` + VAPIDPublicKey string `toml:"vapid_public_key"` + VAPIDPrivateKey string `toml:"vapid_private_key"` + // Subject identifies the sender to the push service; a mailto: or https: URL + // per RFC 8292. Defaults to mailto:admin@ is not attempted — + // set it explicitly. + Subject string `toml:"subject"` + // IntervalMinutes is how often the digest sender wakes to look for new + // stories per subscriber. Defaults to 360 (6h). + IntervalMinutes int `toml:"interval_minutes"` + // MinStories is the smallest number of new stories that triggers a digest + // for a subscriber, so they aren't pinged for a single item. Defaults to 3. + MinStories int `toml:"min_stories"` } // AuthConfig wires Pete's web UI to an OIDC provider (our Authentik instance). @@ -167,6 +191,19 @@ func (c *Config) validate() error { } } + if c.Web.Push.Enabled { + if !c.Web.Auth.Enabled { + return fmt.Errorf("web.push requires web.auth to be enabled (push is signed-in only)") + } + p := c.Web.Push + if p.VAPIDPublicKey == "" || p.VAPIDPrivateKey == "" { + return fmt.Errorf("web.push requires vapid_public_key and vapid_private_key (generate with: pete -genvapid)") + } + if p.Subject == "" { + return fmt.Errorf("web.push.subject is required (a mailto: or https: URL identifying the sender)") + } + } + for i, s := range c.Sources { if s.Name == "" { return fmt.Errorf("sources[%d].name is required", i) @@ -232,6 +269,12 @@ func (c *Config) applyDefaults() { if c.Web.SiteTitle == "" { c.Web.SiteTitle = "Pete" } + if c.Web.Push.IntervalMinutes == 0 { + c.Web.Push.IntervalMinutes = 360 + } + if c.Web.Push.MinStories == 0 { + c.Web.Push.MinStories = 3 + } for i := range c.Sources { if c.Sources[i].PollIntervalMinutes == 0 { c.Sources[i].PollIntervalMinutes = 20 diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 6c6b57e..938c9c6 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -211,6 +211,43 @@ feed_url = "https://e.com/rss" tier = 1 poll_interval_minutes = 20 enabled = true +`}, + {"push enabled without auth", ` +[matrix] +homeserver = "https://h" +user_id = "@p:h" +password = "pw" +pickle_key = "test_pickle_key_1234" +[matrix.channels] +tech = "!t:e" +[storage] +db_path = "/tmp/t.db" +[web.push] +enabled = true +vapid_public_key = "pub" +vapid_private_key = "priv" +subject = "mailto:a@b.c" +`}, + {"push enabled missing keys", ` +[matrix] +homeserver = "https://h" +user_id = "@p:h" +password = "pw" +pickle_key = "test_pickle_key_1234" +[matrix.channels] +tech = "!t:e" +[storage] +db_path = "/tmp/t.db" +[web.auth] +enabled = true +issuer = "https://i" +client_id = "id" +client_secret = "secret" +redirect_url = "https://r/cb" +session_secret = "session_secret_16chars_long" +[web.push] +enabled = true +subject = "mailto:a@b.c" `}, } diff --git a/internal/ingestion/poller.go b/internal/ingestion/poller.go index 8056f83..e8ac632 100644 --- a/internal/ingestion/poller.go +++ b/internal/ingestion/poller.go @@ -97,8 +97,16 @@ func (p *Poller) pollOnce(ctx context.Context, src config.SourceConfig) { func (p *Poller) pollOnceWithErr(ctx context.Context, src config.SourceConfig) error { items, err := FetchFeed(src.FeedURL, src.UserAgent) if err != nil { + // Persist the failure for the owner-facing source-health dashboard. The + // in-memory consecutiveFailures in pollSource drives log warnings; this + // row is the authoritative record the dashboard reads. + storage.RecordPollResult(src.Name, false, 0, err) return err } + // A successful fetch: record health now (before per-item processing) with + // the number of items the feed returned, so the dashboard reflects feed + // reachability even if individual items are later dropped as duplicates. + storage.RecordPollResult(src.Name, true, len(items), nil) newCount := 0 for i := range items { diff --git a/internal/storage/db.go b/internal/storage/db.go index 10a9302..054a815 100644 --- a/internal/storage/db.go +++ b/internal/storage/db.go @@ -120,6 +120,11 @@ func RunMaintenance() { exec("prune old reactions", `DELETE FROM reactions WHERE reacted_at < ?`, storyCutoff) + // Drop per-user read/bookmark rows whose story has been pruned above, so the + // table can't accumulate dangling references as stories age out. + exec("prune orphan user_story_state", + `DELETE FROM user_story_state WHERE story_id NOT IN (SELECT id FROM stories)`) + // Daily unique tokens are only useful for the recent window; their salts are // long gone. page_views is kept forever (tiny aggregate, all-time totals). exec("prune old daily_visitors", diff --git a/internal/storage/push.go b/internal/storage/push.go new file mode 100644 index 0000000..76fca70 --- /dev/null +++ b/internal/storage/push.go @@ -0,0 +1,101 @@ +package storage + +import "fmt" + +// PushSubscription is one browser/device endpoint a signed-in user has opted in +// for Web Push digests. See the push_subscriptions schema for the field roles. +type PushSubscription struct { + Endpoint string + UserSub string + P256dh string + Auth string + CreatedAt int64 + LastNotifiedAt int64 +} + +// AddPushSubscription records (or refreshes) a push endpoint for a user. The +// endpoint is the primary key, so a re-subscribe from the same browser updates +// the keys and resets the digest watermark to now — the user shouldn't be +// paged for everything published before they opted in. +func AddPushSubscription(sub, endpoint, p256dh, auth string) error { + now := nowUnix() + _, err := Get().Exec(` + INSERT INTO push_subscriptions (endpoint, user_sub, p256dh, auth, created_at, last_notified_at) + VALUES (?, ?, ?, ?, ?, ?) + ON CONFLICT(endpoint) DO UPDATE SET + user_sub = excluded.user_sub, + p256dh = excluded.p256dh, + auth = excluded.auth, + last_notified_at = excluded.last_notified_at`, + endpoint, sub, p256dh, auth, now, now) + if err != nil { + return fmt.Errorf("add push subscription: %w", err) + } + return nil +} + +// RemovePushSubscription drops one endpoint. Used both for an explicit opt-out +// and when a push service reports the endpoint is gone (404/410). +func RemovePushSubscription(endpoint string) error { + _, err := Get().Exec(`DELETE FROM push_subscriptions WHERE endpoint = ?`, endpoint) + if err != nil { + return fmt.Errorf("remove push subscription: %w", err) + } + return nil +} + +// ListPushSubscriptions returns every stored subscription, for the digest sender. +func ListPushSubscriptions() ([]PushSubscription, error) { + rows, err := Get().Query( + `SELECT endpoint, user_sub, p256dh, auth, created_at, last_notified_at + FROM push_subscriptions`) + if err != nil { + return nil, err + } + defer rows.Close() + var out []PushSubscription + for rows.Next() { + var p PushSubscription + if err := rows.Scan(&p.Endpoint, &p.UserSub, &p.P256dh, &p.Auth, &p.CreatedAt, &p.LastNotifiedAt); err != nil { + return nil, err + } + out = append(out, p) + } + return out, rows.Err() +} + +// TouchPushSubscription advances an endpoint's digest watermark so its next +// digest only considers stories seen after ts. +func TouchPushSubscription(endpoint string, ts int64) error { + _, err := Get().Exec( + `UPDATE push_subscriptions SET last_notified_at = ? WHERE endpoint = ?`, ts, endpoint) + if err != nil { + return fmt.Errorf("touch push subscription: %w", err) + } + return nil +} + +// NewClassifiedSince returns classified stories first seen after sinceUnix, +// newest first, capped at limit. The digest sender uses it to count and preview +// what's new for a subscriber; it carries just the fields a digest needs. +func NewClassifiedSince(sinceUnix int64, limit int) ([]Story, error) { + rows, err := Get().Query( + `SELECT id, headline, source, channel, seen_at + FROM stories + WHERE classified = 1 AND channel <> '_discarded' AND seen_at > ? + ORDER BY seen_at DESC + LIMIT ?`, sinceUnix, limit) + if err != nil { + return nil, err + } + defer rows.Close() + var out []Story + for rows.Next() { + var s Story + if err := rows.Scan(&s.ID, &s.Headline, &s.Source, &s.Channel, &s.SeenAt); err != nil { + return nil, err + } + out = append(out, s) + } + return out, rows.Err() +} diff --git a/internal/storage/push_test.go b/internal/storage/push_test.go new file mode 100644 index 0000000..ce55af9 --- /dev/null +++ b/internal/storage/push_test.go @@ -0,0 +1,105 @@ +package storage + +import "testing" + +func TestPushSubscriptionLifecycle(t *testing.T) { + setupTestDB(t) + + if err := AddPushSubscription("sub-1", "https://push.example/ep-a", "p256-a", "auth-a"); err != nil { + t.Fatal(err) + } + // A second endpoint for the same user (e.g. a second device). + if err := AddPushSubscription("sub-1", "https://push.example/ep-b", "p256-b", "auth-b"); err != nil { + t.Fatal(err) + } + // A different user. + if err := AddPushSubscription("sub-2", "https://push.example/ep-c", "p256-c", "auth-c"); err != nil { + t.Fatal(err) + } + + subs, err := ListPushSubscriptions() + if err != nil { + t.Fatal(err) + } + if len(subs) != 3 { + t.Fatalf("got %d subscriptions, want 3", len(subs)) + } + + // Re-subscribing the same endpoint updates keys in place, not a new row. + if err := AddPushSubscription("sub-1", "https://push.example/ep-a", "p256-a2", "auth-a2"); err != nil { + t.Fatal(err) + } + subs, _ = ListPushSubscriptions() + if len(subs) != 3 { + t.Fatalf("after re-subscribe got %d rows, want 3 (upsert, not insert)", len(subs)) + } + var epA PushSubscription + for _, s := range subs { + if s.Endpoint == "https://push.example/ep-a" { + epA = s + } + } + if epA.P256dh != "p256-a2" || epA.Auth != "auth-a2" { + t.Errorf("re-subscribe did not refresh keys: %+v", epA) + } + + if err := RemovePushSubscription("https://push.example/ep-a"); err != nil { + t.Fatal(err) + } + subs, _ = ListPushSubscriptions() + if len(subs) != 2 { + t.Fatalf("after remove got %d rows, want 2", len(subs)) + } +} + +func TestTouchPushSubscriptionAdvancesWatermark(t *testing.T) { + setupTestDB(t) + if err := AddPushSubscription("sub-1", "https://push.example/ep", "p", "a"); err != nil { + t.Fatal(err) + } + subs, _ := ListPushSubscriptions() + orig := subs[0].LastNotifiedAt + + want := orig + 5000 + if err := TouchPushSubscription("https://push.example/ep", want); err != nil { + t.Fatal(err) + } + subs, _ = ListPushSubscriptions() + if subs[0].LastNotifiedAt != want { + t.Errorf("watermark = %d, want %d", subs[0].LastNotifiedAt, want) + } +} + +func TestNewClassifiedSince(t *testing.T) { + setupTestDB(t) + now := nowUnix() + + insert := func(guid, headline, source, channel string, classified bool, seenAt int64) { + if err := InsertStory(&Story{ + GUID: guid, Headline: headline, ArticleURL: "https://x/" + guid, + Source: source, Channel: channel, Classified: classified, SeenAt: seenAt, + }); err != nil { + t.Fatal(err) + } + } + insert("old", "Old news", "Feed A", "tech", true, now-1000) + insert("fresh1", "Fresh one", "Feed A", "tech", true, now-100) + insert("fresh2", "Fresh two", "Feed B", "gaming", true, now-50) + insert("unclassified", "Pending", "Feed A", "", false, now-10) + insert("discarded", "Junk", "Feed A", "_discarded", true, now-10) + + got, err := NewClassifiedSince(now-500, 10) + if err != nil { + t.Fatal(err) + } + if len(got) != 2 { + t.Fatalf("got %d stories, want 2 (fresh classified, non-discarded, after watermark)", len(got)) + } + // Newest first. + if got[0].GUID != "" && got[0].Headline != "Fresh two" { + t.Errorf("first result = %q, want newest 'Fresh two'", got[0].Headline) + } + if got[0].Source != "Feed B" || got[1].Source != "Feed A" { + t.Errorf("unexpected order/sources: %q then %q", got[0].Source, got[1].Source) + } +} diff --git a/internal/storage/queries.go b/internal/storage/queries.go index e9f58e3..00dff4d 100644 --- a/internal/storage/queries.go +++ b/internal/storage/queries.go @@ -300,6 +300,55 @@ func ListAllClassified(limit, offset int) ([]Story, error) { return out, rows.Err() } +// ListForFeed returns up to `limit` classified stories for the outbound RSS and +// JSON feeds, newest first. Unlike the web list queries it also selects the full +// `content` and `published_at`, which the feeds need for content:encoded bodies +// and real pubDates. channel == "" spans all real channels; otherwise it scopes +// to that one channel. Sentinel channels are always excluded. +func ListForFeed(channel string, limit int) ([]Story, error) { + const cols = `s.id, s.guid, s.headline, s.lede, s.content, s.image_url, s.article_url, s.url_canonical, s.source, s.channel, s.seen_at, s.published_at` + var ( + rows *sql.Rows + err error + ) + if channel == "" { + rows, err = Get().Query( + `SELECT `+cols+` + FROM stories s + WHERE s.classified = 1 + AND s.channel IS NOT NULL + AND s.channel NOT IN ('_discarded', '_duplicate') + ORDER BY COALESCE(s.published_at, s.seen_at) DESC + LIMIT ?`, limit) + } else { + rows, err = Get().Query( + `SELECT `+cols+` + FROM stories s + WHERE s.classified = 1 + AND s.channel = ? + ORDER BY COALESCE(s.published_at, s.seen_at) DESC + LIMIT ?`, channel, limit) + } + if err != nil { + return nil, err + } + defer rows.Close() + var out []Story + for rows.Next() { + var s Story + var content, canonical sql.NullString + var published sql.NullInt64 + if err := rows.Scan(&s.ID, &s.GUID, &s.Headline, &s.Lede, &content, &s.ImageURL, &s.ArticleURL, &canonical, &s.Source, &s.Channel, &s.SeenAt, &published); err != nil { + return nil, err + } + s.Content = content.String + s.URLCanonical = canonical.String + s.PublishedAt = published.Int64 + out = append(out, s) + } + return out, rows.Err() +} + // ListRecentlyPosted returns up to `limit` stories that have been posted to // Matrix, ordered by post time (newest first). Posted is always true. func ListRecentlyPosted(limit int) ([]Story, error) { diff --git a/internal/storage/rank.go b/internal/storage/rank.go new file mode 100644 index 0000000..811e94c --- /dev/null +++ b/internal/storage/rank.go @@ -0,0 +1,275 @@ +package storage + +import ( + "database/sql" + "errors" + "math" + "sort" + "strings" +) + +// Ranking weights for the "For you" feed. Bookmarks are a stronger signal of +// interest than a plain read, and channel affinity outweighs source affinity +// (a reader follows topics more than outlets). Recency keeps the feed fresh so +// a heavily-read channel doesn't surface week-old stories over today's news. +const ( + affinityReadWeight = 1.0 + affinityBookmarkWeight = 3.0 + + forYouChannelWeight = 1.0 + forYouSourceWeight = 0.7 + forYouRecencyWeight = 0.9 + + // forYouCandidatePool bounds how many recent unread stories we score in Go. + forYouCandidatePool = 400 + // forYouRecencyHalfLifeHours sets how fast the recency term decays. + forYouRecencyHalfLifeHours = 48.0 +) + +// userAffinity builds normalized channel and source affinity scores (each 0..1) +// for a signed-in user from their read + bookmark history. Bookmarks count for +// more than plain reads. total is the number of signal-bearing rows; when it is +// zero the user has no history yet and both maps are empty. +func userAffinity(sub string) (channel, source map[string]float64, total int, err error) { + channel = make(map[string]float64) + source = make(map[string]float64) + if sub == "" { + return channel, source, 0, nil + } + rows, err := Get().Query( + `SELECT s.channel, s.source, u.read_at, u.bookmarked_at + FROM user_story_state u + JOIN stories s ON s.id = u.story_id + WHERE u.user_sub = ? + AND s.channel IS NOT NULL + AND s.channel NOT IN ('_discarded', '_duplicate')`, sub) + if err != nil { + return nil, nil, 0, err + } + defer rows.Close() + for rows.Next() { + var ch, src string + var readAt, markAt sql.NullInt64 + if err := rows.Scan(&ch, &src, &readAt, &markAt); err != nil { + return nil, nil, 0, err + } + w := 0.0 + if readAt.Valid { + w += affinityReadWeight + } + if markAt.Valid { + w += affinityBookmarkWeight + } + if w == 0 { + continue + } + channel[ch] += w + source[src] += w + total++ + } + if err := rows.Err(); err != nil { + return nil, nil, 0, err + } + normalizeMax(channel) + normalizeMax(source) + return channel, source, total, nil +} + +// normalizeMax scales a map's values so the largest becomes 1.0, leaving an +// all-zero (or empty) map untouched. +func normalizeMax(m map[string]float64) { + var max float64 + for _, v := range m { + if v > max { + max = v + } + } + if max == 0 { + return + } + for k := range m { + m[k] /= max + } +} + +// ForYou returns a personalized ranking of recent, unread stories for a +// signed-in user, blending channel affinity, source affinity, and recency. It +// returns (nil, nil) when the user has no read/bookmark history yet, so callers +// can fall back to the plain latest feed. +func ForYou(sub string, limit int) ([]Story, error) { + if limit <= 0 { + return nil, nil + } + chAff, srcAff, total, err := userAffinity(sub) + if err != nil { + return nil, err + } + if total == 0 { + return nil, nil + } + rows, err := Get().Query( + `SELECT s.id, s.guid, s.headline, s.lede, s.image_url, s.article_url, s.source, s.platforms, s.channel, s.paywalled, s.seen_at, COALESCE(s.published_at, s.seen_at), + EXISTS(SELECT 1 FROM post_log p WHERE p.guid = s.guid) AS posted + FROM stories s + WHERE s.classified = 1 + AND s.channel IS NOT NULL + AND s.channel NOT IN ('_discarded', '_duplicate') + AND s.id NOT IN ( + SELECT story_id FROM user_story_state + WHERE user_sub = ? AND read_at IS NOT NULL) + ORDER BY COALESCE(s.published_at, s.seen_at) DESC + LIMIT ?`, sub, forYouCandidatePool) + if err != nil { + return nil, err + } + defer rows.Close() + + now := float64(nowUnix()) + type scored struct { + s Story + score float64 + } + var cands []scored + for rows.Next() { + var s Story + var effectiveAt int64 + if err := rows.Scan(&s.ID, &s.GUID, &s.Headline, &s.Lede, &s.ImageURL, &s.ArticleURL, &s.Source, &s.Platforms, &s.Channel, &s.Paywalled, &s.SeenAt, &effectiveAt, &s.Posted); err != nil { + return nil, err + } + ageHours := (now - float64(effectiveAt)) / 3600.0 + if ageHours < 0 { + ageHours = 0 + } + recency := math.Exp(-ageHours / forYouRecencyHalfLifeHours) + score := forYouChannelWeight*chAff[s.Channel] + + forYouSourceWeight*srcAff[s.Source] + + forYouRecencyWeight*recency + cands = append(cands, scored{s, score}) + } + if err := rows.Err(); err != nil { + return nil, err + } + // Candidates arrive newest-first, and a stable sort keeps that order for + // equal scores, so ties break toward the more recent story. + sort.SliceStable(cands, func(i, j int) bool { return cands[i].score > cands[j].score }) + if len(cands) > limit { + cands = cands[:limit] + } + out := make([]Story, 0, len(cands)) + for _, c := range cands { + out = append(out, c.s) + } + return out, nil +} + +// relatedRecencyWindowSeconds bounds "related" results to roughly the same +// window the story feed lives in (stories are pruned at 30 days anyway). +const relatedRecencyWindowSeconds = 30 * 86400 + +// relatedStopwords are high-frequency, low-signal tokens dropped when building +// the "related" FTS query so matches key off the story's actual subject matter. +var relatedStopwords = map[string]bool{ + "the": true, "and": true, "for": true, "with": true, "that": true, + "this": true, "from": true, "has": true, "have": true, "are": true, + "was": true, "were": true, "will": true, "its": true, "into": true, + "out": true, "how": true, "why": true, "what": true, "who": true, + "you": true, "your": true, "not": true, "but": true, "all": true, + "new": true, "now": true, "more": true, "after": true, "over": true, + "about": true, "says": true, "said": true, "of": true, "to": true, + "in": true, "is": true, "on": true, "at": true, "by": true, "as": true, + "an": true, "be": true, "it": true, "or": true, "if": true, "we": true, + "he": true, "do": true, "up": true, "so": true, "no": true, "my": true, +} + +// RelatedStories returns classified stories textually similar to the given +// story, ranked by FTS5 relevance and excluding the story itself. The match +// query is an OR of significant tokens from the seed story's headline and lede, +// so it surfaces stories that share subject matter rather than requiring every +// term (which is what SearchStories' implicit-AND query would demand). +func RelatedStories(storyID int64, limit int) ([]Story, error) { + if storyID <= 0 || limit <= 0 { + return nil, nil + } + var headline, lede sql.NullString + err := Get().QueryRow(`SELECT headline, lede FROM stories WHERE id = ?`, storyID).Scan(&headline, &lede) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return nil, err + } + fts := buildRelatedFTSQuery(headline.String + " " + lede.String) + if fts == "" { + return nil, nil + } + cutoff := nowUnix() - relatedRecencyWindowSeconds + rows, err := Get().Query( + `SELECT s.id, s.guid, s.headline, s.lede, s.image_url, s.article_url, s.source, s.platforms, s.channel, s.paywalled, s.seen_at, + EXISTS(SELECT 1 FROM post_log p WHERE p.guid = s.guid) AS posted + FROM stories_fts f + JOIN stories s ON s.id = f.rowid + WHERE f.stories_fts MATCH ? + AND s.id != ? + AND s.classified = 1 + AND s.channel IS NOT NULL + AND s.channel NOT IN ('_discarded', '_duplicate') + AND s.seen_at >= ? + ORDER BY bm25(stories_fts) ASC, s.seen_at DESC + LIMIT ?`, fts, storyID, cutoff, limit) + if err != nil { + return nil, err + } + defer rows.Close() + var out []Story + for rows.Next() { + var s Story + if err := rows.Scan(&s.ID, &s.GUID, &s.Headline, &s.Lede, &s.ImageURL, &s.ArticleURL, &s.Source, &s.Platforms, &s.Channel, &s.Paywalled, &s.SeenAt, &s.Posted); err != nil { + return nil, err + } + out = append(out, s) + } + return out, rows.Err() +} + +// buildRelatedFTSQuery tokenizes a story's headline+lede into a de-duplicated, +// stopword-filtered OR query of quoted terms, capped so a long lede can't build +// a pathological query. Returns "" when nothing usable remains. +func buildRelatedFTSQuery(raw string) string { + var tokens []string + var cur strings.Builder + seen := make(map[string]bool) + flush := func() { + if cur.Len() == 0 { + return + } + t := strings.ToLower(cur.String()) + cur.Reset() + if len([]rune(t)) < 2 || relatedStopwords[t] || seen[t] { + return + } + seen[t] = true + tokens = append(tokens, t) + } + for _, r := range raw { + switch { + case r >= 'a' && r <= 'z', r >= 'A' && r <= 'Z', r >= '0' && r <= '9': + cur.WriteRune(r) + case r > 127: + cur.WriteRune(r) + default: + flush() + } + } + flush() + if len(tokens) == 0 { + return "" + } + const maxTokens = 16 + if len(tokens) > maxTokens { + tokens = tokens[:maxTokens] + } + for i, t := range tokens { + tokens[i] = `"` + t + `"` + } + return strings.Join(tokens, " OR ") +} diff --git a/internal/storage/rank_test.go b/internal/storage/rank_test.go new file mode 100644 index 0000000..66e762e --- /dev/null +++ b/internal/storage/rank_test.go @@ -0,0 +1,141 @@ +package storage + +import ( + "strings" + "testing" +) + +// seedStoryFull inserts a story with an explicit channel + source so ranking +// tests can build a skewed affinity profile. +func seedStoryFull(t *testing.T, guid, channel, source, headline, lede string) int64 { + t.Helper() + s := &Story{ + GUID: guid, + Headline: headline, + Lede: lede, + ArticleURL: "https://example.com/" + guid, + Source: source, + Channel: channel, + Classified: true, + SeenAt: nowUnix(), + } + if err := InsertStory(s); err != nil { + t.Fatalf("insert story %s: %v", guid, err) + } + var id int64 + if err := Get().QueryRow(`SELECT id FROM stories WHERE guid = ?`, guid).Scan(&id); err != nil { + t.Fatalf("lookup id %s: %v", guid, err) + } + return id +} + +func TestForYou_LeansToAffinityAndExcludesRead(t *testing.T) { + setupTestDB(t) + const sub = "sub-1" + + // A skewed history: the user reads/bookmarks gaming stories. + g1 := seedStoryFull(t, "g1", "gaming", "GameSite", "Game one", "") + g2 := seedStoryFull(t, "g2", "gaming", "GameSite", "Game two", "") + // Candidates to rank (all unread until we mark some). + gc := seedStoryFull(t, "gc", "gaming", "GameSite", "Fresh gaming story", "") + tc := seedStoryFull(t, "tc", "tech", "TechSite", "Fresh tech story", "") + + if err := SetRead(sub, g1, true); err != nil { + t.Fatalf("read g1: %v", err) + } + if err := SetBookmark(sub, g2, true); err != nil { + t.Fatalf("bookmark g2: %v", err) + } + + got, err := ForYou(sub, 10) + if err != nil { + t.Fatalf("ForYou: %v", err) + } + if len(got) == 0 { + t.Fatal("expected results") + } + // Affinity leans gaming, so a gaming story tops the list and the tech story + // sinks to the bottom. (gc and the unread-but-bookmarked g2 both qualify and + // tie on score, so we assert on channel rather than a specific id.) + if got[0].Channel != "gaming" { + t.Fatalf("expected a gaming story first, got channel %q (id %d)", got[0].Channel, got[0].ID) + } + if got[len(got)-1].ID != tc { + t.Fatalf("expected tech candidate ranked last, got id %d", got[len(got)-1].ID) + } + // Read stories must never appear. + for _, s := range got { + if s.ID == g1 { + t.Fatalf("read story g1 leaked into ForYou") + } + } + // Sanity: the gaming candidate that was never touched should be present. + var sawGC bool + for _, s := range got { + if s.ID == gc { + sawGC = true + } + } + if !sawGC { + t.Fatalf("expected unread gaming candidate gc in results") + } +} + +func TestForYou_NoHistoryReturnsNil(t *testing.T) { + setupTestDB(t) + seedStoryFull(t, "a", "tech", "TechSite", "Something", "") + got, err := ForYou("nobody", 10) + if err != nil { + t.Fatalf("ForYou: %v", err) + } + if got != nil { + t.Fatalf("expected nil for a user with no history, got %d rows", len(got)) + } +} + +func TestRelatedStories_OnTopicExcludesSelf(t *testing.T) { + setupTestDB(t) + seed := seedStoryFull(t, "seed", "tech", "TechSite", + "Apple unveils new iPhone camera", "The new camera sensor is larger.") + rel := seedStoryFull(t, "rel", "tech", "OtherSite", + "iPhone camera teardown reveals sensor", "A look at the new iPhone camera.") + seedStoryFull(t, "off", "gaming", "GameSite", + "Nintendo announces handheld", "A brand new portable console.") + + got, err := RelatedStories(seed, 5) + if err != nil { + t.Fatalf("RelatedStories: %v", err) + } + if len(got) == 0 { + t.Fatal("expected at least one related story") + } + for _, s := range got { + if s.ID == seed { + t.Fatal("seed story returned as its own related") + } + } + if got[0].ID != rel { + t.Fatalf("expected the on-topic iPhone story first, got id %d", got[0].ID) + } +} + +func TestBuildRelatedFTSQuery(t *testing.T) { + // Stopwords and 1-char tokens drop out; the rest become an OR of quoted terms. + q := buildRelatedFTSQuery("The new iPhone camera is a big deal") + if q == "" { + t.Fatal("expected a non-empty query") + } + for _, bad := range []string{`"the"`, `"is"`, `"new"`} { + if strings.Contains(q, bad) { + t.Fatalf("stopword leaked into query: %s in %q", bad, q) + } + } + for _, want := range []string{`"iphone"`, `"camera"`} { + if !strings.Contains(q, want) { + t.Fatalf("expected %s in query %q", want, q) + } + } + if buildRelatedFTSQuery("the a of to") != "" { + t.Fatal("expected empty query when only stopwords remain") + } +} diff --git a/internal/storage/schema.go b/internal/storage/schema.go index 525e13e..1d15488 100644 --- a/internal/storage/schema.go +++ b/internal/storage/schema.go @@ -54,6 +54,18 @@ CREATE TABLE IF NOT EXISTS user_preferences ( updated_at INTEGER NOT NULL ); +-- Per-user read + bookmark state for signed-in visitors, keyed by OIDC subject. +-- One row carries both signals; a NULL timestamp means "not set". A row with +-- both timestamps NULL is meaningless and is pruned, so presence of a row means +-- the story is read, bookmarked, or both. +CREATE TABLE IF NOT EXISTS user_story_state ( + user_sub TEXT NOT NULL, + story_id INTEGER NOT NULL, + read_at INTEGER, + bookmarked_at INTEGER, + PRIMARY KEY (user_sub, story_id) +); + -- Aggregate web usage. page_views holds running view counts keyed by a coarse -- path label ("home", channel slug, …) and the UTC day, so we can report both -- all-time totals and per-day breakdowns without storing any per-request rows. @@ -64,6 +76,35 @@ CREATE TABLE IF NOT EXISTS page_views ( PRIMARY KEY (path, day) ); +-- Per-source poll health, one row per configured feed (keyed by source name). +-- Written on every poll (success and failure) so the owner-facing dashboard can +-- show which feeds are healthy without keeping the poller's in-memory state. +-- last_success_at / last_item_count survive failures so a broken feed still +-- shows when it last worked and how much it last returned. +CREATE TABLE IF NOT EXISTS source_health ( + source TEXT PRIMARY KEY, + last_poll_at INTEGER, -- unix, most recent poll attempt + last_success_at INTEGER, -- unix, most recent successful fetch + last_error TEXT, -- last failure message ('' when healthy) + consecutive_failures INTEGER NOT NULL DEFAULT 0, + last_item_count INTEGER NOT NULL DEFAULT 0, -- items in the last successful fetch + updated_at INTEGER NOT NULL +); + +-- Web Push subscriptions for signed-in users, one row per browser/device +-- endpoint. p256dh + auth are the client's encryption keys (RFC 8291); the +-- server needs them to encrypt each push. last_notified_at is the per-endpoint +-- digest watermark: the sender only counts stories seen after it. A user can +-- have several endpoints (phone, desktop) — each is notified independently. +CREATE TABLE IF NOT EXISTS push_subscriptions ( + endpoint TEXT PRIMARY KEY, + user_sub TEXT NOT NULL, + p256dh TEXT NOT NULL, + auth TEXT NOT NULL, + created_at INTEGER NOT NULL, + last_notified_at INTEGER NOT NULL +); + -- Privacy-preserving daily unique estimate. visitor is a salted hash of -- IP+User-Agent; the salt rotates every UTC day and is never persisted, so the -- hashes are irreversible and cannot be linked across days. We keep only enough @@ -88,6 +129,9 @@ CREATE INDEX IF NOT EXISTS idx_reactions_post_guid ON reactions(post_guid); CREATE UNIQUE INDEX IF NOT EXISTS idx_reactions_event_id ON reactions(event_id); CREATE INDEX IF NOT EXISTS idx_page_views_day ON page_views(day); CREATE INDEX IF NOT EXISTS idx_daily_visitors_day ON daily_visitors(day); +CREATE INDEX IF NOT EXISTS idx_user_state_bookmarks ON user_story_state(user_sub, bookmarked_at) WHERE bookmarked_at IS NOT NULL; +CREATE INDEX IF NOT EXISTS idx_user_state_reads ON user_story_state(user_sub, read_at) WHERE read_at IS NOT NULL; +CREATE INDEX IF NOT EXISTS idx_push_sub_user ON push_subscriptions(user_sub); ` const ftsSchema = ` diff --git a/internal/storage/sourcehealth.go b/internal/storage/sourcehealth.go new file mode 100644 index 0000000..6d02826 --- /dev/null +++ b/internal/storage/sourcehealth.go @@ -0,0 +1,149 @@ +package storage + +import ( + "database/sql" + "fmt" +) + +// SourceHealth is one source's persisted poll health, as written by the poller. +type SourceHealth struct { + Source string + LastPollAt int64 // 0 = never polled + LastSuccessAt int64 // 0 = never succeeded + LastError string + ConsecutiveFailures int + LastItemCount int + UpdatedAt int64 +} + +// SourceContentStat is per-source content derived from the stories table (plus +// post_log for last-posted), independent of poll health. +type SourceContentStat struct { + Source string + Total int // stories currently retained for this source + Classified int // of those, how many are classified + Paywalled int // of those, how many are gated + LastSeenAt int64 // MAX(seen_at); 0 = none + LastPostedAt int64 // MAX(post_log.posted_at) joined by guid; 0 = never posted +} + +// RecordPollResult upserts a source's health row after a poll attempt. On +// success it clears the error and failure counter and records the item count; +// on failure it bumps consecutive_failures and stores the message while +// preserving the last successful timestamp and item count. Fire-and-forget: +// a failure here must never disrupt polling, so errors are logged and swallowed. +func RecordPollResult(source string, ok bool, itemCount int, pollErr error) { + now := nowUnix() + if ok { + exec("record poll success", + `INSERT INTO source_health + (source, last_poll_at, last_success_at, last_error, consecutive_failures, last_item_count, updated_at) + VALUES (?, ?, ?, '', 0, ?, ?) + ON CONFLICT(source) DO UPDATE SET + last_poll_at = excluded.last_poll_at, + last_success_at = excluded.last_success_at, + last_error = '', + consecutive_failures = 0, + last_item_count = excluded.last_item_count, + updated_at = excluded.updated_at`, + source, now, now, itemCount, now) + return + } + msg := "" + if pollErr != nil { + msg = pollErr.Error() + } + exec("record poll failure", + `INSERT INTO source_health + (source, last_poll_at, last_success_at, last_error, consecutive_failures, last_item_count, updated_at) + VALUES (?, ?, NULL, ?, 1, 0, ?) + ON CONFLICT(source) DO UPDATE SET + last_poll_at = excluded.last_poll_at, + last_error = excluded.last_error, + consecutive_failures = source_health.consecutive_failures + 1, + updated_at = excluded.updated_at`, + source, now, msg, now) +} + +// ListSourceHealth returns the poll-health row for every source that has been +// polled at least once, keyed by source name. +func ListSourceHealth() (map[string]SourceHealth, error) { + rows, err := Get().Query( + `SELECT source, last_poll_at, last_success_at, last_error, + consecutive_failures, last_item_count, updated_at + FROM source_health`) + if err != nil { + return nil, fmt.Errorf("list source health: %w", err) + } + defer rows.Close() + out := make(map[string]SourceHealth) + for rows.Next() { + var h SourceHealth + var lastPoll, lastSuccess sql.NullInt64 + var lastErr sql.NullString + if err := rows.Scan(&h.Source, &lastPoll, &lastSuccess, &lastErr, + &h.ConsecutiveFailures, &h.LastItemCount, &h.UpdatedAt); err != nil { + return nil, err + } + h.LastPollAt = lastPoll.Int64 + h.LastSuccessAt = lastSuccess.Int64 + h.LastError = lastErr.String + out[h.Source] = h + } + return out, rows.Err() +} + +// SourceContentStats derives per-source content counts from the stories table, +// with last-posted joined from post_log by guid. Keyed by source name. Only +// sources with at least one retained story appear; the caller pads out the rest +// from its configured source list. +func SourceContentStats() (map[string]SourceContentStat, error) { + out := make(map[string]SourceContentStat) + + rows, err := Get().Query( + `SELECT source, + COUNT(*), + COALESCE(SUM(classified), 0), + COALESCE(SUM(paywalled), 0), + COALESCE(MAX(seen_at), 0) + FROM stories + GROUP BY source`) + if err != nil { + return nil, fmt.Errorf("source content stats: %w", err) + } + defer rows.Close() + for rows.Next() { + var st SourceContentStat + if err := rows.Scan(&st.Source, &st.Total, &st.Classified, &st.Paywalled, &st.LastSeenAt); err != nil { + return nil, err + } + out[st.Source] = st + } + if err := rows.Err(); err != nil { + return nil, err + } + + // Last-posted per source, joined by guid. Kept separate so sources with + // stories but no posts still appear above with a zero last-posted. + prows, err := Get().Query( + `SELECT s.source, MAX(p.posted_at) + FROM post_log p + JOIN stories s ON s.guid = p.guid + GROUP BY s.source`) + if err != nil { + return nil, fmt.Errorf("source last-posted: %w", err) + } + defer prows.Close() + for prows.Next() { + var source string + var lastPosted int64 + if err := prows.Scan(&source, &lastPosted); err != nil { + return nil, err + } + st := out[source] + st.Source = source + st.LastPostedAt = lastPosted + out[source] = st + } + return out, prows.Err() +} diff --git a/internal/storage/sourcehealth_test.go b/internal/storage/sourcehealth_test.go new file mode 100644 index 0000000..b4b241a --- /dev/null +++ b/internal/storage/sourcehealth_test.go @@ -0,0 +1,104 @@ +package storage + +import ( + "errors" + "testing" +) + +func TestRecordPollResult_SuccessThenFailure(t *testing.T) { + setupTestDB(t) + + // First a successful poll returning 7 items. + RecordPollResult("Feed A", true, 7, nil) + h, err := ListSourceHealth() + if err != nil { + t.Fatal(err) + } + a, ok := h["Feed A"] + if !ok { + t.Fatal("expected a health row for Feed A") + } + if a.LastItemCount != 7 || a.ConsecutiveFailures != 0 || a.LastError != "" { + t.Errorf("after success: items=%d fails=%d err=%q", a.LastItemCount, a.ConsecutiveFailures, a.LastError) + } + if a.LastPollAt == 0 || a.LastSuccessAt == 0 { + t.Errorf("after success: last_poll=%d last_success=%d, want both set", a.LastPollAt, a.LastSuccessAt) + } + successTS := a.LastSuccessAt + + // Two failures in a row: failures accumulate, but the last-success timestamp + // and item count are preserved so the dashboard still shows when it last worked. + RecordPollResult("Feed A", false, 0, errors.New("dial tcp: timeout")) + RecordPollResult("Feed A", false, 0, errors.New("502 bad gateway")) + h, _ = ListSourceHealth() + a = h["Feed A"] + if a.ConsecutiveFailures != 2 { + t.Errorf("consecutive failures = %d, want 2", a.ConsecutiveFailures) + } + if a.LastError != "502 bad gateway" { + t.Errorf("last error = %q, want %q", a.LastError, "502 bad gateway") + } + if a.LastSuccessAt != successTS { + t.Errorf("last success = %d, want preserved %d", a.LastSuccessAt, successTS) + } + if a.LastItemCount != 7 { + t.Errorf("last item count = %d, want preserved 7", a.LastItemCount) + } + + // Recovery clears the error and resets the counter. + RecordPollResult("Feed A", true, 3, nil) + h, _ = ListSourceHealth() + a = h["Feed A"] + if a.ConsecutiveFailures != 0 || a.LastError != "" || a.LastItemCount != 3 { + t.Errorf("after recovery: fails=%d err=%q items=%d", a.ConsecutiveFailures, a.LastError, a.LastItemCount) + } +} + +func TestSourceContentStats(t *testing.T) { + setupTestDB(t) + + // Source X: two classified stories, one paywalled; one posted. + InsertStory(&Story{GUID: "x1", Headline: "X one", ArticleURL: "https://x.com/1", Source: "X", Channel: "tech", Classified: true, SeenAt: 100}) + InsertStory(&Story{GUID: "x2", Headline: "X two", ArticleURL: "https://x.com/2", Source: "X", Channel: "tech", Classified: true, Paywalled: true, SeenAt: 200}) + // Source Y: one unclassified story, never posted. + InsertStory(&Story{GUID: "y1", Headline: "Y one", ArticleURL: "https://y.com/1", Source: "Y", SeenAt: 150}) + + InsertPostLog("x1", "tech", "$e1", "", false) + // Backdate/forward the post so we can assert MAX(posted_at). + Get().Exec(`UPDATE post_log SET posted_at = ? WHERE guid = ?`, int64(500), "x1") + + stats, err := SourceContentStats() + if err != nil { + t.Fatal(err) + } + + x := stats["X"] + if x.Total != 2 || x.Classified != 2 || x.Paywalled != 1 { + t.Errorf("X: total=%d classified=%d paywalled=%d, want 2/2/1", x.Total, x.Classified, x.Paywalled) + } + if x.LastSeenAt != 200 { + t.Errorf("X last seen = %d, want 200", x.LastSeenAt) + } + if x.LastPostedAt != 500 { + t.Errorf("X last posted = %d, want 500", x.LastPostedAt) + } + + y := stats["Y"] + if y.Total != 1 || y.Classified != 0 || y.Paywalled != 0 { + t.Errorf("Y: total=%d classified=%d paywalled=%d, want 1/0/0", y.Total, y.Classified, y.Paywalled) + } + if y.LastPostedAt != 0 { + t.Errorf("Y last posted = %d, want 0 (never posted)", y.LastPostedAt) + } +} + +func TestListSourceHealth_Empty(t *testing.T) { + setupTestDB(t) + h, err := ListSourceHealth() + if err != nil { + t.Fatal(err) + } + if len(h) != 0 { + t.Errorf("expected no health rows, got %d", len(h)) + } +} diff --git a/internal/storage/userstate.go b/internal/storage/userstate.go new file mode 100644 index 0000000..875a05d --- /dev/null +++ b/internal/storage/userstate.go @@ -0,0 +1,139 @@ +package storage + +import ( + "database/sql" + "fmt" + "strings" +) + +// SetRead marks (read=true) or clears (read=false) the read flag for one story +// and one signed-in user (keyed by OIDC subject). Read and bookmark state share +// a row; clearing the last remaining flag removes the row. +func SetRead(sub string, storyID int64, read bool) error { + var ts any + if read { + ts = nowUnix() + } + _, err := Get().Exec(` + INSERT INTO user_story_state (user_sub, story_id, read_at, bookmarked_at) + VALUES (?, ?, ?, NULL) + ON CONFLICT(user_sub, story_id) DO UPDATE SET read_at = excluded.read_at`, + sub, storyID, ts) + if err != nil { + return fmt.Errorf("set read: %w", err) + } + return pruneEmptyState(sub, storyID) +} + +// SetBookmark adds (on=true) or removes (on=false) a bookmark for one story and +// one signed-in user. See SetRead for the shared-row semantics. +func SetBookmark(sub string, storyID int64, on bool) error { + var ts any + if on { + ts = nowUnix() + } + _, err := Get().Exec(` + INSERT INTO user_story_state (user_sub, story_id, read_at, bookmarked_at) + VALUES (?, ?, NULL, ?) + ON CONFLICT(user_sub, story_id) DO UPDATE SET bookmarked_at = excluded.bookmarked_at`, + sub, storyID, ts) + if err != nil { + return fmt.Errorf("set bookmark: %w", err) + } + return pruneEmptyState(sub, storyID) +} + +// pruneEmptyState drops a row once neither flag is set, keeping the table to +// only meaningful state. +func pruneEmptyState(sub string, storyID int64) error { + _, err := Get().Exec( + `DELETE FROM user_story_state + WHERE user_sub = ? AND story_id = ? AND read_at IS NULL AND bookmarked_at IS NULL`, + sub, storyID) + if err != nil { + return fmt.Errorf("prune user state: %w", err) + } + return nil +} + +// UserStoryState reports, for the given story ids, which are read and which are +// bookmarked by this user. Both maps contain only ids whose flag is set, so a +// missing key means false. An empty sub or id list returns empty maps. +func UserStoryState(sub string, ids []int64) (read, bookmarked map[int64]bool, err error) { + read = make(map[int64]bool) + bookmarked = make(map[int64]bool) + if sub == "" || len(ids) == 0 { + return read, bookmarked, nil + } + q := `SELECT story_id, read_at, bookmarked_at FROM user_story_state + WHERE user_sub = ? AND story_id IN (` + placeholders(len(ids)) + `)` + args := make([]any, 0, len(ids)+1) + args = append(args, sub) + for _, id := range ids { + args = append(args, id) + } + rows, err := Get().Query(q, args...) + if err != nil { + return nil, nil, fmt.Errorf("user story state: %w", err) + } + defer rows.Close() + for rows.Next() { + var id int64 + var r, b sql.NullInt64 + if err := rows.Scan(&id, &r, &b); err != nil { + return nil, nil, err + } + if r.Valid { + read[id] = true + } + if b.Valid { + bookmarked[id] = true + } + } + return read, bookmarked, rows.Err() +} + +// ListBookmarks returns the user's bookmarked stories, most recently bookmarked +// first, restricted to still-classified stories. +func ListBookmarks(sub string, limit, offset int) ([]Story, error) { + rows, err := Get().Query( + `SELECT s.id, s.guid, s.headline, s.lede, s.image_url, s.article_url, s.source, s.platforms, s.channel, s.paywalled, s.seen_at, + EXISTS(SELECT 1 FROM post_log p WHERE p.guid = s.guid) AS posted + FROM user_story_state u + JOIN stories s ON s.id = u.story_id + WHERE u.user_sub = ? + AND u.bookmarked_at IS NOT NULL + AND s.classified = 1 + ORDER BY u.bookmarked_at DESC, u.story_id DESC + LIMIT ? OFFSET ?`, sub, limit, offset) + if err != nil { + return nil, err + } + defer rows.Close() + var out []Story + for rows.Next() { + var s Story + if err := rows.Scan(&s.ID, &s.GUID, &s.Headline, &s.Lede, &s.ImageURL, &s.ArticleURL, &s.Source, &s.Platforms, &s.Channel, &s.Paywalled, &s.SeenAt, &s.Posted); err != nil { + return nil, err + } + out = append(out, s) + } + return out, rows.Err() +} + +// CountBookmarks returns how many stories the user has bookmarked. +func CountBookmarks(sub string) (int, error) { + var n int + err := Get().QueryRow( + `SELECT COUNT(*) FROM user_story_state WHERE user_sub = ? AND bookmarked_at IS NOT NULL`, + sub).Scan(&n) + return n, err +} + +// placeholders returns "?, ?, …" with n slots for an IN clause. +func placeholders(n int) string { + if n <= 0 { + return "" + } + return strings.Repeat("?, ", n-1) + "?" +} diff --git a/internal/storage/userstate_test.go b/internal/storage/userstate_test.go new file mode 100644 index 0000000..de7232a --- /dev/null +++ b/internal/storage/userstate_test.go @@ -0,0 +1,126 @@ +package storage + +import "testing" + +func seedStory(t *testing.T, guid string) int64 { + t.Helper() + s := &Story{ + GUID: guid, + Headline: "Headline " + guid, + Lede: "Lede.", + ArticleURL: "https://example.com/" + guid, + Source: "Test Source", + Channel: "tech", + Classified: true, + SeenAt: 1700000000, + } + if err := InsertStory(s); err != nil { + t.Fatalf("insert story %s: %v", guid, err) + } + var id int64 + if err := Get().QueryRow(`SELECT id FROM stories WHERE guid = ?`, guid).Scan(&id); err != nil { + t.Fatalf("lookup id %s: %v", guid, err) + } + return id +} + +func TestUserStoryState_ReadAndBookmark(t *testing.T) { + setupTestDB(t) + id1 := seedStory(t, "s1") + id2 := seedStory(t, "s2") + const sub = "ak-sub-1" + + // Nothing set yet. + read, marks, err := UserStoryState(sub, []int64{id1, id2}) + if err != nil { + t.Fatalf("initial state: %v", err) + } + if len(read) != 0 || len(marks) != 0 { + t.Fatalf("expected empty state, got read=%v bookmarked=%v", read, marks) + } + + // Mark id1 read, bookmark id1 and id2. + if err := SetRead(sub, id1, true); err != nil { + t.Fatalf("set read: %v", err) + } + if err := SetBookmark(sub, id1, true); err != nil { + t.Fatalf("set bookmark id1: %v", err) + } + if err := SetBookmark(sub, id2, true); err != nil { + t.Fatalf("set bookmark id2: %v", err) + } + read, marks, _ = UserStoryState(sub, []int64{id1, id2}) + if !read[id1] || read[id2] { + t.Fatalf("read map wrong: %v", read) + } + if !marks[id1] || !marks[id2] { + t.Fatalf("bookmark map wrong: %v", marks) + } + // id1 carries both flags in a single row. + if !read[id1] || !marks[id1] { + t.Fatalf("expected id1 read+bookmarked, read=%v marks=%v", read, marks) + } + + // ListBookmarks orders newest bookmark first, tiebreaking on story id so the + // result is deterministic within a single second. + bm, err := ListBookmarks(sub, 10, 0) + if err != nil { + t.Fatalf("list bookmarks: %v", err) + } + if len(bm) != 2 { + t.Fatalf("expected 2 bookmarks, got %d", len(bm)) + } + if bm[0].ID != id2 || bm[1].ID != id1 { + t.Fatalf("bookmark order wrong: %d then %d", bm[0].ID, bm[1].ID) + } + if n, _ := CountBookmarks(sub); n != 2 { + t.Fatalf("count bookmarks = %d, want 2", n) + } +} + +func TestUserStoryState_ClearRemovesRow(t *testing.T) { + setupTestDB(t) + id := seedStory(t, "s1") + const sub = "ak-sub-1" + + if err := SetRead(sub, id, true); err != nil { + t.Fatalf("set read: %v", err) + } + if err := SetRead(sub, id, false); err != nil { + t.Fatalf("unset read: %v", err) + } + // Row should be gone since neither flag is set. + var n int + if err := Get().QueryRow(`SELECT COUNT(*) FROM user_story_state WHERE user_sub = ?`, sub).Scan(&n); err != nil { + t.Fatalf("count rows: %v", err) + } + if n != 0 { + t.Fatalf("expected row pruned, found %d", n) + } + + // Setting read then bookmark then clearing only read must keep the row. + _ = SetRead(sub, id, true) + _ = SetBookmark(sub, id, true) + _ = SetRead(sub, id, false) + read, marks, _ := UserStoryState(sub, []int64{id}) + if read[id] { + t.Fatalf("expected not read") + } + if !marks[id] { + t.Fatalf("expected still bookmarked after clearing read") + } +} + +func TestUserStoryState_ScopedBySub(t *testing.T) { + setupTestDB(t) + id := seedStory(t, "s1") + _ = SetBookmark("user-a", id, true) + + read, marks, _ := UserStoryState("user-b", []int64{id}) + if len(read) != 0 || len(marks) != 0 { + t.Fatalf("user-b should see no state, got read=%v marks=%v", read, marks) + } + if n, _ := CountBookmarks("user-b"); n != 0 { + t.Fatalf("user-b count = %d, want 0", n) + } +} diff --git a/internal/web/feed.go b/internal/web/feed.go new file mode 100644 index 0000000..2bd03b3 --- /dev/null +++ b/internal/web/feed.go @@ -0,0 +1,303 @@ +package web + +import ( + "encoding/json" + "encoding/xml" + "log/slog" + "net/http" + "strings" + "time" + + "pete/internal/storage" +) + +// feedItemLimit caps how many stories each outbound feed carries. +const feedItemLimit = 50 + +// feedCacheControl is a short cache window; feeds refresh a few times an hour. +const feedCacheControl = "public, max-age=300" + +const ( + rssContentNS = "http://purl.org/rss/1.0/modules/content/" + rssAtomNS = "http://www.w3.org/2005/Atom" + jsonFeedVer = "https://jsonfeed.org/version/1.1" +) + +// --- RSS 2.0 --- + +type rssFeedXML struct { + XMLName xml.Name `xml:"rss"` + Version string `xml:"version,attr"` + ContentNS string `xml:"xmlns:content,attr"` + AtomNS string `xml:"xmlns:atom,attr"` + Channel rssChannel `xml:"channel"` +} + +type rssChannel struct { + Title string `xml:"title"` + Link string `xml:"link"` + Description string `xml:"description"` + Language string `xml:"language,omitempty"` + LastBuildDate string `xml:"lastBuildDate,omitempty"` + Generator string `xml:"generator,omitempty"` + AtomLink rssAtomLink `xml:"atom:link"` + Items []rssItem `xml:"item"` +} + +type rssAtomLink struct { + Href string `xml:"href,attr"` + Rel string `xml:"rel,attr"` + Type string `xml:"type,attr"` +} + +type rssItem struct { + Title string `xml:"title"` + Link string `xml:"link"` + GUID rssGUID `xml:"guid"` + PubDate string `xml:"pubDate,omitempty"` + Category string `xml:"category,omitempty"` + Description string `xml:"description"` + Content *rssContent `xml:"content:encoded,omitempty"` +} + +type rssGUID struct { + IsPermaLink string `xml:"isPermaLink,attr"` + Value string `xml:",chardata"` +} + +type rssContent struct { + Value string `xml:",cdata"` +} + +// --- JSON Feed 1.1 --- + +type jsonFeed struct { + Version string `json:"version"` + Title string `json:"title"` + HomePageURL string `json:"home_page_url"` + FeedURL string `json:"feed_url"` + Description string `json:"description,omitempty"` + Items []jsonFeedItem `json:"items"` +} + +type jsonFeedItem struct { + ID string `json:"id"` + URL string `json:"url"` + Title string `json:"title"` + ContentText string `json:"content_text,omitempty"` + Summary string `json:"summary,omitempty"` + Image string `json:"image,omitempty"` + DatePublished string `json:"date_published,omitempty"` + Authors []jsonFeedAuthor `json:"authors,omitempty"` + Tags []string `json:"tags,omitempty"` +} + +type jsonFeedAuthor struct { + Name string `json:"name"` +} + +// handleFeedXML serves an RSS 2.0 feed for the given channel ("" = all channels). +func (s *Server) handleFeedXML(w http.ResponseWriter, r *http.Request, channel string) { + stories, err := storage.ListForFeed(channel, feedItemLimit) + if err != nil { + slog.Error("web: feed query failed", "channel", channel, "err", err) + http.Error(w, "internal error", http.StatusInternalServerError) + return + } + + base := s.publicBase(r) + title, homeURL, desc := s.feedMeta(channel, base) + selfURL := base + feedPath(channel, "xml") + + feed := rssFeedXML{ + Version: "2.0", + ContentNS: rssContentNS, + AtomNS: rssAtomNS, + Channel: rssChannel{ + Title: title, + Link: homeURL, + Description: desc, + Language: "en", + Generator: "Pete", + AtomLink: rssAtomLink{Href: selfURL, Rel: "self", Type: "application/rss+xml"}, + Items: make([]rssItem, 0, len(stories)), + }, + } + if len(stories) > 0 { + feed.Channel.LastBuildDate = feedTime(stories[0]).UTC().Format(time.RFC1123Z) + } + for _, st := range stories { + link := storyLink(st) + item := rssItem{ + Title: st.Headline, + Link: link, + GUID: rssGUID{IsPermaLink: "false", Value: st.GUID}, + PubDate: feedTime(st).UTC().Format(time.RFC1123Z), + Category: st.Channel, + Description: st.Lede, + } + if html := contentToHTML(st.Content); html != "" { + item.Content = &rssContent{Value: html} + } + feed.Channel.Items = append(feed.Channel.Items, item) + } + + w.Header().Set("Content-Type", "application/rss+xml; charset=utf-8") + w.Header().Set("Cache-Control", feedCacheControl) + if _, err := w.Write([]byte(xml.Header)); err != nil { + return + } + enc := xml.NewEncoder(w) + enc.Indent("", " ") + if err := enc.Encode(feed); err != nil { + slog.Error("web: rss encode failed", "err", err) + } +} + +// handleFeedJSON serves a JSON Feed 1.1 for the given channel ("" = all). +func (s *Server) handleFeedJSON(w http.ResponseWriter, r *http.Request, channel string) { + stories, err := storage.ListForFeed(channel, feedItemLimit) + if err != nil { + slog.Error("web: feed query failed", "channel", channel, "err", err) + http.Error(w, "internal error", http.StatusInternalServerError) + return + } + + base := s.publicBase(r) + title, homeURL, desc := s.feedMeta(channel, base) + + feed := jsonFeed{ + Version: jsonFeedVer, + Title: title, + HomePageURL: homeURL, + FeedURL: base + feedPath(channel, "json"), + Description: desc, + Items: make([]jsonFeedItem, 0, len(stories)), + } + for _, st := range stories { + item := jsonFeedItem{ + ID: st.GUID, + URL: storyLink(st), + Title: st.Headline, + ContentText: strings.TrimSpace(st.Content), + Summary: st.Lede, + Image: st.ImageURL, + DatePublished: feedTime(st).UTC().Format(time.RFC3339), + Tags: []string{st.Channel}, + } + if item.ContentText == "" { + item.ContentText = st.Lede + } + if st.Source != "" { + item.Authors = []jsonFeedAuthor{{Name: st.Source}} + } + feed.Items = append(feed.Items, item) + } + + w.Header().Set("Content-Type", "application/feed+json; charset=utf-8") + w.Header().Set("Cache-Control", feedCacheControl) + enc := json.NewEncoder(w) + enc.SetIndent("", " ") + if err := enc.Encode(feed); err != nil { + slog.Error("web: json feed encode failed", "err", err) + } +} + +// feedMeta returns the title, home-page URL, and description for a feed. An +// empty channel is the site-wide feed; a slug scopes to that channel. +func (s *Server) feedMeta(channel, base string) (title, homeURL, desc string) { + site := s.cfg.SiteTitle + if site == "" { + site = "Pete" + } + if channel == "" { + return site, base + "/", "The latest across every channel." + } + ch := channelBySlug(channel) + return site + " — " + ch.Title, base + "/" + channel, ch.Blurb +} + +// feedPath is the site-relative path of a feed, e.g. "/feed.xml" or +// "/gaming/feed.json". +func feedPath(channel, ext string) string { + if channel == "" { + return "/feed." + ext + } + return "/" + channel + "/feed." + ext +} + +// storyLink is the canonical outbound link for a story: its canonical URL when +// known, otherwise the raw article URL. +func storyLink(s storage.Story) string { + if s.URLCanonical != "" { + return s.URLCanonical + } + return s.ArticleURL +} + +// feedTime picks the best timestamp for a story: its published date when +// present, otherwise when Pete first saw it. +func feedTime(s storage.Story) time.Time { + if s.PublishedAt > 0 { + return time.Unix(s.PublishedAt, 0) + } + return time.Unix(s.SeenAt, 0) +} + +// channelBySlug looks up a channel by slug, falling back to a bare title-cased +// entry so an unknown slug never panics. +func channelBySlug(slug string) Channel { + for _, ch := range channels { + if ch.Slug == slug { + return ch + } + } + return Channel{Slug: slug, Title: slug, Theme: slug} +} + +// publicBase returns the site's public origin (scheme://host, no trailing +// slash). It prefers the configured base_url and falls back to the request's +// host so feeds still carry absolute URLs when base_url is unset. +func (s *Server) publicBase(r *http.Request) string { + if b := strings.TrimRight(s.cfg.BaseURL, "/"); b != "" { + return b + } + scheme := "http" + if r.TLS != nil || strings.EqualFold(r.Header.Get("X-Forwarded-Proto"), "https") { + scheme = "https" + } + return scheme + "://" + r.Host +} + +// contentToHTML turns Pete's stored plain-text article body (paragraphs split by +// blank lines, soft line breaks inside) into simple, escaped HTML for RSS +// content:encoded. Returns "" when there is no body. +func contentToHTML(text string) string { + text = strings.TrimSpace(text) + if text == "" { + return "" + } + var b strings.Builder + for _, para := range strings.Split(text, "\n\n") { + para = strings.TrimSpace(para) + if para == "" { + continue + } + b.WriteString("

") + b.WriteString(strings.ReplaceAll(escapeHTMLText(para), "\n", "
")) + b.WriteString("

") + } + return b.String() +} + +// escapeHTMLText escapes the five characters that matter inside HTML text so the +// article body can't inject markup into content:encoded. +func escapeHTMLText(s string) string { + return strings.NewReplacer( + "&", "&", + "<", "<", + ">", ">", + `"`, """, + "'", "'", + ).Replace(s) +} diff --git a/internal/web/feed_test.go b/internal/web/feed_test.go new file mode 100644 index 0000000..615f5e5 --- /dev/null +++ b/internal/web/feed_test.go @@ -0,0 +1,210 @@ +package web + +import ( + "encoding/json" + "encoding/xml" + "net/http/httptest" + "path/filepath" + "strings" + "testing" + "time" + + "pete/internal/config" + "pete/internal/storage" +) + +// TestFeeds exercises the outbound RSS and JSON feeds end to end: a classified +// story appears in both formats, carrying its canonical link, full content, and +// a real pubDate; a channel-scoped feed excludes stories from other channels. +func TestFeeds(t *testing.T) { + storage.Close() + if err := storage.Init(filepath.Join(t.TempDir(), "feed.db")); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { storage.Close() }) + + pub := time.Date(2026, 3, 1, 12, 0, 0, 0, time.UTC).Unix() + tech := &storage.Story{ + GUID: "feed-tech-1", + Headline: "Chips & Dips: A Tech Tale", + Lede: "The lede for the tech story.", + Content: "First paragraph.\n\nSecond paragraph with & symbols.", + ArticleURL: "https://example.com/tech/story?utm=x", + URLCanonical: "https://example.com/tech/story", + Source: "Example Wire", + Channel: "tech", + Classified: true, + SeenAt: time.Now().Unix(), + PublishedAt: pub, + } + gaming := &storage.Story{ + GUID: "feed-gaming-1", + Headline: "A Gaming Headline", + Lede: "Gaming lede.", + ArticleURL: "https://example.com/gaming/story", + Source: "Play Wire", + Channel: "gaming", + Classified: true, + SeenAt: time.Now().Unix(), + } + for _, st := range []*storage.Story{tech, gaming} { + if err := storage.InsertStory(st); err != nil { + t.Fatal(err) + } + } + + s, err := New(config.WebConfig{SiteTitle: "Pete", ListenAddr: ":0", BaseURL: "https://news.example/"}, nil, true) + if err != nil { + t.Fatal(err) + } + + // --- Site-wide RSS --- + rw := httptest.NewRecorder() + s.handleFeedXML(rw, httptest.NewRequest("GET", "/feed.xml", nil), "") + if rw.Code != 200 { + t.Fatalf("rss status = %d", rw.Code) + } + if ct := rw.Header().Get("Content-Type"); !strings.HasPrefix(ct, "application/rss+xml") { + t.Errorf("rss content-type = %q", ct) + } + var rss struct { + Channel struct { + Title string `xml:"title"` + AtomLink struct { + Href string `xml:"href,attr"` + } `xml:"link"` + Items []struct { + Title string `xml:"title"` + Link string `xml:"link"` + GUID string `xml:"guid"` + PubDate string `xml:"pubDate"` + Content string `xml:"encoded"` // content:encoded + } `xml:"item"` + } `xml:"channel"` + } + if err := xml.Unmarshal(rw.Body.Bytes(), &rss); err != nil { + t.Fatalf("rss did not parse as XML: %v\n%s", err, rw.Body.String()) + } + if len(rss.Channel.Items) != 2 { + t.Fatalf("rss items = %d, want 2", len(rss.Channel.Items)) + } + // Newest-first: PublishedAt March 2026 vs gaming's seen_at (now) — gaming is + // newer, so it sorts first. Find the tech item to assert on. + var techItem *struct { + Title string `xml:"title"` + Link string `xml:"link"` + GUID string `xml:"guid"` + PubDate string `xml:"pubDate"` + Content string `xml:"encoded"` + } + for i := range rss.Channel.Items { + if rss.Channel.Items[i].GUID == "feed-tech-1" { + techItem = &rss.Channel.Items[i] + } + } + if techItem == nil { + t.Fatal("tech item missing from rss") + } + if techItem.Link != "https://example.com/tech/story" { + t.Errorf("rss link = %q, want canonical", techItem.Link) + } + if techItem.Title != "Chips & Dips: A Tech Tale" { + t.Errorf("rss title = %q", techItem.Title) + } + if !strings.Contains(techItem.Content, "

First paragraph.

") { + t.Errorf("rss content missing paragraph markup: %q", techItem.Content) + } + if !strings.Contains(techItem.Content, "<html>") { + t.Errorf("rss content did not escape embedded markup: %q", techItem.Content) + } + if !strings.Contains(techItem.PubDate, "2026") { + t.Errorf("rss pubDate = %q, want the published date", techItem.PubDate) + } + if !strings.Contains(rw.Body.String(), `href="https://news.example/feed.xml"`) { + t.Errorf("rss missing atom self link with base_url") + } + + // --- Site-wide JSON Feed --- + rw = httptest.NewRecorder() + s.handleFeedJSON(rw, httptest.NewRequest("GET", "/feed.json", nil), "") + if rw.Code != 200 { + t.Fatalf("json status = %d", rw.Code) + } + if ct := rw.Header().Get("Content-Type"); !strings.HasPrefix(ct, "application/feed+json") { + t.Errorf("json content-type = %q", ct) + } + var jf struct { + Version string `json:"version"` + FeedURL string `json:"feed_url"` + HomePageURL string `json:"home_page_url"` + Items []struct { + ID string `json:"id"` + URL string `json:"url"` + Title string `json:"title"` + ContentText string `json:"content_text"` + Tags []string `json:"tags"` + Authors []struct { + Name string `json:"name"` + } `json:"authors"` + } `json:"items"` + } + if err := json.Unmarshal(rw.Body.Bytes(), &jf); err != nil { + t.Fatalf("json feed did not parse: %v", err) + } + if !strings.Contains(jf.Version, "jsonfeed.org") { + t.Errorf("json version = %q", jf.Version) + } + if jf.FeedURL != "https://news.example/feed.json" { + t.Errorf("json feed_url = %q", jf.FeedURL) + } + if len(jf.Items) != 2 { + t.Fatalf("json items = %d, want 2", len(jf.Items)) + } + var jTech *struct { + ID string `json:"id"` + URL string `json:"url"` + Title string `json:"title"` + ContentText string `json:"content_text"` + Tags []string `json:"tags"` + Authors []struct { + Name string `json:"name"` + } `json:"authors"` + } + for i := range jf.Items { + if jf.Items[i].ID == "feed-tech-1" { + jTech = &jf.Items[i] + } + } + if jTech == nil { + t.Fatal("tech item missing from json feed") + } + if jTech.URL != "https://example.com/tech/story" { + t.Errorf("json url = %q, want canonical", jTech.URL) + } + if !strings.Contains(jTech.ContentText, "Second paragraph") { + t.Errorf("json content_text = %q", jTech.ContentText) + } + if len(jTech.Tags) != 1 || jTech.Tags[0] != "tech" { + t.Errorf("json tags = %v", jTech.Tags) + } + if len(jTech.Authors) != 1 || jTech.Authors[0].Name != "Example Wire" { + t.Errorf("json authors = %v", jTech.Authors) + } + + // --- Channel-scoped RSS excludes other channels --- + rw = httptest.NewRecorder() + s.handleFeedXML(rw, httptest.NewRequest("GET", "/tech/feed.xml", nil), "tech") + rss.Channel.Items = nil // xml.Unmarshal appends; clear the site-wide items + if err := xml.Unmarshal(rw.Body.Bytes(), &rss); err != nil { + t.Fatalf("channel rss parse: %v", err) + } + if len(rss.Channel.Items) != 1 { + t.Fatalf("channel rss items = %d, want 1", len(rss.Channel.Items)) + } + if rss.Channel.Items[0].GUID != "feed-tech-1" { + t.Errorf("channel rss wrong item: %q", rss.Channel.Items[0].GUID) + } + if !strings.Contains(rss.Channel.Title, "Tech") { + t.Errorf("channel rss title = %q, want channel name", rss.Channel.Title) + } +} diff --git a/internal/web/handlers.go b/internal/web/handlers.go index e4b3bf7..51e9acc 100644 --- a/internal/web/handlers.go +++ b/internal/web/handlers.go @@ -45,16 +45,20 @@ func toView(s storage.Story) StoryView { } type pageData struct { - SiteTitle string - Channels []Channel - Active string // slug of active channel, "" for landing - Weather Weather - Phase string // when set, forces day/dawn/dusk/night and disables the clock-driven phase JS - AllSources template.JS // JSON array of {name, channel} for the settings panel - AuthEnabled bool // sign-in is available - User *SessionUser // nil for anonymous visitors - UserPrefs template.JS // signed-in user's stored prefs blob (JSON), or "null" - Path string // current request path, for post-login return + SiteTitle string + Channels []Channel + Active string // slug of active channel, "" for landing + Weather Weather + Phase string // when set, forces day/dawn/dusk/night and disables the clock-driven phase JS + AllSources template.JS // JSON array of {name, channel} for the settings panel + AuthEnabled bool // sign-in is available + User *SessionUser // nil for anonymous visitors + UserPrefs template.JS // signed-in user's stored prefs blob (JSON), or "null" + Path string // current request path, for post-login return + PostingEnabled bool // false = web-only mode; hide Matrix-posting UI + IsAdmin bool // signed-in user is on the admin allowlist (shows /status link) + PushEnabled bool // Web Push is configured (shows the notifications toggle to signed-in users) + PushPublicKey string // VAPID public key handed to the client to subscribe } type channelPage struct { @@ -74,6 +78,7 @@ type indexPage struct { JustPosted []StoryView Stats []channelStat Latest []StoryView + ForYou []StoryView // personalized rail; empty for anon / no-history users } type channelStat struct { @@ -105,17 +110,21 @@ func (s *Server) base(r *http.Request) pageData { srcJSON = []byte("[]") } d := pageData{ - SiteTitle: s.cfg.SiteTitle, - Channels: channels, - Weather: currentWeather(time.Now()), - AllSources: jsForScript(srcJSON), - AuthEnabled: s.auth != nil, - UserPrefs: template.JS("null"), - Path: r.URL.Path, + SiteTitle: s.cfg.SiteTitle, + Channels: channels, + Weather: currentWeather(time.Now()), + AllSources: jsForScript(srcJSON), + AuthEnabled: s.auth != nil, + UserPrefs: template.JS("null"), + Path: r.URL.Path, + PostingEnabled: s.postingEnabled, + PushEnabled: s.auth != nil && s.cfg.Push.Enabled, + PushPublicKey: s.cfg.Push.VAPIDPublicKey, } if s.auth != nil { if u := s.auth.userFromRequest(r); u != nil { d.User = u + d.IsAdmin = s.adminSubs[u.Sub] if blob, err := storage.GetUserPrefs(u.Sub); err == nil && blob != "" { d.UserPrefs = jsForScript([]byte(blob)) } @@ -176,9 +185,54 @@ func (s *Server) handleIndex(w http.ResponseWriter, r *http.Request) { Stats: stats, Latest: latest, } + // For signed-in users with some read/bookmark history, lead with a small + // personalized rail. ForYou returns nothing for anon / no-history users, so + // the section simply doesn't render for them. + if s.auth != nil { + if u := s.auth.userFromRequest(r); u != nil { + const forYouLimit = 8 + if fy, err := storage.ForYou(u.Sub, forYouLimit); err != nil { + slog.Error("web: for-you rail failed", "sub", u.Sub, "err", err) + } else { + for _, row := range fy { + data.ForYou = append(data.ForYou, toView(row)) + } + } + } + } s.render(w, "index", data) } +type forYouPage struct { + pageData + Stories []StoryView +} + +// handleForYou renders the dedicated personalized feed. Anonymous visitors are +// sent to sign-in (the route is only registered when auth is on). +func (s *Server) handleForYou(w http.ResponseWriter, r *http.Request) { + u := s.auth.userFromRequest(r) + if u == nil { + http.Redirect(w, r, "/auth/login?next=/for-you", http.StatusSeeOther) + return + } + s.track(r, "for-you") + const limit = 30 + rows, err := storage.ForYou(u.Sub, limit) + if err != nil { + slog.Error("web: for-you page failed", "sub", u.Sub, "err", err) + http.Error(w, "internal error", http.StatusInternalServerError) + return + } + views := make([]StoryView, 0, len(rows)) + for _, row := range rows { + views = append(views, toView(row)) + } + base := s.base(r) + base.Active = "for-you" + s.render(w, "for-you", forYouPage{pageData: base, Stories: views}) +} + func (s *Server) handleChannel(w http.ResponseWriter, r *http.Request, ch Channel) { s.track(r, ch.Slug) page := 1 @@ -220,6 +274,64 @@ func (s *Server) handleChannel(w http.ResponseWriter, r *http.Request, ch Channe s.render(w, "channel", data) } +type bookmarksPage struct { + pageData + Stories []StoryView + Page int + HasPrev bool + HasNext bool + PrevURL string + NextURL string + Total int +} + +// handleBookmarks lists the signed-in user's bookmarked stories. Anonymous +// visitors are sent to sign-in (the route is only registered when auth is on). +func (s *Server) handleBookmarks(w http.ResponseWriter, r *http.Request) { + u := s.auth.userFromRequest(r) + if u == nil { + http.Redirect(w, r, "/auth/login?next=/bookmarks", http.StatusSeeOther) + return + } + s.track(r, "bookmarks") + page := 1 + if p := r.URL.Query().Get("page"); p != "" { + if n, err := strconv.Atoi(p); err == nil && n > 0 { + page = n + } + } + offset := (page - 1) * pageSize + rows, err := storage.ListBookmarks(u.Sub, pageSize+1, offset) + if err != nil { + slog.Error("web: list bookmarks failed", "sub", u.Sub, "err", err) + http.Error(w, "internal error", http.StatusInternalServerError) + return + } + hasNext := len(rows) > pageSize + if hasNext { + rows = rows[:pageSize] + } + views := make([]StoryView, 0, len(rows)) + for _, row := range rows { + views = append(views, toView(row)) + } + total, _ := storage.CountBookmarks(u.Sub) + + base := s.base(r) + base.Active = "bookmarks" + data := bookmarksPage{ + pageData: base, + Stories: views, + Page: page, + HasPrev: page > 1, + HasNext: hasNext, + PrevURL: fmt.Sprintf("/bookmarks?page=%d", page-1), + NextURL: fmt.Sprintf("/bookmarks?page=%d", page+1), + Total: total, + } + s.render(w, "bookmarks", data) +} + var ( demoVariants = []string{"rain", "petals", "jacaranda", "motes", "leaves", "clear", "clouds", "snow", "fog", "storm"} demoIntensities = []string{"light", "medium", "heavy"} @@ -309,6 +421,12 @@ func (s *Server) handleSearch(w http.ResponseWriter, r *http.Request) { http.Error(w, "internal error", http.StatusInternalServerError) return } + _ = json.NewEncoder(w).Encode(map[string]any{"results": toSearchResults(rows)}) +} + +// toSearchResults maps stories to the JSON shape shared by /api/search and +// /api/related, resolving each story's channel to its display metadata. +func toSearchResults(rows []storage.Story) []searchResult { channelByName := make(map[string]Channel, len(channels)) for _, ch := range channels { channelByName[ch.Slug] = ch @@ -333,7 +451,50 @@ func (s *Server) handleSearch(w http.ResponseWriter, r *http.Request) { Posted: row.Posted, }) } - _ = json.NewEncoder(w).Encode(map[string]any{"results": results}) + return results +} + +// handleRelated returns stories textually similar to a given story, for the +// "You might also like" rail in reader mode. It is public (reader mode works +// for anonymous visitors too); for signed-in users it drops already-read +// stories so recommendations stay fresh. +func (s *Server) handleRelated(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.Header().Set("Cache-Control", "no-store") + id, err := strconv.ParseInt(strings.TrimSpace(r.URL.Query().Get("id")), 10, 64) + if err != nil || id <= 0 { + http.Error(w, `{"error":"bad id"}`, http.StatusBadRequest) + return + } + const relatedLimit = 6 + // Over-fetch so dropping already-read stories doesn't starve the rail. + rows, err := storage.RelatedStories(id, relatedLimit*2) + if err != nil { + slog.Error("web: related failed", "id", id, "err", err) + http.Error(w, `{"error":"internal error"}`, http.StatusInternalServerError) + return + } + if s.auth != nil && len(rows) > 0 { + if u := s.auth.userFromRequest(r); u != nil { + ids := make([]int64, 0, len(rows)) + for _, row := range rows { + ids = append(ids, row.ID) + } + if read, _, err := storage.UserStoryState(u.Sub, ids); err == nil { + kept := rows[:0] + for _, row := range rows { + if !read[row.ID] { + kept = append(kept, row) + } + } + rows = kept + } + } + } + if len(rows) > relatedLimit { + rows = rows[:relatedLimit] + } + _ = json.NewEncoder(w).Encode(map[string]any{"results": toSearchResults(rows)}) } // handleArticle serves the stored full text of a single story for reader mode. diff --git a/internal/web/push_sender.go b/internal/web/push_sender.go new file mode 100644 index 0000000..35d6657 --- /dev/null +++ b/internal/web/push_sender.go @@ -0,0 +1,199 @@ +package web + +import ( + "context" + "encoding/json" + "fmt" + "log/slog" + "time" + + "pete/internal/storage" + + webpush "github.com/SherClockHolmes/webpush-go" +) + +// digestScan caps how many new stories the sender inspects per subscriber in one +// pass. Well past MinStories; the digest only needs a count and one headline. +const digestScan = 60 + +// runPushSender periodically builds and delivers a "N new stories" digest to +// each subscriber, respecting their disabled-sources preference. It's started +// only when push is configured. Best-effort throughout: a failed send never +// stops the loop, and a permanently-gone endpoint is pruned. +func (s *Server) runPushSender(ctx context.Context) { + interval := time.Duration(s.cfg.Push.IntervalMinutes) * time.Minute + if interval <= 0 { + interval = 6 * time.Hour + } + slog.Info("web: push digest sender started", "interval", interval, "min_stories", s.cfg.Push.MinStories) + ticker := time.NewTicker(interval) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + s.sendDigests() + } + } +} + +// sendDigests walks every subscription once, notifying those with enough new +// stories since their last digest. +func (s *Server) sendDigests() { + subs, err := storage.ListPushSubscriptions() + if err != nil { + slog.Error("push: list subscriptions failed", "err", err) + return + } + if len(subs) == 0 { + return + } + now := time.Now().Unix() + // Disabled-source sets are per user; cache within a pass so a user with + // several devices only parses prefs once. + disabledByUser := make(map[string]map[string]bool) + sent, pruned := 0, 0 + + for _, sub := range subs { + stories, err := storage.NewClassifiedSince(sub.LastNotifiedAt, digestScan) + if err != nil { + slog.Error("push: scan new stories failed", "sub", sub.UserSub, "err", err) + continue + } + if len(stories) == 0 { + continue + } + disabled, ok := disabledByUser[sub.UserSub] + if !ok { + disabled = disabledSourcesFor(sub.UserSub) + disabledByUser[sub.UserSub] = disabled + } + count, top := 0, "" + for _, st := range stories { + if disabled[st.Source] { + continue + } + if count == 0 { + top = st.Headline + } + count++ + } + if count < s.cfg.Push.MinStories { + continue + } + + payload := buildDigestPayload(count, top) + gone, err := s.sendPush(sub, payload) + if gone { + if derr := storage.RemovePushSubscription(sub.Endpoint); derr != nil { + slog.Error("push: prune gone subscription failed", "err", derr) + } else { + pruned++ + } + continue + } + if err != nil { + slog.Warn("push: send failed", "sub", sub.UserSub, "err", err) + continue + } + if derr := storage.TouchPushSubscription(sub.Endpoint, now); derr != nil { + slog.Error("push: advance watermark failed", "err", derr) + } + sent++ + } + if sent > 0 || pruned > 0 { + slog.Info("push: digest pass complete", "sent", sent, "pruned", pruned, "subscriptions", len(subs)) + } +} + +// buildDigestPayload renders the notification JSON the service worker expects. +func buildDigestPayload(count int, top string) []byte { + body := fmt.Sprintf("%d new stories", count) + if count == 1 { + body = "1 new story" + } + if top != "" { + body += " — " + top + } + b, _ := json.Marshal(map[string]string{ + "title": "Pete has fresh news", + "body": body, + "url": "/", + "tag": "pete-digest", + }) + return b +} + +// sendPush encrypts and delivers one notification. It reports gone=true when the +// push service says the endpoint no longer exists (404/410) so the caller can +// prune it; err is set for other, likely-transient failures. +func (s *Server) sendPush(sub storage.PushSubscription, payload []byte) (gone bool, err error) { + resp, err := webpush.SendNotification(payload, &webpush.Subscription{ + Endpoint: sub.Endpoint, + Keys: webpush.Keys{P256dh: sub.P256dh, Auth: sub.Auth}, + }, &webpush.Options{ + Subscriber: s.cfg.Push.Subject, + VAPIDPublicKey: s.cfg.Push.VAPIDPublicKey, + VAPIDPrivateKey: s.cfg.Push.VAPIDPrivateKey, + TTL: 24 * 60 * 60, + Urgency: webpush.UrgencyNormal, + }) + if err != nil { + return false, err + } + defer resp.Body.Close() + if resp.StatusCode == 404 || resp.StatusCode == 410 { + return true, nil + } + if resp.StatusCode >= 400 { + return false, fmt.Errorf("push service returned %d", resp.StatusCode) + } + return false, nil +} + +// disabledSourcesFor returns the set of source names a user has hidden, read +// from their stored prefs blob. The blob mirrors localStorage: a JSON object +// whose "pete.disabledSources.v1" value is itself a JSON string encoding a +// {sourceName: true} map. Any parse failure yields an empty (deny-nothing) set. +func disabledSourcesFor(sub string) map[string]bool { + out := map[string]bool{} + blob, err := storage.GetUserPrefs(sub) + if err != nil || blob == "" { + return out + } + var prefs map[string]json.RawMessage + if err := json.Unmarshal([]byte(blob), &prefs); err != nil { + return out + } + raw, ok := prefs["pete.disabledSources.v1"] + if !ok { + return out + } + // The value is normally a JSON *string* containing JSON; unwrap that first, + // but tolerate a bare object too. + inner := []byte(raw) + var asStr string + if err := json.Unmarshal(raw, &asStr); err == nil { + inner = []byte(asStr) + } + var set map[string]bool + if err := json.Unmarshal(inner, &set); err != nil { + return out + } + for name, on := range set { + if on { + out[name] = true + } + } + return out +} + +// StartPushSender launches the digest loop if push is enabled. Safe to call +// unconditionally; it's a no-op when push is off. +func (s *Server) StartPushSender(ctx context.Context) { + if !s.cfg.Push.Enabled || s.auth == nil { + return + } + go s.runPushSender(ctx) +} diff --git a/internal/web/push_sender_test.go b/internal/web/push_sender_test.go new file mode 100644 index 0000000..a6083d2 --- /dev/null +++ b/internal/web/push_sender_test.go @@ -0,0 +1,58 @@ +package web + +import ( + "path/filepath" + "strings" + "testing" + + "pete/internal/storage" +) + +func TestDisabledSourcesFor(t *testing.T) { + storage.Close() + if err := storage.Init(filepath.Join(t.TempDir(), "push.db")); err != nil { + t.Fatal(err) + } + t.Cleanup(func() { storage.Close() }) + + // The stored blob mirrors localStorage: the disabledSources value is itself a + // JSON *string* encoding a {source: true} map (see prefs.js snapshot()). + blob := `{"pete.disabledSources.v1":"{\"Feed A\":true,\"Feed B\":false}","pete.weather.loc.v1":"1000-100"}` + if err := storage.PutUserPrefs("sub-1", blob, "u", "u@x"); err != nil { + t.Fatal(err) + } + + got := disabledSourcesFor("sub-1") + if !got["Feed A"] { + t.Error("Feed A should be disabled") + } + if got["Feed B"] { + t.Error("Feed B is false in prefs and must not be treated as disabled") + } + if len(got) != 1 { + t.Errorf("disabled set = %v, want just {Feed A}", got) + } + + // A user with no prefs disables nothing. + if len(disabledSourcesFor("nobody")) != 0 { + t.Error("unknown user should have an empty disabled set") + } +} + +func TestBuildDigestPayload(t *testing.T) { + single := string(buildDigestPayload(1, "Only Story")) + if !strings.Contains(single, "1 new story") || strings.Contains(single, "1 new stories") { + t.Errorf("singular wording wrong: %s", single) + } + if !strings.Contains(single, "Only Story") { + t.Errorf("top headline missing: %s", single) + } + + many := string(buildDigestPayload(7, "Big One")) + if !strings.Contains(many, "7 new stories") || !strings.Contains(many, "Big One") { + t.Errorf("plural payload wrong: %s", many) + } + if !strings.Contains(many, `"tag":"pete-digest"`) { + t.Errorf("expected digest tag in payload: %s", many) + } +} diff --git a/internal/web/pwa.go b/internal/web/pwa.go new file mode 100644 index 0000000..68d9006 --- /dev/null +++ b/internal/web/pwa.go @@ -0,0 +1,106 @@ +package web + +import ( + "io/fs" + "log/slog" + "net/http" + + "pete/internal/storage" +) + +// maxPushBodyBytes caps a subscription payload. A PushSubscription JSON is an +// endpoint URL plus two short base64 keys — a few hundred bytes — so 4 KiB is +// generous headroom for long endpoint URLs. +const maxPushBodyBytes = 4096 + +// handlePushSubscribe stores the caller's Web Push subscription. The body is the +// browser's PushSubscription.toJSON() shape: {endpoint, keys:{p256dh, auth}}. +func (s *Server) handlePushSubscribe(w http.ResponseWriter, r *http.Request) { + u := s.requireUser(w, r) + if u == nil { + return + } + if !s.cfg.Push.Enabled { + http.Error(w, `{"error":"push disabled"}`, http.StatusNotFound) + return + } + var req struct { + Endpoint string `json:"endpoint"` + Keys struct { + P256dh string `json:"p256dh"` + Auth string `json:"auth"` + } `json:"keys"` + } + if !decodeStateBodyN(w, r, &req, maxPushBodyBytes) { + return + } + if req.Endpoint == "" || req.Keys.P256dh == "" || req.Keys.Auth == "" { + http.Error(w, `{"error":"incomplete subscription"}`, http.StatusBadRequest) + return + } + if err := storage.AddPushSubscription(u.Sub, req.Endpoint, req.Keys.P256dh, req.Keys.Auth); err != nil { + slog.Error("push: subscribe failed", "sub", u.Sub, "err", err) + http.Error(w, `{"error":"internal error"}`, http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusNoContent) +} + +// handlePushUnsubscribe drops a stored subscription by endpoint. It doesn't +// require the endpoint to belong to the caller beyond being signed in; the +// endpoint is an unguessable capability URL, and dropping a stale one is benign. +func (s *Server) handlePushUnsubscribe(w http.ResponseWriter, r *http.Request) { + u := s.requireUser(w, r) + if u == nil { + return + } + var req struct { + Endpoint string `json:"endpoint"` + } + if !decodeStateBodyN(w, r, &req, maxPushBodyBytes) { + return + } + if req.Endpoint == "" { + http.Error(w, `{"error":"missing endpoint"}`, http.StatusBadRequest) + return + } + if err := storage.RemovePushSubscription(req.Endpoint); err != nil { + slog.Error("push: unsubscribe failed", "sub", u.Sub, "err", err) + http.Error(w, `{"error":"internal error"}`, http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusNoContent) +} + +// handleManifest serves the web app manifest from the embedded static tree. It +// lives at the root so the installable scope covers the whole origin. +func (s *Server) handleManifest(w http.ResponseWriter, r *http.Request) { + s.serveEmbedded(w, r, "manifest.webmanifest", "application/manifest+json; charset=utf-8", "public, max-age=3600") +} + +// handleServiceWorker serves /sw.js from the root. Serving it here rather than +// under /static/ lets its scope be the whole origin (a worker's default scope +// is its own path), and we set Service-Worker-Allowed as a belt-and-braces in +// case it's ever moved. no-cache keeps updated workers from being pinned by the +// HTTP cache — the browser still byte-compares to decide whether to install. +func (s *Server) handleServiceWorker(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Service-Worker-Allowed", "/") + s.serveEmbedded(w, r, "sw.js", "text/javascript; charset=utf-8", "no-cache") +} + +// serveEmbedded writes a file from the embedded static FS with explicit headers. +func (s *Server) serveEmbedded(w http.ResponseWriter, _ *http.Request, name, contentType, cacheControl string) { + sub, err := fs.Sub(staticFS, "static") + if err != nil { + http.Error(w, "internal error", http.StatusInternalServerError) + return + } + b, err := fs.ReadFile(sub, name) + if err != nil { + http.NotFound(w, nil) + return + } + w.Header().Set("Content-Type", contentType) + w.Header().Set("Cache-Control", cacheControl) + _, _ = w.Write(b) +} diff --git a/internal/web/reader_test.go b/internal/web/reader_test.go index df5d1d1..18f30b8 100644 --- a/internal/web/reader_test.go +++ b/internal/web/reader_test.go @@ -42,7 +42,7 @@ func TestReaderCardDataAndArticleAPI(t *testing.T) { t.Fatal(err) } - s, err := New(config.WebConfig{SiteTitle: "Pete", ListenAddr: ":0"}, nil) + s, err := New(config.WebConfig{SiteTitle: "Pete", ListenAddr: ":0"}, nil, true) if err != nil { t.Fatal(err) } diff --git a/internal/web/server.go b/internal/web/server.go index bfc1bd1..a1db26b 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -52,11 +52,13 @@ type SourceInfo struct { // Server is the HTTP server for Pete's web UI. type Server struct { - cfg config.WebConfig - sources []SourceInfo - srv *http.Server - tpls map[string]*template.Template // keyed by page name (e.g. "index", "channel") - auth *Authenticator // nil when sign-in is disabled or unavailable + cfg config.WebConfig + sources []SourceInfo + postingEnabled bool // false = web-only mode; hides Matrix-posting UI + srv *http.Server + tpls map[string]*template.Template // keyed by page name (e.g. "index", "channel") + auth *Authenticator // nil when sign-in is disabled or unavailable + adminSubs map[string]bool // OIDC subjects allowed to view /status // Daily-rotated salt for the privacy-preserving unique-visitor estimate. // Guarded by metricsMu; never persisted (see metrics.go). @@ -68,8 +70,8 @@ type Server struct { // New builds the server. Templates are parsed once at startup. Each page // gets its own template set sharing layout.html + _card.html, which avoids // `main` define collisions between pages. -func New(cfg config.WebConfig, sources []config.SourceConfig) (*Server, error) { - pages := []string{"index", "channel", "weather"} +func New(cfg config.WebConfig, sources []config.SourceConfig, postingEnabled bool) (*Server, error) { + pages := []string{"index", "channel", "weather", "bookmarks", "for-you", "status"} tpls := make(map[string]*template.Template, len(pages)) for _, p := range pages { t, err := template.New("").Funcs(funcs).ParseFS(templateFS, @@ -89,7 +91,13 @@ func New(cfg config.WebConfig, sources []config.SourceConfig) (*Server, error) { } infos = append(infos, SourceInfo{Name: sc.Name, Channel: sc.DirectRoute}) } - s := &Server{cfg: cfg, sources: infos, tpls: tpls} + adminSubs := make(map[string]bool, len(cfg.AdminSubs)) + for _, sub := range cfg.AdminSubs { + if sub != "" { + adminSubs[sub] = true + } + } + s := &Server{cfg: cfg, sources: infos, postingEnabled: postingEnabled, tpls: tpls, adminSubs: adminSubs} // Optional OIDC sign-in (Authentik). Discovery is a network call; if the // provider is unreachable at boot we log and serve anonymously rather than @@ -115,15 +123,23 @@ func New(cfg config.WebConfig, sources []config.SourceConfig) (*Server, error) { mux.Handle("GET /static/", http.StripPrefix("/static/", http.FileServer(http.FS(staticSub)))) mux.HandleFunc("GET /img/{name}", s.handleImg) + mux.HandleFunc("GET /manifest.webmanifest", s.handleManifest) + mux.HandleFunc("GET /sw.js", s.handleServiceWorker) + mux.HandleFunc("GET /{$}", s.handleIndex) mux.HandleFunc("GET /weather", s.handleWeatherDemo) mux.HandleFunc("GET /api/search", s.handleSearch) mux.HandleFunc("GET /api/article", s.handleArticle) + mux.HandleFunc("GET /api/related", s.handleRelated) + mux.HandleFunc("GET /feed.xml", func(w http.ResponseWriter, r *http.Request) { s.handleFeedXML(w, r, "") }) + mux.HandleFunc("GET /feed.json", func(w http.ResponseWriter, r *http.Request) { s.handleFeedJSON(w, r, "") }) for _, ch := range channels { ch := ch mux.HandleFunc("GET /"+ch.Slug, func(w http.ResponseWriter, r *http.Request) { s.handleChannel(w, r, ch) }) + mux.HandleFunc("GET /"+ch.Slug+"/feed.xml", func(w http.ResponseWriter, r *http.Request) { s.handleFeedXML(w, r, ch.Slug) }) + mux.HandleFunc("GET /"+ch.Slug+"/feed.json", func(w http.ResponseWriter, r *http.Request) { s.handleFeedJSON(w, r, ch.Slug) }) } mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) @@ -136,6 +152,16 @@ func New(cfg config.WebConfig, sources []config.SourceConfig) (*Server, error) { mux.HandleFunc("GET /auth/logout", s.auth.handleLogout) mux.HandleFunc("GET /api/preferences", s.handlePrefs) mux.HandleFunc("PUT /api/preferences", s.handlePrefs) + mux.HandleFunc("POST /api/read", s.handleRead) + mux.HandleFunc("POST /api/bookmark", s.handleBookmark) + mux.HandleFunc("GET /api/state", s.handleState) + mux.HandleFunc("GET /bookmarks", s.handleBookmarks) + mux.HandleFunc("GET /for-you", s.handleForYou) + mux.HandleFunc("GET /status", s.handleStatus) + if s.cfg.Push.Enabled { + mux.HandleFunc("POST /api/push/subscribe", s.handlePushSubscribe) + mux.HandleFunc("POST /api/push/unsubscribe", s.handlePushUnsubscribe) + } } s.srv = &http.Server{ diff --git a/internal/web/static/css/input.css b/internal/web/static/css/input.css index b98270b..1efd0fd 100644 --- a/internal/web/static/css/input.css +++ b/internal/web/static/css/input.css @@ -330,6 +330,62 @@ html[data-phase="night"] { .pete-reader-hint { display: none; } } + /* "You might also like" rail, shown under the article in feed mode. Lives + inside the reader's scroll area, below the article card. */ + .pete-reader-related { width: 100%; margin: 0.85rem auto 0; } + .pete-reader-related-title { + font-family: "Fredoka", "Nunito", system-ui, sans-serif; + font-weight: 700; + font-size: 0.95rem; + color: #fff; + margin: 0 0 0.6rem; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); + } + .pete-reader-related-grid { display: grid; gap: 0.6rem; } + .pete-reader-related-card { + display: flex; + align-items: center; + gap: 0.75rem; + background: var(--card); + color: var(--ink); + border-radius: 1rem; + border: 2px solid rgba(0, 0, 0, 0.06); + padding: 0.6rem; + text-decoration: none; + transition: transform 0.15s ease, box-shadow 0.15s ease; + } + .pete-reader-related-card:hover { + transform: translateY(-1px); + box-shadow: 0 6px 16px rgba(60, 40, 20, 0.16); + } + html[data-phase="night"] .pete-reader-related-card { border-color: rgba(255, 255, 255, 0.08); } + .pete-reader-related-thumb { + width: 4.5rem; + height: 3.25rem; + flex-shrink: 0; + object-fit: cover; + border-radius: 0.6rem; + background: rgba(0, 0, 0, 0.06); + } + .pete-reader-related-meta { min-width: 0; display: flex; flex-direction: column; gap: 0.25rem; } + .pete-reader-related-eyebrow { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.4rem; + font-size: 0.7rem; + } + .pete-reader-related-source { font-weight: 700; opacity: 0.7; } + .pete-reader-related-headline { + font-weight: 700; + line-height: 1.25; + font-size: 0.92rem; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + } + /* Grid treatment for stories already read in feed mode: dimmed, with a small corner check. Hovering restores full opacity so nothing feels lost. */ [data-story-card][data-read="1"] { opacity: 0.5; transition: opacity 0.2s ease; } diff --git a/internal/web/static/css/output.css b/internal/web/static/css/output.css index b417a7b..bd6361c 100644 --- a/internal/web/static/css/output.css +++ b/internal/web/static/css/output.css @@ -1 +1 @@ -*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body{font-family:Nunito,system-ui,sans-serif}html{scroll-behavior:smooth}body,html{overflow-x:hidden}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.pete-channel-nav{scrollbar-width:none;-ms-overflow-style:none}.pete-channel-nav::-webkit-scrollbar{display:none}.pete-reader-backdrop{position:absolute;inset:0;background:rgba(20,14,6,.55);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}html[data-phase=night] .pete-reader-backdrop{background:rgba(6,8,20,.65)}.pete-reader-shell{position:relative;height:100%;width:100%;max-width:44rem;margin:0 auto;display:flex;flex-direction:column;padding:max(env(safe-area-inset-top),.75rem) 1rem .75rem;gap:.75rem}.pete-reader-bar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;color:#fff}.pete-reader-progress{font-family:Fredoka,Nunito,system-ui,sans-serif;font-weight:600;font-size:.85rem;letter-spacing:.02em;text-shadow:0 1px 2px rgba(0,0,0,.4)}.pete-reader-nav{display:flex;align-items:center;gap:.4rem}.pete-reader-btn{display:inline-flex;align-items:center;justify-content:center;min-width:2.25rem;height:2.25rem;padding:0 .7rem;border-radius:9999px;background:hsla(0,0%,100%,.14);color:#fff;font-weight:700;font-size:.95rem;border:2px solid hsla(0,0%,100%,.18);cursor:pointer;transition:background .15s ease,transform .15s ease,opacity .15s ease}.pete-reader-btn:hover{background:hsla(0,0%,100%,.28);transform:translateY(-1px)}.pete-reader-btn:disabled{opacity:.35;cursor:default;transform:none}.pete-reader-btn-open{background:var(--accent);border-color:transparent;color:#1c1305;text-decoration:none}.pete-reader-btn-open:hover{background:var(--accent);filter:brightness(1.08)}.pete-reader-scroll{flex:1 1 auto;overflow-y:auto;-webkit-overflow-scrolling:touch;border-radius:1.75rem}.pete-reader-article{background:var(--card);color:var(--ink);border-radius:1.75rem;border:2px solid rgba(0,0,0,.06);box-shadow:0 6px 0 rgba(60,40,20,.12),0 16px 32px rgba(60,40,20,.18);padding:clamp(1.25rem,4vw,2.5rem)}html[data-phase=night] .pete-reader-article{border-color:hsla(0,0%,100%,.08)}.pete-reader-eyebrow{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem;font-size:.75rem;margin-bottom:.85rem}.pete-reader-chip{display:inline-flex;align-items:center;gap:.35rem;border-radius:9999px;padding:.15rem .65rem;color:#fff;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.pete-reader-source{font-weight:700;opacity:.75}.pete-reader-time{opacity:.55}.pete-reader-title{font-family:Fredoka,Nunito,system-ui,sans-serif;font-weight:700;line-height:1.15;letter-spacing:-.01em;font-size:clamp(1.6rem,4.5vw,2.4rem);margin-bottom:1rem}.pete-reader-hero{width:100%;border-radius:1.1rem;margin-bottom:1.25rem;background:rgba(0,0,0,.05)}.pete-reader-body{font-size:1.08rem;line-height:1.75}.pete-reader-body p{margin-bottom:1.05em}.pete-reader-body p:last-child{margin-bottom:0}.pete-reader-note{margin-top:1.25rem;padding-top:1rem;border-top:1px solid rgba(0,0,0,.1);font-size:.85rem;opacity:.7}html[data-phase=night] .pete-reader-note{border-color:hsla(0,0%,100%,.12)}.pete-reader-note a{color:var(--accent);font-weight:700}.pete-reader-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:.75rem;padding:clamp(2rem,8vw,4rem) 1rem;color:var(--ink)}.pete-reader-empty-emoji{font-size:2.5rem}.pete-reader-hint{text-align:center;color:hsla(0,0%,100%,.85);font-size:.75rem;text-shadow:0 1px 2px rgba(0,0,0,.4)}.pete-reader-hint kbd{font-family:ui-monospace,monospace;background:hsla(0,0%,100%,.16);border-radius:.3rem;padding:.05rem .3rem}@media (max-width:640px){.pete-reader-hint{display:none}}[data-story-card][data-read="1"]{opacity:.5;transition:opacity .2s ease}[data-story-card][data-read="1"]:hover{opacity:1}[data-story-card][data-read="1"]:after{content:"✓";position:absolute;top:.6rem;right:.6rem;z-index:6;display:grid;place-items:center;height:1.5rem;width:1.5rem;border-radius:9999px;background:rgba(20,14,6,.72);color:#fff;font-size:.8rem;font-weight:700}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.-right-6{right:-1.5rem}.-top-6{top:-1.5rem}.-z-10{z-index:-10}.-z-\[5\]{z-index:-5}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-8{margin-bottom:2rem}.mr-1{margin-right:.25rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-2,.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.line-clamp-3{-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-\[16\/10\]{aspect-ratio:16/10}.h-12{height:3rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-9{height:2.25rem}.h-full{height:100%}.max-h-\[55vh\]{max-height:55vh}.max-h-\[60vh\]{max-height:60vh}.min-h-screen{min-height:100vh}.w-12{width:3rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-9{width:2.25rem}.w-full{width:100%}.min-w-0{min-width:0}.max-w-2xl{max-width:42rem}.max-w-6xl{max-width:72rem}.max-w-\[7rem\]{max-width:7rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-y-0{--tw-translate-y:-0px}.-translate-y-0,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-transparent{border-color:transparent}.bg-\[color\:var\(--accent\)\]{background-color:var(--accent)}.bg-\[color\:var\(--bg\)\]{background-color:var(--bg)}.bg-\[color\:var\(--bg-grad\)\]{background-color:var(--bg-grad)}.bg-\[color\:var\(--card\)\]{background-color:var(--card)}.bg-transparent{background-color:transparent}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-1{padding-bottom:.25rem}.pb-10{padding-bottom:2.5rem}.pb-24{padding-bottom:6rem}.pb-4{padding-bottom:1rem}.pt-1{padding-top:.25rem}.pt-3{padding-top:.75rem}.pt-8{padding-top:2rem}.pt-\[10vh\]{padding-top:10vh}.pt-\[12vh\]{padding-top:12vh}.text-center{text-align:center}.align-\[-4px\]{vertical-align:-4px}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12rem\]{font-size:12rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-\[color\:var\(--ink\)\]{color:var(--ink)}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/85{color:hsla(0,0%,100%,.85)}.underline{text-decoration-line:underline}.decoration-4{text-decoration-thickness:4px}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-\[color\:var\(--accent\)\]{accent-color:var(--accent)}.opacity-20{opacity:.2}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px)}.blur,.grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale:grayscale(100%)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur-sm,.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-1000{transition-duration:1s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.font-display{font-family:Fredoka,Nunito,system-ui,sans-serif;letter-spacing:-.01em}.shadow-pete{box-shadow:0 4px 0 rgba(60,40,20,.1),0 8px 24px rgba(60,40,20,.08)}.shadow-pete-lg{box-shadow:0 6px 0 rgba(60,40,20,.12),0 16px 32px rgba(60,40,20,.12)}.bg-theme-gaming{background-color:#4caf7d}.bg-theme-tech{background-color:#5aa9e6}.bg-theme-politics{background-color:#e07a5f}.bg-theme-eu{background-color:#039}.bg-theme-music{background-color:#b079d6}.bg-theme-anime{background-color:#ec5e8a}.bg-theme-foss{background-color:#d97706}.bg-theme-kids{background-color:#14b8a6}.bg-theme-finance{background-color:#10b981}.bg-theme-lego{background-color:#d01012}.text-theme-gaming{color:#2d8a5a}.text-theme-tech{color:#2f7fb8}.text-theme-politics{color:#b8523a}.text-theme-eu{color:#039}.text-theme-music{color:#8a4fb8}.text-theme-anime{color:#c33a6a}.text-theme-foss{color:#b8530a}.text-theme-kids{color:#0f766e}.text-theme-finance{color:#059669}.text-theme-lego{color:#b00d0e}.decoration-theme-gaming{text-decoration-color:#4caf7d}.decoration-theme-tech{text-decoration-color:#5aa9e6}.decoration-theme-politics{text-decoration-color:#e07a5f}.decoration-theme-eu{text-decoration-color:#039}.decoration-theme-music{text-decoration-color:#b079d6}.decoration-theme-anime{text-decoration-color:#ec5e8a}.decoration-theme-foss{text-decoration-color:#d97706}.decoration-theme-kids{text-decoration-color:#14b8a6}.decoration-theme-finance{text-decoration-color:#10b981}.decoration-theme-lego{text-decoration-color:#d01012}.border-theme-gaming{border-color:#4caf7d}.border-theme-tech{border-color:#5aa9e6}.border-theme-politics{border-color:#e07a5f}.border-theme-eu{border-color:#039}.border-theme-music{border-color:#b079d6}.border-theme-anime{border-color:#ec5e8a}.border-theme-foss{border-color:#d97706}.border-theme-kids{border-color:#14b8a6}.border-theme-finance{border-color:#10b981}.border-theme-lego{border-color:#d01012}.glow-theme-gaming{box-shadow:0 0 0 2px rgba(76,175,125,.35),0 0 24px 4px rgba(76,175,125,.45)}.glow-theme-gaming,.glow-theme-tech{animation:pete-glow-pulse 2.4s ease-in-out infinite}.glow-theme-tech{box-shadow:0 0 0 2px rgba(90,169,230,.35),0 0 24px 4px rgba(90,169,230,.45)}.glow-theme-politics{box-shadow:0 0 0 2px rgba(224,122,95,.35),0 0 24px 4px rgba(224,122,95,.45)}.glow-theme-eu,.glow-theme-politics{animation:pete-glow-pulse 2.4s ease-in-out infinite}.glow-theme-eu{box-shadow:0 0 0 2px rgba(0,51,153,.35),0 0 24px 4px rgba(0,51,153,.45)}.glow-theme-music{box-shadow:0 0 0 2px rgba(176,121,214,.35),0 0 24px 4px rgba(176,121,214,.45)}.glow-theme-anime,.glow-theme-music{animation:pete-glow-pulse 2.4s ease-in-out infinite}.glow-theme-anime{box-shadow:0 0 0 2px rgba(236,94,138,.35),0 0 24px 4px rgba(236,94,138,.45)}.glow-theme-foss{box-shadow:0 0 0 2px rgba(217,119,6,.35),0 0 24px 4px rgba(217,119,6,.45)}.glow-theme-foss,.glow-theme-kids{animation:pete-glow-pulse 2.4s ease-in-out infinite}.glow-theme-kids{box-shadow:0 0 0 2px rgba(20,184,166,.35),0 0 24px 4px rgba(20,184,166,.45)}.glow-theme-finance{box-shadow:0 0 0 2px rgba(16,185,129,.35),0 0 24px 4px rgba(16,185,129,.45)}.glow-theme-finance,.glow-theme-lego{animation:pete-glow-pulse 2.4s ease-in-out infinite}.glow-theme-lego{box-shadow:0 0 0 2px rgba(208,16,18,.35),0 0 24px 4px rgba(208,16,18,.45)}@keyframes pete-glow-pulse{0%,to{filter:brightness(1)}50%{filter:brightness(1.08)}}.line-clamp-3{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.paywall-stamp{position:absolute;inset:0;pointer-events:none;display:flex;align-items:center;justify-content:center;z-index:5;background:rgba(255,250,240,.18)}.paywall-stamp:before{content:"PAYWALLED";font-family:var(--font-display,ui-sans-serif),system-ui,sans-serif;font-weight:900;font-size:clamp(1rem,3.2vw,1.75rem);letter-spacing:.12em;color:rgba(180,30,30,.85);border:.28rem double rgba(180,30,30,.85);padding:.3rem .9rem;transform:rotate(-15deg);text-shadow:0 1px 0 hsla(0,0%,100%,.4);box-shadow:inset 0 0 0 2px hsla(0,0%,100%,.15);background:rgba(255,240,230,.55);border-radius:.25rem;filter:contrast(1.05)}:root,html[data-phase=day]{--bg:#fff7e4;--bg-grad:#ffeec2;--card:#fff;--ink:#3a2e1f;--accent:#f2a541}html[data-phase=dawn]{--bg:#ffe7d6;--bg-grad:#ffc9c9;--card:#fff4ea;--ink:#4a2e2a;--accent:#ff8a65}html[data-phase=dusk]{--bg:#ffd6a8;--bg-grad:#f7a07e;--card:#fff1de;--ink:#3d2417;--accent:#e6553a}html[data-phase=night]{--bg:#1a1f3a;--bg-grad:#2a3358;--card:#2d365a;--ink:#f1ecd8;--accent:#f9d976}.empty\:hidden:empty{display:none}.hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.hover\:-translate-y-0\.5:hover,.hover\:-translate-y-1:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.hover\:text-\[color\:var\(--ink\)\]:hover{color:var(--ink)}.hover\:brightness-105:hover{--tw-brightness:brightness(1.05);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:shadow-pete-lg:hover{box-shadow:0 6px 0 rgba(60,40,20,.12),0 16px 32px rgba(60,40,20,.12)}.focus\:border-\[color\:var\(--accent\)\]:focus{border-color:var(--accent)}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:-rotate-6{--tw-rotate:-6deg}.group:hover .group-hover\:-rotate-6,.group:hover .group-hover\:scale-105{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.group:hover .group-hover\:underline{text-decoration-line:underline}@media (min-width:640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:gap-2{gap:.5rem}.sm\:gap-4{gap:1rem}.sm\:p-10{padding:2.5rem}.sm\:pt-12{padding-top:3rem}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-5xl{font-size:3rem;line-height:1}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}}@media (min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}} \ No newline at end of file +*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body{font-family:Nunito,system-ui,sans-serif}html{scroll-behavior:smooth}body,html{overflow-x:hidden}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.pete-channel-nav{scrollbar-width:none;-ms-overflow-style:none}.pete-channel-nav::-webkit-scrollbar{display:none}.pete-reader-backdrop{position:absolute;inset:0;background:rgba(20,14,6,.55);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}html[data-phase=night] .pete-reader-backdrop{background:rgba(6,8,20,.65)}.pete-reader-shell{position:relative;height:100%;width:100%;max-width:44rem;margin:0 auto;display:flex;flex-direction:column;padding:max(env(safe-area-inset-top),.75rem) 1rem .75rem;gap:.75rem}.pete-reader-bar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;color:#fff}.pete-reader-progress{font-family:Fredoka,Nunito,system-ui,sans-serif;font-weight:600;font-size:.85rem;letter-spacing:.02em;text-shadow:0 1px 2px rgba(0,0,0,.4)}.pete-reader-nav{display:flex;align-items:center;gap:.4rem}.pete-reader-btn{display:inline-flex;align-items:center;justify-content:center;min-width:2.25rem;height:2.25rem;padding:0 .7rem;border-radius:9999px;background:hsla(0,0%,100%,.14);color:#fff;font-weight:700;font-size:.95rem;border:2px solid hsla(0,0%,100%,.18);cursor:pointer;transition:background .15s ease,transform .15s ease,opacity .15s ease}.pete-reader-btn:hover{background:hsla(0,0%,100%,.28);transform:translateY(-1px)}.pete-reader-btn:disabled{opacity:.35;cursor:default;transform:none}.pete-reader-btn-open{background:var(--accent);border-color:transparent;color:#1c1305;text-decoration:none}.pete-reader-btn-open:hover{background:var(--accent);filter:brightness(1.08)}.pete-reader-scroll{flex:1 1 auto;overflow-y:auto;-webkit-overflow-scrolling:touch;border-radius:1.75rem}.pete-reader-article{background:var(--card);color:var(--ink);border-radius:1.75rem;border:2px solid rgba(0,0,0,.06);box-shadow:0 6px 0 rgba(60,40,20,.12),0 16px 32px rgba(60,40,20,.18);padding:clamp(1.25rem,4vw,2.5rem)}html[data-phase=night] .pete-reader-article{border-color:hsla(0,0%,100%,.08)}.pete-reader-eyebrow{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem;font-size:.75rem;margin-bottom:.85rem}.pete-reader-chip{display:inline-flex;align-items:center;gap:.35rem;border-radius:9999px;padding:.15rem .65rem;color:#fff;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.pete-reader-source{font-weight:700;opacity:.75}.pete-reader-time{opacity:.55}.pete-reader-title{font-family:Fredoka,Nunito,system-ui,sans-serif;font-weight:700;line-height:1.15;letter-spacing:-.01em;font-size:clamp(1.6rem,4.5vw,2.4rem);margin-bottom:1rem}.pete-reader-hero{width:100%;border-radius:1.1rem;margin-bottom:1.25rem;background:rgba(0,0,0,.05)}.pete-reader-body{font-size:1.08rem;line-height:1.75}.pete-reader-body p{margin-bottom:1.05em}.pete-reader-body p:last-child{margin-bottom:0}.pete-reader-note{margin-top:1.25rem;padding-top:1rem;border-top:1px solid rgba(0,0,0,.1);font-size:.85rem;opacity:.7}html[data-phase=night] .pete-reader-note{border-color:hsla(0,0%,100%,.12)}.pete-reader-note a{color:var(--accent);font-weight:700}.pete-reader-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:.75rem;padding:clamp(2rem,8vw,4rem) 1rem;color:var(--ink)}.pete-reader-empty-emoji{font-size:2.5rem}.pete-reader-hint{text-align:center;color:hsla(0,0%,100%,.85);font-size:.75rem;text-shadow:0 1px 2px rgba(0,0,0,.4)}.pete-reader-hint kbd{font-family:ui-monospace,monospace;background:hsla(0,0%,100%,.16);border-radius:.3rem;padding:.05rem .3rem}@media (max-width:640px){.pete-reader-hint{display:none}}.pete-reader-related{width:100%;margin:.85rem auto 0}.pete-reader-related-title{font-family:Fredoka,Nunito,system-ui,sans-serif;font-weight:700;font-size:.95rem;color:#fff;margin:0 0 .6rem;text-shadow:0 1px 2px rgba(0,0,0,.4)}.pete-reader-related-grid{display:grid;gap:.6rem}.pete-reader-related-card{display:flex;align-items:center;gap:.75rem;background:var(--card);color:var(--ink);border-radius:1rem;border:2px solid rgba(0,0,0,.06);padding:.6rem;text-decoration:none;transition:transform .15s ease,box-shadow .15s ease}.pete-reader-related-card:hover{transform:translateY(-1px);box-shadow:0 6px 16px rgba(60,40,20,.16)}html[data-phase=night] .pete-reader-related-card{border-color:hsla(0,0%,100%,.08)}.pete-reader-related-thumb{width:4.5rem;height:3.25rem;flex-shrink:0;-o-object-fit:cover;object-fit:cover;border-radius:.6rem;background:rgba(0,0,0,.06)}.pete-reader-related-meta{min-width:0;display:flex;flex-direction:column;gap:.25rem}.pete-reader-related-eyebrow{display:flex;align-items:center;flex-wrap:wrap;gap:.4rem;font-size:.7rem}.pete-reader-related-source{font-weight:700;opacity:.7}.pete-reader-related-headline{font-weight:700;line-height:1.25;font-size:.92rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}[data-story-card][data-read="1"]{opacity:.5;transition:opacity .2s ease}[data-story-card][data-read="1"]:hover{opacity:1}[data-story-card][data-read="1"]:after{content:"✓";position:absolute;top:.6rem;right:.6rem;z-index:6;display:grid;place-items:center;height:1.5rem;width:1.5rem;border-radius:9999px;background:rgba(20,14,6,.72);color:#fff;font-size:.8rem;font-weight:700}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.-right-6{right:-1.5rem}.-top-6{top:-1.5rem}.-z-10{z-index:-10}.-z-\[5\]{z-index:-5}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.-mt-1{margin-top:-.25rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-8{margin-bottom:2rem}.mr-1{margin-right:.25rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-2,.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.line-clamp-3{-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-\[16\/10\]{aspect-ratio:16/10}.h-12{height:3rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-9{height:2.25rem}.h-full{height:100%}.max-h-\[55vh\]{max-height:55vh}.max-h-\[60vh\]{max-height:60vh}.min-h-screen{min-height:100vh}.w-12{width:3rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-9{width:2.25rem}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[52rem\]{min-width:52rem}.max-w-2xl{max-width:42rem}.max-w-6xl{max-width:72rem}.max-w-\[7rem\]{max-width:7rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.-translate-y-0{--tw-translate-y:-0px}.-translate-y-0,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-transparent{border-color:transparent}.bg-\[color\:var\(--accent\)\]{background-color:var(--accent)}.bg-\[color\:var\(--bg\)\]{background-color:var(--bg)}.bg-\[color\:var\(--bg-grad\)\]{background-color:var(--bg-grad)}.bg-\[color\:var\(--card\)\]{background-color:var(--card)}.bg-emerald-500\/15{background-color:rgba(16,185,129,.15)}.bg-red-500\/15{background-color:rgba(239,68,68,.15)}.bg-transparent{background-color:transparent}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-10{padding-bottom:2.5rem}.pb-24{padding-bottom:6rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pt-1{padding-top:.25rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-8{padding-top:2rem}.pt-\[10vh\]{padding-top:10vh}.pt-\[12vh\]{padding-top:12vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-\[-4px\]{vertical-align:-4px}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12rem\]{font-size:12rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#1c1305\]{--tw-text-opacity:1;color:rgb(28 19 5/var(--tw-text-opacity,1))}.text-\[color\:var\(--ink\)\]{color:var(--ink)}.text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/85{color:hsla(0,0%,100%,.85)}.underline{text-decoration-line:underline}.decoration-4{text-decoration-thickness:4px}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-\[color\:var\(--accent\)\]{accent-color:var(--accent)}.opacity-20{opacity:.2}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px)}.blur,.grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale:grayscale(100%)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur-sm,.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-1000{transition-duration:1s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.font-display{font-family:Fredoka,Nunito,system-ui,sans-serif;letter-spacing:-.01em}.shadow-pete{box-shadow:0 4px 0 rgba(60,40,20,.1),0 8px 24px rgba(60,40,20,.08)}.shadow-pete-lg{box-shadow:0 6px 0 rgba(60,40,20,.12),0 16px 32px rgba(60,40,20,.12)}.bg-theme-gaming{background-color:#4caf7d}.bg-theme-tech{background-color:#5aa9e6}.bg-theme-politics{background-color:#e07a5f}.bg-theme-eu{background-color:#039}.bg-theme-music{background-color:#b079d6}.bg-theme-anime{background-color:#ec5e8a}.bg-theme-foss{background-color:#d97706}.bg-theme-kids{background-color:#14b8a6}.bg-theme-finance{background-color:#10b981}.bg-theme-lego{background-color:#d01012}.text-theme-gaming{color:#2d8a5a}.text-theme-tech{color:#2f7fb8}.text-theme-politics{color:#b8523a}.text-theme-eu{color:#039}.text-theme-music{color:#8a4fb8}.text-theme-anime{color:#c33a6a}.text-theme-foss{color:#b8530a}.text-theme-kids{color:#0f766e}.text-theme-finance{color:#059669}.text-theme-lego{color:#b00d0e}.decoration-theme-gaming{text-decoration-color:#4caf7d}.decoration-theme-tech{text-decoration-color:#5aa9e6}.decoration-theme-politics{text-decoration-color:#e07a5f}.decoration-theme-eu{text-decoration-color:#039}.decoration-theme-music{text-decoration-color:#b079d6}.decoration-theme-anime{text-decoration-color:#ec5e8a}.decoration-theme-foss{text-decoration-color:#d97706}.decoration-theme-kids{text-decoration-color:#14b8a6}.decoration-theme-finance{text-decoration-color:#10b981}.decoration-theme-lego{text-decoration-color:#d01012}.border-theme-gaming{border-color:#4caf7d}.border-theme-tech{border-color:#5aa9e6}.border-theme-politics{border-color:#e07a5f}.border-theme-eu{border-color:#039}.border-theme-music{border-color:#b079d6}.border-theme-anime{border-color:#ec5e8a}.border-theme-foss{border-color:#d97706}.border-theme-kids{border-color:#14b8a6}.border-theme-finance{border-color:#10b981}.border-theme-lego{border-color:#d01012}.glow-theme-gaming{box-shadow:0 0 0 2px rgba(76,175,125,.35),0 0 24px 4px rgba(76,175,125,.45)}.glow-theme-gaming,.glow-theme-tech{animation:pete-glow-pulse 2.4s ease-in-out infinite}.glow-theme-tech{box-shadow:0 0 0 2px rgba(90,169,230,.35),0 0 24px 4px rgba(90,169,230,.45)}.glow-theme-politics{box-shadow:0 0 0 2px rgba(224,122,95,.35),0 0 24px 4px rgba(224,122,95,.45)}.glow-theme-eu,.glow-theme-politics{animation:pete-glow-pulse 2.4s ease-in-out infinite}.glow-theme-eu{box-shadow:0 0 0 2px rgba(0,51,153,.35),0 0 24px 4px rgba(0,51,153,.45)}.glow-theme-music{box-shadow:0 0 0 2px rgba(176,121,214,.35),0 0 24px 4px rgba(176,121,214,.45)}.glow-theme-anime,.glow-theme-music{animation:pete-glow-pulse 2.4s ease-in-out infinite}.glow-theme-anime{box-shadow:0 0 0 2px rgba(236,94,138,.35),0 0 24px 4px rgba(236,94,138,.45)}.glow-theme-foss{box-shadow:0 0 0 2px rgba(217,119,6,.35),0 0 24px 4px rgba(217,119,6,.45)}.glow-theme-foss,.glow-theme-kids{animation:pete-glow-pulse 2.4s ease-in-out infinite}.glow-theme-kids{box-shadow:0 0 0 2px rgba(20,184,166,.35),0 0 24px 4px rgba(20,184,166,.45)}.glow-theme-finance{box-shadow:0 0 0 2px rgba(16,185,129,.35),0 0 24px 4px rgba(16,185,129,.45)}.glow-theme-finance,.glow-theme-lego{animation:pete-glow-pulse 2.4s ease-in-out infinite}.glow-theme-lego{box-shadow:0 0 0 2px rgba(208,16,18,.35),0 0 24px 4px rgba(208,16,18,.45)}@keyframes pete-glow-pulse{0%,to{filter:brightness(1)}50%{filter:brightness(1.08)}}.line-clamp-3{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.paywall-stamp{position:absolute;inset:0;pointer-events:none;display:flex;align-items:center;justify-content:center;z-index:5;background:rgba(255,250,240,.18)}.paywall-stamp:before{content:"PAYWALLED";font-family:var(--font-display,ui-sans-serif),system-ui,sans-serif;font-weight:900;font-size:clamp(1rem,3.2vw,1.75rem);letter-spacing:.12em;color:rgba(180,30,30,.85);border:.28rem double rgba(180,30,30,.85);padding:.3rem .9rem;transform:rotate(-15deg);text-shadow:0 1px 0 hsla(0,0%,100%,.4);box-shadow:inset 0 0 0 2px hsla(0,0%,100%,.15);background:rgba(255,240,230,.55);border-radius:.25rem;filter:contrast(1.05)}:root,html[data-phase=day]{--bg:#fff7e4;--bg-grad:#ffeec2;--card:#fff;--ink:#3a2e1f;--accent:#f2a541}html[data-phase=dawn]{--bg:#ffe7d6;--bg-grad:#ffc9c9;--card:#fff4ea;--ink:#4a2e2a;--accent:#ff8a65}html[data-phase=dusk]{--bg:#ffd6a8;--bg-grad:#f7a07e;--card:#fff1de;--ink:#3d2417;--accent:#e6553a}html[data-phase=night]{--bg:#1a1f3a;--bg-grad:#2a3358;--card:#2d365a;--ink:#f1ecd8;--accent:#f9d976}.last\:border-0:last-child{border-width:0}.empty\:hidden:empty{display:none}.hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.hover\:-translate-y-0\.5:hover,.hover\:-translate-y-1:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.hover\:text-\[color\:var\(--ink\)\]:hover{color:var(--ink)}.hover\:brightness-105:hover{--tw-brightness:brightness(1.05);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:shadow-pete-lg:hover{box-shadow:0 6px 0 rgba(60,40,20,.12),0 16px 32px rgba(60,40,20,.12)}.focus\:border-\[color\:var\(--accent\)\]:focus{border-color:var(--accent)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:-rotate-6{--tw-rotate:-6deg}.group:hover .group-hover\:-rotate-6,.group:hover .group-hover\:scale-105{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.group:hover .group-hover\:underline{text-decoration-line:underline}@media (min-width:640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:gap-2{gap:.5rem}.sm\:gap-4{gap:1rem}.sm\:p-10{padding:2.5rem}.sm\:p-8{padding:2rem}.sm\:pt-12{padding-top:3rem}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-5xl{font-size:3rem;line-height:1}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}}@media (min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.dark\:text-emerald-300{--tw-text-opacity:1;color:rgb(110 231 183/var(--tw-text-opacity,1))}.dark\:text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.dark\:text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}} \ No newline at end of file diff --git a/internal/web/static/img/apple-touch-icon.png b/internal/web/static/img/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1872373363e51ec8deed218899fe895e21e4d037 GIT binary patch literal 25986 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 literal 0 HcmV?d00001 diff --git a/internal/web/static/img/icon-192.png b/internal/web/static/img/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e548b0a28b8f5116463c2cbad85af8587d9c3c GIT binary patch literal 38154 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 literal 0 HcmV?d00001 diff --git a/internal/web/static/img/icon-512.png b/internal/web/static/img/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..a28a398a01f76499e92200a68e067debdc249496 GIT binary patch literal 157981 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 z z_Yk5Lcbhg)#P>($`pE{yN%`f(N__$i#L6(pyOc)*Xzc4Z;enhr}|EVz>_HnseC{qpM>1NDP{g#6;JNhVJ}OtwtlLw4O_qBlSTu><6~%wJeCzW#K;F&NgR_m&AbxI=E|3Lc)HU*CEg z$jZ*n{+ySm5tXP3^_#kD%*R-EH<)VivikMAi7nQI8;mB6O+F&3@WYODDPN1K+yrK{ zuZcDau9#AYG(x;-EH&K>;DA@}gUFR)&D`)Jw}?_?nV>7}hymojp;yYSJBdy6Jw;<) z5~5?A^s9fBx3Iz=!kG3$$y0B__ z{zqtpAr{t__MG2OyT+n~(!Jy(P@t~?`&^4DkjJ%;V zc+z{$v}`c#Fs`p+WHix$S3wX~K?TJ`k%z@@NhRUOsM!J~8QJFwQ77?{_G`X`Q_3M4 zbcO(I$yRl@*M3VvC#Fz>uaOI-YhssXgk$vlWFvZcnQ<9V1jv@G?;isjj{sPMy4DPh z(!|32;wtIQy=r9}SI1fnbj;-ncO&V^A>4UKm}O))KW(~0{`}u(qf^6fPeqs5@>7~3 z`O*G)rmmjUDE>a20VR`abQc%s?i0x@P*X~ ztnH7F8#%2u55$KPolKx*#9Q$m*HGen)I+7Uv*Ma{X1e>_MO;6^#tno`-xAQpX(+3x z@R=B~TT5XHsZqt>`eb3EakZ>Fi;B0ZF)YY>kTO7RIb31Wqa@Se!~#mk%HMlcN& zwvC$RmD=3ToB0bg4k9XA+JcLGo10qznV&;~d_p^waXh@$6YM}<{PnGY)%0ffYc!ru zPHyZ%rrb-tgy9$iHj-`=CN$!A_|3X(yn-TIK!A0NzMFcE8>h$?_!2`UZHV|ugLMu$ zt(?aCGOUFa5rB%%UFPd0nyH@=;71AkYXdxHK4Ml!!VddrTTu0>hs5krGKepv+$=?} zA1wIK!b(kxOqcFNK@s^rS*b7pM*CaQwV|A_#W)_o_*Q={PKlyN_5&hT-_<5VN{Q+F z2Ar^u^2E50&pYIwqFs&iUG^^P?q^gHW~pDBd21n`sHKZAy6zH!d>bpvR7&>zg)4on=H7J-km39Q~i99EceqpyApR%qlh|$ez$e z-mpZ*Z8(7~icAVEB?T+h2;@3Jd+Ri8F+*MvEW~P!mnZIVL_UI0sUUm~u$SQ9#VdM@ z!wQ(ZpwnJl-Q!lgRkNr_IF&v@))t-hZIAoZ?N=<)QL<~Fpy9(q0y;c8Vzz`9-Rycp zR=p=KtqQDARoOZb{*YRQ-C+H)^WNdw@E8;K<4F`d>ke$1bnk3vZ3`MjD z?Qi+=4zIZCv?2YHX%5l!T(pEEj%H7r7{{NazB(J$py6C4o4@~bcJ*)VuVVQl<33K7 zU7*AUl;KwF)n0peEx~_NjVOW)Ui;V04WZ}T+NJ%moUcC9hgeV0x=VdshvODFD~MJ9 zoN|dnK)#yt;}&te9#WHgBs6FTldEMnF?YZJ^IRA{6$kAJo*FgGOOo7EC_5D?Bkc zl>Hi3k;o_BX&A)foUb!0I}#>aAg?Khg)1RiG*rH&U`c>0$oH7=GMD~_B~>#?Kb^O_ zizV{7z0h(ociu66g{+Y28~=@&97R-#Fo_s=MdI@l=XG`{(!#Vm5A)xlN3N<3)*^?I z*k)-2_&76sW-`{mF1o#H*^ypO163PT+AlK>8z3jfMA!hw;3>-h_gg%7p~608CF8Ns ztRyu!GPZvtaXD@A6Cf*K74nC7_(Cu=Xq^VDPHMUuCVIxQ1cgO*E^ZR%C)Rf2>)}62 zUX3oxg=>xxKvUBZW%S&{s%|)#;fr^}s2p@eU3|%c;3NZ+p8Ig?+{bo#JD-=&NeO ze(Jo&U4Q9w-bjBt4Sx|>MC?guWSW7(+MyVa4!6zKGd;5BWqhke|t0et(Up-a2q=G`UHO27-Dvye~s=9IZI z-cUsu&YC}=pc)j0QYhbEk0hleWf?jREti;P`@}4!JvtNbzWVzb&3;cRIxl-HMhZ(P zR}-STIyn;MBjNWq-rat($*^o}pI&}dEgbp&GBZEttjc|_MTW-j-#8>AYC+$*G&-N! zf`^H$o$CbktiHn9`fWU>G}a@&4}nY95cS5Y-00I z=hMVO7C~1MRQZXB9OWz7Yav^{WqJeG(|9hsph{pK{2gR%P|i1>qe*f|X|=BP4Lw;**4i*c-}r<(3JuHbDm8mVL*61&H<)_#0-}b zMtA=Vs}E7y+b-UL7PS7G=*-zq6V_5P;f>09<8APLXW!0SQ;o`+MTfrm5v)>R=uSRc z3lzEpHMyjoyDMNQ+o*;YwZd9vp-|Lmt+)L}&FfrfDBi$3ahcpda>@tfUPZMfM)}ZE zSL^~i5r1}>0^j@Ak=6dTXFrVf=c#z>;RXBF6HP9QpncW0;nhzLQFKO7B82lN`NIx@ zsiGVHZ*DrMaY|!!XO}q&EgwBM4wo!2VQSApKWJ7cEt19~#izF}sHO@lIF37nmq zoY@!?J!xsST36t%8>|d6tvx*V&gZNT>c4$XyWi_X{&%nAxZ_89tHAl@^q{{A44fd- zztj}v((T@46|hHlcCqFDsYX}@5@i3Ik9v?#jkzp1#1@-CCCTlRMgV^7>rTcHF8d$9 zCa>zf!%Z%=qz#Pqjq=#N%IAu%OZW=oXVP+b=Rz50bynqQ0PrPqQd1VeMj3+IPm`*D zX8k@yo2kq*pEZ}-xtC60VVmcd(~5=fHr(BKT=Vh-$KrC)N*CgDlj&!PN-0G#>^R=O znK2*NE8^uM7AK{<#U--(cb~ZV^R96-pZmg<^nXcx*b8UXb+g4JrStZH91yBCTpW z%GGB^wEn`+QUea1#~eM1g#1p^lPBV>ot=&}r5js6h3 z&!>O_I7e0`tnu1(TO+Kj6*?1w(G=&63NdN(tv8b9SHZJ2qmgtGv6lzyM1cvadX}S0 z)`pzjKs~RFI-yLL`#E8@v$Y+WJCS~#8=@Dn>!_F9pf7!`y~EPlU1F3-PRS65OO(Hy z^G?HYqA|G8D^24=Wnu7)qQ^Dm04Kz+EA>0<3C!!XWV)0T&pMgkv ze-9?Ari- z)}%|wU7JW2nNp3y8z0Dy*&;~oa+(CvcB$LJx3aw_Z3Eb$fX=M!WFrZzn33@0)7^VrAT_k^kw&? z4FfFt@wTAq+b4;uR_C-Q8j{$+b9%ByIND37f03Mp0C-i>u-E>KIviAtb^9#G9uqjr^2*AXBsSg33GAKCS|y+xZ6X1n*tgr5QomY+dQcaye= zQi~ngcfrWHM_XZiJnQ+sFBv(l@;@BSqv<0M%4A9Ni!uYDSZOf*V#?v%Y%y~eyuLgA zGB@>f?Fj%_ci8ai;hd1>T@|F805zp{_*}LDgZyFGrVgLqF!~$>w|{)<0G$!6WeOL# zaowA=O?)1uAUU=CYiONRaYJ_Gq{o%05-NLQcbLiX<4)g(d>NIKjQ&pqL| z-oyLnRm3lcZe4im<$##SO_D4|OZF(D{AA)M>!kmKDVk4-Y49Zc#eT&5>ZhlVU7?T6 z4X~i|wICU0?Kq z((B%+kOHAn@bU#0G$F2z)zF|3^-tnR zLNces^;2Tb24mQ5YOe zq+nCGI5S0acNh-c8z{v`x#4v2saDA8VAg95-Zf*V>*vEgQYr4~((ts{4vq(&!Qrx8YOC9uan zbg)$5L7$1!%c5s8>!+9KOF1#lr0W!#>)UK}e|O|1_cQRF;(G>HbtFyJ%Z;*ZbyfB? zsBmn-EPP4wLSY(VyJTq-Q>2?ejsc~yhIgNx)gN^SqMFth-$O1Ifs%X7)Mgf%Q1#28 zBowOFbd5urpj|l*)b_+l4OeR@2X2$mWVTL(Wq2)aJvZld00z;)I zZ{<32(kFA8V{b^N0vGvr6~SX9en6%WIu+(}1UV3RqJ4KRNjGi(Hup7kUbyBLA9rslG^(dwg2Gv$NJR)0lO3Qu5P9Ea3NjL8_4Fq=B zm@zbO$^Ë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%0Dw2-K^TgM29nu?V}%D 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

P5PY)W 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 results array + + // Signed-in users (Authentik) get read + bookmark state synced server-side; + // window.PETE_USER is non-null for them. Anonymous visitors keep the + // localStorage-only behaviour and never see the bookmark controls. + var SIGNED_IN = !!(window.PETE_USER); + var bookmarkSet = Object.create(null); // id -> 1 for bookmarked stories var items = []; // {id, url, headline, lede, image, time, source, chTitle, chEmoji, chTheme, posted, paywalled} var index = 0; @@ -45,6 +54,102 @@ if (on) readSet[id] = 1; else delete readSet[id]; saveRead(readSet); paintCard(id, on); + if (SIGNED_IN) postState("/api/read", { id: Number(id), read: !!on }); + } + + // ---- server sync (signed-in only) ----------------------------------------- + function postState(url, body) { + try { + fetch(url, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + credentials: "same-origin", + keepalive: true + }).catch(function () {}); + } catch (e) {} + } + + function isBookmarked(id) { return !!bookmarkSet[id]; } + + // setBookmark updates memory, paints every matching control, and persists. + function setBookmark(id, on) { + if (on) bookmarkSet[id] = 1; else delete bookmarkSet[id]; + paintBookmark(id, on); + postState("/api/bookmark", { id: Number(id), on: !!on }); + // On the bookmarks page, an un-bookmark should drop the card immediately. + if (!on && location.pathname === "/bookmarks") { + document.querySelectorAll('[data-story-card][data-id="' + cssEsc(id) + '"]').forEach(function (c) { + c.parentNode && c.parentNode.removeChild(c); + }); + } + } + + // setBookmarkQuiet applies server-provided state without echoing it back. + function setBookmarkQuiet(id, on) { + if (on) bookmarkSet[id] = 1; else delete bookmarkSet[id]; + paintBookmark(id, on); + } + + function paintBookmark(id, on) { + document.querySelectorAll('[data-bookmark-btn][data-story-id="' + cssEsc(id) + '"]').forEach(function (b) { + applyCardBookmark(b, on); + }); + if (readerBookmarkBtn && items[index] && String(items[index].id) === String(id)) { + applyReaderBookmark(on); + } + } + + function applyCardBookmark(btn, on) { + btn.setAttribute("aria-pressed", on ? "true" : "false"); + var svg = btn.querySelector("svg"); + if (on) { + btn.style.background = "var(--accent)"; + btn.style.color = "#1c1305"; + if (svg) svg.setAttribute("fill", "currentColor"); + } else { + btn.style.background = "rgba(20,14,6,.62)"; + btn.style.color = "#fff"; + if (svg) svg.setAttribute("fill", "none"); + } + } + + function applyReaderBookmark(on) { + if (!readerBookmarkBtn) return; + readerBookmarkBtn.setAttribute("aria-pressed", on ? "true" : "false"); + readerBookmarkBtn.textContent = on ? "🔖 Saved" : "🔖 Save"; + } + + // initUserState reveals the bookmark controls and pulls the signed-in user's + // read + bookmark state for the stories on this page, painting them and + // migrating any device-local reads the account doesn't have yet. + function initUserState() { + if (!SIGNED_IN) return; + document.querySelectorAll("[data-bookmark-btn]").forEach(function (b) { + b.style.display = "inline-flex"; + }); + var ids = []; + document.querySelectorAll("[data-story-card]").forEach(function (c) { + var id = c.getAttribute("data-id"); + if (id) ids.push(id); + }); + if (!ids.length) return; + fetch("/api/state?ids=" + encodeURIComponent(ids.join(",")), { credentials: "same-origin" }) + .then(function (r) { return r.ok ? r.json() : null; }) + .then(function (data) { + if (!data) return; + var serverRead = Object.create(null); + (data.read || []).forEach(function (id) { + serverRead[id] = 1; readSet[id] = 1; paintCard(id, true); + }); + (data.bookmarked || []).forEach(function (id) { setBookmarkQuiet(id, true); }); + // Push up reads made on this device before the account knew them. + ids.forEach(function (id) { + if (readSet[id] && !serverRead[id]) postState("/api/read", { id: Number(id), read: true }); + }); + saveRead(readSet); + }) + .catch(function () {}); } // Reflect read state onto every matching card on the page (a story can appear // in more than one section on the home page). @@ -173,6 +278,61 @@ .finally(function () { if (ctrl === inflight) inflight = null; }); } + // ---- related ("you might also like") -------------------------------------- + function clearRelated() { + if (!relatedEl) return; + relatedEl.innerHTML = ""; + relatedEl.hidden = true; + } + + function renderRelated(reqId, results) { + if (!relatedEl) return; + // Ignore a response that arrived after the user moved on. + if (!items[index] || String(items[index].id) !== String(reqId)) return; + if (!results || !results.length) { clearRelated(); return; } + var html = '

' + + '"; + relatedEl.innerHTML = html; + relatedEl.hidden = false; + } + + function fetchRelated(it) { + if (!relatedEl) return; + clearRelated(); + var reqId = it.id; + if (relatedCache[reqId]) { renderRelated(reqId, relatedCache[reqId]); return; } + fetch("/api/related?id=" + encodeURIComponent(it.id), { credentials: "same-origin" }) + .then(function (r) { return r.ok ? r.json() : null; }) + .then(function (data) { + var results = (data && data.results) || []; + relatedCache[reqId] = results; + renderRelated(reqId, results); + }) + .catch(function () {}); + } + // ---- navigation ----------------------------------------------------------- function show(i) { index = i; @@ -186,11 +346,17 @@ nextBtn.disabled = false; nextBtn.textContent = index === items.length - 1 ? "done ✓" : "→"; if (scrollEl) scrollEl.scrollTop = 0; + if (readerBookmarkBtn) { + readerBookmarkBtn.style.display = SIGNED_IN ? "" : "none"; + applyReaderBookmark(isBookmarked(it.id)); + } fetchContent(it); + fetchRelated(it); setRead(it.id, true); // presenting a story marks it read } function renderDone() { + clearRelated(); progressEl.textContent = items.length + " / " + items.length; linkEl.style.display = "none"; prevBtn.disabled = items.length === 0; @@ -226,6 +392,7 @@ function closeReader() { open = false; if (inflight) { inflight.abort(); inflight = null; } + clearRelated(); overlay.classList.add("hidden"); document.body.classList.remove("overflow-hidden"); } @@ -245,6 +412,32 @@ if (nextBtn) nextBtn.addEventListener("click", next); if (closeBtn) closeBtn.addEventListener("click", closeReader); if (backdrop) backdrop.addEventListener("click", closeReader); + if (readerBookmarkBtn) readerBookmarkBtn.addEventListener("click", function () { + var it = items[index]; + if (it) setBookmark(it.id, !isBookmarked(it.id)); + }); + + initUserState(); + }); + + // Bookmark buttons live inside the card's ; intercept so a tap toggles the + // bookmark instead of following the link. Delegated so it also covers cards + // that are added or removed after load. + document.addEventListener("click", function (e) { + var btn = e.target.closest && e.target.closest("[data-bookmark-btn]"); + if (!btn) return; + e.preventDefault(); + e.stopPropagation(); + var id = btn.getAttribute("data-story-id"); + if (id) setBookmark(id, !isBookmarked(id)); + }); + document.addEventListener("keydown", function (e) { + if (e.key !== "Enter" && e.key !== " ") return; + var btn = e.target.closest && e.target.closest("[data-bookmark-btn]"); + if (!btn) return; + e.preventDefault(); + var id = btn.getAttribute("data-story-id"); + if (id) setBookmark(id, !isBookmarked(id)); }); document.addEventListener("keydown", function (e) { @@ -274,6 +467,12 @@ if (cur) setRead(cur.id, false); // let the user undo an accidental read break; } + case "b": case "B": { + if (!SIGNED_IN) break; + var it = items[index]; + if (it) { e.preventDefault(); setBookmark(it.id, !isBookmarked(it.id)); } + break; + } } }); })(); diff --git a/internal/web/static/manifest.webmanifest b/internal/web/static/manifest.webmanifest new file mode 100644 index 0000000..874c25f --- /dev/null +++ b/internal/web/static/manifest.webmanifest @@ -0,0 +1,22 @@ +{ + "name": "Pete — friendly news", + "short_name": "Pete", + "description": "A calm, read-one-at-a-time news reader. Bookmarks, a personalized feed, and offline reading.", + "id": "/", + "start_url": "/?source=pwa", + "scope": "/", + "display": "standalone", + "orientation": "portrait-primary", + "background_color": "#fbf3e3", + "theme_color": "#fbf3e3", + "categories": ["news", "productivity"], + "icons": [ + { "src": "/static/img/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" }, + { "src": "/static/img/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" }, + { "src": "/static/img/maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } + ], + "shortcuts": [ + { "name": "For you", "short_name": "For you", "url": "/for-you", "description": "Your personalized feed" }, + { "name": "Bookmarks", "short_name": "Saved", "url": "/bookmarks", "description": "Stories you saved" } + ] +} diff --git a/internal/web/static/sw.js b/internal/web/static/sw.js new file mode 100644 index 0000000..47ba3a5 --- /dev/null +++ b/internal/web/static/sw.js @@ -0,0 +1,198 @@ +// Pete's service worker: an installable-PWA shell, an offline reader, and the +// Web Push receiver. Served from the root (/sw.js) so its scope is the whole +// origin — it can intercept navigations and /api/article the same as any page. +// +// Bump CACHE_VERSION whenever the precached shell assets change; activate() +// drops every cache that doesn't match the current version. +var CACHE_VERSION = "v1"; +var SHELL_CACHE = "pete-shell-" + CACHE_VERSION; +var RUNTIME_CACHE = "pete-runtime-" + CACHE_VERSION; + +// App shell: the static assets every page needs. Versioned by URL content only +// loosely, so we lean on network-first for HTML and cache-first for these. +var SHELL_ASSETS = [ + "/static/css/output.css", + "/static/js/prefs.js", + "/static/js/weather.js", + "/static/js/weather-forecast.js", + "/static/js/search.js", + "/static/js/settings.js", + "/static/js/reader.js", + "/static/js/pwa.js", + "/static/img/pete.avif", + "/static/img/icon-192.png", + "/static/img/icon-512.png", +]; + +// How many visited-article responses to keep for offline reading before the +// oldest are evicted. Reader articles are small JSON blobs. +var RUNTIME_MAX = 60; + +self.addEventListener("install", function (event) { + event.waitUntil( + caches.open(SHELL_CACHE).then(function (cache) { + // addAll is atomic-ish: if one asset 404s the whole install fails, so keep + // this list to assets we know are served. Individual failures are tolerated + // by falling back to per-asset puts. + return Promise.all( + SHELL_ASSETS.map(function (url) { + return cache.add(url).catch(function () {}); + }) + ); + }).then(function () { + return self.skipWaiting(); + }) + ); +}); + +self.addEventListener("activate", function (event) { + event.waitUntil( + caches.keys().then(function (keys) { + return Promise.all( + keys.map(function (k) { + if (k !== SHELL_CACHE && k !== RUNTIME_CACHE) return caches.delete(k); + }) + ); + }).then(function () { + return self.clients.claim(); + }) + ); +}); + +// trimCache evicts the oldest entries once a runtime cache passes its cap. +function trimCache(cacheName, max) { + caches.open(cacheName).then(function (cache) { + cache.keys().then(function (keys) { + if (keys.length <= max) return; + for (var i = 0; i < keys.length - max; i++) cache.delete(keys[i]); + }); + }); +} + +// A minimal offline page for navigations we have nothing cached for. +function offlineFallback() { + return new Response( + "" + + "Offline · Pete" + + "
" + + "
🦆
" + + "

You're offline

" + + "

Pete can't reach the news right now. Articles you've already opened are still readable — head back and try one of those.

" + + "
", + { headers: { "Content-Type": "text/html; charset=utf-8" }, status: 503 } + ); +} + +self.addEventListener("fetch", function (event) { + var req = event.request; + if (req.method !== "GET") return; + + var url = new URL(req.url); + if (url.origin !== self.location.origin) return; // never touch cross-origin + + // Visited articles: network-first so text stays fresh, but cache every success + // so the reader still works offline for stories the user has already opened. + if (url.pathname === "/api/article") { + event.respondWith( + fetch(req).then(function (res) { + if (res && res.ok) { + var copy = res.clone(); + caches.open(RUNTIME_CACHE).then(function (cache) { + cache.put(req, copy); + trimCache(RUNTIME_CACHE, RUNTIME_MAX); + }); + } + return res; + }).catch(function () { + return caches.match(req).then(function (hit) { + return hit || new Response(JSON.stringify({ error: "offline" }), { + status: 503, + headers: { "Content-Type": "application/json" }, + }); + }); + }) + ); + return; + } + + // Static assets: cache-first (they're versioned by deploy), fill the cache on + // first miss so a later offline visit has them. + if (url.pathname.indexOf("/static/") === 0) { + event.respondWith( + caches.match(req).then(function (hit) { + return hit || fetch(req).then(function (res) { + if (res && res.ok) { + var copy = res.clone(); + caches.open(SHELL_CACHE).then(function (cache) { cache.put(req, copy); }); + } + return res; + }); + }) + ); + return; + } + + // Page navigations: network-first, fall back to a cached copy of the same page, + // then to the offline card. Successful HTML is cached so revisits work offline. + if (req.mode === "navigate") { + event.respondWith( + fetch(req).then(function (res) { + if (res && res.ok) { + var copy = res.clone(); + caches.open(RUNTIME_CACHE).then(function (cache) { + cache.put(req, copy); + trimCache(RUNTIME_CACHE, RUNTIME_MAX); + }); + } + return res; + }).catch(function () { + return caches.match(req).then(function (hit) { + return hit || offlineFallback(); + }); + }) + ); + return; + } + + // Everything else (other /api/* calls): straight to the network. These are + // personalized/stateful and must not be served stale. +}); + +// ---- Web Push ------------------------------------------------------------- +// The server sends a JSON payload {title, body, url, tag}. Missing fields fall +// back to sensible defaults so a malformed push still shows something useful. +self.addEventListener("push", function (event) { + var data = {}; + if (event.data) { + try { data = event.data.json(); } catch (e) { data = { body: event.data.text() }; } + } + var title = data.title || "Pete"; + var options = { + body: data.body || "New stories are waiting.", + icon: "/static/img/icon-192.png", + badge: "/static/img/icon-192.png", + tag: data.tag || "pete-digest", + renotify: true, + data: { url: data.url || "/" }, + }; + event.waitUntil(self.registration.showNotification(title, options)); +}); + +self.addEventListener("notificationclick", function (event) { + event.notification.close(); + var target = (event.notification.data && event.notification.data.url) || "/"; + event.waitUntil( + self.clients.matchAll({ type: "window", includeUncontrolled: true }).then(function (clients) { + for (var i = 0; i < clients.length; i++) { + var c = clients[i]; + // Focus an existing Pete tab and route it to the target if we can. + if ("focus" in c) { + c.focus(); + if ("navigate" in c && target !== "/") { try { c.navigate(target); } catch (e) {} } + return; + } + } + if (self.clients.openWindow) return self.clients.openWindow(target); + }) + ); +}); diff --git a/internal/web/status.go b/internal/web/status.go new file mode 100644 index 0000000..6d9f0ec --- /dev/null +++ b/internal/web/status.go @@ -0,0 +1,128 @@ +package web + +import ( + "log/slog" + "net/http" + "sort" + "time" + + "pete/internal/storage" +) + +// isAdmin reports whether the request carries a signed-in session whose OIDC +// subject is on the admin allowlist. False when auth is off, the allowlist is +// empty, or the visitor is anonymous. +func (s *Server) isAdmin(r *http.Request) bool { + if s.auth == nil || len(s.adminSubs) == 0 { + return false + } + u := s.auth.userFromRequest(r) + if u == nil { + return false + } + return s.adminSubs[u.Sub] +} + +// sourceStatus is one row of the source-health dashboard: the configured feed +// plus its persisted poll health and derived content stats. +type sourceStatus struct { + Name string + Channel string + Healthy bool // last poll succeeded (no consecutive failures) + NeverRun bool // no poll recorded yet + + LastPollAt time.Time + LastSuccessAt time.Time + LastError string + Failures int + LastItemCount int + + Total int + Classified int + Paywalled int + PaywallRate int // percent of retained stories that are gated + LastSeenAt time.Time + LastPostedAt time.Time +} + +type statusPage struct { + pageData + Sources []sourceStatus + DegradedCnt int // sources currently failing +} + +// handleStatus renders the owner-facing source-health dashboard. Access is +// restricted to admin subjects; everyone else gets a 404 so the page's +// existence isn't advertised. +func (s *Server) handleStatus(w http.ResponseWriter, r *http.Request) { + if !s.isAdmin(r) { + http.NotFound(w, r) + return + } + s.track(r, "status") + + health, err := storage.ListSourceHealth() + if err != nil { + slog.Error("web: source health query failed", "err", err) + http.Error(w, "internal error", http.StatusInternalServerError) + return + } + stats, err := storage.SourceContentStats() + if err != nil { + slog.Error("web: source content stats failed", "err", err) + http.Error(w, "internal error", http.StatusInternalServerError) + return + } + + rows := make([]sourceStatus, 0, len(s.sources)) + degraded := 0 + for _, src := range s.sources { + h, hasHealth := health[src.Name] + st := stats[src.Name] + + row := sourceStatus{ + Name: src.Name, + Channel: src.Channel, + NeverRun: !hasHealth || h.LastPollAt == 0, + LastError: h.LastError, + Failures: h.ConsecutiveFailures, + LastItemCount: h.LastItemCount, + Total: st.Total, + Classified: st.Classified, + Paywalled: st.Paywalled, + } + row.Healthy = hasHealth && h.ConsecutiveFailures == 0 + if h.LastPollAt > 0 { + row.LastPollAt = time.Unix(h.LastPollAt, 0) + } + if h.LastSuccessAt > 0 { + row.LastSuccessAt = time.Unix(h.LastSuccessAt, 0) + } + if st.LastSeenAt > 0 { + row.LastSeenAt = time.Unix(st.LastSeenAt, 0) + } + if st.LastPostedAt > 0 { + row.LastPostedAt = time.Unix(st.LastPostedAt, 0) + } + if st.Total > 0 { + row.PaywallRate = st.Paywalled * 100 / st.Total + } + if !row.NeverRun && !row.Healthy { + degraded++ + } + rows = append(rows, row) + } + + // Failing sources first (most consecutive failures), then healthy ones by + // name, so the owner's eye lands on what needs attention. + sort.SliceStable(rows, func(i, j int) bool { + if rows[i].Failures != rows[j].Failures { + return rows[i].Failures > rows[j].Failures + } + return rows[i].Name < rows[j].Name + }) + + base := s.base(r) + base.Active = "status" + s.render(w, "status", statusPage{pageData: base, Sources: rows, DegradedCnt: degraded}) +} diff --git a/internal/web/status_render_test.go b/internal/web/status_render_test.go new file mode 100644 index 0000000..792d8c9 --- /dev/null +++ b/internal/web/status_render_test.go @@ -0,0 +1,38 @@ +package web + +import ( + "strings" + "testing" + "time" + + "pete/internal/config" +) + +func TestStatusTemplateExecutes(t *testing.T) { + s, err := New(config.WebConfig{SiteTitle: "Pete", ListenAddr: ":0"}, nil, true) + if err != nil { + t.Fatal(err) + } + data := statusPage{ + pageData: pageData{SiteTitle: "Pete", Channels: channels}, + DegradedCnt: 1, + Sources: []sourceStatus{ + {Name: "Broken Feed", Channel: "tech", Failures: 3, LastError: "dial tcp: timeout", + LastPollAt: time.Now(), NeverRun: false, Healthy: false, Total: 4, Paywalled: 2, PaywallRate: 50}, + {Name: "Good Feed", Channel: "eu", Healthy: true, LastPollAt: time.Now(), + LastSuccessAt: time.Now(), LastItemCount: 12, Total: 30, Classified: 28, + LastSeenAt: time.Now(), LastPostedAt: time.Now()}, + {Name: "Idle Feed", Channel: "music", NeverRun: true}, + }, + } + var b strings.Builder + if err := s.tpls["status"].ExecuteTemplate(&b, "layout", data); err != nil { + t.Fatal(err) + } + out := b.String() + for _, want := range []string{"Broken Feed", "Good Feed", "dial tcp: timeout", "1 degraded", "Source health"} { + if !strings.Contains(out, want) { + t.Errorf("rendered status page missing %q", want) + } + } +} diff --git a/internal/web/templates/_card.html b/internal/web/templates/_card.html index 50c29a6..3db1171 100644 --- a/internal/web/templates/_card.html +++ b/internal/web/templates/_card.html @@ -11,6 +11,13 @@ data-posted="{{if .Story.Posted}}1{{end}}" data-paywalled="{{if .Story.Paywalled}}1{{end}}" class="group relative block rounded-3xl bg-[color:var(--card)] border-2 {{if .Story.Posted}}border-theme-{{.Theme}} glow-theme-{{.Theme}}{{else}}border-[color:var(--ink)]/10{{end}} shadow-pete overflow-hidden hover:-translate-y-1 hover:shadow-pete-lg transition"> + + + {{if .Story.ImageURL}}
+
+ +
+

saved for later

+

Bookmarks

+

Stories you've tucked away. Tap the bookmark on any card to add or remove one.

+

{{.Total}} saved

+
+
+ + +{{if .Stories}} +
+ {{range .Stories}} + {{template "card" dict "Story" . "Theme" .Channel "ShowChannel" true}} + {{end}} +
+ +
+{{else}} +
+ Nothing saved yet. Browse the feed and tap the 🔖 on a story to keep it here. +
+{{end}} +{{end}} diff --git a/internal/web/templates/for-you.html b/internal/web/templates/for-you.html new file mode 100644 index 0000000..3f1359d --- /dev/null +++ b/internal/web/templates/for-you.html @@ -0,0 +1,26 @@ +{{define "title"}}For you — {{.SiteTitle}}{{end}} + +{{define "main"}} +
+
+ +
+

picked for you

+

For you

+

Fresh stories weighted toward the channels and sources you read and bookmark most. The more you read, the sharper this gets.

+
+
+
+ +{{if .Stories}} +
+ {{range .Stories}} + {{template "card" dict "Story" . "Theme" .Channel "ShowChannel" true}} + {{end}} +
+{{else}} +
+ Nothing to tune yet. Read a few stories or bookmark the ones you like, and Pete will start building a feed around them. +
+{{end}} +{{end}} diff --git a/internal/web/templates/index.html b/internal/web/templates/index.html index 560b4a1..10ae816 100644 --- a/internal/web/templates/index.html +++ b/internal/web/templates/index.html @@ -6,14 +6,34 @@ a friendlier news feed.

+ {{if .PostingEnabled}} Pete reads RSS, sorts stories, and posts them to Matrix. Glowing cards are the ones he's posted. + {{else}} + Pete reads RSS and sorts stories into channels, fresh from his feeds. + {{end}}

-{{if .JustPosted}} +{{if .ForYou}} +
+
+

+ For you +

+ more → +
+
+ {{range .ForYou}} + {{template "card" dict "Story" . "Theme" .Channel "ShowChannel" true}} + {{end}} +
+
+{{end}} + +{{if and .PostingEnabled .JustPosted}}

@@ -34,7 +54,7 @@

Channels

- last 24 hours + {{if .PostingEnabled}}last 24 hours{{else}}what Pete's tracking{{end}}
{{range .Stats}} @@ -47,6 +67,7 @@ {{.Channel.Title}}
+ {{if $.PostingEnabled}}
last post
@@ -57,6 +78,7 @@
posted 24h
{{.PostsToday}}
+ {{end}}
stories
{{.Total}}
diff --git a/internal/web/templates/layout.html b/internal/web/templates/layout.html index 71cc389..3ead847 100644 --- a/internal/web/templates/layout.html +++ b/internal/web/templates/layout.html @@ -9,6 +9,17 @@ + + + + + + + + + {{if .Active}}{{if ne .Active "bookmarks"}} + + {{end}}{{end}} @@ -214,5 +270,6 @@ + {{end}} diff --git a/internal/web/templates/status.html b/internal/web/templates/status.html new file mode 100644 index 0000000..161286b --- /dev/null +++ b/internal/web/templates/status.html @@ -0,0 +1,80 @@ +{{define "title"}}Source health — {{.SiteTitle}}{{end}} + +{{define "main"}} +
+
+

owner view

+

Source health

+

+ Per-feed poll status and content stats. Rows that are currently failing float to the top. +

+
+ + {{len .Sources}} sources + + {{if .DegradedCnt}} + + ⚠ {{.DegradedCnt}} degraded + + {{else}} + + ✓ all healthy + + {{end}} +
+
+
+ +
+ + + + + + + + + + + + + + + + + {{range .Sources}} + + + + + + + + + + + + + {{if .LastError}}{{if not .Healthy}} + + + + {{end}}{{end}} + {{else}} + + {{end}} + +
SourceChannelStatusLast pollLast successItemsStoriesPaywallLast storyLast posted
{{.Name}}{{.Channel}} + {{if .NeverRun}} + ◌ idle + {{else if .Healthy}} + ● ok + {{else}} + ✕ {{.Failures}} fail{{if ne .Failures 1}}s{{end}} + {{end}} + {{if .LastPollAt.IsZero}}never{{else}}{{timeAgo .LastPollAt}}{{end}}{{if .LastSuccessAt.IsZero}}never{{else}}{{timeAgo .LastSuccessAt}}{{end}}{{.LastItemCount}}{{.Total}} + {{if .Total}}{{.PaywallRate}}%{{else}}—{{end}} + {{if .LastSeenAt.IsZero}}—{{else}}{{timeAgo .LastSeenAt}}{{end}}{{if .LastPostedAt.IsZero}}—{{else}}{{timeAgo .LastPostedAt}}{{end}}
{{.LastError}}
No sources configured.
+
+{{end}} diff --git a/internal/web/userstate_api.go b/internal/web/userstate_api.go new file mode 100644 index 0000000..b2c0125 --- /dev/null +++ b/internal/web/userstate_api.go @@ -0,0 +1,159 @@ +package web + +import ( + "encoding/json" + "io" + "log/slog" + "net/http" + "strconv" + "strings" + + "pete/internal/storage" +) + +// maxStateBodyBytes caps read/bookmark request bodies. These carry a single id +// and a boolean, so this is generous headroom. +const maxStateBodyBytes = 1024 + +// maxStateIDs bounds how many ids /api/state will look up in one call. A page +// renders a few dozen cards; this is well clear of that. +const maxStateIDs = 500 + +// requireUser resolves the signed-in user or writes the appropriate error and +// returns nil. It mirrors handlePrefs: 404 when auth is disabled entirely, 401 +// for anonymous callers (the client's cue to stay on localStorage). +func (s *Server) requireUser(w http.ResponseWriter, r *http.Request) *SessionUser { + if s.auth == nil { + http.Error(w, "auth disabled", http.StatusNotFound) + return nil + } + u := s.auth.userFromRequest(r) + if u == nil { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + http.Error(w, `{"error":"not signed in"}`, http.StatusUnauthorized) + return nil + } + return u +} + +// decodeStateBody reads a small JSON body into dst, writing a 400 on failure. +func decodeStateBody(w http.ResponseWriter, r *http.Request, dst any) bool { + return decodeStateBodyN(w, r, dst, maxStateBodyBytes) +} + +// decodeStateBodyN is decodeStateBody with an explicit byte cap, for endpoints +// (like push subscribe) whose payloads run larger than a single id + flag. +func decodeStateBodyN(w http.ResponseWriter, r *http.Request, dst any, limit int64) bool { + body, err := io.ReadAll(io.LimitReader(r.Body, limit+1)) + if err != nil || int64(len(body)) > limit { + http.Error(w, `{"error":"bad request"}`, http.StatusBadRequest) + return false + } + if err := json.Unmarshal(body, dst); err != nil { + http.Error(w, `{"error":"invalid JSON"}`, http.StatusBadRequest) + return false + } + return true +} + +// handleRead records or clears a story's read flag for the signed-in user. +func (s *Server) handleRead(w http.ResponseWriter, r *http.Request) { + u := s.requireUser(w, r) + if u == nil { + return + } + var req struct { + ID int64 `json:"id"` + Read bool `json:"read"` + } + if !decodeStateBody(w, r, &req) { + return + } + if req.ID <= 0 { + http.Error(w, `{"error":"bad id"}`, http.StatusBadRequest) + return + } + if err := storage.SetRead(u.Sub, req.ID, req.Read); err != nil { + slog.Error("state: set read failed", "sub", u.Sub, "id", req.ID, "err", err) + http.Error(w, `{"error":"internal error"}`, http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusNoContent) +} + +// handleBookmark adds or removes a bookmark for the signed-in user. +func (s *Server) handleBookmark(w http.ResponseWriter, r *http.Request) { + u := s.requireUser(w, r) + if u == nil { + return + } + var req struct { + ID int64 `json:"id"` + On bool `json:"on"` + } + if !decodeStateBody(w, r, &req) { + return + } + if req.ID <= 0 { + http.Error(w, `{"error":"bad id"}`, http.StatusBadRequest) + return + } + if err := storage.SetBookmark(u.Sub, req.ID, req.On); err != nil { + slog.Error("state: set bookmark failed", "sub", u.Sub, "id", req.ID, "err", err) + http.Error(w, `{"error":"internal error"}`, http.StatusInternalServerError) + return + } + w.WriteHeader(http.StatusNoContent) +} + +// handleState returns which of the given story ids are read and bookmarked, so +// the client can paint a freshly rendered page in one round-trip. +func (s *Server) handleState(w http.ResponseWriter, r *http.Request) { + u := s.requireUser(w, r) + if u == nil { + return + } + ids := parseIDList(r.URL.Query().Get("ids")) + read, bookmarked, err := storage.UserStoryState(u.Sub, ids) + if err != nil { + slog.Error("state: lookup failed", "sub", u.Sub, "err", err) + http.Error(w, `{"error":"internal error"}`, http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.Header().Set("Cache-Control", "no-store") + _ = json.NewEncoder(w).Encode(map[string]any{ + "read": keysOf(read), + "bookmarked": keysOf(bookmarked), + }) +} + +// parseIDList turns "1,2,3" into a bounded, deduplicated slice of positive ids. +func parseIDList(raw string) []int64 { + if raw == "" { + return nil + } + seen := make(map[int64]bool) + out := make([]int64, 0) + for _, part := range strings.Split(raw, ",") { + id, err := strconv.ParseInt(strings.TrimSpace(part), 10, 64) + if err != nil || id <= 0 || seen[id] { + continue + } + seen[id] = true + out = append(out, id) + if len(out) >= maxStateIDs { + break + } + } + return out +} + +// keysOf returns the keys of a set as a slice (order unspecified). +func keysOf(m map[int64]bool) []int64 { + out := make([]int64, 0, len(m)) + for k := range m { + out = append(out, k) + } + return out +} diff --git a/main.go b/main.go index 6b6b56c..09f07a4 100644 --- a/main.go +++ b/main.go @@ -21,9 +21,22 @@ import ( "pete/internal/storage" "pete/internal/web" + webpush "github.com/SherClockHolmes/webpush-go" "maunium.net/go/mautrix/id" ) +// runGenVAPID prints a fresh VAPID keypair for the [web.push] config block. +func runGenVAPID() { + priv, pub, err := webpush.GenerateVAPIDKeys() + if err != nil { + fmt.Fprintln(os.Stderr, "genvapid: failed:", err) + os.Exit(1) + } + fmt.Println("# Add these under [web.push] in your config:") + fmt.Printf("vapid_public_key = %q\n", pub) + fmt.Printf("vapid_private_key = %q\n", priv) +} + func main() { configPath := flag.String("config", "config.toml", "path to config file") seed := flag.Bool("seed", false, "ingest current feed items as seen without posting, then exit") @@ -31,8 +44,15 @@ func main() { testSource := flag.String("test-source", "", "source name to use for -test (default: first enabled)") local := flag.Bool("local", false, "web/RSS-only mode: poll feeds and serve the web UI, no Matrix login or posting") backfillPaywall := flag.Bool("backfill-paywall", false, "re-check paywalled rows with current detection logic; clear false positives and fill missing thumbnails, then exit") + genVAPID := flag.Bool("genvapid", false, "generate a VAPID keypair for web.push and print it, then exit") flag.Parse() + // -genvapid needs neither config nor database; handle it before anything else. + if *genVAPID { + runGenVAPID() + return + } + slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: slog.LevelInfo, }))) @@ -240,11 +260,12 @@ func main() { // Start the read-only web UI alongside the Matrix bot. if cfg.Web.Enabled { - ws, err := web.New(cfg.Web, cfg.Sources) + ws, err := web.New(cfg.Web, cfg.Sources, postingEnabled) if err != nil { slog.Error("web server init failed", "err", err) } else { go ws.Start(ctx) + ws.StartPushSender(ctx) } } @@ -349,7 +370,8 @@ func runLocal(cfg *config.Config) { poller.Start(ctx) slog.Info("local: pollers started") - ws, err := web.New(cfg.Web, cfg.Sources) + // Local mode never connects to Matrix, so it's always web-only. + ws, err := web.New(cfg.Web, cfg.Sources, false) if err != nil { slog.Error("local: web server init failed", "err", err) os.Exit(1)