Shareable URLs for notebook outputs — record any chart, DataFrame, or figure into a live link
Project description
Skua
Shareable URLs for notebook outputs
One function call turns plots, DataFrames, and text into permanent links. Re-run the cell to update — same URL, fresh results.
Installation
pip install getskua
No setup required. No account, no API key.
Quick Start
import matplotlib.pyplot as plt
import skua
skua.init("Q3 Review")
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 4, 9])
ax.set_title("Quadratic Growth")
result = skua.record(fig, title="Quadratic Growth")
print(result.url) # https://skua.dev/r/abc123
Share the URL with anyone. Call skua.record() again with the same title to update in place — handy for iterating, and also the simplest way to change a record's visibility.
CLI
Works with any tool that can run shell commands — AI coding assistants, CI pipelines, scripts.
skua record chart.png --title "Q3 Revenue"
skua record data.csv --title "Sales Data" --visibility public --tags "finance,q3"
skua record plot.json --title "Interactive Chart"
cat report.txt | skua record - --type text --title "Analysis"
Use --json for machine-readable output:
skua record chart.png --title "Chart" --json
# {"url": "https://skua.dev/r/abc123", "id": "abc123", "visibility": "public"}
Supported Types
Skua auto-detects the object type and picks the right serializer:
- Matplotlib figures — high-DPI PNG
- Plotly figures — fully interactive (zoom, pan, hover, export)
- Pandas DataFrames — sortable, filterable tables
- Polars DataFrames — same interactive tables (LazyFrames collected automatically)
- NumPy arrays — rendered as tables
- PIL Images — saved as PNG
- Lists of dicts — rendered as tables (handy for HuggingFace pipelines, eval loops)
- PyTorch / TensorFlow tensors — image tensors as PNG, others as tables
- Anything else — falls back to string representation
API
skua.init(name=None, visibility=None)
Open a named session scope. Call once per notebook/kernel before any skua.record().
name— custom session name (max 100 chars). If omitted, a random "Adverb Verbing" name is generated and printed.visibility— session-default visibility for every subsequentrecord(). One of"public","unlisted","private". Per-call overrides still win. Omit to fall back to the server default (public).
skua.record(obj, title, description=None, visibility=None, tags=None)
Capture and share a Python object. Returns a Record with .url and .metadata.
In Jupyter, the original object is displayed inline.
visibility—"public","unlisted", or"private". Defaults to the session default or"public".public— listed on your profile, URL shareable, discoverable.unlisted— URL works for anyone, but not listed on your profile.private— only you can view (requires a verified account).
tags— optional list of strings for categorization (max 20 tags, 30 chars each). Displayed on the record page and profile listing.
Re-calling record() with the same (session, title) updates the existing record in place — including its visibility.
skua.login()
Open the browser to verify your email. Verified accounts get 365-day retention (vs 90 days), no hard record cap (reach out if you hit one), and a public profile page at skua.dev/u/username.
skua.auth("sk_...")
Paste the token you receive by email after skua.login().
Environment
All infrastructure-level settings are read from environment variables (rarely needed):
SKUA_API_URL— API host (default:https://api.skua.dev)SKUA_WEB_URL— web host (default:https://skua.dev)SKUA_TOKEN— auth token (alternative toskua.auth()/~/.skua/token)
Limits
Anonymous usage works out of the box:
- 90-day retention, 10 records per device, 20 uploads/hour, 10 MB per record
Verify your email to unlock:
- 365-day retention (resets on update), no hard record cap (reach out if you hit one), 10 MB per record
Privacy
public and unlisted records are accessible to anyone who has the URL — URLs contain random IDs that are not guessable, but there's no login-gated access control for these. private records are cookie/token-gated and only viewable by you. Do not record sensitive data at public or unlisted.
Documentation
Full docs, live examples, and the API reference at skua.dev/docs.
License
MIT
Support
Questions or feedback? Email hello@skua.dev or open an issue on GitHub.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file getskua-0.11.0a8.tar.gz.
File metadata
- Download URL: getskua-0.11.0a8.tar.gz
- Upload date:
- Size: 188.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ad67e3bd4a4abc8c176b1fed8620997f35457c23fc3296380036d6fd0db84513
|
|
| MD5 |
8575f2ae3130633456c8a2d831bcf0ac
|
|
| BLAKE2b-256 |
5ebaea88806ae0b90b4322f107cb7745cb4e338a7600c3befc0710f7f901e7f8
|
File details
Details for the file getskua-0.11.0a8-py3-none-any.whl.
File metadata
- Download URL: getskua-0.11.0a8-py3-none-any.whl
- Upload date:
- Size: 29.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8fe440b9456281ea031f1713673906207b5ae4cff3457b3f02c4d90954cd203d
|
|
| MD5 |
c12d73990e856c3c72fa54564a7aca53
|
|
| BLAKE2b-256 |
494511fea05a4bb3e2d94ebe7815a46ec80d4d2c63c2760f259344bc19f2c62d
|