PromoLens

Open-source Chrome extension that estimates, on request, how likely a Reddit post is to be promotional. Not affiliated with Reddit.

View the Project on GitHub PhiDesign/promolens

Reddit developer-terms review (draft, not legal advice)

Reviewed on 2026-09-07 against:

Not yet reviewed: the Developer Data Protection Addendum (Dev 7.1), the Public Content Policy (Dev 4.2), Brand Guidelines. Do those before any public release.

Summary

  Personal use (today) Public release
Reading public post pages and profile listings via www.reddit.com/*.json with the user’s session Negligible risk, but technically not the “authorized Access Info” the terms require Blocker - must use a registered app + OAuth (Dev 1.4, 6; Data API 2.8)
Sending post text to a third-party LLM provider for inference No training, provider does not train on API input, one post per click Blocker unless Reddit permits it, the model runs locally, or the public build ships rules-only (Dev 7.2 “will not share Reddit Services and Data with any third party”; Dev 4.2 / Data API 2.4, 3.2 on AI models)
Free, open source, no monetization OK OK - stays OK only while non-commercial (Dev 4.1; Data API 3.1, 3.2)
Short caches (results 24 h, history 6 h), Clear-cache button OK Mostly OK - see encryption at rest
History summaries with excerpts stored in extension storage Unencrypted at rest Fix: keep excerpts in memory only, or persist hashes/results without content (Dev 7.4)
Attribution of quoted evidence Quotes and subreddit shown, no link back Fix: link history evidence to permalinks, cite username, say it is from Reddit (Dev 5.2; Data API 4.2)
Privacy policy docs/privacy.md draft Fix: publish at a URL before install; describe deletion (Dev 7.2; Data API 2.6); comply with the DPA (Dev 7.1)
Rate limits, no crawling, no surveillance or harassment On-demand only, one click = one post OK (Dev 4.2) - keep the on-demand design
App review - Register the app honestly; Reddit may review at its discretion (Dev 3.1)

Actions before a public release

  1. Register a Reddit app; move background/history.ts and background/postFetch.ts to the OAuth Data API (user login, oauth.reddit.com). Keep the one-click-one-post behaviour. Built 2026-09-07, dormant: background/redditAuth.ts implements the installed-app OAuth flow (code grant, permanent refresh token, silent refresh, revoke on logout) and dataApiFetch routes the existing fetchers through oauth.reddit.com; the popup shows “Log in with Reddit” once REDDIT_CLIENT_ID in apps/extension/src/shared/redditApp.ts is filled in after Reddit’s approval. Known limitation: a browser extension cannot set a custom User-Agent on fetch; document this in the access request if Reddit asks.
  2. Decide the deeper-analysis story for the public build: rules-only by default; model analysis only as “run your own API” with a local model, or with written permission from Reddit for inference-only use.
  3. Do not persist post/comment/history excerpts at rest - done 2026-09-07: history summaries and fetched post pages live in worker memory only; only hashed results are stored.
  4. Add permalink links and usernames to evidence lines that quote other posts or comments - done 2026-09-07: history evidence names u/<author> and carries a “source” link to the post.
  5. Publish the privacy policy at a stable URL; add the deletion instructions; read and comply with the Developer DPA.
  6. Read the Public Content Policy and Brand Guidelines; keep “not affiliated with Reddit” wording; “PromoLens for Reddit” is the permitted naming pattern if the Reddit wordmark is ever used.
  7. Keep the project non-commercial unless a separate agreement with Reddit exists.

Where to ask Reddit (from the Developer Terms and the linked help article)

Responsible Builder Policy (read 2026-09-07)

Shown by Reddit before app creation. Points that matter for PromoLens:

Consequence: the OAuth migration depends on an approved access request, not just on a client ID. Submit the non-commercial request first; keep the paid-tier question for a separate, later ticket, but do not hide the intent.

Access request log

Context: the November 2025 policy change

r/redditdev announcement “Introducing the Responsible Builder Policy + new approval process for API access” (u/redtaboo, admin, 11 Nov 2025):

Resubmission text (second request)

Fill in the app name / client id before sending. Keep every sentence true of the public build.

Benefit for Redditors. PromoLens helps readers tell transparent promotion from possible undisclosed promotion. Many posts in communities such as r/SaaS or r/Entrepreneur are product pitches dressed as stories or advice. On the reader’s request, PromoLens shows an estimate of how promotional a post is, whether the author disclosed a connection, and the observable evidence, quoted from the post. It treats an openly disclosed founder post as fine and never makes claims about a person - only about a post. Free, open source (MIT): https://github.com/PhiDesign/promolens. Privacy policy: https://phidesign.github.io/promolens/privacy.

What the app does on Reddit. It is a Chrome extension that runs entirely in the reader’s browser. It never posts, votes, comments, or messages, and does nothing automatically. When the reader clicks a button on a post, it reads that one post (title, body, links, top-level comments) and the post author’s recent public submissions and comments - the same pages anyone can open - through the Data API with the reader’s own OAuth login (read-only scopes: identity, read, history). A rule engine in the browser then scores the post. The author history is used for one purpose: to see whether the same product is being posted repeatedly across communities (repeat promotion / spam). PromoLens does not infer anything about people - no sensitive characteristics, no identity matching, no profiling beyond “this product recurs in this author’s posts”. Results are shown as estimates (e.g. “possible undisclosed promotion”, “transparent promotion”) with quoted evidence and links back to the source posts. Every request is made by a human’s explicit click, from their own browser, under their own OAuth token; the extension identifies itself through the registered OAuth client (a browser extension cannot set a custom User-Agent header) and its behaviour is publicly documented in the linked repository and privacy policy. Nothing is stored on any server; results are cached in the browser for 24 hours by content hash and can be cleared with one click; post text is never written to disk. No data is sold, shared, or used to train any model. Volume: about four API requests per click, a few dozen per user per day.

Example. A post titled “My exact content workflow” that names five tools and links only one, with a referral code, by an author whose public posts mention that tool in five communities, is shown as “Possible undisclosed promotion” with those three facts as reasons. A post saying “I’m the founder, here is the link” is shown as “Transparent promotion”. A balanced comparison with no links is shown as “Looks organic”.

Why not Devvit. PromoLens must annotate any post the reader is viewing, in the reader’s own browser, on the reader’s request, without moderator installation and without acting as its own account. Devvit apps are installed per subreddit by moderators and render inside Reddit’s app surfaces; they cannot add a control to arbitrary post pages in the reader’s browser.

Subreddits. None specifically - it acts only on the post the reader clicks. Operating username. None; it acts as the logged-in reader. App. Not yet created: the app-creation form currently requires prior approval (it returns the Responsible Builder Policy notice). On approval I will register “PromoLens” as an installed app (no client secret) with redirect URI https://ehfnofnaipjdnmniofegnlpfgaghcbmn.chromiumapp.org/oauth and about-URL https://phidesign.github.io/promolens/.

Note (2026-09-08): app creation at reddit.com/prefs/apps is blocked until a data-access request is approved, so the request must go first and the app is registered afterwards.

Do not mention the optional language-model API in this request: it is a developer-only feature, off by default, that runs against a server the developer hosts; it is not part of the public build’s Reddit data flow.

Why the design already helps

The terms repeatedly penalise crawling, excessive use, retention beyond need, and surveillance. PromoLens analyses one post per explicit click, never scans feeds automatically, keeps only short-lived caches, and phrases every result as an estimate about a post rather than a claim about a person. Those choices are the main reason the remaining work is a migration (OAuth) and a policy decision (model provider), not a redesign.