Rev 2 · 4 November 2026 · status: approved; all §11 decisions settled by the owner on 4 November 2026. Desktop first; the extension waits (D4).
A client for 4chan that reads boards and threads, watches threads, filters posts, posts replies, and has the Clip video tool built in. Its pitch, in one line: drop a video, and it comes out fitting the board you’re posting to. It ships as a desktop app (Linux, Windows, macOS) and as a browser extension.
It is not a Carino Systems product (§2). Clip itself stays a Files mode
(~/Github/Files/docs/SCOPE-CLIP.md); this client reuses its pure parts.
| Fact | Consequence |
|---|---|
The read API (a.4cdn.org) only answers browser requests from boards.4chan.org (CORS). A request from any other origin gets access-control-allow-origin: http://boards.4chan.org. |
A hosted website can’t be the web version. It would need a proxy that relays 4chan’s content through a server we run. The web version is a browser extension running on boards.4chan.org (§5). |
boards.json gives per-board max_filesize, max_webm_filesize, max_webm_duration, webm_audio, max_comment_chars, cooldowns, min_image_width/height, require_subject, ws_board, spoilers, math_tags, code_tags, user_ids, country_flags. E.g. /g/ 4 MB · 120 s · no sound; /wsg/ 6 MB · 400 s · sound; /gif/ 4 MB · 300 s · sound. |
Clip presets come live from the board, not from a hand-kept list. The post form can check every limit before upload. |
The API sends Last-Modified and accepts If-Modified-Since; cache-control: max-age=5. |
Thread updates are conditional requests; most cost a 304. |
One plain request to the image host (i.4cdn.org) got HTTP 429. |
4chan’s edge rate-limits clients that don’t behave like a browser. The fetch layer must be conservative and look like a normal browser (§4.1). This is the biggest unknown and is tested first (C0). |
4chan publishes API rules (github.com/4chan/4chan-API): at most 1 request per second, thread updates no more often than every 10 s, use If-Modified-Since. |
Built into the fetch layer as hard limits, not settings. |
Not confirmed, to check in C0: which video codecs 4chan accepts in WebM (VP8/VP9 for sure; AV1 unknown), whether MP4 uploads are accepted, the maximum image dimensions (the community figure is 2048×2048, not in the API), and the current posting and captcha flow.
So, like ButterEye: own repo, own name, own icon, not on the hub, no
carino.systems domain, no Carino branding. Licence AGPL-3.0, matching
Files, so Clip code moves between them freely (§11, D2).
boards.json, favourites pinned. NSFW boards
(ws_board: 0) are off by default and appear only after the user opts
in once in Settings (D6). Links into an NSFW board while it’s off show a
one-line notice with the switch, not the content.code_tags, math via vendored KaTeX where math_tags, country/board
flags, poster IDs where user_ids), backlinks, quote previews on hover
(tap on touch), inline image/video expand, auto-update with conditional
requests (10 s minimum, backing off to 60 s+ when nothing changes), unread
count, last-read line, deleted posts kept and marked.The owner’s requirement is that the UI is modern. Concretely:
:root (colour, radius,
spacing, type scale), dark by default, light theme, follows the OS
setting. One accent colour; board identity through a small coloured tag,
not full re-skins. Fonts self-hosted (a variable sans for UI, a mono for
code tags).ui/css/themes.css): Classic, the site’s own board styles
(Yotsuba, Yotsuba B, Futaba, Burichan, Tomorrow, Photon), and Atrium,
the desktop themes of the owner’s Atrium setup (Cyberpunk, Matrix, Aero
Glass, Windows 95, Lo-fi, Luna, Moe, Orbit, Orchard, Orchard Dark).prefers-reduced-motion.decorations: false), system notifications, tray
icon with the (You) count.Shown on first launch, before any request to the site. Full-window, one step per screen, a progress row on top, Back / Next / Skip setup on every step, keyboard-only works (Enter, Esc, arrows). Every answer is changeable later in Settings, and Settings → Run setup again reopens it.
rpm -q): Fedora’s
ffmpeg-free first, then RPM Fusion’s ffmpeg, and the command fits that
(install ffmpeg-free, or swap to RPM Fusion’s fuller build). The app
never runs a package manager or asks for admin rights. Clip is disabled
with a reason until the check passes; everything else works.Stored in the app’s settings DB with a setupVersion; a later release
that adds a step shows only the new steps, not the whole flow.
archive.json links where the board is archived).boards.json: file size, WebM size/length/sound,
minimum dimensions, comment length, required subject, and cooldown
countdowns, all shown before posting so a post doesn’t bounce.max_webm_filesize, sound only if
webm_audio, length ≤ max_webm_duration, longest side ≤ 2048 (if C0
confirms it). The Clip editor (trim, crop, segments, subtitles, HDR →
SDR) is the same as in Files.plan → bytes) and share the pure
fit.js controller and quality warning.Retry-After waited in full, no redirects
followed, no parallel bursts. One generic client name in the UA; never the
user’s email or identity.
Decided in C0 (4 Nov 2026): the JSON path sends the honest
User-Agent: CloverEye/<version> and no cookie jar, instead of a
browser User-Agent and cookies. The live probe got no 429 with it; images
load in the webview, which has its own browser UA and cookies. See
C0-PROBE.md. Revisit only if the week-long C0 gate shows
429s or an edge challenge on the JSON path; a 4chan Pass (C4) would add
its own cookie then.boards.4chan.org as a content script, so API requests are
same-origin and posting uses the page’s own captcha and cookies..xpi and an unpacked zip from GitHub releases.| Phase | Delivers | Done when |
|---|---|---|
| C0 · Gates | First-time setup (§3.1b) and design tokens, runnable in a browser with a mock bridge; Tauri skeleton (compiles once webkit2gtk4.1-devel and gtk3-devel are installed); Rust fetch layer with limits; measure whether the image host still returns 429 to a polite client; WebM playback in WebKitGTK and WKWebView; confirm codecs/MP4/dimension limits by posting test files to a test board by hand; repo, name, licence |
A week of normal browsing with zero 429s, or a documented answer to the 429 problem |
| C1 · Read | Design tokens + three-pane shell (§3.1a), command palette, boards, catalog, thread, media, gallery, keyboard | Usable as a daily reader on Linux; UI checks in §3.1a pass |
| C2 · Track | (You)s, watcher, notifications, filters | Watcher survives a day open with no rate-limit hits |
| C3 · Clip | ffmpeg engine, board-driven presets, Clip editor shared with Files | Fixture suite (Clip §8): ≤ limit 100%, median ≥ 98% |
| C4 · Post | Forms, captcha view, Pass, pre-flight checks, image cleaning | Real posts on a test board from Linux, Windows (Wine) and macOS |
| C5 · Extension | Chrome + Firefox extension from the same UI | Store submission or release zip |
| C6 · Ship | RPM, Windows installer, DMG, update channel | Installs clean on a fresh VM per platform |
Order with Files: Clip P0–P2 in Files go first. That builds fit.js,
the editor and the WebCodecs engine. C0–C2 can run alongside, since they
share no code with Clip. C3 then reuses the editor and adds the ffmpeg
engine.
| Risk | Likelihood | Answer |
|---|---|---|
| 4chan’s edge blocks or rate-limits the desktop client | Medium (seen once already) | C0 gate; polite fetch layer; the extension path is immune because it runs in the real page |
| Posting or captcha flow changes and breaks posting | High over time | Posting runs inside an embedded 4chan page, so most changes don’t touch our code; keep the post code path small |
| Store rejects the extension | Medium | GitHub releases as the fallback |
| Illegal content in cache | Low but serious | §4.2: memory/temp-only cache, deleted-on-upstream-delete, no scraping |
| Trademark complaint | Low | No “4chan” in name or icon |
| Scope creep into a 4chan X clone | High | The Clip-to-post flow is the product; §3 is the whole v1 list |
boards.json copies.fit.js, presets schema, quality warning, editor, JASSUB path.scrub.js (image cleaning before upload), detect.js.| # | Question | Decision |
|---|---|---|
| D1 | Name | CloverEye (repo and folder CloverEye) |
| D2 | Licence | AGPL-3.0, like Files |
| D3 | Desktop stack | Tauri 2 |
| D4 | Extension | Desktop first; the extension (C5) only after C0–C4 |
| D5 | Apple Developer account | Not now; unsigned macOS build |
| D6 | NSFW boards | Off by default, opt-in in Settings |
| D7 | UI | Modern, per §3.1a |
Name note: “Clover” was also the name of a well-known open-source Android 4chan client (now discontinued, continued by forks), and the clover is 4chan’s logo motif. CloverEye is distinct enough as a name, but the icon should be an original mark (no four-leaf clover in 4chan’s green) to stay clear of their logo.