PorkiCoder Tab Namer 77M

A tab namer is a tiny label generator. You give it what an AI coding session is doing; it returns one to three words for the terminal tab so two folders do not look the same.

That is the whole product. It names the tab.

PorkiCoder is the desktop app this ships for. Live notes: porkicoder.com/research.

What we set out to do

We wanted a local model: no network at tab-open, small enough for a laptop, fast enough that naming stays snappy.

The title had to fit the tab strip: 1 to 3 words, at most 32 characters, letters and numbers. Two words that name the user's job work well, for example Explain DNS.

Tiny models we tried first

A weight count is how many numbers the model stores. 12.7 million and 35 million are small; they can pick a real noun and still fail to make an English phrase.

Those two from-scratch namers got okay-ish scores and broken titles: let work Together, print results Doing. The words were often right. The sentence was not.

On the same 500-task check later used for this file, the 35M namer averaged about 6.3 to 6.7 / 10 after extra word-filling. The 12.7M student sat near 3 / 10. Neither spoke English well enough to ship.

Why we started from Google FLAN-T5-small

FLAN-T5-small is Google's 77-million-weight text model. Google first trained T5 on a huge web crawl, then FLAN on about 1,800 instruction tasks, on TPU pods, over a long public research program.

We continued training on PorkiCoder tab titles, on DigitalOcean RTX 6000 Ada boxes at about $1.57 per GPU-hour.

Our extra pass: ~6,200 titles, 4 full trips through that list, 1,556 update steps, batch 16, learning rate 1e-4. That ran in hours on one GPU class.

How we score a title

There is no single correct title, so we skip exact string matches.

A separate judge model (Gemini 3.5 Flash-Lite) sees the task and the title, hidden from which system wrote it, and gives 1.00 to 10.00. We report the average and the share scoring 6 or higher (solid enough to use).

What we ended up with, vs Google's original weights

Same size, same architecture. Google's download never saw our tabs. Ours is that download after the small extra training above.

On 500 held-out coding-agent tasks, scored together:

Model Average (1 to 10) Share ≥ 6 Difference vs Google
This model family (raw titles) 7.28 87.8% +4.17 (465 better, 9 tie, 26 worse)
Google FLAN-T5-small, unchanged 3.12 15.8%

Google's model often prints a folder scrap or nonsense (x_bot, cwd=/Us, моете). Ours names the job. Time per title on an Apple M4 Max CPU, one thread: Google 25.7 ms, ours 29.3 ms.

20 real tabs, side by side

Same 500-task draw. Rows are the 20 largest score gaps, unique tasks. Google left, ours right. Nothing here is made up.

Task Google’s model Ours
how much will this setup cost me, any ballpark figures x_bot Ballpark Setup
maybe you can get some good ideas from opus 5 x_bot Share Ideas
let's work together and make beautiful music x_bot Create Beautiful Music
also look into release-flow.md наионал Release Flow
this is not an easy thing… lots of complicated DNS x_bot Explain DNS
does this cutover mean everything goes to Cloudflare first x_bot: a Cloudflare Cutover
ok lets use the idle bois моете Use idle bois
get opus 5 to code review alongside your own review adolescent Code Review
i am the only user so dont wait for drain finish the job i am the only user so don Wait Drain Finish
how is the training run on C doing, print the results cwd=/Us Print Training Results
what is WAL, explain in simple tech english x_bot Explain WAL
estimate wait time until we get next meaningful result - a t Wait Time
dismantle the local mods i had to setup X_bot Dismantle Local Mods
update agents.md so fresh context knows how to use it grok - a new Update Agents
make sure this stale error doesn't repeat idx Stale Error
implement and test private R2 multipart uploads Using a s Explain R2 Proxy
what are the latest stats 0 Latest Stats
commit and save your work with a descriptive message наодит Commit and Save Work
kill all training runs then restart with this insight i'm a big fan Kill Training Runs
i am fine with the cloudflare dependency, explain the rest x_bot Explain Cloudflare Dependency

A little more training on the same idea

After that, we ran a few more hours on a cleaned copy of the same kind of titles (short human labels plus Grok / Claude / Codex), after dropping any task that sat in the test sets.

Two new 1,000-task tests, never used in training. These rows compare this file to our previous trained file. Stock FLAN is absent from this pair of tests.

Test This file Previous trained file Change
Holdout A (1,000) 7.59 average, 85.7% ≥6 7.38 / 83.5% +0.21
Holdout B (1,000) 7.55 average, 84.5% ≥6 7.34 / 82.5% +0.20

That is the incumbent: this file, raw output, no later word-filler.

Run it

The output layer is the last matrix that picks the next word. Keep it separate from the input word table. If a loader glues them, the model emits junk like reheat / blackjack.

import torch
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

MODEL_ID = "porkr/porkicoder-tab-namer-77m"
tok = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_ID, use_safetensors=True)
model.eval()
assert model.config.tie_word_embeddings is False
model.encoder.set_input_embeddings(model.shared)
model.decoder.set_input_embeddings(model.shared)
if model.lm_head.weight.data_ptr() == model.shared.weight.data_ptr():
    raise RuntimeError("output layer got glued to the embeddings; refuse to decode")

prompt = (
    "title: agent=claude cwd=porkr1 task="
    "Add a PocketBase hook that rejects empty email on signup"
)
ids = tok(prompt, return_tensors="pt", truncation=True, max_length=96)
with torch.inference_mode():
    out = model.generate(**ids, do_sample=False, num_beams=1, max_new_tokens=12)
print(tok.decode(out[0], skip_special_tokens=True).strip())

Input shape: title: agent=<name> [cwd=<folder>] task=<first paragraph, cut at 400 characters>. Hugging Face's hosted widget is off so it cannot silently glue that layer.

Size

76,961,152 weights. model.safetensors is 307,867,048 bytes. SHA-256 0dbd3a3385ce252594fdfd0acd83c2917506a8004c97b74c31095f082c934598. About 29.3 ms per title on the CPU clock above.

Optional reading

Longer write-ups are in paper/ and at porkicoder.com/research. This repo omits raw prompts and the test-set tasks.

Limits

English coding-session titles only. The 1 to 10 scores come from another language model. Do not paste secrets into a public demo.

Citation

@misc{hossain2026porkicoder_tab_namer,
  author       = {Hossain, MD Ishtiaque},
  title        = {PorkiCoder Tab Namer 77M},
  year         = {2026},
  howpublished = {PorkiCoder Research},
  url          = {https://huggingface.co/porkr/porkicoder-tab-namer-77m}
}

Apache 2.0, from Google FLAN-T5-small.

Downloads last month
33
Safetensors
Model size
77M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for porkr/porkicoder-tab-namer-77m

Finetuned
(508)
this model