Instructions to use porkr/porkicoder-tab-namer-77m with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use porkr/porkicoder-tab-namer-77m with Transformers:
# Use a pipeline as a high-level helper # Warning: Pipeline type "summarization" is no longer supported in transformers v5. # You must load the model directly (see below) or downgrade to v4.x with: # 'pip install "transformers<5.0.0' from transformers import pipeline pipe = pipeline("summarization", model="porkr/porkicoder-tab-namer-77m")# Load model directly from transformers import AutoTokenizer, AutoModelForSeq2SeqLM tokenizer = AutoTokenizer.from_pretrained("porkr/porkicoder-tab-namer-77m") model = AutoModelForSeq2SeqLM.from_pretrained("porkr/porkicoder-tab-namer-77m", device_map="auto") - Notebooks
- Google Colab
- Kaggle
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
Model tree for porkr/porkicoder-tab-namer-77m
Base model
google/flan-t5-small