Skip to content

Repository files navigation

Farcaster Ark

Keep your casts. Keep the media.

Farcaster Ark is a local-first command-line tool that creates repeatable, verifiable snapshots of a Farcaster account. It preserves signed protocol records, useful Neynar views, and downloadable media without sending archive contents anywhere other than the APIs and media hosts needed to retrieve them.

Farcaster Ark is an independent open-source project. It is not affiliated with or endorsed by Farcaster or Neynar.

What it saves

  • Authored casts and replies as raw, signed protocol messages.
  • Likes, recasts, following, mentions, profile data, username proofs, verifications, storage limits, and on-chain account events.
  • The current follower list and Neynar-enriched cast views in a full backup.
  • Downloadable images, video, audio, and PDFs referenced by the profile or authored casts.
  • A manifest with record and request counts, a known-minimum Neynar credit estimate, completeness notes, and SHA-256 checksums.

Each run creates an immutable timestamped snapshot. Media is content-addressed and deduplicated across snapshots, so unchanged files are stored once.

Requirements

  • macOS or Linux.
  • Python 3.10 or newer.
  • A Neynar API key.
  • Enough local disk space for the account's media.
  • Optional: ffmpeg for HLS/DASH streaming video. Direct images, audio, video, and PDFs do not require it.

There are no required third-party Python packages.

Get a Neynar API key

Neynar requires an API key for its HTTP APIs. A free Neynar account is enough to get started, although a large account may require more credits than the free allowance provides.

  1. Open the Neynar Developer Portal and sign up or sign in.
  2. Create or select an app in the portal if prompted.
  3. Copy the app's API key. Neynar's API quickstart confirms that keys are obtained from the Developer Portal.
  4. Store only the key in a private file:
mkdir -p "$HOME/.config/farcaster-ark"
install -m 600 /dev/null "$HOME/.config/farcaster-ark/neynar-api-key"${EDITOR:-vi}"$HOME/.config/farcaster-ark/neynar-api-key"

Farcaster Ark refuses a key file that is readable by other users. It also accepts NEYNAR_API_KEY from the environment, but the private file is better for unattended monthly backups. Never commit the key.

No Farcaster signer, seed phrase, private key, wallet connection, or Neynar app wallet is required. Farcaster Ark only performs read operations.

Install from source

Clone or download this repository, then install it into an isolated virtual environment:

cd farcaster-ark
python3 -m venv .venv
. .venv/bin/activate
python -m pip install .
farcaster-ark --version

pipx install . is also supported if pipx is already installed. For a source checkout without installation, use python3 -m farcaster_ark anywhere this README uses farcaster-ark.

Create the first backup

Pass a Farcaster username with or without its leading @:

farcaster-ark backup alice

The default archive is ~/FarcasterArk. Choose another disk or directory with:

farcaster-ark backup alice --output /Volumes/Backup/FarcasterArk

The command resolves the username to its permanent FID and can optionally cross-check an expected FID:

farcaster-ark backup alice --fid 1234

Progress is printed without printing the API key. A failed run remains clearly marked as an in-progress snapshot; it is never published as complete.

Neynar credits

Farcaster Ark uses large raw-protocol pages and deduplicates media to reduce repeat work. The manifest records a known-minimum estimate, not a billing receipt: undocumented endpoints and failed/retried requests may add usage.

After one successful snapshot, estimate the next run without making API calls:

farcaster-ark estimate

For unattended runs, stop before API access if the previous snapshot projects more than a chosen budget:

farcaster-ark backup alice --credit-budget 5000

For a cheaper signed-protocol snapshot, omit the enriched cast views and the v2 follower list:

farcaster-ark backup alice --protocol-only
farcaster-ark estimate --protocol-only

The full mode is the default because it preserves the broadest account view.

Verify and recover

Verify the latest snapshot and every media blob it references:

farcaster-ark verify

Verify a named snapshot or a non-default archive:

farcaster-ark verify --snapshot 2026-07-14T033643Z \
--output /Volumes/Backup/FarcasterArk

If API collection completed but media downloading was interrupted, resume the newest complete staging snapshot without spending additional Neynar credits:

farcaster-ark resume

Use --skip-media when only protocol/API data is wanted. Use --refresh-media to try every URL again even when its earlier download is still present.

Monthly backups

Running the same full command monthly creates a new snapshot and reuses media already stored in the archive.

macOS launchd

Generate and install a job for 03:00 local time on the first day of each month:

farcaster-ark launchd alice --install

The command writes a per-account plist under ~/Library/LaunchAgents and prints the launchctl bootstrap command needed to load it. Use --day, --hour, --output, --api-key-file, --credit-budget, or --protocol-only to change its settings. Run without --install to inspect the plist on standard output first.

Linux cron

Find the absolute executable path with command -v farcaster-ark, then add a monthly entry with crontab -e, for example:

031**/absolute/path/to/farcaster-ark backup alice >> "$HOME/farcaster-ark.log" 2>&1

Scheduled jobs must be able to access the archive disk and API key file.

Archive layout

~/FarcasterArk/
├── LATEST
├── media/
│ ├── index.json
│ └── blobs/<sha-prefix>/<sha256>.<extension>
└── snapshots/<UTC timestamp>/
├── manifest.json
├── SHA256SUMS
├── media-manifest.jsonl
├── account/
├── protocol/
└── neynar/

Copy the entire archive directory when moving it. Snapshots refer to the shared media/blobs directory.

Completeness boundaries

This is a point-in-time account-state backup, not a private client-data export.

  • Normal protocol *ByFid queries return current valid state. Content removed before the first backup generally cannot be reconstructed. Monthly snapshots preserve changes observed after the first run.
  • DMs, drafts, bookmarks, mutes, blocks, and other client-private state are not Farcaster protocol account messages and are not included.
  • Replies authored by the account are included. Incoming mentions and current followers are included in a full run, but every reply or reaction made by other people on every cast is not expanded with costly per-cast crawling.
  • Farcaster media lives at external URLs. Hosts may delete files, block automated access, expire signed links, or disappear. Every attempted URL and failure status is retained in media-manifest.jsonl.
  • The archive contains public keys, wallet identifiers, and signed public messages, but never Farcaster private keys or wallet secrets.

Security

The Neynar key is sent only in requests to Neynar API hosts; media hosts never receive it. Media URLs and redirects resolving to localhost or private network addresses are blocked by default. --allow-private-media-hosts disables that protection and should be used only with trusted account data.

See SECURITY.md for reporting and storage guidance.

Development

Run the local verification suite:

python3 -m unittest discover -s tests -v
python3 -m py_compile farcaster_ark/*.py bin/backup_farcaster.py
sh -n scripts/monthly-backup.sh

Tests use mocked API and media responses and spend no Neynar credits. See CONTRIBUTING.md for contributor guidance.

License

MIT

About

Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - byte/farcaster-ark: Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver · GitHub
Skip to content

Repository files navigation

Farcaster Ark

Keep your casts. Keep the media.

Farcaster Ark is a local-first command-line tool that creates repeatable, verifiable snapshots of a Farcaster account. It preserves signed protocol records, useful Neynar views, and downloadable media without sending archive contents anywhere other than the APIs and media hosts needed to retrieve them.

Farcaster Ark is an independent open-source project. It is not affiliated with or endorsed by Farcaster or Neynar.

What it saves

  • Authored casts and replies as raw, signed protocol messages.
  • Likes, recasts, following, mentions, profile data, username proofs, verifications, storage limits, and on-chain account events.
  • The current follower list and Neynar-enriched cast views in a full backup.
  • Downloadable images, video, audio, and PDFs referenced by the profile or authored casts.
  • A manifest with record and request counts, a known-minimum Neynar credit estimate, completeness notes, and SHA-256 checksums.

Each run creates an immutable timestamped snapshot. Media is content-addressed and deduplicated across snapshots, so unchanged files are stored once.

Requirements

  • macOS or Linux.
  • Python 3.10 or newer.
  • A Neynar API key.
  • Enough local disk space for the account's media.
  • Optional: ffmpeg for HLS/DASH streaming video. Direct images, audio, video, and PDFs do not require it.

There are no required third-party Python packages.

Get a Neynar API key

Neynar requires an API key for its HTTP APIs. A free Neynar account is enough to get started, although a large account may require more credits than the free allowance provides.

  1. Open the Neynar Developer Portal and sign up or sign in.
  2. Create or select an app in the portal if prompted.
  3. Copy the app's API key. Neynar's API quickstart confirms that keys are obtained from the Developer Portal.
  4. Store only the key in a private file:
mkdir -p "$HOME/.config/farcaster-ark"
install -m 600 /dev/null "$HOME/.config/farcaster-ark/neynar-api-key"${EDITOR:-vi}"$HOME/.config/farcaster-ark/neynar-api-key"

Farcaster Ark refuses a key file that is readable by other users. It also accepts NEYNAR_API_KEY from the environment, but the private file is better for unattended monthly backups. Never commit the key.

No Farcaster signer, seed phrase, private key, wallet connection, or Neynar app wallet is required. Farcaster Ark only performs read operations.

Install from source

Clone or download this repository, then install it into an isolated virtual environment:

cd farcaster-ark
python3 -m venv .venv
. .venv/bin/activate
python -m pip install .
farcaster-ark --version

pipx install . is also supported if pipx is already installed. For a source checkout without installation, use python3 -m farcaster_ark anywhere this README uses farcaster-ark.

Create the first backup

Pass a Farcaster username with or without its leading @:

farcaster-ark backup alice

The default archive is ~/FarcasterArk. Choose another disk or directory with:

farcaster-ark backup alice --output /Volumes/Backup/FarcasterArk

The command resolves the username to its permanent FID and can optionally cross-check an expected FID:

farcaster-ark backup alice --fid 1234

Progress is printed without printing the API key. A failed run remains clearly marked as an in-progress snapshot; it is never published as complete.

Neynar credits

Farcaster Ark uses large raw-protocol pages and deduplicates media to reduce repeat work. The manifest records a known-minimum estimate, not a billing receipt: undocumented endpoints and failed/retried requests may add usage.

After one successful snapshot, estimate the next run without making API calls:

farcaster-ark estimate

For unattended runs, stop before API access if the previous snapshot projects more than a chosen budget:

farcaster-ark backup alice --credit-budget 5000

For a cheaper signed-protocol snapshot, omit the enriched cast views and the v2 follower list:

farcaster-ark backup alice --protocol-only
farcaster-ark estimate --protocol-only

The full mode is the default because it preserves the broadest account view.

Verify and recover

Verify the latest snapshot and every media blob it references:

farcaster-ark verify

Verify a named snapshot or a non-default archive:

farcaster-ark verify --snapshot 2026-07-14T033643Z \
--output /Volumes/Backup/FarcasterArk

If API collection completed but media downloading was interrupted, resume the newest complete staging snapshot without spending additional Neynar credits:

farcaster-ark resume

Use --skip-media when only protocol/API data is wanted. Use --refresh-media to try every URL again even when its earlier download is still present.

Monthly backups

Running the same full command monthly creates a new snapshot and reuses media already stored in the archive.

macOS launchd

Generate and install a job for 03:00 local time on the first day of each month:

farcaster-ark launchd alice --install

The command writes a per-account plist under ~/Library/LaunchAgents and prints the launchctl bootstrap command needed to load it. Use --day, --hour, --output, --api-key-file, --credit-budget, or --protocol-only to change its settings. Run without --install to inspect the plist on standard output first.

Linux cron

Find the absolute executable path with command -v farcaster-ark, then add a monthly entry with crontab -e, for example:

031**/absolute/path/to/farcaster-ark backup alice >> "$HOME/farcaster-ark.log" 2>&1

Scheduled jobs must be able to access the archive disk and API key file.

Archive layout

~/FarcasterArk/
├── LATEST
├── media/
│ ├── index.json
│ └── blobs/<sha-prefix>/<sha256>.<extension>
└── snapshots/<UTC timestamp>/
├── manifest.json
├── SHA256SUMS
├── media-manifest.jsonl
├── account/
├── protocol/
└── neynar/

Copy the entire archive directory when moving it. Snapshots refer to the shared media/blobs directory.

Completeness boundaries

This is a point-in-time account-state backup, not a private client-data export.

  • Normal protocol *ByFid queries return current valid state. Content removed before the first backup generally cannot be reconstructed. Monthly snapshots preserve changes observed after the first run.
  • DMs, drafts, bookmarks, mutes, blocks, and other client-private state are not Farcaster protocol account messages and are not included.
  • Replies authored by the account are included. Incoming mentions and current followers are included in a full run, but every reply or reaction made by other people on every cast is not expanded with costly per-cast crawling.
  • Farcaster media lives at external URLs. Hosts may delete files, block automated access, expire signed links, or disappear. Every attempted URL and failure status is retained in media-manifest.jsonl.
  • The archive contains public keys, wallet identifiers, and signed public messages, but never Farcaster private keys or wallet secrets.

Security

The Neynar key is sent only in requests to Neynar API hosts; media hosts never receive it. Media URLs and redirects resolving to localhost or private network addresses are blocked by default. --allow-private-media-hosts disables that protection and should be used only with trusted account data.

See SECURITY.md for reporting and storage guidance.

Development

Run the local verification suite:

python3 -m unittest discover -s tests -v
python3 -m py_compile farcaster_ark/*.py bin/backup_farcaster.py
sh -n scripts/monthly-backup.sh

Tests use mocked API and media responses and spend no Neynar credits. See CONTRIBUTING.md for contributor guidance.

License

MIT

About

Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - byte/farcaster-ark: Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver · GitHub
Skip to content

Repository files navigation

Farcaster Ark

Keep your casts. Keep the media.

Farcaster Ark is a local-first command-line tool that creates repeatable, verifiable snapshots of a Farcaster account. It preserves signed protocol records, useful Neynar views, and downloadable media without sending archive contents anywhere other than the APIs and media hosts needed to retrieve them.

Farcaster Ark is an independent open-source project. It is not affiliated with or endorsed by Farcaster or Neynar.

What it saves

  • Authored casts and replies as raw, signed protocol messages.
  • Likes, recasts, following, mentions, profile data, username proofs, verifications, storage limits, and on-chain account events.
  • The current follower list and Neynar-enriched cast views in a full backup.
  • Downloadable images, video, audio, and PDFs referenced by the profile or authored casts.
  • A manifest with record and request counts, a known-minimum Neynar credit estimate, completeness notes, and SHA-256 checksums.

Each run creates an immutable timestamped snapshot. Media is content-addressed and deduplicated across snapshots, so unchanged files are stored once.

Requirements

  • macOS or Linux.
  • Python 3.10 or newer.
  • A Neynar API key.
  • Enough local disk space for the account's media.
  • Optional: ffmpeg for HLS/DASH streaming video. Direct images, audio, video, and PDFs do not require it.

There are no required third-party Python packages.

Get a Neynar API key

Neynar requires an API key for its HTTP APIs. A free Neynar account is enough to get started, although a large account may require more credits than the free allowance provides.

  1. Open the Neynar Developer Portal and sign up or sign in.
  2. Create or select an app in the portal if prompted.
  3. Copy the app's API key. Neynar's API quickstart confirms that keys are obtained from the Developer Portal.
  4. Store only the key in a private file:
mkdir -p "$HOME/.config/farcaster-ark"
install -m 600 /dev/null "$HOME/.config/farcaster-ark/neynar-api-key"${EDITOR:-vi}"$HOME/.config/farcaster-ark/neynar-api-key"

Farcaster Ark refuses a key file that is readable by other users. It also accepts NEYNAR_API_KEY from the environment, but the private file is better for unattended monthly backups. Never commit the key.

No Farcaster signer, seed phrase, private key, wallet connection, or Neynar app wallet is required. Farcaster Ark only performs read operations.

Install from source

Clone or download this repository, then install it into an isolated virtual environment:

cd farcaster-ark
python3 -m venv .venv
. .venv/bin/activate
python -m pip install .
farcaster-ark --version

pipx install . is also supported if pipx is already installed. For a source checkout without installation, use python3 -m farcaster_ark anywhere this README uses farcaster-ark.

Create the first backup

Pass a Farcaster username with or without its leading @:

farcaster-ark backup alice

The default archive is ~/FarcasterArk. Choose another disk or directory with:

farcaster-ark backup alice --output /Volumes/Backup/FarcasterArk

The command resolves the username to its permanent FID and can optionally cross-check an expected FID:

farcaster-ark backup alice --fid 1234

Progress is printed without printing the API key. A failed run remains clearly marked as an in-progress snapshot; it is never published as complete.

Neynar credits

Farcaster Ark uses large raw-protocol pages and deduplicates media to reduce repeat work. The manifest records a known-minimum estimate, not a billing receipt: undocumented endpoints and failed/retried requests may add usage.

After one successful snapshot, estimate the next run without making API calls:

farcaster-ark estimate

For unattended runs, stop before API access if the previous snapshot projects more than a chosen budget:

farcaster-ark backup alice --credit-budget 5000

For a cheaper signed-protocol snapshot, omit the enriched cast views and the v2 follower list:

farcaster-ark backup alice --protocol-only
farcaster-ark estimate --protocol-only

The full mode is the default because it preserves the broadest account view.

Verify and recover

Verify the latest snapshot and every media blob it references:

farcaster-ark verify

Verify a named snapshot or a non-default archive:

farcaster-ark verify --snapshot 2026-07-14T033643Z \
--output /Volumes/Backup/FarcasterArk

If API collection completed but media downloading was interrupted, resume the newest complete staging snapshot without spending additional Neynar credits:

farcaster-ark resume

Use --skip-media when only protocol/API data is wanted. Use --refresh-media to try every URL again even when its earlier download is still present.

Monthly backups

Running the same full command monthly creates a new snapshot and reuses media already stored in the archive.

macOS launchd

Generate and install a job for 03:00 local time on the first day of each month:

farcaster-ark launchd alice --install

The command writes a per-account plist under ~/Library/LaunchAgents and prints the launchctl bootstrap command needed to load it. Use --day, --hour, --output, --api-key-file, --credit-budget, or --protocol-only to change its settings. Run without --install to inspect the plist on standard output first.

Linux cron

Find the absolute executable path with command -v farcaster-ark, then add a monthly entry with crontab -e, for example:

031**/absolute/path/to/farcaster-ark backup alice >> "$HOME/farcaster-ark.log" 2>&1

Scheduled jobs must be able to access the archive disk and API key file.

Archive layout

~/FarcasterArk/
├── LATEST
├── media/
│ ├── index.json
│ └── blobs/<sha-prefix>/<sha256>.<extension>
└── snapshots/<UTC timestamp>/
├── manifest.json
├── SHA256SUMS
├── media-manifest.jsonl
├── account/
├── protocol/
└── neynar/

Copy the entire archive directory when moving it. Snapshots refer to the shared media/blobs directory.

Completeness boundaries

This is a point-in-time account-state backup, not a private client-data export.

  • Normal protocol *ByFid queries return current valid state. Content removed before the first backup generally cannot be reconstructed. Monthly snapshots preserve changes observed after the first run.
  • DMs, drafts, bookmarks, mutes, blocks, and other client-private state are not Farcaster protocol account messages and are not included.
  • Replies authored by the account are included. Incoming mentions and current followers are included in a full run, but every reply or reaction made by other people on every cast is not expanded with costly per-cast crawling.
  • Farcaster media lives at external URLs. Hosts may delete files, block automated access, expire signed links, or disappear. Every attempted URL and failure status is retained in media-manifest.jsonl.
  • The archive contains public keys, wallet identifiers, and signed public messages, but never Farcaster private keys or wallet secrets.

Security

The Neynar key is sent only in requests to Neynar API hosts; media hosts never receive it. Media URLs and redirects resolving to localhost or private network addresses are blocked by default. --allow-private-media-hosts disables that protection and should be used only with trusted account data.

See SECURITY.md for reporting and storage guidance.

Development

Run the local verification suite:

