Real-Fruit-Snacks21 downloadsRun an internet speed test and log every result as a note: download, upload, latency and jitter as front matter, with a self-updating summary.
Run an internet speed test from inside Obsidian and log every result as a note.
A one-off speed test is a browser tab. A log tells you which network was slow, when it started, and whether the new router helped. Speedlog keeps that log where you already keep everything else: one Markdown note per run, numeric front matter you can chart with Bases or Dataview, a summary that rewrites itself, and a timeline of every step the test took.
download_mbps, upload_mbps, latency_ms, jitter_ms, loaded_latency_ms, server, label, profile, phase timings and more; a callout with the numbers and how they compare to the median for that network; a Timeline table of every step with its duration and what it found.Summary.md, rewritten after every run. Per-label medians and extremes, failed runs with their reason, and the last seven days, every row linked to its note.
Summary.md is rebuilt.Every step lands in the panel's log as it happens and in the note's Timeline afterwards, with pick_s, latency_s, download_s and upload_s in the front matter.
| The panel mid-run | After a few runs |
|---|---|
![]() |
![]() |
| Summary.md | Settings |
|---|---|
![]() |
![]() |
The panel takes its colours from whatever theme you run; these were shot under Terminal Workbench.
From the community plugin directory, search for Speedlog.
Manually: download main.js, styles.css and manifest.json from the latest release into <vault>/.obsidian/plugins/speedlog/ and enable it under Settings → Community plugins. Works on desktop and mobile.
| Command | What it does |
|---|---|
| Run speed test | Runs a test with the current label and writes the note. |
| Open panel | Opens the Speedlog sidebar. |
| Open summary note | Rebuilds and opens Summary.md. |
The ribbon gauge opens the panel; clicking the status bar item runs a test.
| Setting | What it does |
|---|---|
| Profile | Accurate (default): four streams, about 160 MB down and 10–40 MB up, plus latency under load. Balanced: one stream, about 60 MB and 15 MB. Light: one 5 MB transfer, about 7 MB in total. |
| Server | LibreSpeed · nearest (default, picked each run), one of 17 LibreSpeed servers by city, or Cloudflare's nearest edge. |
| Time cap | A run stops after this many seconds and reports what it has. |
| Run on startup | One test 30 seconds after the vault opens, at most once a day. Off by default. |
| Repeat every | Never, or 30 minutes to 24 hours. Off by default. |
| Allow scheduled runs on mobile | Off: startup and interval runs skip phones and tablets. Manual runs always work. |
| Folder | Where run notes and Summary.md live. Default Speed tests/. |
| Filename format | Moment.js format for run notes. Default YYYY-MM-DD HHmmss. |
| Keep Summary.md updated | Rebuild the summary after every run. |
| Status bar | Show the last result in the status bar; click it to run again. |
---
download_mbps: 557.2
upload_mbps: 15.4
latency_ms: 27
jitter_ms: 2.6
loaded_latency_ms: 60
profile: accurate
label: "home wifi"
server: "New York, United States (2) (Clouvider)"
server_host: "nyc.speedtest.clouvider.net"
server_picked: auto
platform: "desktop · linux"
trigger: manual
duration_s: 12.1
pick_s: 2.5
latency_s: 0.9
download_s: 3.4
upload_s: 5.1
date: 2026-09-17T18:51:03-04:00
tags: [speedlog]
---
Below the front matter: the results callout, the Timeline table, the previous runs for that label, and a link to the summary. A failed run is written with status: failed and error: "…" instead of the numbers, and is excluded from medians.
Any query tool works on the front matter. A Dataview table of the last 20 runs on one network:
TABLE download_mbps AS "Down", upload_mbps AS "Up", latency_ms AS "ms", loaded_latency_ms AS "loaded"
FROM "Speed tests" WHERE label = "home wifi" AND !status SORT date DESC LIMIT 20
Or make a Base on the Speed tests folder and add a chart of download_mbps over date.
Speedlog contacts one server per run, and only while a test is running: the LibreSpeed server it picked (or the one you chose), or speed.cloudflare.com. The list of 17 LibreSpeed servers is embedded in the plugin, taken from librespeed.org/backend-servers, so the list itself is never fetched. Requests carry the test payload and nothing else; nothing about you or your vault leaves the device. The run note records which server was used.
Data per run at the default profile: about 160 MB down and 10–40 MB up (uploads are sized to your uplink). Use Light on metered connections. LibreSpeed servers are run by volunteers and may come and go; a server that refuses is skipped for the next nearest.
Speedlog measures what Obsidian itself can move on your connection at that moment. Wi-Fi, VPNs and whatever else is downloading all show up in it, which is the point of logging. Against different servers a minute apart, Speedlog's Cloudflare and LibreSpeed results agreed within a few percent during testing. Servers that don't allow cross-origin transfers are tested through Obsidian's own request path, which cannot stream progress; those runs show "non-streaming transfer" in the note and the progress bar advances per round rather than continuously.
Plain main.js, no build step. See CONTRIBUTING.md. Before opening a pull request, run Dev Lab's pre-flight review on the plugin folder; it should report 0 linter errors.
Thoughtbin · Theme Lab · Dev Lab · Glow · Outrun · Dossier · Comic · Grimoire
MIT.