Publishing on Vivum

How to publish

Vivum is an index, not a host. You write and host your article yourself, and submit the link here. You keep full ownership of the code and the content. Vivum lists the article, adds a discussion layer, and can trigger formal peer review once a threshold is reached.

What "self-hosted" means in practice

There is no editor or upload button on Vivum. The only hard requirement is a stable public URL where the article lives, you host it yourself, wherever makes sense for what you built, and submit that link.

For most articles, that public URL and the source code are the same thing: a plain HTML file, a Distill build, or an exported notebook pushed to a public GitHub repo, served directly by GitHub Pages for free. In that case the repo isn't optional infrastructure, it's the article.

Shiny and Dash articles work differently. They need a live R or Python process, so the thing readers visit is a deployed app on a host like shinyapps.io or Render, not a static GitHub Pages site. You can still keep the source in a public GitHub repo, and you should, it's how reviewers and readers verify the analysis, but the repo isn't what you're linking to as the article itself. The next section walks through which case applies to you.

Choosing a tool for the interactive parts

"Interactive" almost always means a chart or simulation that responds to user input, a slider, a dropdown, a button. The tool you reach for depends on what you already know, not on any Vivum requirement. The table below lists some options, what they're good at, and where they fall short.

Plain HTML + D3 / Plotly.jsBest for: full control, no build step, works on any static host. Limitations:you write the charting code yourself; steeper learning curve than the notebook tools below if you've never used D3. This is what the Vivum template and what The Living Article is built with.
Observable notebooksBest for: data-driven articles, reactive cells that recompute automatically, publishing straight from the notebook. Limitations:your analysis lives on Observable's platform, not in your own repo, so "where's the code" means linking your notebook's page rather than a GitHub repo. observablehq.com →
Distill template (HTML + Svelte)Best for: ML and interpretability writing in the style Distill popularized; built-in citations, sidenotes, KaTeX. Limitations: Svelte build tooling adds setup overhead compared to a single static file; the project is no longer actively maintained. Template on GitHub →
Quarto / Shiny (R)Best for: statistical and bioinformatics work already in R; renders directly to interactive HTML. Limitations:Shiny apps need a running R process, so static GitHub Pages hosting won't work for them; use the free tier of shinyapps.io instead, and link that URL.
Plotly Dash (Python)Best for: biomedical and genomics data already in a Python pipeline. Limitations: same constraint as Shiny, Dash apps run a live Python server, so they need a host that runs Python (e.g. Render, Fly.io) rather than GitHub Pages. dash.plotly.com →
Jupyter BookBest for: longer, multi-page computational narratives built from notebooks. Limitations:interactivity depends on ipywidgets exporting cleanly to static HTML, some widgets don't survive the export and need Binder/JupyterHub instead, which is a heavier hosting setup than a static page. jupyterbook.org →

If you're unsure, plain HTML with D3 or Plotly.js is the safest default: it's a static file, it hosts anywhere for free, and it's exactly what the Vivum template is built on. For a sense of what this looks like at full scale, read The Living Article , an interactive piece arguing that the web medium changes what a scientific argument can say, built entirely with this approach.

If your analysis already works in R or Python and the gap is purely on the web side, you don't need to learn HTML, CSS, or D3 from scratch to use that default. AI coding tools (e.g. Claude, Gemini, ChatGPT) are well suited to exactly this handoff: provide both the Vivum template and your existing analysis (the script, notebook, or write-up) as context, and it's generally enough for the tool to draft the interactive HTML/JS around your results. You're still responsible for checking that it represents the analysis correctly, but it removes the need to become a frontend developer first.

A minimal worked example

Here is the entire pattern behind the interactive figures in The Living Article , for instance the ROC explorer and the likelihood-surface descent: an SVG element sits in the HTML, a slider sits next to it, and a short script redraws the SVG whenever the slider moves. Nothing here is Vivum-specific, it's the same D3 you'd write for any static site.