python3 -m unittest discover -s tests -v
python3 -m py_compile farcaster_ark/*.py bin/backup_farcaster.py
sh -n scripts/monthly-backup.sh

Tests use mocked API and media responses and spend no Neynar credits. See CONTRIBUTING.md for contributor guidance.

License

MIT

About

Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - byte/farcaster-ark: Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver · GitHub
Skip to content

Repository files navigation

Farcaster Ark

Keep your casts. Keep the media.

Farcaster Ark is a local-first command-line tool that creates repeatable, verifiable snapshots of a Farcaster account. It preserves signed protocol records, useful Neynar views, and downloadable media without sending archive contents anywhere other than the APIs and media hosts needed to retrieve them.

Farcaster Ark is an independent open-source project. It is not affiliated with or endorsed by Farcaster or Neynar.

What it saves

  • Authored casts and replies as raw, signed protocol messages.
  • Likes, recasts, following, mentions, profile data, username proofs, verifications, storage limits, and on-chain account events.
  • The current follower list and Neynar-enriched cast views in a full backup.
  • Downloadable images, video, audio, and PDFs referenced by the profile or authored casts.
  • A manifest with record and request counts, a known-minimum Neynar credit estimate, completeness notes, and SHA-256 checksums.

Each run creates an immutable timestamped snapshot. Media is content-addressed and deduplicated across snapshots, so unchanged files are stored once.

Requirements

  • macOS or Linux.
  • Python 3.10 or newer.
  • A Neynar API key.
  • Enough local disk space for the account's media.
  • Optional: ffmpeg for HLS/DASH streaming video. Direct images, audio, video, and PDFs do not require it.

There are no required third-party Python packages.

Get a Neynar API key

Neynar requires an API key for its HTTP APIs. A free Neynar account is enough to get started, although a large account may require more credits than the free allowance provides.

  1. Open the Neynar Developer Portal and sign up or sign in.
  2. Create or select an app in the portal if prompted.
  3. Copy the app's API key. Neynar's API quickstart confirms that keys are obtained from the Developer Portal.
  4. Store only the key in a private file:
mkdir -p "$HOME/.config/farcaster-ark"
install -m 600 /dev/null "$HOME/.config/farcaster-ark/neynar-api-key"${EDITOR:-vi}"$HOME/.config/farcaster-ark/neynar-api-key"

Farcaster Ark refuses a key file that is readable by other users. It also accepts NEYNAR_API_KEY from the environment, but the private file is better for unattended monthly backups. Never commit the key.

No Farcaster signer, seed phrase, private key, wallet connection, or Neynar app wallet is required. Farcaster Ark only performs read operations.

Install from source

Clone or download this repository, then install it into an isolated virtual environment:

cd farcaster-ark
python3 -m venv .venv
. .venv/bin/activate
python -m pip install .
farcaster-ark --version

pipx install . is also supported if pipx is already installed. For a source checkout without installation, use python3 -m farcaster_ark anywhere this README uses farcaster-ark.

Create the first backup

Pass a Farcaster username with or without its leading @:

farcaster-ark backup alice

The default archive is ~/FarcasterArk. Choose another disk or directory with:

farcaster-ark backup alice --output /Volumes/Backup/FarcasterArk

The command resolves the username to its permanent FID and can optionally cross-check an expected FID:

farcaster-ark backup alice --fid 1234

Progress is printed without printing the API key. A failed run remains clearly marked as an in-progress snapshot; it is never published as complete.

Neynar credits

Farcaster Ark uses large raw-protocol pages and deduplicates media to reduce repeat work. The manifest records a known-minimum estimate, not a billing receipt: undocumented endpoints and failed/retried requests may add usage.

After one successful snapshot, estimate the next run without making API calls:

farcaster-ark estimate

For unattended runs, stop before API access if the previous snapshot projects more than a chosen budget:

farcaster-ark backup alice --credit-budget 5000

For a cheaper signed-protocol snapshot, omit the enriched cast views and the v2 follower list:

farcaster-ark backup alice --protocol-only
farcaster-ark estimate --protocol-only

The full mode is the default because it preserves the broadest account view.

Verify and recover

Verify the latest snapshot and every media blob it references:

farcaster-ark verify

Verify a named snapshot or a non-default archive:

farcaster-ark verify --snapshot 2026-07-14T033643Z \
--output /Volumes/Backup/FarcasterArk

If API collection completed but media downloading was interrupted, resume the newest complete staging snapshot without spending additional Neynar credits:

farcaster-ark resume

Use --skip-media when only protocol/API data is wanted. Use --refresh-media to try every URL again even when its earlier download is still present.

Monthly backups

Running the same full command monthly creates a new snapshot and reuses media already stored in the archive.

macOS launchd

Generate and install a job for 03:00 local time on the first day of each month:

farcaster-ark launchd alice --install

The command writes a per-account plist under ~/Library/LaunchAgents and prints the launchctl bootstrap command needed to load it. Use --day, --hour, --output, --api-key-file, --credit-budget, or --protocol-only to change its settings. Run without --install to inspect the plist on standard output first.

Linux cron

Find the absolute executable path with command -v farcaster-ark, then add a monthly entry with crontab -e, for example:

031**/absolute/path/to/farcaster-ark backup alice >> "$HOME/farcaster-ark.log" 2>&1

Scheduled jobs must be able to access the archive disk and API key file.

Archive layout

~/FarcasterArk/
├── LATEST
├── media/
│ ├── index.json
│ └── blobs/<sha-prefix>/<sha256>.<extension>
└── snapshots/<UTC timestamp>/
├── manifest.json
├── SHA256SUMS
├── media-manifest.jsonl
├── account/
├── protocol/
└── neynar/

Copy the entire archive directory when moving it. Snapshots refer to the shared media/blobs directory.

Completeness boundaries

This is a point-in-time account-state backup, not a private client-data export.

  • Normal protocol *ByFid queries return current valid state. Content removed before the first backup generally cannot be reconstructed. Monthly snapshots preserve changes observed after the first run.
  • DMs, drafts, bookmarks, mutes, blocks, and other client-private state are not Farcaster protocol account messages and are not included.
  • Replies authored by the account are included. Incoming mentions and current followers are included in a full run, but every reply or reaction made by other people on every cast is not expanded with costly per-cast crawling.
  • Farcaster media lives at external URLs. Hosts may delete files, block automated access, expire signed links, or disappear. Every attempted URL and failure status is retained in media-manifest.jsonl.
  • The archive contains public keys, wallet identifiers, and signed public messages, but never Farcaster private keys or wallet secrets.

Security

The Neynar key is sent only in requests to Neynar API hosts; media hosts never receive it. Media URLs and redirects resolving to localhost or private network addresses are blocked by default. --allow-private-media-hosts disables that protection and should be used only with trusted account data.

See SECURITY.md for reporting and storage guidance.

Development

Run the local verification suite:

