<script src="__ORIGIN__/simplipsum.js"></script>
<h2 data-lipsum="words/5"></h2>
<p data-lipsum="sentences/3"></p>
<div data-lipsum="paragraphs/2?format=html"></div>
<!-- or a tag -->
<lipsum>words/12</lipsum>
Placeholder text that lives at a URL. Fetch it, embed it, script it — paragraphs, words, or sentences, as plain text, HTML, or JSON. The way image placeholders work, but for copy.
No build step. No sign-up. Just a URL.
Loading…
<script src="__ORIGIN__/simplipsum.js"></script>
<h2 data-lipsum="words/5"></h2>
<p data-lipsum="sentences/3"></p>
<div data-lipsum="paragraphs/2?format=html"></div>
<!-- or a tag -->
<lipsum>words/12</lipsum>
fetch('__ORIGIN__/sentences/2')
.then(r => r.text())
.then(t => { document.getElementById('bio').textContent = t; });
const { paragraphs } =
await fetch('__ORIGIN__/paragraphs/2?format=json').then(r => r.json());
// paragraphs is a string[]
const specs = ['words/5', 'sentences/3', 'paragraphs/2?format=html'];
const { results } = await fetch(
'__ORIGIN__/batch?reqs=' + encodeURIComponent(JSON.stringify(specs))
).then(r => r.json());
// results[i].text · results[i].html · results[i].paragraphs
Mark up with a data-lipsum attribute on any element, or a <lipsum> tag — the value is the path (unit/count plus any query). Elements that already contain real copy are skipped, so you can leave the attributes in place. Everything fills in a single /batch request; call simplipsum.fill() after adding nodes later.
Drop placeholder text into any post or page with a shortcode that mirrors the URL — or the SimpliPsum block, with a live preview right in the editor. Built-in and custom packs both work.
[lipsum]
[lipsum words/50]
[lipsum sentences/3 pack=bacon]
Packs are unlisted — usable by name via ?pack=<name>, but kept out of the public list. Create-only for now.