<!-- 1. Load D3 from a CDN, no build step, no install -->
<script src="https://cdn.jsdelivr.net/npm/d3@7/dist/d3.min.js"></script>

<!-- 2. Somewhere in your article body -->
<svg id="my-figure" width="600" height="300"></svg>
<input type="range" id="param-a" min="0" max="100" value="50" />

<script>
  // 3. Draw once on load, redraw whenever the slider changes
  function draw(value) {
    const svg = d3.select('#my-figure');
    svg.selectAll('circle').remove();
    svg.append('circle')
      .attr('cx', 300)
      .attr('cy', 150)
      .attr('r', value)
      .attr('fill', '#0A6B3B');
  }

  draw(50);
  document.getElementById('param-a')
    .addEventListener('input', (e) => draw(+e.target.value));
</script>

Save that as index.html, push it to a public GitHub repo, enable GitHub Pages, and you have a live, interactive article with a real public URL, no framework required. The Vivum template starts from exactly this pattern and adds the page layout, table of contents, sidenotes, and citation block around it.

Hosting it publicly

Your article needs a stable public URL, and ideally a public repo behind it. GitHub Pages is the default choice for anything that's a static file (plain HTML, Distill, Observable export, Jupyter Book export): it's free, version-controlled, and serves directly from the repo you just pushed.

GitHub PagesFree. Serves a static site directly from your public repo, no separate hosting account needed. pages.github.com →
Netlify / VercelFree tiers. Continuous deployment from Git; useful if your article has a JS build step.
shinyapps.ioFree tier. Required for R/Shiny apps, which need a live server rather than a static page.
Any static or app hostAmazon S3, Cloudflare Pages, Render, Fly.io, or your own server. Any stable HTTPS URL is accepted.

Submitting to Vivum

Once your article is live, submit it using the form. After approval, it'll enter the public feed immediately, where the community can read, comment, upvote, and nominate it for review.

Submit the repository URL alongside the live URL whenever your code lives in one, this is the case for plain HTML, Distill, Observable exports, and Jupyter Book articles, where the repo is what lets readers inspect the code, reproduce the analysis, and verify every interactive claim independently. For Shiny or Dash articles, link the repo too if you have one public; if your code only lives in a private deployment, that's acceptable but worth disclosing in the submission notes, since it limits how readers can verify the analysis.

If the article accompanies a peer-reviewed publication, you can optionally add a published paper URL (DOI or journal link) at submission time. This positions Vivum as a complementary interactive layer on top of the formal paper.

Keeping your article up to date

Vivum links to your article rather than hosting a copy, so every update happens on your end: push to GitHub, redeploy to shinyapps.io or Render, whatever applies to your setup. For changes that affect the scientific content (new results, revised methodology, corrected figures), visit your article's page on Vivum and use the Version history section to log what changed.

Typo fixes and styling tweaks don't need to be logged. Reserve version notes for changes a reviewer or reader would actually want to know about.

On approval, we also snapshot your article using the Wayback Machine. That way, we save a permanent record of what the article looked like when it was first indexed. Version history is what tracks everything that happens after that: each confirmed update is logged with a description and a timestamp, so the two together give a full picture, what it looked like at the start, and what changed since.

What happens after submission

On submissionYour article is created with pending status. It is not yet in the public feed; it sits in the moderation queue for an admin to check for spam or obvious problems.
On approvalAn admin clears the queue (usually within 24 hours) and the status moves to live, the article appears in the public feed for the first time, and the Wayback Machine snapshot described above is taken.
At thresholdWhile live, the article accumulates score, comments, and nominations. Once these cross a combined threshold, and the article has been live for at least two weeks, status moves to in_review and it enters the formal review queue.
After reviewA reviewer publishes a structured note covering significance, reproducibility, and clarity. Status moves to reviewed, a DOI is issued via Zenodo, and the article becomes formally citable.

Questions about submission? Contact the editorial team via mail.
The Distill template is open source under Apache 2.0. Observable notebooks are CC-BY by default.