Off-platform lift · Persistent DOI · v1.0.0
Zenodo submission – mint a persistent DOI
The 159-row indie saas teardowns dataset ships at /dataset under CC-BY-4.0. This page is the canonical handoff surface for depositing it on Zenodo – CERN's open-research repository – so the deposit mints a persistent DOI. DOIs are the strongest dataset identifier class Google Dataset Search recognises, the canonical citation form every academic reference manager pivots on, and propagate automatically into the BibTeX, the citation string, and the Hugging Face dataset card the moment the DOI lands on Vercel.
Live DOI: 10.5281/zenodo.20315741
Six-step submission
- Create a Zenodo account. zenodo.org/signup. Free, ORCID-linkable. If you already have a GitHub or ORCID account, sign in via either – Zenodo accepts both as identity providers. New accounts get an API access token under Account → Applications → Personal access tokens. Scopes needed:
deposit:writeanddeposit:actions. - Export the pre-built deposition payload.
curl -O https://unlocksaas.com/dataset/zenodo/raw
The response sets
Content-Dispositiontofilename="zenodo-deposition.json", so the file lands ready for the CLI. The payload is the exact JSON shape Zenodo’s API expects. - Run the operator CLI.
export ZENODO_API_TOKEN="<paste-your-token>" python3 scripts/mint-zenodo-deposit.py --confirm
The CLI creates the deposition, uploads the 8 artifacts (JSON bundle, universal CSV, 5 per-table CSVs, markdown summary), reserves a DOI, and publishes the deposit. The CLI prints the resulting DOI + record URL on success. Without
--confirmit does a dry-run that prints the planned API calls without executing them.Prefer the sandbox first?
--sandboxtargets sandbox.zenodo.org instead of the production Zenodo – same API shape, DOIs are sandbox-scoped and non-resolvable, but the workflow rehearses cleanly without committing a real DOI. - Set the activation env vars on Vercel.
# The Zenodo record landing URL (catalog cross-listing target) vercel env add NEXT_PUBLIC_UNLOCKSAAS_ZENODO_DOI_URL production # Paste the URL the CLI printed, for example: # https://zenodo.org/records/12345678 # The bare DOI (identifier surface) vercel env add NEXT_PUBLIC_UNLOCKSAAS_ZENODO_DOI production # Paste the bare DOI the CLI printed, for example: # 10.5281/zenodo.12345678
Both vars are
NEXT_PUBLIC_*– the values render into server-rendered JSON-LD and have no secrecy contract. The DOI itself is independently verifiable by followinghttps://doi.org/<doi>; pasting a fabricated value would point at nothing.Repeat for preview if you want the cross- listing visible on preview deploys too.
- Redeploy and verify. The next deploy picks up both env vars. On the live site:
- The Dataset JSON-LD on
/datasetdeclares the DOI as a typedPropertyValue identifier, appendshttps://doi.org/<doi>tosameAs, and adds the Zenodo catalog row toincludedInDataCatalog. - The BibTeX entry gets a
doi = { ... }field. The citation string gets aDOI: https://doi.org/<doi>suffix. - The Hugging Face dataset card’s YAML frontmatter gets a
doi:field; the dataset card body gets a DOI table row near the top. - The downloaded JSON bundle gets
doi+doiUrlfields.
Verify with the Google Rich Results Test against
/dataset– the Dataset node should showidentifieras an array with the DOI PropertyValue first. - The Dataset JSON-LD on
- Wait for Dataset Search ingestion. Google Dataset Search re-ingests on its own crawl cadence (typically 1–7 days). The DOI propagates faster across academic citation pipelines: Zotero / Mendeley / EndNote recognise the DOI immediately because the Zenodo record is already published; the citation export formats on the Zenodo record page (BibTeX, RIS, CSL-JSON, DataCite XML) are immediately usable.
Files uploaded to the deposit
The CLI fetches each artifact from the canonical site and uploads it under the filename below. Version-suffixed so a future bump produces a new deposit (and a new DOI) without file-name collisions.
- Source
indie-saas-teardowns-v1.0.0.jsonFull JSON bundle with schema descriptions and citation metadata - Source
indie-saas-teardowns-v1.0.0.csvUniversal CSV (flat, one row per record, 14 columns) - Source
funnel-teardowns-v1.0.0.csvFunnel teardowns – 33 rows, 27 columns - Source
pricing-teardowns-v1.0.0.csvPricing teardowns – 31 rows, 29 columns - Source
comparisons-v1.0.0.csvHead-to-head comparisons – 61 rows, 22 columns - Source
alternatives-v1.0.0.csvNamed-competitor alternatives – 21 rows, 17 columns - Source
categories-v1.0.0.csvCategory buckets – 13 rows, 8 columns - Source
README-v1.0.0.mdMarkdown summary mirror of the canonical landing page
Total per-table CSV count: 5. Counts per table: Funnel teardowns (33), Pricing teardowns (31), Head-to-head comparisons (61), Named-competitor alternatives (21), Category buckets (13).
No-CLI alternative (web UI)
If you would rather click than script, the same artifacts upload through Zenodo’s web UI. The deposition payload JSON contains every metadata field, so you can paste each value into the corresponding form input.
- Go to zenodo.org/uploads/new.
- Upload type: Dataset. Access right: Open. License: Creative Commons Attribution 4.0.
- Open https://unlocksaas.com/dataset/zenodo/raw in another tab. Each form field on the Zenodo page maps one-to-one to a key in the JSON.
- Upload the 8 files from the list above. Drag-drop from the canonical site or download first.
- Click Reserve DOI, then Publish. Copy the DOI from the resulting record page.
- Set both env vars on Vercel and redeploy (step 4 above).
OSF.io alternative
Open Science Framework (OSF) also mints DOIs and is a recognised DataCatalog. The same dataset can be deposited on OSF instead of (or in addition to) Zenodo. The env-var slot is reserved:
vercel env add NEXT_PUBLIC_UNLOCKSAAS_OSF_DATASET_URL production # Paste the OSF project URL, for example: # https://osf.io/abc123/ vercel env add NEXT_PUBLIC_UNLOCKSAAS_OSF_DOI production # Paste the bare DOI OSF mints, for example: # 10.17605/OSF.IO/ABC123
Create the OSF project at osf.io/myprojects, upload the same 8 artifacts, click Create DOI. The DOI propagates into the canonical Dataset JSON-LD the same way Zenodo’s does. Both slots are additive – you can have a Zenodo DOI as the primary identifier and an OSF deposit as an additional includedInDataCatalog row.
Brunson Hard-Rule
The deposition metadata payload, the file upload list, the HTML description, and the citation block all derive from the same module that drives /dataset and its JSON-LD. The Zenodo deposit cannot drift from the canonical site by construction – every row count, license string, citation, and column contract is read once at module load.
The DOI itself is operator-gated. The canonical Dataset JSON-LD declares the DOI as a typed PropertyValue identifier only when both env vars resolve to valid values: the URL must be https:// and the bare DOI must match 10.<digits>/<suffix>. A missing or malformed value is silently skipped – the schema validator never sees a fabricated DOI claim.
Author: Maryan, Founder, Unlock SaaS
Last verified: 2026-05-18
Next editorial review: 2026-08-16
Raw deposition payload: /dataset/zenodo/raw
Operator CLI: scripts/mint-zenodo-deposit.py