python3 -m unittest discover -s tests -v
python3 -m py_compile farcaster_ark/*.py bin/backup_farcaster.py
sh -n scripts/monthly-backup.sh

Tests use mocked API and media responses and spend no Neynar credits. See CONTRIBUTING.md for contributor guidance.

License

MIT

About

Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - byte/farcaster-ark: Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver · GitHub
Skip to content

Repository files navigation

Farcaster Ark

Keep your casts. Keep the media.

Farcaster Ark is a local-first command-line tool that creates repeatable, verifiable snapshots of a Farcaster account. It preserves signed protocol records, useful Neynar views, and downloadable media without sending archive contents anywhere other than the APIs and media hosts needed to retrieve them.

Farcaster Ark is an independent open-source project. It is not affiliated with or endorsed by Farcaster or Neynar.

What it saves

  • Authored casts and replies as raw, signed protocol messages.
  • Likes, recasts, following, mentions, profile data, username proofs, verifications, storage limits, and on-chain account events.
  • The current follower list and Neynar-enriched cast views in a full backup.
  • Downloadable images, video, audio, and PDFs referenced by the profile or authored casts.
  • A manifest with record and request counts, a known-minimum Neynar credit estimate, completeness notes, and SHA-256 checksums.

Each run creates an immutable timestamped snapshot. Media is content-addressed and deduplicated across snapshots, so unchanged files are stored once.

Requirements

  • macOS or Linux.
  • Python 3.10 or newer.
  • A Neynar API key.
  • Enough local disk space for the account's media.
  • Optional: ffmpeg for HLS/DASH streaming video. Direct images, audio, video, and PDFs do not require it.

There are no required third-party Python packages.

Get a Neynar API key

Neynar requires an API key for its HTTP APIs. A free Neynar account is enough to get started, although a large account may require more credits than the free allowance provides.

  1. Open the Neynar Developer Portal and sign up or sign in.
  2. Create or select an app in the portal if prompted.
  3. Copy the app's API key. Neynar's API quickstart confirms that keys are obtained from the Developer Portal.
  4. Store only the key in a private file:
mkdir -p "$HOME/.config/farcaster-ark"
install -m 600 /dev/null "$HOME/.config/farcaster-ark/neynar-api-key"${EDITOR:-vi}"$HOME/.config/farcaster-ark/neynar-api-key"

Farcaster Ark refuses a key file that is readable by other users. It also accepts NEYNAR_API_KEY from the environment, but the private file is better for unattended monthly backups. Never commit the key.

No Farcaster signer, seed phrase, private key, wallet connection, or Neynar app wallet is required. Farcaster Ark only performs read operations.

Install from source

Clone or download this repository, then install it into an isolated virtual environment:

cd farcaster-ark
python3 -m venv .venv
. .venv/bin/activate
python -m pip install .
farcaster-ark --version

pipx install . is also supported if pipx is already installed. For a source checkout without installation, use python3 -m farcaster_ark anywhere this README uses farcaster-ark.

Create the first backup

Pass a Farcaster username with or without its leading @:

farcaster-ark backup alice

The default archive is ~/FarcasterArk. Choose another disk or directory with:

farcaster-ark backup alice --output /Volumes/Backup/FarcasterArk

The command resolves the username to its permanent FID and can optionally cross-check an expected FID:

farcaster-ark backup alice --fid 1234

Progress is printed without printing the API key. A failed run remains clearly marked as an in-progress snapshot; it is never published as complete.

Neynar credits

Farcaster Ark uses large raw-protocol pages and deduplicates media to reduce repeat work. The manifest records a known-minimum estimate, not a billing receipt: undocumented endpoints and failed/retried requests may add usage.

After one successful snapshot, estimate the next run without making API calls:

farcaster-ark estimate

For unattended runs, stop before API access if the previous snapshot projects more than a chosen budget:

farcaster-ark backup alice --credit-budget 5000

For a cheaper signed-protocol snapshot, omit the enriched cast views and the v2 follower list:

farcaster-ark backup alice --protocol-only
farcaster-ark estimate --protocol-only

The full mode is the default because it preserves the broadest account view.

Verify and recover

Verify the latest snapshot and every media blob it references:

farcaster-ark verify

Verify a named snapshot or a non-default archive:

farcaster-ark verify --snapshot 2026-07-14T033643Z \
--output /Volumes/Backup/FarcasterArk

If API collection completed but media downloading was interrupted, resume the newest complete staging snapshot without spending additional Neynar credits:

farcaster-ark resume

Use --skip-media when only protocol/API data is wanted. Use --refresh-media to try every URL again even when its earlier download is still present.

Monthly backups

Running the same full command monthly creates a new snapshot and reuses media already stored in the archive.

macOS launchd

Generate and install a job for 03:00 local time on the first day of each month:

farcaster-ark launchd alice --install

The command writes a per-account plist under ~/Library/LaunchAgents and prints the launchctl bootstrap command needed to load it. Use --day, --hour, --output, --api-key-file, --credit-budget, or --protocol-only to change its settings. Run without --install to inspect the plist on standard output first.

Linux cron

Find the absolute executable path with command -v farcaster-ark, then add a monthly entry with crontab -e, for example:

031**/absolute/path/to/farcaster-ark backup alice >> "$HOME/farcaster-ark.log" 2>&1

Scheduled jobs must be able to access the archive disk and API key file.

Archive layout

~/FarcasterArk/
├── LATEST
├── media/
│ ├── index.json
│ └── blobs/<sha-prefix>/<sha256>.<extension>
└── snapshots/<UTC timestamp>/
├── manifest.json
├── SHA256SUMS
├── media-manifest.jsonl
├── account/
├── protocol/
└── neynar/

Copy the entire archive directory when moving it. Snapshots refer to the shared media/blobs directory.

Completeness boundaries

This is a point-in-time account-state backup, not a private client-data export.

  • Normal protocol *ByFid queries return current valid state. Content removed before the first backup generally cannot be reconstructed. Monthly snapshots preserve changes observed after the first run.
  • DMs, drafts, bookmarks, mutes, blocks, and other client-private state are not Farcaster protocol account messages and are not included.
  • Replies authored by the account are included. Incoming mentions and current followers are included in a full run, but every reply or reaction made by other people on every cast is not expanded with costly per-cast crawling.
  • Farcaster media lives at external URLs. Hosts may delete files, block automated access, expire signed links, or disappear. Every attempted URL and failure status is retained in media-manifest.jsonl.
  • The archive contains public keys, wallet identifiers, and signed public messages, but never Farcaster private keys or wallet secrets.

Security

The Neynar key is sent only in requests to Neynar API hosts; media hosts never receive it. Media URLs and redirects resolving to localhost or private network addresses are blocked by default. --allow-private-media-hosts disables that protection and should be used only with trusted account data.

See SECURITY.md for reporting and storage guidance.

Development

Run the local verification suite:

python3 -m unittest discover -s tests -v
python3 -m py_compile farcaster_ark/*.py bin/backup_farcaster.py
sh -n scripts/monthly-backup.sh

Tests use mocked API and media responses and spend no Neynar credits. See CONTRIBUTING.md for contributor guidance.

License

MIT

About

Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - byte/farcaster-ark: Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver · GitHub
Skip to content

Repository files navigation

Farcaster Ark

Keep your casts. Keep the media.

Farcaster Ark is a local-first command-line tool that creates repeatable, verifiable snapshots of a Farcaster account. It preserves signed protocol records, useful Neynar views, and downloadable media without sending archive contents anywhere other than the APIs and media hosts needed to retrieve them.

Farcaster Ark is an independent open-source project. It is not affiliated with or endorsed by Farcaster or Neynar.

What it saves

  • Authored casts and replies as raw, signed protocol messages.
  • Likes, recasts, following, mentions, profile data, username proofs, verifications, storage limits, and on-chain account events.
  • The current follower list and Neynar-enriched cast views in a full backup.
  • Downloadable images, video, audio, and PDFs referenced by the profile or authored casts.
  • A manifest with record and request counts, a known-minimum Neynar credit estimate, completeness notes, and SHA-256 checksums.

Each run creates an immutable timestamped snapshot. Media is content-addressed and deduplicated across snapshots, so unchanged files are stored once.

Requirements

  • macOS or Linux.
  • Python 3.10 or newer.
  • A Neynar API key.
  • Enough local disk space for the account's media.
  • Optional: ffmpeg for HLS/DASH streaming video. Direct images, audio, video, and PDFs do not require it.

There are no required third-party Python packages.

Get a Neynar API key

Neynar requires an API key for its HTTP APIs. A free Neynar account is enough to get started, although a large account may require more credits than the free allowance provides.

  1. Open the Neynar Developer Portal and sign up or sign in.
  2. Create or select an app in the portal if prompted.
  3. Copy the app's API key. Neynar's API quickstart confirms that keys are obtained from the Developer Portal.
  4. Store only the key in a private file:
mkdir -p "$HOME/.config/farcaster-ark"
install -m 600 /dev/null "$HOME/.config/farcaster-ark/neynar-api-key"${EDITOR:-vi}"$HOME/.config/farcaster-ark/neynar-api-key"

Farcaster Ark refuses a key file that is readable by other users. It also accepts NEYNAR_API_KEY from the environment, but the private file is better for unattended monthly backups. Never commit the key.

No Farcaster signer, seed phrase, private key, wallet connection, or Neynar app wallet is required. Farcaster Ark only performs read operations.

Install from source

Clone or download this repository, then install it into an isolated virtual environment:

cd farcaster-ark
python3 -m venv .venv
. .venv/bin/activate
python -m pip install .
farcaster-ark --version

pipx install . is also supported if pipx is already installed. For a source checkout without installation, use python3 -m farcaster_ark anywhere this README uses farcaster-ark.

Create the first backup

Pass a Farcaster username with or without its leading @:

farcaster-ark backup alice

The default archive is ~/FarcasterArk. Choose another disk or directory with:

farcaster-ark backup alice --output /Volumes/Backup/FarcasterArk

The command resolves the username to its permanent FID and can optionally cross-check an expected FID:

farcaster-ark backup alice --fid 1234

Progress is printed without printing the API key. A failed run remains clearly marked as an in-progress snapshot; it is never published as complete.

Neynar credits

Farcaster Ark uses large raw-protocol pages and deduplicates media to reduce repeat work. The manifest records a known-minimum estimate, not a billing receipt: undocumented endpoints and failed/retried requests may add usage.

After one successful snapshot, estimate the next run without making API calls:

farcaster-ark estimate

For unattended runs, stop before API access if the previous snapshot projects more than a chosen budget:

farcaster-ark backup alice --credit-budget 5000

For a cheaper signed-protocol snapshot, omit the enriched cast views and the v2 follower list:

farcaster-ark backup alice --protocol-only
farcaster-ark estimate --protocol-only

The full mode is the default because it preserves the broadest account view.

Verify and recover

Verify the latest snapshot and every media blob it references:

farcaster-ark verify

Verify a named snapshot or a non-default archive:

farcaster-ark verify --snapshot 2026-07-14T033643Z \
--output /Volumes/Backup/FarcasterArk

If API collection completed but media downloading was interrupted, resume the newest complete staging snapshot without spending additional Neynar credits:

farcaster-ark resume

Use --skip-media when only protocol/API data is wanted. Use --refresh-media to try every URL again even when its earlier download is still present.

Monthly backups

Running the same full command monthly creates a new snapshot and reuses media already stored in the archive.

macOS launchd

Generate and install a job for 03:00 local time on the first day of each month:

farcaster-ark launchd alice --install

The command writes a per-account plist under ~/Library/LaunchAgents and prints the launchctl bootstrap command needed to load it. Use --day, --hour, --output, --api-key-file, --credit-budget, or --protocol-only to change its settings. Run without --install to inspect the plist on standard output first.

Linux cron

Find the absolute executable path with command -v farcaster-ark, then add a monthly entry with crontab -e, for example:

031**/absolute/path/to/farcaster-ark backup alice >> "$HOME/farcaster-ark.log" 2>&1

Scheduled jobs must be able to access the archive disk and API key file.

Archive layout

~/FarcasterArk/
├── LATEST
├── media/
│ ├── index.json
│ └── blobs/<sha-prefix>/<sha256>.<extension>
└── snapshots/<UTC timestamp>/
├── manifest.json
├── SHA256SUMS
├── media-manifest.jsonl
├── account/
├── protocol/
└── neynar/

Copy the entire archive directory when moving it. Snapshots refer to the shared media/blobs directory.

Completeness boundaries

This is a point-in-time account-state backup, not a private client-data export.

  • Normal protocol *ByFid queries return current valid state. Content removed before the first backup generally cannot be reconstructed. Monthly snapshots preserve changes observed after the first run.
  • DMs, drafts, bookmarks, mutes, blocks, and other client-private state are not Farcaster protocol account messages and are not included.
  • Replies authored by the account are included. Incoming mentions and current followers are included in a full run, but every reply or reaction made by other people on every cast is not expanded with costly per-cast crawling.
  • Farcaster media lives at external URLs. Hosts may delete files, block automated access, expire signed links, or disappear. Every attempted URL and failure status is retained in media-manifest.jsonl.
  • The archive contains public keys, wallet identifiers, and signed public messages, but never Farcaster private keys or wallet secrets.

Security

The Neynar key is sent only in requests to Neynar API hosts; media hosts never receive it. Media URLs and redirects resolving to localhost or private network addresses are blocked by default. --allow-private-media-hosts disables that protection and should be used only with trusted account data.

See SECURITY.md for reporting and storage guidance.

Development

Run the local verification suite:

