hone supports two data formats: a playlist format for sharing problem lists, and a JSON backup format for full data portability.
Playlist format¶
The playlist format is a plain text file that hone import and hone export both understand. It's designed to be human-readable and easy to edit.
# Favorites
https://neetcode.io/problems/two-sum/question
https://neetcode.io/problems/valid-anagram/question
# Week 1
https://neetcode.io/problems/climbing-stairs/question
https://leetcode.com/problems/house-robber/
https://neetcode.io/problems/coin-change/question
Rules:
# Name— starts a playlist section; all URLs below belong to that playlist- URLs before any
#header are imported without a playlist - Blank lines and
//comments are ignored - Any URL order is preserved within each section
- A
#header with no URLs below it is silently skipped
Importing¶
hone import my-list.txt
hone processes URLs sequentially. For each URL:
- If the problem doesn't exist in your library — scrape and insert it
- If it does exist — skip scraping, but still add it to the playlist
- If the playlist doesn't exist — create it
Progress is shown inline as each URL completes:
Importing 5 problems across 2 playlist(s)
✓ neetcode/two-sum [Favorites]
✓ neetcode/valid-anagram [Favorites]
– neetcode/climbing-stairs already in library
✓ leetcode/house-robber [Week 1]
✗ neetcode/coin-change scrape: timeout
████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 4 / 5
✓ 3 added – 1 skipped ✗ 1 failed 1 playlist(s) created
Exporting¶
hone export
hone export -o my-list.txt
The output groups problems by playlist and round-trips cleanly with hone import.
JSON backup format¶
The --backup flag produces a complete snapshot of your database — problems, SRS state, attempt history, and playlists.
hone export --backup -o backup.json
Example output:
{
"version": 1,
"exported_at": "2026-03-30T14:00:00Z",
"problems": [
{
"platform": "neetcode",
"slug": "two-sum",
"title": "Two Sum",
"difficulty": "easy",
"created_at": "2026-03-01 09:00:00",
"topics": ["array", "hash table"],
"easiness_factor": 2.6,
"interval_days": 6,
"repetition_count": 2,
"next_review_date": "2026-04-05",
"mastered_before": false
}
],
"playlists": [
{
"name": "Favorites",
"problems": ["neetcode/two-sum", "neetcode/valid-anagram"]
}
],
"attempts": [
{
"problem": "neetcode/two-sum",
"started_at": "2026-03-28 10:00:00",
"completed_at": "2026-03-28 10:08:30",
"result": "success",
"duration_seconds": 510,
"quality": 5
}
]
}
Restoring¶
hone init backup.json
Database must not exist
hone init refuses to run if ~/.local/share/hone/data.db already exists, to prevent accidental data loss. Delete the database first, then restore:
rm ~/.local/share/hone/data.db && hone init backup.json
Moving to a new machine¶
-
On the old machine:
hone export --backup -o hone-backup.json -
Transfer
hone-backup.jsonto the new machine (AirDrop, scp, etc.) -
On the new machine:
brew install pricklywiggles/hone/hone hone init hone-backup.json
Your entire history, SRS state, and playlists are restored. You'll need to re-authenticate with problem platforms (hone auth neetcode), since the browser profile is not included in the backup.