# academia.sh: can theory and a real field problem live in the same lesson?

> A free, publicly open, 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 free learning platform with no signup wall: the field–curriculum–course–unit–lesson hierarchy, full-text search, progress tracking and verifiable certificates all work. Anyone who wants to read the computer-science curriculum can use it today.
- Form: Web app
- Maturity: Beta
- State: In development
- Focus: Education & research
- Started: 2026-08-13
- Technologies: Laravel, PHP, Livewire, Blade, Tailwind, PostgreSQL, Redis, Filament, Pest
- Tags: #education, #content-platform, #open-access
- Website: https://academia.sh
- The research behind this work: Laravel's preload curve: 123 files buy eight times what the last 1,912 do (https://www.muhammetsafak.com.tr/en/research/laravel-preload-curve/) · opcache preload cuts the deploy bill by up to fourteen times — but five of seven frameworks do not hand it to you (https://www.muhammetsafak.com.tr/en/research/opcache-preload-deploy-bill/)
- Source: https://www.muhammetsafak.com.tr/en/labs/academia/
- Language: en-US
- Author: Muhammet Şafak

---
Unlike 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 — discipline, curriculum, course,
unit, lesson — and all of it is free. 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, no signup wall, text-first

What came out is an open, free education platform that does only its job: no
paywall, no ads, no layer pulling attention away from the content. 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 knowledge should
be public, free and open: the obstacle in front of learning should be the
difficulty of the knowledge itself — not a payment screen, 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.