python3 -m unittest discover -s tests -v
python3 -m py_compile farcaster_ark/*.py bin/backup_farcaster.py
sh -n scripts/monthly-backup.sh

Tests use mocked API and media responses and spend no Neynar credits. See CONTRIBUTING.md for contributor guidance.

License

MIT

About

Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - byte/farcaster-ark: Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver · GitHub
Skip to content

Repository files navigation

Farcaster Ark

Keep your casts. Keep the media.

Farcaster Ark is a local-first command-line tool that creates repeatable, verifiable snapshots of a Farcaster account. It preserves signed protocol records, useful Neynar views, and downloadable media without sending archive contents anywhere other than the APIs and media hosts needed to retrieve them.

Farcaster Ark is an independent open-source project. It is not affiliated with or endorsed by Farcaster or Neynar.

What it saves

  • Authored casts and replies as raw, signed protocol messages.
  • Likes, recasts, following, mentions, profile data, username proofs, verifications, storage limits, and on-chain account events.
  • The current follower list and Neynar-enriched cast views in a full backup.
  • Downloadable images, video, audio, and PDFs referenced by the profile or authored casts.
  • A manifest with record and request counts, a known-minimum Neynar credit estimate, completeness notes, and SHA-256 checksums.

Each run creates an immutable timestamped snapshot. Media is content-addressed and deduplicated across snapshots, so unchanged files are stored once.

Requirements

  • macOS or Linux.
  • Python 3.10 or newer.
  • A Neynar API key.
  • Enough local disk space for the account's media.
  • Optional: ffmpeg for HLS/DASH streaming video. Direct images, audio, video, and PDFs do not require it.

There are no required third-party Python packages.

Get a Neynar API key

Neynar requires an API key for its HTTP APIs. A free Neynar account is enough to get started, although a large account may require more credits than the free allowance provides.

  1. Open the Neynar Developer Portal and sign up or sign in.
  2. Create or select an app in the portal if prompted.
  3. Copy the app's API key. Neynar's API quickstart confirms that keys are obtained from the Developer Portal.
  4. Store only the key in a private file:
mkdir -p "$HOME/.config/farcaster-ark"
install -m 600 /dev/null "$HOME/.config/farcaster-ark/neynar-api-key"${EDITOR:-vi}"$HOME/.config/farcaster-ark/neynar-api-key"

Farcaster Ark refuses a key file that is readable by other users. It also accepts NEYNAR_API_KEY from the environment, but the private file is better for unattended monthly backups. Never commit the key.

No Farcaster signer, seed phrase, private key, wallet connection, or Neynar app wallet is required. Farcaster Ark only performs read operations.

Install from source

Clone or download this repository, then install it into an isolated virtual environment:

cd farcaster-ark
python3 -m venv .venv
. .venv/bin/activate
python -m pip install .
farcaster-ark --version

pipx install . is also supported if pipx is already installed. For a source checkout without installation, use python3 -m farcaster_ark anywhere this README uses farcaster-ark.

Create the first backup

Pass a Farcaster username with or without its leading @:

farcaster-ark backup alice

The default archive is ~/FarcasterArk. Choose another disk or directory with:

farcaster-ark backup alice --output /Volumes/Backup/FarcasterArk

The command resolves the username to its permanent FID and can optionally cross-check an expected FID:

farcaster-ark backup alice --fid 1234

Progress is printed without printing the API key. A failed run remains clearly marked as an in-progress snapshot; it is never published as complete.

Neynar credits

Farcaster Ark uses large raw-protocol pages and deduplicates media to reduce repeat work. The manifest records a known-minimum estimate, not a billing receipt: undocumented endpoints and failed/retried requests may add usage.

After one successful snapshot, estimate the next run without making API calls:

farcaster-ark estimate

For unattended runs, stop before API access if the previous snapshot projects more than a chosen budget:

farcaster-ark backup alice --credit-budget 5000

For a cheaper signed-protocol snapshot, omit the enriched cast views and the v2 follower list:

farcaster-ark backup alice --protocol-only
farcaster-ark estimate --protocol-only

The full mode is the default because it preserves the broadest account view.

Verify and recover

Verify the latest snapshot and every media blob it references:

farcaster-ark verify

Verify a named snapshot or a non-default archive:

farcaster-ark verify --snapshot 2026-07-14T033643Z \
--output /Volumes/Backup/FarcasterArk

If API collection completed but media downloading was interrupted, resume the newest complete staging snapshot without spending additional Neynar credits:

farcaster-ark resume

Use --skip-media when only protocol/API data is wanted. Use --refresh-media to try every URL again even when its earlier download is still present.

Monthly backups

Running the same full command monthly creates a new snapshot and reuses media already stored in the archive.

macOS launchd

Generate and install a job for 03:00 local time on the first day of each month:

farcaster-ark launchd alice --install

The command writes a per-account plist under ~/Library/LaunchAgents and prints the launchctl bootstrap command needed to load it. Use --day, --hour, --output, --api-key-file, --credit-budget, or --protocol-only to change its settings. Run without --install to inspect the plist on standard output first.

Linux cron

Find the absolute executable path with command -v farcaster-ark, then add a monthly entry with crontab -e, for example:

031**/absolute/path/to/farcaster-ark backup alice >> "$HOME/farcaster-ark.log" 2>&1

Scheduled jobs must be able to access the archive disk and API key file.

Archive layout

~/FarcasterArk/
├── LATEST
├── media/
│ ├── index.json
│ └── blobs/<sha-prefix>/<sha256>.<extension>
└── snapshots/<UTC timestamp>/
├── manifest.json
├── SHA256SUMS
├── media-manifest.jsonl
├── account/
├── protocol/
└── neynar/

Copy the entire archive directory when moving it. Snapshots refer to the shared media/blobs directory.

Completeness boundaries

This is a point-in-time account-state backup, not a private client-data export.

  • Normal protocol *ByFid queries return current valid state. Content removed before the first backup generally cannot be reconstructed. Monthly snapshots preserve changes observed after the first run.
  • DMs, drafts, bookmarks, mutes, blocks, and other client-private state are not Farcaster protocol account messages and are not included.
  • Replies authored by the account are included. Incoming mentions and current followers are included in a full run, but every reply or reaction made by other people on every cast is not expanded with costly per-cast crawling.
  • Farcaster media lives at external URLs. Hosts may delete files, block automated access, expire signed links, or disappear. Every attempted URL and failure status is retained in media-manifest.jsonl.
  • The archive contains public keys, wallet identifiers, and signed public messages, but never Farcaster private keys or wallet secrets.

Security

The Neynar key is sent only in requests to Neynar API hosts; media hosts never receive it. Media URLs and redirects resolving to localhost or private network addresses are blocked by default. --allow-private-media-hosts disables that protection and should be used only with trusted account data.

See SECURITY.md for reporting and storage guidance.

Development

Run the local verification suite:

