ANYFREEBOOK

What’s new

Every change that reached production, newest first. Dates are the day the change went live, not the day it was written. The full list of open sources is on the sources page, and the API is documented on the developers page.

Stability

The app no longer shows a raw client-side error

  • Every route now has an error boundary, so a crash shows a page you can act on — retry, or go home — instead of Next.js’s "Application error: a client-side exception has occurred".
  • Fixed the three real causes behind the crashes: the same ad slot being pushed to AdSense twice, a PDF page being rendered onto one canvas by two handlers at once, and a login cookie being written to the browser in two chunks of which only the second arrived.
  • Errors are now reported to the server, so a crash is visible in the logs instead of only on your screen.
Creators

Publish with a cover image, and download what your readers read

  • Publishers can upload a cover image when they publish. The image is stored with the publication and shown on its page.
  • Every published book can be downloaded as an EPUB or as plain text, from a real download button on the reading page.
  • A book published as an attached file downloads that file itself, so the file the author uploaded is the file the reader gets.
Classrooms

A class keeps its own history

  • Every live session is recorded: how long it ran, how many people attended, and who they were.
  • Signed-in attendees are listed by name. Visitors who did not sign in are listed by a stable anonymous id, so the same guest is recognisable across sessions.
  • The host sees how much time each attendee spent in the class.
Institutions

Anyone can join an institution

  • Visitors can now join an institution with one click and leave again when they want.
  • Joining never changes an existing role, so it cannot demote an owner or grant admin rights.
  • The institution page lists its members with their roles.
Search

A source that did not answer is no longer reported as zero results

  • When an upstream source failed or rate-limited us, it used to be returned as "this source has zero matches" — which read as a real answer.
  • Now every response says which sources failed and whether the result is partial, so an incomplete answer is never presented as a complete one.
  • Sources that answer a failed request are retried twice before they are written off.
Search

Twelve live sources, and the website searches the same ones as the API

  • Added OpenAlex, Wikisource, Europeana, Zenodo and the Open Textbook Library to the fan-out.
  • The website’s own search now covers the same sources as the public API, so the two agree.
  • A language category searches in its own language.
Developers

A public API and an npm client

  • A versioned public API at /api/v1 with search, resolve and health endpoints. Every result carries a legal tier, so you know whether a title is really free to download before you link to it.
  • A source registry at /api/v1/sources, so the documentation cannot drift from the code.
  • A rate limiter that is enforced in the database rather than in memory.
  • An npm client, `anyfreebook-cli`, for searching from a terminal.
Community

Reddit outreach that cannot post by itself

  • Discovery, drafting and rules checking for Reddit communities, with a hard rule that nothing is ever posted automatically — every post is reviewed by a person first.
  • Subreddit rules are read and recorded, because rules differ per community and are checked by hand.
  • A rate limiter, a descriptive user agent, full disclosure and a minimum answer length, so the community side cannot become spam.
Mobile

The Android app and the installable site

  • The site installs as an app on Android and iOS, and works offline from what it has already loaded.
  • An Android App Bundle is signed and built from the same Next.js source, so the app and the site never drift apart.
  • Digital Asset Links are set up, so the installed app opens as the real site.
Site

Installable, and honest about its own catalogue

  • The site became a PWA: installable, offline-capable, and with a real app icon.
  • The catalogue claims were replaced with numbers that were measured against the live sources on the day they were written.