What Weirling collects, and why
Weirling ranks articles by how you actually read. That means it records what you open, how far you read, and what you rate. Here is every field, in plain language. Nothing is sold, shared with advertisers, or sent to analytics companies.
Your controls
- See and edit what was learned: the interest map.
- Download everything: Preferences → Your Data → Export (a portable JSON file).
- Delete everything: Preferences → Your Data → Delete account. It is permanent and immediate.
- Leave the crowd counts: Preferences → Your Data, untick “Count my reading…”.
- Email: turn digest, weekly and alert emails on or off in Preferences, or use the link in any email.
On a self-hosted instance, the person who runs it holds this data, on their own server.
What you did with each article
One row per article you opened, saved, rated or skipped.
How long: Kept while your account exists. After 90 days (TELEMETRY_RAW_RETENTION_DAYS) the two finest-grained fields, scroll depth and active reading time, are cleared; completion, ratings and saves stay because your interest map is built from them.
| Field | What it is | Why |
|---|---|---|
| id | A random record number. | Database bookkeeping. |
| user_id | Your account. | Links the record to you and to the article. |
| content_item_id | The article. | Links the record to you and to the article. |
| prs_score | The score the article had for you when it was shown. | To check later whether the ranking was right. |
| was_suggested | Whether it was a discovery pick from outside your sources. | To learn which discoveries you like. |
| surfaced_in_digest | Whether your digest showed it. | To tell digest reading from browsing. |
| opened_at | When you first opened it. | Reading habits, such as the best time to send your digest. |
| read_completion_pct | How much of it you read (0 to 100%). | The main signal: finished articles teach the ranking most. |
| time_on_page_seconds | Seconds the reader page was open. | A rough reading-time signal for older clients. |
| scroll_depth_pct | How far down you scrolled. | Part of the completion estimate. Cleared after 90 days. |
| active_time_seconds | Seconds you were actively reading (not idle, tab visible). | Part of the completion estimate. Cleared after 90 days. |
| reached_end | Whether you reached the end. | A strong sign you finished it. |
| re_read_count | How often you came back to it in a later session. | Re-reading is a strong sign of value. |
| explicit_rating | Your thumbs up or down. | Your direct feedback to the ranking. |
| explicit_rating_reason | The reason you picked (e.g. too basic, off-topic). | Adjusts the ranking in the way you asked. |
| saved | Whether you saved it. | Saves are a strong positive signal and fill your saved list. |
| saved_at | When you saved it. | Ordering your saved list. |
| saved_read_at | When you finished a saved article. | Learning whether saving leads to reading. |
| shared | Whether you shared it. | A positive signal. |
| skipped | Whether you skipped it. | A negative signal. |
| graph_signal_applied | How much of this record has already updated your interest map. | So the same read is never counted twice. |
| tags | Tags you gave a saved article, or that came with an import. | Organising your saved list. |
| created_at | When the record was created. | Database bookkeeping. |
| updated_at | When it last changed. | Database bookkeeping and the 90-day clean-up. |
What your digest showed you
One row per article placed in a digest, with the numbers behind its position.
How long: Deleted after 90 days (TELEMETRY_RAW_RETENTION_DAYS). Before deletion they are folded into daily counts per digest section that contain no user at all.
| Field | What it is | Why |
|---|---|---|
| id | A random record number. | Database bookkeeping. |
| user_id | Your account. | Links the record to you and to the article. |
| content_item_id | The article. | Links the record to you and to the article. |
| digest_id | Which digest it was in. | Grouping by digest. |
| section | The digest section (top reads, discover…). | Measuring each section. |
| position | Its place in the digest. | Correcting for 'people read the top item more'. |
| score | Its ranking score. | Learning how to rank better for you. |
| features_json | The signal values behind the score (topic match, source trust…). | Learning which signals matter to you. |
| weights_version | Which version of the ranking model scored it. | Comparing model versions fairly. |
| exploration | Whether it was a deliberate 'try something new' pick. | So exploration doesn't bias the learning. |
| propensity | How likely that pick was. | Correcting for exploration when learning. |
| viewed | Whether you opened the digest it was in. | An item in a digest you never opened isn't counted as ignored. |
| team | Which ranking chose it, in a head-to-head test digest. | Measuring whether Weirling's ranking beats newest-first. |
| shown_at | When it was shown. | Timing and the 90-day clean-up. |
Your digests
One row per digest built for you.
How long: Kept while your account exists, so you can look back at past digests.
| Field | What it is | Why |
|---|---|---|
| id | A random record number. | Database bookkeeping. |
| user_id | Your account. | Links the digest to you. |
| generated_at | When it was built. | Showing the right digest and your history. |
| delivered_at | When it was emailed, if it was. | Not emailing the same digest twice. |
| delivery_method | In the app or by email. | Delivery bookkeeping. |
| section_counts | How many items each section had. | Showing the digest layout. |
| opened | Whether you opened it. | Learning your digest length and send time; pausing nudges. |
| total_items | How many items it had. | Skipping near-empty emails. |
| created_at | When the record was created. | Database bookkeeping. |
| updated_at | When it last changed. | Database bookkeeping. |
Product events (hosted service only)
On the hosted service, one row for each of these moments: signing up, finishing onboarding, adding sources, a digest being sent or opened, opening or finishing an article, rating, saving, answering 'how many of the top 5 did you want?', subscribing and cancelling. Self-hosted instances record none by default (PRODUCT_METRICS), and nothing is sent to any third party.
How long: Kept while your account exists and deleted with it. Daily totals with no account attached are kept for trends.
| Field | What it is | Why |
|---|---|---|
| id | A random record number. | Database bookkeeping. |
| user_id | Your account. | Counting readers rather than clicks, and deleting your events with your account. |
| event | Which moment it was, e.g. digest opened. | Measuring whether the product works: weekly satisfied readers, retention, time to a first good digest. |
| props | A small detail: the plan, a count, or your top-5 answer. Never article titles or text. | Telling those measurements apart. |
| created_at | When it happened. | Weekly and daily totals. |
Everything else
- Account: your email, a one-way hash of your password, your name and your settings.
- What you follow: your sources, creators, and the newsletters sent to your Weirling address (visible only to you).
- What was learned: your interest map (topics and weights) and how much you trust each source.
- Articles: the full text of an article is shortened to an excerpt after 90 days.
Cookies and browser storage
Weirling uses only what it needs to sign you in, keep your account safe and remember your settings. There are no analytics, advertising or tracking cookies, and nothing from other companies, so there is nothing to consent to and no banner.
| Name | Type | Why | How long |
|---|---|---|---|
| rp_access | Cookie | Keeps you signed in. httpOnly, so page scripts cannot read it. | Minutes; renewed while you use the app. |
| rp_refresh | Cookie | Renews your session without a new sign-in. httpOnly, sent only to the sign-in endpoints. | Until it expires (days) or you sign out. |
| rp_csrf | Cookie | Protects your account against forged requests from other sites. httpOnly. | Same as the session. |
| rp-session-seen | Local storage | Remembers that this device was signed in, so the app opens offline. | Removed when you sign out. |
| reader-font-step | Local storage | Your reader text size. | Until you clear site data. |
| reader-theme | Local storage | Your reader colour theme. | Until you clear site data. |
| install-prompt-dismissed | Local storage | Stops the 'install the app' hint coming back. | Until you clear site data. |
| readprism-v2 | Offline cache | App pages and articles you opened, so they work offline. | Replaced on each app update. |