Repository navigation
tippr v0.21.0
✨ Features and improvements
- A browser test in the release workflow: after the smoke test, four ordinary members (not admins) use the site
in Chrome: one posts through the submit form, the others reply to each other down a thread, and they all vote on
the post and the comments, changing and undoing votes, with the arrows and scores checked. A fifth account,
moderator of the test vault only, handles a member's report from the queue, removes and approves a comment,
distinguishes its own, locks and unlocks the thread, and bans and unbans a member, each checked as the moderator,
the members and logged-out visitors see it, and in the moderation log. And support requests: two members write to
the admins from the contact page; an admin turns on admin mode with a two-factor code, takes one, notes and replies,
and gives an employee one category, who sees only that; the member gets the answer from the admin team, without the
admin's name or the staff note, and their reply reaches the ticket. Every page is checked
for JavaScript errors, failed requests, sideways scrolling on a phone and unreadable text, and saved as a
screenshot at desktop and phone width in both themes (the run'sscreenshots-VERSIONartifact). See
docs/RELEASING.md. - NSFW posts stay off the front page and /v/all unless a member asks for them: being over 18 used to put
every NSFW post in those listings, which also took the ads off those pages. A new preference, "show NSFW posts on
the front page and /v/all" (off by default, and only for members who said they're over 18), brings them back;
NSFW vaults and their posts are shown in the vault itself as before. - Markdown follows CommonMark now, in place of reddit's snudown: posts, comments, messages, sidebars and the
wiki use markdown-it-py, the standard most sites follow, with GitHub's tables,strikethroughand bare links,
and tippr's own super^script, ^(several words), >!spoilers!< and :emoji:. New: task lists (- [ ]/- [x]
show as ☐ / ☑),[words](example.com)links withouthttps://, and /v/vault links, which snudown never made
(it linked reddit's /r/ instead). A picture's address,, is a link to it outside the wiki,
not leftover syntax. Differences: a heading needs a space after its#s (#1stays as typed), and the wiki no
longer takes raw HTML tables (markdown tables do the same). Output is still checked against the same list of
safe tags, raw HTML is still never used, and long or odd text renders quickly. Installs no longer build snudown
or need gperf; linkify-it-py is new. - Formatting buttons and help for the new markdown: the toolbar over text boxes adds heading, code block,
numbered list, task list and table buttons (code on several lines now becomes a ``` block). The "formatting help"
table under the box shows every option, including strikethrough, superscript, headings, task lists, code blocks
and tables, and reads properly in night mode; /help/formatting is rewritten to match. - Scales: tip a post toward what it's like. Up and down votes rank posts; a post's new "scales" link (beside
"share") opens scales to tip instead: helpful ↔ unhelpful, human-made ↔ probably AI and beginner-friendly ↔
in-depth, and behind "more scales", practical ↔ just for fun, well-sourced ↔ opinion and calm ↔ heated (open
already when you've tipped one of those). Each member tips each scale once, and can change sides or take the tip
back. A scale's tally (how many tipped
each way, and a bar of the split) shows once you've tipped it, so the first tips don't steer everyone else, and
the poster sees all of theirs. Scales are opinions, not reports: they don't rank posts, don't go to moderators,
and "probably AI" sits beside the poster's own AI label without changing it; the panel points to "report" for
posts that break a rule. Posters, logged-out visitors (asked to log in), members in a timeout, and removed,
archived or sponsored posts can't be tipped. Tips are kept in PostgreSQL (scale_tips) and are in a member's
data export. - Updating from /admin/servers shows its progress: while an update runs, the page keeps itself up to date every
few seconds instead of needing reloads. Each server's card says what it's doing and for how long, with its log's
latest lines open, and the updater now refreshes those every 10 seconds while the backup and the installer run
(before, the page heard nothing from it until a step finished). While the site is down for the install, the page
says so and keeps checking, then catches up when it's back; it stops once every server has finished. Servers
that haven't started yet say they're waiting. (The updater that runs an update is the one already installed, so
the progress reports start with the update after this one.) - /traffic/adverts counts ads: it read tables reddit filled from its ad servers' logs, which nothing filled
here. The site counts them itself now: a sponsored post when it's shown in a listing (by post, and by campaign
and vault for its traffic page) and when it's clicked, and each AdSense unit it puts on a page (sidebar, in-feed,
or Auto ads pages). What Google filled the units with, and their clicks and earnings, stay in the AdSense
account. Bots aren't counted.
🐞 Bug fixes
- /admin/servers ran words together, and an update's log was one long paragraph: the page's space compression
joined lines without a space ("The newest release is0.20.2", a server's name and id, "3.54(1, 5 and 15 minutes")
and took the line breaks out of the log; both read properly now. - /traffic/languages and the "top vaults" table were empty: they listed last month, the newest reddit's batch
traffic pipeline had finished; tippr counts as pages are viewed, so they list this month, and say so. - The sitemap left out the front page: it listed vaults from the most subscribed down, so the first page it
gave search engines was the default /v/tippr ("Tippr Meta"), which Google then showed for a search for the site's
name. The front page is the sitemap's first entry now, followed by the vault directory (/vaults) and the help
pages and policies. - Clicking a sponsored post failed: its link goes through /click, served by reddit's separate click tracker,
which was never ported to Python 3 (every click was an error) and which Docker installs didn't have at all. /click
is part of the site now: it checks the link's signature, counts the click and sends the browser on. Updating
removes the old click server (gunicorn-click). - Updating could leave the queues and jobs stopped: the installer installs the pinned Python packages, but pip
kept a package already installed under the same name and version even when it came from elsewhere, and an older
formenergy-observability from PyPI then conflicted with the pinnedpackaging: the pages worked, but paster refused
to start the consumers and jobs. The packages pinned to a URL (the baseplate and formenergy-observability forks) are
now always reinstalled, and the installer checks that the packages fit together, as paster does, failing the install
(so an update rolls back) if they don't. - Clicking "reply" on a comment threw a JavaScript error ("e is not defined", from reddit's code): the reply
box still opened, but the comment's hidden replies weren't shown with it, and the error was reported on every
reply. - Search showed NSFW posts to everyone, and pages with NSFW posts had ads: search results included them for
people who hadn't said they're over 18, logged out too (hiding them was reddit's safe_search experiment, never
on); they're shown only to people who have now, as listings already did. And a page that shows any NSFW post
(the front page, /v/all, other listings, profiles, search) has no AdSense ads, which Google doesn't allow next to
adult content: before, only an NSFW vault's own pages and NSFW posts' pages dropped them. - Every page loaded a tracking pixel nothing used, and on Docker it was missing: reddit counted pageviews from
the pixel's log, which nothing reads now that tippr counts them as it serves them, and Caddy had no route for it,
so every page had a 404. Pages no longer load it (tracker_urlis blank), and Caddy answers the remaining pixels
(sponsored links, embeds) as the installer's nginx does. - A vault's NSFW setting was hard to find: it's labelled "NSFW: viewers must be 18 or older" on the vault form
now, instead of "viewers must be over eighteen years old" (and the /v/all option gains its missing "in"). - The support pages said "254 milliseconds ago": they say "just now" for the last minute, as the rest of the
site does. - Search results showed the wrong descriptions: a vault's page described the whole site (its link previews
already used the vault's own description), and a post's showed its markdown (* item,[link](https://...)).
A vault's page now has its own description, and a post's or comment's reads as plain text. - A comment a moderator removed stayed in front of logged-out visitors for up to 2 minutes: they get a thread's
comments from a short cache, which removing, approving, distinguishing or editing a comment didn't clear (it
follows the comment count). Those now change the thread's cache key, so the next view is built afresh. - Removed posts and comments were hard to read for moderators: their salmon background left the grey tagline and
buttons at 1.4:1. They're a pale red with a red edge now. - The unread message count was unreadable in night mode: night mode's link colour turned it teal on its orange
badge; it's white again.
Downloads
- Docker:
docker pull techidiotsllc/tippr:0.21.0, or unpacktippr-0.21.0-compose.tar.gz, copy
.env.exampleto.env, fill it in and rundocker compose up -d(docker/README.md). - Proxmox:
tippr-0.21.0-proxmox-amd64.tar.zstis an LXC template with the whole site installed;
create a container with the site's domain as its hostname and start it (docs/PROXMOX.md). - Installer (Ubuntu 24.04): unpack
tippr-0.21.0-installer.tar.gzinto/home/tippr/srcand
runsudo TIPPR_USER=tippr TIPPR_DOMAIN=example.com ./install-tippr.shintippr/; it doesn't need
to clone anything (docs/INSTALL_tippr.md).
SHA256SUMS lists the files' checksums.