Drops the "Search limit reached" badge, the card and button borders, and the $0
counter on the robot (its chest shows the logo again). Uses only white, black and
grays, and spends the freed space on larger text.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Redraws the mascot as a shaded robot with a glossy visor, sad LED face and a chest
counter stuck at $0, keeps the original text and adds "So far, $0 has been donated
to direct-img.link." The card is larger with bigger text and less empty space.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replaces the AI-generated image with a papercraft-style one drawn in
HTML/SVG (design/donate.html, rendered with headless Chrome). The mascot's
head is the logo's frame, its antenna the logo's link and its chest the
logo itself. It explains why searches stopped, that cached images still
load, that it resets on its own, and asks for donations at direct-img.link.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brave errors (e.g. its spending limit being hit) now fall back to Bing
like empty results do, with the error in a Brave Unavailable alert. If
Bing fails too (HTTP error or a page without results, which for Bing
means it's blocking us), a new papercraft donate.webp is served instead
of an AI image, and nothing is cached so the query works once either
search is back.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ai.direct-img.link serves images from the AuroraIMG-6M API on our Dokploy
server (github.com/direct-img/AuroraIMG-6M) instead of searching. It takes
?src= (auroraimg-6m, case-insensitive, the default and only source for now)
and ?i=, where each i gets its own seed derived from the query, so it's a
different image of the same prompt. It has its own daily limit
(AI_DAILY_LIMIT) and AI: cache keys / ai/ R2 prefix. Failed generations
aren't cached, since they're likely temporary.
On direct-img.link and free.direct-img.link, a search that finds nothing (or
fewer than i working images) now serves an AI image of the query instead of
bad.webp. It's kept for 24h like failures were, so a later search can still
find a real image; bad.webp is only served if the AI image fails too. Its ttl
is stored in KV and R2 metadata so cache hits and deduped waiters send a
matching max-age.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Limits change (e.g. 35 -> 25/day) and the README kept going stale, so it
now links to the homepage, which reads them live from rate-limit.js.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add _routes.json so /, /robots.txt and /assets/* skip the worker and
don't count against the Functions request quota. rate-limit.js moves to
assets/ so the homepage reads it client-side instead of via HTMLRewriter.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- New logo (svg + jpg) and multi-size favicon.ico
- /favicon.ico still served at root so direct image views get the icon
- Generated missing bad.webp placeholder
- Moved limit.webp into /assets and routed error images via helper
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>