
Implement Paper Auto
- 1.4k installs
- 164 repo stars
- Updated August 4, 2026
- marimo-team/skills
implement-paper-auto builds story-driven marimo notebooks from research papers via AlphaXiv without user input.
About
The implement-paper-auto skill converts research papers into compelling marimo notebooks without requesting user feedback. Agents fetch structured content from alphaxiv.org, preferring the overview markdown endpoint and falling back to full paper text or arXiv PDF when unavailable. Paper IDs parse from arXiv URLs, AlphaXiv links, or bare identifiers including version suffixes. The core goal is a clear story, not a full benchmark rerun: pick one teachable concept, explain it with minimal CPU-runnable code, and add one or two charts, dropdowns, or sliders while avoiding excessive scrolling. Agents must ultra-think the narrative and example before coding, rejecting toy datasets when a creative demonstration better shows where an approach shines. Comparison of two approaches is common but examples should feel informative, not cherry-picked or overdone. After choosing the showcase idea, build immediately using the marimo-notebook skill and optional anywidget references when custom widgets improve the story. Hide all code cells and move input and output cells to the top. Public AlphaXiv endpoints need no authentication.
- Fetches paper content from alphaxiv.org overview or full-text markdown endpoints.
- Agents pick one story and concept without asking the user for feedback.
- Notebooks run on CPU with minimal code, charts, and light interactivity.
- Ultra-think narrative and example before writing any notebook code.
- Hide code cells and move inputs and outputs to the top of the file.
Implement Paper Auto by the numbers
- 1,449 all-time installs (skills.sh)
- +90 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #814 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
implement-paper-auto capabilities & compatibility
- Capabilities
- alphaxiv paper fetching · story driven notebook design · cpu runnable examples · widget integration via anywidget · code cell hiding
- Use cases
- research · documentation
What implement-paper-auto says it does
Implement a research paper in a marimo notebook fully automatically without extra user input.
You need to apply thinking and come up with the best story yourself.
npx skills add https://github.com/marimo-team/skills --skill implement-paper-autoAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.4k |
|---|---|
| repo stars | ★ 164 |
| Security audit | 2 / 3 scanners passed |
| Last updated | August 4, 2026 |
| Repository | marimo-team/skills ↗ |
How do I automatically turn an arXiv paper into a runnable marimo notebook that teaches one idea?
Automatically implement a research paper as a story-driven marimo notebook using AlphaXiv without asking the user for input.
Who is it for?
Researchers turning papers into interactive notebook explainers on AlphaXiv content.
Skip if: Skip when the user wants manual step-by-step collaboration on notebook design.
When should I use this skill?
User provides a paper URL or ID and wants automatic marimo implementation.
What you get
CPU-runnable marimo notebook with hidden code, clear story, charts, and optional widgets.
- Runnable marimo notebook
- Interactive charts or widgets
- Hidden-code narrative layout
Files
You need to come up with a compelling story to tell from a paper. Do not ask the user for feedback/input. You need to apply thinking and come up with the best story yourself.
Fetching Papers via AlphaXiv
Use alphaxiv.org to get structured, LLM-friendly paper content. This is faster and more reliable than trying to read a raw PDF.
Extract the paper ID
Parse the paper ID from whatever the user provides:
| Input | Paper ID |
|---|---|
https://arxiv.org/abs/2401.12345 | 2401.12345 |
https://arxiv.org/pdf/2401.12345 | 2401.12345 |
https://alphaxiv.org/overview/2401.12345 | 2401.12345 |
2401.12345v2 | 2401.12345v2 |
2401.12345 | 2401.12345 |
Fetch the AI-generated overview (try this first)
curl -s "https://alphaxiv.org/overview/{PAPER_ID}.md"Returns a structured, detailed analysis of the paper as plain markdown. One call, no JSON parsing.
Fetch the full paper text (fallback)
If the overview doesn't contain the specific detail you need (e.g., a particular equation, table, or proof):
curl -s "https://alphaxiv.org/abs/{PAPER_ID}.md"Returns the full extracted text of the paper as markdown.
Error handling
- 404 on the overview: Report hasn't been generated for this paper yet. Try the full text instead.
- 404 on the full text: Text hasn't been processed yet. As a last resort, direct the user to the PDF at
https://arxiv.org/pdf/{PAPER_ID}. - No authentication is required — these are public endpoints.
What is a good implementation?
A good implementation tells a story, that's the most important thing. The story should be simple, but it should not be missing.
Papers typically have more than one concept in them. So that means you need to pick a story! It isn't the goal to fully implement the paper or to rerun a giant benchmark. The goal is to take a lesson/idea and to explain that very clearly in a notebook that can simply run on a CPU. That way, a user can easily run learn something from it. When you look at the notebook, what is the main concept or idea that you think is worth exploring? What is the concept that tells a story?
Pick the idea that is easiest to explain with a minimum code example. For a minimum code example to really work, it tends to help to have one, maybe two charts to look at. Maybe there's a dropdown that lets you try out different settings. Possibly even a slider. But the one thing we would want to do is prevent that the user needs to do a lot of scrolling.
It will be typical that you'll want to compare two approaches. But take a moment to think about the example, because that matters most to the story. Most of the time you don't want to use a toy example. They're not informative and they are overdone. It may be better to generate a creative example that shows where one approach can really shine. We don't want to cherry pick, but we also don't want to do examples that have been overdone either.
I cannot stress enough how important it is to actually think about the story and the example before you write any code whatsoever. You should really ultra think this. Give the user some interaction but really try to prevent scrolling. A good example tells a story, it doesn't just state some facts.
Feel free to think about this decision, but once you've got it clear what idea is best to showcase, immediately proceed to build the marimo notebook.
Use the marimo-notebook skill for this, and possibly the anywidget skill, but only if a custom widget makes for a better story. If you strongly feel that it makes sense to use a custom anywidget, refer to references/ANYWIDGET.md.
When you are ready, make sure that you hide all the code and that you move the cells with inputs/outputs to the top of the file.
Example:
@app.cell
def _(hide_code=True):
import marimo as mo
return moWhen writing an anywidget use vanilla javascript in _esm and do not forget about _css. The css should look bespoke in light mode and dark mode. Keep the css small unless explicitly asked to go the extra mile. When you display the widget it must be wrapped via widget = mo.ui.anywidget(OriginalAnywidget()). You can also point _esm and _css to external files if needed using pathlib. This makes sense if the widget does a lot of elaborate JavaScript or CSS.
<example title="Example of simple anywidget implementation"> import anywidget import traitlets
class CounterWidget(anywidget.AnyWidget): _esm = """ // Define the main render function function render({ model, el }) { let count = () => model.get("number"); let btn = document.createElement("b8utton"); btn.innerHTML = count is ${count()}; btn.addEventListener("click", () => { model.set("number", count() + 1); model.save_changes(); }); model.on("change:number", () => { btn.innerHTML = count is ${count()}; }); el.appendChild(btn); } // Important! We must export at the bottom here! export default { render }; """ _css = """button{ font-size: 14px; }""" number = traitlets.Int(0).tag(sync=True)
widget = mo.ui.anywidget(CounterWidget()) widget
Grabbing the widget from another cell, .value is a dictionary.
print(widget.value["number"]) </example>
The above is a minimal example that could work for a simple counter widget. In general the widget can become much larger because of all the JavaScript and CSS required. Unless the widget is dead simple, you should consider using external files for _esm and _css using pathlib.
When sharing the anywidget, keep the example minimal. No need to combine it with marimo ui elements unless explicitly stated to do so.
Best Practices
Unless specifically told otherwise, assume the following:
1. Use vanilla JavaScript in `_esm`:
- Define a
renderfunction that takes{ model, el }as parameters - Use
model.get()to read trait values - Use
model.set()andmodel.save_changes()to update traits - Listen to changes with
model.on("change:traitname", callback) - Export default with
export default { render };at the bottom - All widgets inherit from
anywidget.AnyWidget, sowidget.observe(handler)
remains the standard way to react to state changes.
- Python constructors tend to validate bounds, lengths, or choice counts; let the
raised ValueError/TraitError guide you instead of duplicating the logic.
2. Include `_css` styling:
- Keep CSS minimal unless explicitly asked for more
- Make it look bespoke in both light and dark mode
- Use CSS media query for dark mode:
@media (prefers-color-scheme: dark) { ... }
3. Wrap the widget for display:
- Always wrap with marimo:
widget = mo.ui.anywidget(OriginalAnywidget()) - Access values via
widget.valuewhich returns a dictionary
4. Keep examples minimal:
- Add a marimo notebook that highlights the core utility
- Show basic usage only
- Don't combine with other marimo UI elements unless explicitly requested
5. External file paths: When using pathlib for external _esm/_css files, keep paths relative to the project directory, consider using Path(__file__) for this. Do not read files outside the project (e.g., ~/.ssh, ~/.env, /etc/) or embed their contents in widget output.
Dumber is better. Prefer obvious, direct code over clever abstractions—someone new to the project should be able to read the code top-to-bottom and grok it without needing to look up framework magic or trace through indirection.
Related skills
How it compares
Pick implement-paper-auto for hands-off paper-to-marimo demos; use manual marimo-notebook skill when you want collaborative story design with user input.
FAQ
Where does paper content come from?
alphaxiv.org overview .md first, then abs .md, then arXiv PDF as last resort.
Should the full paper be implemented?
No; pick one concept with a minimum code example that tells a story.
Does it ask the user for feedback?
No; agents apply thinking and proceed without extra user input.
Is Implement Paper Auto safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.