python3 -m unittest discover -s tests -v
python3 -m py_compile farcaster_ark/*.py bin/backup_farcaster.py
sh -n scripts/monthly-backup.sh

Tests use mocked API and media responses and spend no Neynar credits. See CONTRIBUTING.md for contributor guidance.

License

MIT

About

Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - byte/farcaster-ark: Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver · GitHub
Skip to content

Repository files navigation

Farcaster Ark

Keep your casts. Keep the media.

Farcaster Ark is a local-first command-line tool that creates repeatable, verifiable snapshots of a Farcaster account. It preserves signed protocol records, useful Neynar views, and downloadable media without sending archive contents anywhere other than the APIs and media hosts needed to retrieve them.

Farcaster Ark is an independent open-source project. It is not affiliated with or endorsed by Farcaster or Neynar.

What it saves

  • Authored casts and replies as raw, signed protocol messages.
  • Likes, recasts, following, mentions, profile data, username proofs, verifications, storage limits, and on-chain account events.
  • The current follower list and Neynar-enriched cast views in a full backup.
  • Downloadable images, video, audio, and PDFs referenced by the profile or authored casts.
  • A manifest with record and request counts, a known-minimum Neynar credit estimate, completeness notes, and SHA-256 checksums.

Each run creates an immutable timestamped snapshot. Media is content-addressed and deduplicated across snapshots, so unchanged files are stored once.

Requirements

  • macOS or Linux.
  • Python 3.10 or newer.
  • A Neynar API key.
  • Enough local disk space for the account's media.
  • Optional: ffmpeg for HLS/DASH streaming video. Direct images, audio, video, and PDFs do not require it.

There are no required third-party Python packages.

Get a Neynar API key

Neynar requires an API key for its HTTP APIs. A free Neynar account is enough to get started, although a large account may require more credits than the free allowance provides.

  1. Open the Neynar Developer Portal and sign up or sign in.
  2. Create or select an app in the portal if prompted.
  3. Copy the app's API key. Neynar's API quickstart confirms that keys are obtained from the Developer Portal.
  4. Store only the key in a private file:
mkdir -p "$HOME/.config/farcaster-ark"
install -m 600 /dev/null "$HOME/.config/farcaster-ark/neynar-api-key"${EDITOR:-vi}"$HOME/.config/farcaster-ark/neynar-api-key"

Farcaster Ark refuses a key file that is readable by other users. It also accepts NEYNAR_API_KEY from the environment, but the private file is better for unattended monthly backups. Never commit the key.

No Farcaster signer, seed phrase, private key, wallet connection, or Neynar app wallet is required. Farcaster Ark only performs read operations.

Install from source

Clone or download this repository, then install it into an isolated virtual environment:

cd farcaster-ark
python3 -m venv .venv
. .venv/bin/activate
python -m pip install .
farcaster-ark --version

pipx install . is also supported if pipx is already installed. For a source checkout without installation, use python3 -m farcaster_ark anywhere this README uses farcaster-ark.

Create the first backup

Pass a Farcaster username with or without its leading @:

farcaster-ark backup alice

The default archive is ~/FarcasterArk. Choose another disk or directory with:

farcaster-ark backup alice --output /Volumes/Backup/FarcasterArk

The command resolves the username to its permanent FID and can optionally cross-check an expected FID:

farcaster-ark backup alice --fid 1234

Progress is printed without printing the API key. A failed run remains clearly marked as an in-progress snapshot; it is never published as complete.

Neynar credits

Farcaster Ark uses large raw-protocol pages and deduplicates media to reduce repeat work. The manifest records a known-minimum estimate, not a billing receipt: undocumented endpoints and failed/retried requests may add usage.

After one successful snapshot, estimate the next run without making API calls:

farcaster-ark estimate

For unattended runs, stop before API access if the previous snapshot projects more than a chosen budget:

farcaster-ark backup alice --credit-budget 5000

For a cheaper signed-protocol snapshot, omit the enriched cast views and the v2 follower list:

farcaster-ark backup alice --protocol-only
farcaster-ark estimate --protocol-only

The full mode is the default because it preserves the broadest account view.

Verify and recover

Verify the latest snapshot and every media blob it references:

farcaster-ark verify

Verify a named snapshot or a non-default archive:

farcaster-ark verify --snapshot 2026-07-14T033643Z \
--output /Volumes/Backup/FarcasterArk

If API collection completed but media downloading was interrupted, resume the newest complete staging snapshot without spending additional Neynar credits:

farcaster-ark resume

Use --skip-media when only protocol/API data is wanted. Use --refresh-media to try every URL again even when its earlier download is still present.

Monthly backups

Running the same full command monthly creates a new snapshot and reuses media already stored in the archive.

macOS launchd

Generate and install a job for 03:00 local time on the first day of each month:

farcaster-ark launchd alice --install

The command writes a per-account plist under ~/Library/LaunchAgents and prints the launchctl bootstrap command needed to load it. Use --day, --hour, --output, --api-key-file, --credit-budget, or --protocol-only to change its settings. Run without --install to inspect the plist on standard output first.

Linux cron

Find the absolute executable path with command -v farcaster-ark, then add a monthly entry with crontab -e, for example:

031**/absolute/path/to/farcaster-ark backup alice >> "$HOME/farcaster-ark.log" 2>&1

Scheduled jobs must be able to access the archive disk and API key file.

Archive layout

~/FarcasterArk/
├── LATEST
├── media/
│ ├── index.json
│ └── blobs/<sha-prefix>/<sha256>.<extension>
└── snapshots/<UTC timestamp>/
├── manifest.json
├── SHA256SUMS
├── media-manifest.jsonl
├── account/
├── protocol/
└── neynar/

Copy the entire archive directory when moving it. Snapshots refer to the shared media/blobs directory.

Completeness boundaries

This is a point-in-time account-state backup, not a private client-data export.

  • Normal protocol *ByFid queries return current valid state. Content removed before the first backup generally cannot be reconstructed. Monthly snapshots preserve changes observed after the first run.
  • DMs, drafts, bookmarks, mutes, blocks, and other client-private state are not Farcaster protocol account messages and are not included.
  • Replies authored by the account are included. Incoming mentions and current followers are included in a full run, but every reply or reaction made by other people on every cast is not expanded with costly per-cast crawling.
  • Farcaster media lives at external URLs. Hosts may delete files, block automated access, expire signed links, or disappear. Every attempted URL and failure status is retained in media-manifest.jsonl.
  • The archive contains public keys, wallet identifiers, and signed public messages, but never Farcaster private keys or wallet secrets.

Security

The Neynar key is sent only in requests to Neynar API hosts; media hosts never receive it. Media URLs and redirects resolving to localhost or private network addresses are blocked by default. --allow-private-media-hosts disables that protection and should be used only with trusted account data.

See SECURITY.md for reporting and storage guidance.

Development

Run the local verification suite:

python3 -m unittest discover -s tests -v
python3 -m py_compile farcaster_ark/*.py bin/backup_farcaster.py
sh -n scripts/monthly-backup.sh

Tests use mocked API and media responses and spend no Neynar credits. See CONTRIBUTING.md for contributor guidance.

License

MIT

About

Create complete, repeatable snapshots of your Farcaster account - it is a Farcaster archiver

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages