Beta · Digital archive
FrameSouth
South Indian Cinema, Year by Year.
A premium interactive archive for discovering South Indian cinema by year and by industry. It holds every verified 2024, 2025 and 2026 release across Tollywood, Kollywood, Mollywood and Sandalwood — with real cast, crew and production credits, each one traceable to the page it came from.
And it does the whole thing without a single poster, still, or photograph of anyone. That is the idea, not a shortcut.
The problem
Every film archive looks the same,
because every film archive is a wall of posters.
Open any streaming service, any film database, any “discover cinema” product, and you get the same grid of rectangles. The design is doing no work: the poster is the design. When a film has no poster the interface breaks, so products fill the hole with a grey box, a generated gradient, or a logo.
For South Indian cinema this is a real constraint, not a stylistic one. A great many 2025 releases across the four industries have no licensable artwork at all — a poster-led archive would either omit them or misrepresent them.
There is a second problem underneath it. Film metadata on the open web is thin and inconsistent. We measured before we designed: Wikidata holds 268 South Indian films for 2025 and only 47 of them name a director. An archive built on that is mostly empty rows, which is exactly the point at which products start inventing plausible-looking data.
FrameSouth refuses both moves. No imagery, and no invented facts.
Typography is the poster. Information is the artwork. Motion is the atmosphere.
The product
One journey, four industries, any year.
Year → industry → films → one film. Every step is data-driven, so the year is never a special case and adding one is an import rather than a rebuild.
The year as artwork
The landing page sets the archive’s most recent year at up to 22rem in a didone, split across two lines, one half solid and one half outlined. Earlier years line up beneath it. The list comes from the database — there is not a single year button written anywhere in the source.
Four industries, one identity
Tollywood, Kollywood, Mollywood and Sandalwood each carry one accent — warm red, violet, emerald, gold — used only on numbers, rules, active states and light. The product stays one coherent thing rather than four skins, and every accent was contrast-checked against the near-black ground before it shipped.
Grid and index
GRID is the experimental view: each film a composition of its number, title, genres, principal credits and date, over an abstract mark derived from its own metadata. INDEX is the film-festival programme — dense, ordered, built to run your eye down two hundred titles.
A deterministic identity per film
With no poster to distinguish one card from the next, each film gets an abstract identity hashed from its slug, industry and genres: gradient angle, geometry, alignment, edge. The same film always looks the same — on refresh, on another machine, and on the server and client alike.
Search that reaches the credits
One field searches titles, actors, actresses, directors, producers, music directors, production companies and genres, scoped by year and by industry. Filters only ever offer values that have records behind them: a month with no releases is shown inert, never as an empty promise.
Sources on every film
Each film page lists the pages its facts were read from, with the licence named. Where a fact could not be verified the field is simply absent — no “unknown”, no “N/A”, no filler. 1,156 of the 2,359 films carry no synopsis, and they show none.
Architecture
Two spines: one that gathers, one that serves.
Research runs offline and writes reviewable JSON datasets to disk. Nothing a visitor touches ever contacts a third party — a page request goes to Next.js, to the API layer, to PostgreSQL, and stops.
The year is a row
A years table decides what the archive contains. Routes are
/movies/[year]/[industry]; counts, facets, page titles and the
sitemap all derive from rows. A scanner fails the build if any literal year
appears in app/, components/ or lib/.
Industries are never merged
A film released in two languages is two records, each with its own id, slug and credits. The unique key is (year, industry, source key), chosen so two industries cannot collide. Mahavatar Narsimha exists three times in 2025 and Lineman three times in 2024, and that is correct.
Nothing is invented
Every film carries at least one source URL, and the importer rejects any record that does not. Actor and actress roles are assigned only from Wikidata’s gender property; 5,325 performers whose gender could not be verified are stored as cast rather than guessed into a bucket.
Requirements versus what was actually built
An honest status board.
Every stated requirement, and what exists today. Where something is partial or not built, it says so and says why. The engineering window behind this carries 119 acceptance tests — the original 102 plus 17 opened when 2024 was added — and a leaf is only ticked once its test has actually run, which is why several rows below still read partial or roadmap. Passing every test is not the same as having built everything.
| Requirement | Status | What exists, and how it was verified |
|---|---|---|
| Year → industry → films → film | Built | The full journey walks end to end in a headless browser with zero console errors. |
| Dynamic years, no rebuild to add one | Built | A throwaway 2099 fixture year was imported as data alone: every file under app/, components/ and lib/ hashed identically before and after, and 2099 appeared in the year list, routes, counts, search and facets. Then removed. |
| Up to 100 verified films per industry | Built | Exceeded, several times over. 2026: 140 Tollywood, 125 Kollywood, 143 Mollywood, 150 Sandalwood. 2025: 184, 255, 216, 239. 2024: 253, 218, 229, 207. 2,359 films in total, all real releases, none invented. Every record carries at least one source. |
| Full credits per film | Partial | 16,600 credits. Director and cast reach essentially every film; producers (1,956) and music directors (1,558) only exist where the film has its own article. Missing credits are absent, never filled. |
| Synopsis, runtime, IMDb id | Partial | 1,203 films carry a synopsis, 739 a runtime, 1,151 an IMDb id — the films that have their own encyclopaedia article, roughly half the archive in every year. The other rows show no such row at all. |
| Certification, OTT platform, trailer, original title | Roadmap | The schema and the interface support all four. No open source carries them reliably for 2025 South Indian releases, so all four are null on every row and nothing is displayed. Filling them needs a source we do not yet have permission for. |
| No posters, stills, backdrops or photographs | Built | Five mechanical guarantees fail the build on violation, and a browser walk of every route records zero responses with an image/* content type. There is no raster file in the repository. |
| No cross-industry duplicate merging | Built | A test inserts one title under two industries and asserts both persist with distinct ids and slugs. Real films exist in more than one industry in every year, and a title appearing in both 2024 and 2025 also stays two records. |
| Deterministic visual identity per film | Built | Derived for one film a hundred times yields one result; two films differ; the same title in two industries differs. |
| Search across seven kinds of value | Built | Asserted against a real row for every credit role plus title, genre and company, scoped by year and industry. |
| Filter by year, industry, language, genre, month | Built | Facet counts are asserted equal to their SQL counts, and a value with zero records is never offered. |
| Four sorts | Built | Date newest, date oldest, title A–Z and title Z–A each asserted to produce a correctly ordered sequence. |
| Server-side pagination at ~24 | Built | First page is exactly 24; Load More appends without navigation; list items are asserted to carry no producers, sources or synopsis. |
| Mobile-first responsive design | Built | Five routes at 375×812 with no horizontal overflow; the filter drawer’s controls all measure at least 44px; type is asserted to scale sub-linearly rather than shrink. |
| Accessibility | Built | One h1 and landmark regions per route; a keyboard walk reaches every control with a visible ring; controls report their state; reduced motion leaves zero running animations. All fifteen contrast pairs pass WCAG AA. |
| Dynamic SEO metadata and structured data | Built | “Tollywood Movies 2025 | FrameSouth” and “Tollywood Movies 2024 | FrameSouth” both generated from the route by the same code; JSON-LD parses as @type Movie and carries no image property; the sitemap lists 1,812 URLs and excludes fixture years. |
| Polished error and loading states | Built | Unknown year, industry and film all return a real HTTP 404 with a typographic page. API failures return {error: string} and were asserted to leak no Prisma, Postgres, stack or filesystem detail. |
| PIN-gated live demo | Built | On the on-premises lane, yes: the application listens on loopback and is reachable only through a gateway that asks for a code, issues a signed expiring cookie, and holds the code in a gitignored file never present in anything the site serves — asserted by a test. The cloud lane is deliberately open: it holds public film metadata and no user data, so there is nothing for a gate to protect. Both behaviours are real; neither is claimed of the other. |
| Cloud deployment | Built | Live at framesouthapp.manp.space on Vercel, served from Mumbai, backed by its own Neon PostgreSQL instance holding the identical 2,359-film archive. The browser suite passes against the live URL, and a headless walk of production records zero image requests, zero console errors and zero third-party hosts. It also still runs on-premises under systemd — the same build, pointed at a different database by one environment variable. |
| A second year, added without a rebuild | Built | 2024 was added after 2025 shipped: 907 films imported as data, with every file under app/, components/ and lib/ hashed identically before and after. It appeared automatically in the year list, the routes, the counts, search and the facets. 2026 was added the same way after this page was first written — 558 films, no file under app/, components/ or lib/ touched — and the landing page moved 2025 down into the earlier-years strip on its own. A browser test walks every year the archive holds, driven from the API rather than a fixed list. |
| Years beyond 2024–2026 | Roadmap | The path is proven three times now — a fixture year and two real ones. What is missing for 2023 is the research pass, not the software. |
Roadmap
What comes next, in order.
- Add more years. 2024 is in. Adding 2023 or 2026 is the same four commands and no component changes — a claim now demonstrated with a fixture year and a real one.
- Deepen both years. Producers, music and runtime reach only the films with their own article — about half. A second pass against additional permitted sources would raise coverage without lowering the evidence standard.
- People pages. The credits are already relational, and with two years loaded a director's body of work now spans them — a person page is a small addition with a much larger payoff than it had at one year.
- Certification and OTT. Both are modelled and both are empty. They stay empty until there is a source we are permitted to use.
- A custom domain. The cloud deployment is live on its Vercel address; putting it behind a proper domain is the remaining step, and is configuration rather than code.
- Full-text search. Search is a relational query today, which is correct at 2,359 films. A PostgreSQL text index is the obvious next step at ten times that.
Deployment
Where it runs today.
FrameSouth runs in two places from one codebase, switched by environment variables alone. In the cloud it is deployed on Vercel at framesouthapp.manp.space, served from the Mumbai region and backed by its own Neon PostgreSQL instance. On premises the same build runs under systemd on a private machine against a project-owned PostgreSQL cluster, listening on loopback and reached only through this gateway.
| Production | framesouthapp.manp.space · Vercel, Mumbai region, Neon PostgreSQL |
| Application (on-prem) | 127.0.0.1:8002 · systemd, restarts on failure |
| This gateway | 127.0.0.1:6796 · site, PIN gate and application proxy |
| Engineering window | 127.0.0.1:6795 · internal, never published |
| Database | 127.0.0.1:5433 · PostgreSQL 16, project-owned |
Secrets live in gitignored environment files on premises and in encrypted project variables in the cloud. Nothing in the repository contains a credential, and the production bundle was checked to carry no connection string into the browser. Full detail is in the documentation.
The demo
Stop reading. Go and drive it.
The link below opens the real application with the real 2026 archive behind it — 2,359 films across three years, live counts, working search. It is the same build described above, not a sandbox — and it is also public at framesouthapp.manp.space, which needs no code at all.
What to try first
- Press
⌘Kand search for a director you know. - Switch between 2024, 2025 and 2026 and watch every count change.
- Open Kollywood and click a month on the timeline.
- Switch to INDEX and scan two hundred titles at once.
- Open a film and read its sources at the bottom.
- Resize to a phone width — the layout is designed for it, not shrunk into it.