What it is

python-classic is the annual competition for Python works on tinyfiles.tv. Once a year, we run a one-month jam for the HTML + Python pair — the format where the HTML is the submission and the Python is the backend function. The theme changes every year. Winning works are enshrined permanently in the collection, with a badge that never comes off.

Where tinyjam is a JavaScript-and-WebAssembly competition with a 64KB cap, python-classic is its opposite: Python only, and the total size of both files together is 32KB. The two competitions are spaced apart on the calendar — tinyjam in spring, python-classic in fall — and they don't share entries, themes, or badges. A work submitted to one is not a submission to the other.

Key dates

Now
Announcement. Theme is public, rules are set. You have a year to think about it.
November 11, 2027
Submissions open. The competition officially starts. Drop your files in Discord with the tag [PYCLASSIC27].
December 11, 2027
Submissions close. The hard deadline. Anything submitted after this is out of the competition.
December 11–18, 2027
Voting. The Rater jury scores every submission on the 0–100 scale.
December 19, 2027
Winners announced. Grand Prize, category winners, runners-up, honorable mentions.
December 19, 2027
All qualifying entries go live in the permanent collection. Winners get their badges.

The theme

python-classic '27 theme
Role Player

A game where the Python is the character's mind. A tool that plays a role. A story told from inside a role. Something that embodies a character, occupies a position, or takes on a part — or something about the act of playing a role itself.

Interpret it however you want. We treat the theme as a rating criterion, not a disqualifier. A piece that doesn't engage with "Role Player" can still win — but pieces that do engage with it have an advantage in the scoring.

The rules

Every rule from the normal submission pipeline applies. Two rules change. The normal site caps are 16KB for the Python and 5MB for the HTML, with a zip allowed when static assets are needed. python-classic replaces both with a single 32KB total and a two-file limit. Everything else — the pair model, bandit, the container, the content rules — is exactly what it is the rest of the year.

  • Hard 32KB cap, total. Your HTML and your Python file must together weigh 32,768 bytes or less, uncompressed. You choose the split — 16/16, 24/8, 30/2, any combination — as long as the two together do not exceed 32,768. Anything over is disqualified from the competition. No exceptions, no "close enough."
  • Two files maximum. One HTML file, one Python file. That is the submission. No zip. No third file. No separate static assets. If your HTML needs an image, base64 it into the HTML. If your Python needs a data table, encode it inside the Python file. The two-file cap is the point of the exercise.
  • Same HTML + Python pair model as the site. The HTML is the submission — self-contained, sandboxed, no external calls, no outbound links inside the work. The Python is a backend function, capped at def run(inputs):. Python alone is not accepted, the same as anywhere else on the site. See the Python page for the full pair spec.
  • Same bandit gate, same container, same forbidden-import list. Every submission runs through bandit before a human sees it; any finding at any severity is a rejection. The container flags, the seccomp allowlist, the 3-second timeout, the adversarial test suite — all of it applies, unchanged. The competition does not relax the sandbox.
  • Same source rules. Unminified, readable Python and JavaScript. No obfuscation. No base64-encoded strings. No eval, no exec, no dynamic imports. If a string in the source isn't readable as a string, the submission is rejected.
  • Same content rules. PG-13. Zero curse words, zero suggestive content, zero politics. No live chat in multiplayer works — use the standardized 64 preset phrases. 18+ to submit.
  • Same sidecar JSON. Title, description, tags, and license. An explicit license is mandatory. Cover images and creator metadata are governed by the normal submission rules and are not counted against the 32KB cap.
  • New content only. What you submit must be built for python-classic '27, not pulled from an existing portfolio.

Categories

Every submission is entered into one of the site's four categories. The Python backend can drive any of them — the HTML renders the UI, the Python runs the logic.

Music

Procedural composition, generative audio, sequencers where the Python picks the notes.

Games

Rule engines, AI opponents, text adventures — anything where the Python is the game's mind.

Utilities

Parsers, calculators, converters, generators. A 32KB utility is a real tool.

Videos

Canvas works where the Python drives the sequencing — choreography, procedural film, generated scenes.

Each category gets a first-place winner, a runner-up, and an honorable mention. There is also one Grand Prize across all categories, chosen by the Rater jury as the best overall entry.

Judging

python-classic uses the same Rater jury as the rest of the site. Every submission is scored blind, from 0 to 100, by the Raters. The highest aggregate score in each category wins. The full mechanics are on the Rater Guidelines.

