How to share a Kaggle notebook

Kaggle's visibility model has exactly two settings and no dial between them.

Private with collaborators. You add named Kaggle users. They can open and edit. Everyone else, including someone who has never used Kaggle, is out.

Public. The notebook is visible to the entire Kaggle community and the open web, forkable, indexed, and attached to your profile.

For the platform's actual purpose — a public learning and competition community — this is the right design. It becomes a problem the moment the audience is someone specific who is not a Kaggle user: a hiring manager, a client, a co-author at a different institution, a professor.

The three situations this breaks

A take-home or interview notebook. Publishing it hands your solution to every future candidate. Adding the reviewer as a collaborator requires them to have a Kaggle account and gives them edit rights on your work.

Client or internal analysis run on Kaggle's free GPUs. Public is out for obvious reasons. Collaborators means provisioning Kaggle accounts for people who have no other reason to have one.

A writeup you want feedback on before publishing. Kaggle has comments, but only on public notebooks — so getting review means publishing first, which is backwards.

Export the executed notebook

The reliable move is to render the notebook to one self-contained HTML file and share that file, decoupled from Kaggle's visibility model entirely.

From inside the notebook:

!jupyter nbconvert --to html --execute --no-input \
    /kaggle/working/__notebook__.ipynb --output /kaggle/working/report.html

Or download the .ipynb from the notebook menu and convert locally, which is often easier because you control the environment:

jupyter nbconvert --to html --execute --no-input notebook.ipynb --output report.html

--execute regenerates outputs so they match the code, and --no-input hides the cells so it reads as a document. Drop --no-input when the code is the thing being reviewed — for an interview submission, it usually is.

Interactive charts survive the export. Plotly, Bokeh, Altair and folium render as client-side JavaScript with no kernel behind them, so zoom and hover keep working — as long as the library is embedded in the file rather than pulled from a CDN at view time.

Publish it somewhere with a comment layer

curl -fsS -X POST "https://commareports.com/api/v1/reports" \
  -H "Authorization: Bearer $COMMA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --rawfile html report.html \
        --arg title "Fraud detection — approach and results" \
        '{title: $title, html: $html}')"

Keep the returned id and PATCH it on later runs, so the link you put in an application or a writeup keeps working while the content behind it improves, with every earlier version preserved as a revision.

What that gets you that Kaggle's settings do not

A specific audience. Access is a setting on the report — private, team, domain-gated or link — so a reviewer opens the work with no Kaggle account, and the work is not published to the community.

Review before publication. The feedback conversation happens on anchored threads pinned to specific cells and figures — "this leaks the target through the aggregation" — while the notebook is still private. Kaggle comments only exist after you have published.

A record. Every re-run is a revision at the same URL, so a reviewer can see what changed between the version they commented on and the current one.

When to just make it public

If the notebook is a contribution — a tutorial, a competition writeup, an EDA you want upvotes on — publish it on Kaggle. That is what the platform is for and no private link substitutes for community reach. Export and publish separately when the reader is one specific person who is not on Kaggle.

Try it

Comma is free — unlimited reports, unlimited commenters, unlimited revision history.

Create your first report →

Related