{"slug": "afterfeed-a-tool-to-view-all-your-social-media-backups", "title": "Afterfeed: A tool to view all your social media backups", "summary": "Developer Rebecca released Afterfeed, a self-hosted, local-first tool that imports social media export files from nine services—Twitter/X, Mastodon, Facebook, Reddit, Instagram, Google+, Nextdoor, LiveJournal, and Jekyll—into a single searchable timeline. Afterfeed runs on PHP 8.4.1 or later with SQLite, MySQL/MariaDB, or PostgreSQL, retains original metadata, keeps annotations separate from source records, and exposes a user-scoped read-only JSON API plus a bundled Model Context Protocol server for querying archives. The project intentionally excludes sensitive account data such as IP history, device tokens, phone numbers, cryptographic keys, payment records, birth dates, and advertising preferences.", "body_md": "A private, local-first home for browsing, searching, and rediscovering\n\nyour personal social media archives—without depending on the platforms that created them.\n\n[Features](#what-you-can-do) · [Platforms](#supported-archives) · [Quick start](#quick-start) · [Import guide](https://github.com/rebeccathedev/afterfeed/blob/main/docs/importing.md) · [Product tour](https://github.com/rebeccathedev/afterfeed/blob/main/docs/product-tour.md) · [API & MCP](#api--mcp)\n\nAfterfeed turns disconnected export files into one calm, searchable timeline. Your archive and media stay in the installation you control, original metadata is retained, and private annotations never modify the source records. Authentication and per-user ownership keep libraries isolated when an installation has more than one user.\n\n<sub>Documentation screenshots use fictional accounts and synthetic archive data.</sub>\n\n- **🗂️ Browse everything together** — normalize posts, replies, messages, and media from multiple services into a single timeline.\n- **🔎 Find old moments** — use full-text search, reconstructed threads, yearly heatmaps, statistics, maps, and a cross-service*On This Day* view.\n- **🏷️ Curate privately** — favorite, tag, annotate, collect, or hide posts without changing the imported archive.\n- **🧭 Understand your history** — explore activity patterns and a local relationship index built from conversations, follows, friends, mentions, and reactions.\n- **🎁 Share selectively** — turn one memory into a social-ready image, or export a collection as HTML, PDF, JSON, or a media bundle with granular privacy controls and metadata stripping.\n- **🔌 Connect your tools** — query your own archive through a user-scoped, read-only JSON API or the bundled Model Context Protocol server.\n\n| Service | Preserved content | \n|---|---|\n| **Twitter / X** | Posts and deleted posts, media, likes, profiles and profile history, follows, lists, saved searches, timezone, and verification status | \n| **Mastodon** | Posts, replies, boosts, content warnings, visibility, engagement, favorites, bookmarks, profile fields, aliases, and media | \n| **Facebook** | Posts, check-ins, photos, videos, comments, reactions, friends, saved items, profile history, and media | \n| **Reddit** | Submissions, comments and reply relationships, votes, saved and hidden items, communities, moderation, multireddits, and messages | \n| **Instagram** | Posts, videos, comments, media, profile details, likes, saved posts, follows, and direct messages | \n| **Google+** | Posts, reshares, authored and embedded comments, +1s, external link previews, visibility, check-in locations, profile identity, and post media from Google Takeout | \n| **Nextdoor** | Posts, comments, reactions, private messages, For Sale & Free listings, seasonal activity, and privacy-filtered profile details | \n| **LiveJournal** | Journal subjects, HTML and readable text, tags, userpics, item IDs, dates, and original entry links | \n| **Jekyll** | Published Markdown posts, YAML front matter, tags, categories, original permalinks, author identity, profile image, and referenced local media | \n\nSensitive security and account data—such as IP history, device tokens, phone numbers, cryptographic keys, payment records, birth dates, and advertising preferences—is intentionally excluded where present.\n\n- PHP 8.4.1 or later\n- Composer\n- Node.js and npm\n- SQLite (default), MySQL/MariaDB, or PostgreSQL\n\n```\ngit clone https://github.com/rebeccathedev/afterfeed.git\ncd afterfeed\ncomposer run setup\ncomposer run dev\n```\n\nThen open the local URL shown in your terminal and create the first account. SQLite works out of the box; see [database backend setup](https://github.com/rebeccathedev/afterfeed/blob/main/docs/database-backends.md) to use MySQL/MariaDB or PostgreSQL with native full-text search. The first account adopts data from an older single-user database during an upgrade.\n\nRequirements: Docker Engine with the Compose plugin and access to the repository's GitHub Container Registry package. The application image contains PHP-FPM only; the included production Compose file adds Nginx and persistent volumes for SQLite, archived media, and compiled public assets.\n\n```\ngit clone https://github.com/rebeccathedev/afterfeed.git\ncd afterfeed\n\nexport AFTERFEED_IMAGE=ghcr.io/rebeccathedev/afterfeed:latest\ndocker pull \"$AFTERFEED_IMAGE\"\ndocker run --rm --entrypoint php \"$AFTERFEED_IMAGE\" artisan key:generate --show\n```\n\nCopy the generated key into a new `.env.container` file. Replace the image and URL values for your deployment:\n\n```\nAFTERFEED_IMAGE=ghcr.io/rebeccathedev/afterfeed:latest\nAPP_KEY=base64:paste-the-generated-key-here\nAPP_URL=http://localhost:8080\nAFTERFEED_PORT=8080\nAFTERFEED_MCP_ALLOWED_ORIGINS=http://localhost:8080\n```\n\nStart Afterfeed:\n\n```\ndocker compose --env-file .env.container -f compose.production.yml up -d\ndocker compose --env-file .env.container -f compose.production.yml ps\n```\n\nOpen `http://localhost:8080` and create the first account. Keep `.env.container` private and backed up: changing `APP_KEY` invalidates sessions and encrypted application data. The entrypoint creates SQLite, applies migrations, refreshes public assets, and warms Laravel caches before FPM starts.\n\nTo update later:\n\n```\ndocker compose --env-file .env.container -f compose.production.yml pull\ndocker compose --env-file .env.container -f compose.production.yml up -d\n```\n\nFor HTTPS, external databases, backups, a custom FastCGI proxy, and troubleshooting, see [container deployment](https://github.com/rebeccathedev/afterfeed/blob/main/docs/container.md).\n\nAfterfeed automatically recognizes supported Twitter/X, Mastodon, Facebook, Reddit, Instagram, Google+, Nextdoor, LiveJournal, and Jekyll archive formats. Browser uploads are attached to the signed-in user. For a command-line import:\n\n```\nphp artisan archive:import /path/to/twitter-export.zip me@rebeccapeck.org\n```\n\nImports are safe to repeat. A content fingerprint prevents accidental duplicate imports, while re-importing an existing archive refreshes its normalized records through the latest importer so newly supported metadata can be backfilled.\n\nThe [import guide](https://github.com/rebeccathedev/afterfeed/blob/main/docs/importing.md) documents format recognition, ownership, privacy, and the Google+ Takeout layout and coverage in detail.\n\nThe timeline is only the beginning:\n\n- **Search** uses SQLite FTS5 or the selected database's native full-text engine.\n- **Maps** combine geotagged posts and privately annotated coordinates using locally bundled Leaflet; OpenStreetMap tiles load only when the map is opened.\n- **Statistics** summarize activity by year, hour, weekday, service, and photo volume, plus common words, hashtags, Reddit communities, and frequently mentioned people.\n- **People** creates a relationship directory from mentions, replies, direct messages, friends, follows, and attributable reactions.\n\nArchive imports refresh the People index automatically. To rebuild it manually:\n\n```\nphp artisan archive:people me@rebeccapeck.org\n```\n\nCollections can become a self-contained HTML album, a PDF memory book, a JSON subset, or a ZIP containing HTML, JSON, and selected media. Choose whether to include text, media, identities, dates, private annotations, original links, and precise locations.\n\nPrivacy-friendly defaults remove image EXIF, remux video losslessly with FFmpeg to strip metadata, and omit raw platform metadata. Self-contained HTML and PDF media is capped at 60 MB, and PDF books at 250 posts; use ZIP for larger collections.\n\nIndividual posts can also become square, portrait, or landscape PNG cards. Identity, platform, date, footer, and archived photo controls make it easy to share an old memory without exposing or linking to Afterfeed.\n\nAfterfeed includes a read-only JSON API under `/api/v1`:\n\n```\nGET /api/v1/status\nGET /api/v1/accounts\nGET /api/v1/posts?q=&account_id=&platform=&year=&month=&has_media=&page=&per_page=\nGET /api/v1/posts/{id}\nGET /api/v1/statistics\n```\n\nResults use bounded pagination of at most 100 records per page and omit hidden posts. Every request requires a per-user bearer token created in **Settings → API & MCP access**, and the API exposes only that user's archive.\n\nTo connect a local MCP client such as Claude Desktop or Codex, configure it to launch:\n\n```\nphp /absolute/path/to/afterfeed/artisan afterfeed:mcp me@rebeccapeck.org\n```\n\nThe stdio server provides `search_posts`, `get_post`, `list_accounts`, and `archive_statistics`. Remote clients can use the authenticated Streamable HTTP endpoint at `/api/mcp`; see [remote MCP setup and security](https://github.com/rebeccathedev/afterfeed/blob/main/docs/remote-mcp.md). Each token is revocable and can access only its owner's archive.\n\nEvery platform importer translates its export into four shared records:\n\n```\nSocialAccount  ──<  Archive  ──<  Post  ──<  Attachment\n   identity         import        item         local media\n```\n\n- **SocialAccount** represents one identity on a platform.\n- **Archive** represents one export and its source account.\n- **Post** represents a normalized post, reply, message, or timeline item.\n- **Attachment** represents local media associated with a post.\n\nOriginal export metadata remains in JSON columns, keeping normalization lossless. Large Facebook exports use chunked database upserts and streamed ZIP media reads, avoiding full extraction and unbounded memory use.\n\n```\n# Start the application, queue worker, logs, and Vite\ncomposer run dev\n\n# Run the test suite\ncomposer test\n\n# Build production assets\nnpm run build\n```\n\n🌱 Built for the version of your internet history that belongs to you.", "url": "https://wpnews.pro/news/afterfeed-a-tool-to-view-all-your-social-media-backups", "canonical_source": "https://github.com/rebeccathedev/afterfeed/", "published_at": "2026-10-24 01:43:16+00:00", "updated_at": "2026-10-24 02:12:10.100648+00:00", "lang": "en", "topics": ["ai-agents", "developer-tools", "ai-tools"], "entities": ["Afterfeed", "Rebecca", "Twitter/X", "Mastodon", "Facebook", "Reddit", "Instagram", "Model Context Protocol"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/afterfeed-a-tool-to-view-all-your-social-media-backups", "markdown": "https://wpnews.pro/news/afterfeed-a-tool-to-view-all-your-social-media-backups.md", "text": "https://wpnews.pro/news/afterfeed-a-tool-to-view-all-your-social-media-backups.txt", "jsonld": "https://wpnews.pro/news/afterfeed-a-tool-to-view-all-your-social-media-backups.jsonld"}}