What makes a piece score high:

  • Engagement with the theme. "Role Player" — how well does the work explore it?
  • Execution. Does the pair actually run? Does the HTML degrade gracefully if the Python is slow? Is it polished?
  • Restraint. Does it use its kilobytes well? A 32KB pair that feels complete is worth more than a 32KB pair that feels trimmed.
  • Innovation. Is it something we haven't seen before?

Every submission that scores above 50% is added to the permanent collection. Below 50% goes to the Asset Graveyard. The competition doesn't change this — the threshold is the same as always.

Prizes

python-classic has no cash prize. What it has is something better: permanence.

Grand Prize

Permanent "Grand Prize, python-classic '27" badge on the work page and creator profile. Featured in the collection. One award, across all categories.

Category winners (×4)

Permanent "First Place, [Category], python-classic '27" badge. One per category.

Runners-up and honorable mentions

Permanent badges. Two per category.

All entries above 50%

A permanent "Entered python-classic '27" badge. You don't have to win to be marked.

The 2027 winners will be the first winners of python-classic. Their badges will say so. In ten years, when someone browses the collection and sees "First Winner, python-classic '27," they'll know exactly what it means.

How to enter

Submission happens in Discord, same as everything else. Join the server, read the rules, then drop your files in the submission channel with the tag [PYCLASSIC27] in the message.

Include:

  • Your two files — one HTML, one Python. That's the whole submission.
  • A JSON sidecar (title, description, tags, license).
  • Cover images if you want them — governed by the normal submission rules, not counted against the 32KB cap.

Every submission goes through the same intake pipeline as always: antivirus scan, semantic screening, manual review, bandit, and the container test suite. If it passes the size check and the review, it goes into judging.

Join the Discord →

FAQ

Why 32KB when Python normally gets 16KB and HTML gets 5MB?

Because the competition is the constraint. The normal caps are generous on purpose — the HTML has room for a UI, the Python has room for a real function. python-classic narrows both to a single 32KB total, so the two files share a budget instead of getting separate ones. It's the same idea as tinyjam's 64KB cap: a competition is where the cap becomes the hard rule, and everybody entering is trying to hit it. If 32KB total sounds tight — good, that's the point.

How does the 32KB split work?

32,768 bytes total, uncompressed. You choose the split between the HTML and the Python. 16/16, 24/8, 30/2 — any combination is valid, as long as the two together don't exceed 32,768. There's no per-file minimum and no per-file maximum. Just the total.

Can I submit a zip with static assets?

No. Two files. One HTML, one Python. No zip, no third file, no separate images or audio files. If your HTML needs an image, base64 it into the HTML. The two-file cap is the competition's second rule, and it's not negotiable.

Can I submit a JavaScript work?

Not to python-classic. This is the Python competition. If you want to submit a JavaScript or WebAssembly work, submit to tinyjam in May–June, or drop it into the rolling collection any other month of the year.

Does this compete with tinyjam?

No. tinyjam is the JavaScript-and-WebAssembly jam, in spring (May 6 – June 6). python-classic is the Python jam, in fall (November 11 – December 11). They're separate competitions with separate themes, separate rules, and separate badges. A work submitted to one is not a submission to the other.

Why "Role Player"?

In video games, "role player" means someone who lives inside the fiction. For a Python backend, it opens up in every direction. A game where the Python is the character's mind. A tool that plays a specific role or persona. A story told from inside a role. A music piece where the Python is one instrument in an ensemble. Interpret it however you want — it's a rating criterion, not a disqualifier.

Can I submit more than one entry?

Yes, but each submission is evaluated independently. No bundling, no "series." Every work stands on its own.

Can I work with a team?

Yes. Team submissions are accepted. Prizes are shared among the team.

Do I need an account?

No. There are no accounts on tinyfiles.tv. You submit via Discord, using your Discord handle. No login, no email, no password.

What if I don't win?

If your work scores above 50%, it's still added to the permanent collection — just without the jam badge. Most submissions that pass the threshold get in, even if they don't win.

When's the next python-classic?

Every year, opening November 11 and closing December 11. python-classic '28 opens November 11, 2028. Mark the calendar.

Past winners

None yet. The first python-classic happens in November–December 2027. This section will be filled after the winners are announced — and it will stay filled.

See also

For the Python submission rules — the pair model, the container, bandit, the forbidden-import list — see the Python page. For the annual JavaScript competition, see tinyjam. For the Rater system that judges both, see the Rater Guidelines. For the general submission pipeline, see the Submission Criteria.

Join the Discord to enter python-classic '27 →