academia.sh: can theory and a real field problem live in the same lesson?
A publicly open, free-to-read, text-first learning platform that holds textbook theory and problems actually met in the industry inside a single lesson flow.
What it does today
Live as a learning platform whose lessons are free to read without signup: the curriculum–course–topic–lesson hierarchy, full-text search and progress tracking work, while the course-end exam, verifiable certificates and the study assistant sit in a Pro tier. Anyone who wants to read the computer-science curriculum can use it today.
- Started
- August 2026 — September 2026
- Left Labs
Form
Technologies
This one became a product:
academia.shUnlike video course platforms, academia.sh makes writing the primary medium: readable, searchable, quotable, permanent in the browser. academia.sh is an attempt to present knowledge the way a textbook does — curriculum, course, topic, lesson — and every lesson is free to read, with no account. The first body of content is computer science, but the model is multi-disciplinary from the start: adding mathematics or linguistics means writing lessons, not changing the schema.
That is not the interesting part. The interesting part is this: a lesson that carries only theory becomes lecture notes, and one that carries only field problems becomes a blog post. What does it cost to hold both in one flow — to write, right after the definition, where that definition breaks in practice?
Holding theory and the field problem in one lesson
A field problem is not a separate “exercise” entity; it sits in the lesson’s own text, as the continuation of the theory. The problems are not invented examples either: they are the ones actually met in the industry. That choice keeps the lesson a single entity.
Splitting it would have produced two products — text to read on one side, a list of exercises to solve on the other — and the moment it split, progress, search and assessment would have split with it. Staying single shows up in two places:
Progress. Completion is tracked per lesson, and the denominator is “published active lessons”. Reading a lesson’s theory while skipping its problem is not a state that exists; they are the same lesson. Assessment follows the same principle: a quiz asks about the whole lesson, not the theory alone.
Search. On a text-first platform search is not decoration, it is the spine —
what you cannot search on a video platform is the primary way in here. Postgres
full-text search: weights are title A, intro B, body C; ranking is ts_rank_cd,
snippets ts_headline. search_vector is not a generated column, and
cannot be — though the reason is not to_tsvector, whose two-argument form is
immutable. The problem is that the dictionary sits on the row as text and has
to be cast to regconfig; that cast is not considered immutable, so Postgres
refuses the expression in a generated column. A trigger builds the vector
instead.
Free to read, no signup wall, text-first
What came out is an open education platform that does only its job: lessons are free and need no account, there are no ads, and no layer pulls attention away from the content. The course-end exam, the verifiable certificate and the study assistant sit in a Pro tier; reading never does. The content does not originate in the application database either — it lives as markdown in a separate GitHub repository, and the platform feeds from there. That separation also shapes what comes next: the curriculum is kept in the one form that can genuinely be opened to contributions, plain text. Today I am the only author; that does not have to stay true.
The stack is plain: Laravel 13, Blade + Livewire, Tailwind, PostgreSQL 16,
Redis, with Filament for administration. Markdown renders on the server
(league/commonmark + tempest/highlight), so there is no Node at runtime.
One certificate decision is worth naming: holder_name and course_title are
frozen at issue time. A name changed later does not alter a printed document,
and un-checking a lesson does not revoke the certificate — undoing a mark is an
error correction, not a revocation. The verification page is public but carries
noindex, nofollow: a person’s name should not surface in search results.
There is no repository layer. Eloquent already plays that role; anything holding
a workflow is an Action, stateless capabilities are a Service. Quality gates
are Pest, Pint and Larastan at level 6.
Is the model really discipline-agnostic
The list of remaining work is not why it continues. I believe reading should be public, free and open: the obstacle in front of learning should be the difficulty of the knowledge itself — not a payment screen in front of the text, a signup wall or a company deciding to shut something down. Both the text-first medium and the content living in its own repository follow from that: readable, copyable and continuable by someone else if they want to continue it.
The genuinely open question sits on the content side, and it is not technical. The schema is multi-disciplinary, but the model’s condition is that every lesson also carries a problem from the field. I can write that for computer science because I have been working in that field for years. Adding a second discipline needs no migration — it needs an author. Whether the model is actually discipline-agnostic will only show once that author is found.
The research behind this work
All researchLaravel's preload curve: 123 files buy eight times what the last 1,912 do
How far can a curated preload take Laravel, and what does each slice cost in start-up time?
Finding
The curve is not proportional to volume. The first 1,592 files — Laravel's own framework — buy 30 ms and add 1.2 seconds to start-up. The next 1,094 Symfony files buy 9.5 ms for free. The **123 files** after that (psr, carbon) buy 15.7 ms, more than the 1,094 before them. And the last 1,912 buy 1.8 ms while adding another 1.2 seconds. So the blanket preload the earlier record measured as a ceiling is the worst point on the curve that is not the origin: stopping at 2,809 files gives 12.77 ms for 1,514 ms of start-up, while 4,721 files ask 2,691 ms to reach 10.96 ms.
measured 43 days ago
opcache preload cuts the deploy bill by up to fourteen times — but five of seven frameworks do not hand it to you
With `opcache.preload` on, how long is the first request seven PHP frameworks serve after a deploy, what does the gain cost, and who can actually have it?
Finding
Preload shortens the cold first request by between 3.5× and 14.2× on the six candidates whose classes are PHP source: Symfony drops from 35.58 ms to 2.50 ms, down to Phalcon's bare figure. But only two of the seven candidates — Symfony and CodeIgniter — publish a preload file of their own; for the other five the gain sits on the table waiting for the user to write one. Writing one is not as easy as it looks: a preload generated blindly from the classmap never brings Symfony up at all, and on CodeIgniter it does worse (5.29 ms) than the hand-picked official file (3.13 ms). And the cost does not vanish: Laravel's classmap preload takes the 62 ms it saves each visitor and writes it back as 2,340 ms of php-fpm start-up.
measured 43 days ago