{
  "version": "2",
  "generatedAt": "2026-11-06T20:51:57.517Z",
  "listing": {
    "slug": "wallabag--wallabag",
    "name": "wallabag",
    "tagline": "Self-hosted read-it-later app that saves and cleans web articles, with an OAuth2 REST API.",
    "shortTagline": "Self-hosted read-it-later",
    "description": "wallabag saves web pages for later reading and extracts the article text without clutter. Articles can be tagged, annotated, archived and exported, and apps exist for Android, iOS and the browser. The Builder documents an OAuth2 REST API that covers entries, tags and annotations.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "notes-knowledge",
    "alternativeTo": [
      "Pocket",
      "Instapaper",
      "Pinboard"
    ],
    "shape": "product",
    "formFactor": "web-app",
    "executionModel": "deterministic",
    "provenance": "unknown",
    "codeStack": {
      "languages": [
        "PHP",
        "JavaScript"
      ],
      "frameworks": [
        "Symfony"
      ],
      "packageManager": "composer, yarn",
      "database": [
        "SQLite",
        "MySQL",
        "MariaDB",
        "PostgreSQL"
      ],
      "hostingTarget": [
        "php",
        "docker"
      ]
    },
    "modelStack": null,
    "repos": [
      {
        "url": "https://github.com/wallabag/wallabag",
        "owner": "wallabag",
        "name": "wallabag",
        "license": "MIT",
        "stars": 13053,
        "lastCommit": "2026-11-06"
      }
    ],
    "interface": {
      "kind": "api",
      "url": "https://doc.wallabag.org/developer/api/oauth/",
      "official": true,
      "hosted": "both"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Save a web page by URL",
        "reachable": true,
        "evidence": "REST POST /api/entries"
      },
      {
        "job": "List, search and read saved articles",
        "reachable": true,
        "evidence": "REST GET /api/entries, GET /api/entries/{entry}, GET /api/search"
      },
      {
        "job": "Archive, star and edit an article",
        "reachable": true,
        "evidence": "REST PATCH /api/entries/{entry}"
      },
      {
        "job": "Refetch an article's content",
        "reachable": true,
        "evidence": "REST PATCH /api/entries/{entry}/reload"
      },
      {
        "job": "Delete articles",
        "reachable": true,
        "evidence": "REST DELETE /api/entries/{entry}"
      },
      {
        "job": "Tag articles and manage tags",
        "reachable": true,
        "evidence": "REST POST /api/entries/{entry}/tags, GET /api/tags, DELETE /api/tags/{tag}"
      },
      {
        "job": "Highlight and annotate articles",
        "reachable": true,
        "evidence": "REST /api/annotations/{entry} (GET, POST), /api/annotations/{annotation} (PUT, DELETE)"
      },
      {
        "job": "Export an article",
        "reachable": true,
        "evidence": "REST GET /api/entries/{entry}/export"
      },
      {
        "job": "Manage tagging rules, site credentials and ignore-origin rules",
        "reachable": false,
        "evidence": "Only GET /api/taggingrule/export exists in the API controllers on 2.6.15 and master; site credentials and ignore-origin rules are web controllers."
      },
      {
        "job": "Import from other services",
        "reachable": false,
        "evidence": "No import route in the API controllers on 2.6.15 or master. Import is a web form or the bin/console wallabag:import command on a self-hosted server."
      }
    ],
    "editions": [
      {
        "name": "Self-hosted",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/wallabag/wallabag",
            "command": "git clone https://github.com/wallabag/wallabag.git && cd wallabag && make install"
          },
          {
            "kind": "container",
            "url": "https://hub.docker.com/r/wallabag/wallabag",
            "command": "docker run -v wallabag-data:/var/www/wallabag/data -v wallabag-images:/var/www/wallabag/web/assets/images -p 8080:80 -e \"SYMFONY__ENV__DOMAIN_NAME=http://localhost:8080\" wallabag/wallabag"
          }
        ]
      },
      {
        "name": "wallabag.it",
        "price": {
          "amount": 11,
          "currency": "EUR",
          "period": "year"
        },
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://wallabag.it"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md found at the repo root."
    },
    "customization": {
      "summary": "On the 2.6.15 release, app/config/parameters.yml (or SYMFONY__ENV__ variables in the Docker image) sets the domain, language, instance name and whether people can register. app/config/wallabag.yml sets defaults such as items per page and reading speed. A web/custom.css file restyles every page of the instance. Tagging rules, site credentials and reading settings are per-user settings in the web UI.",
      "envVars": [
        "SYMFONY__ENV__DOMAIN_NAME",
        "SYMFONY__ENV__SERVER_NAME",
        "SYMFONY__ENV__LOCALE",
        "SYMFONY__ENV__FOSUSER_REGISTRATION",
        "SYMFONY__ENV__DATABASE_DRIVER",
        "SYMFONY__ENV__MAILER_DSN"
      ],
      "configFiles": [
        "app/config/parameters.yml",
        "app/config/wallabag.yml",
        "web/custom.css"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 9
    },
    "useWhen": [
      "you want your agent to save links you send it and tag them for later reading",
      "you want a private reading list your own scripts can read, annotate and export"
    ],
    "accounts": [],
    "active": true,
    "lastActivity": "2026-11-06",
    "gotchas": [
      "An API client id and secret are created once in the web UI on 2.6.15; tokens are then issued with username and password through the OAuth endpoint. The wallabag:api-client:create command exists only on master so far",
      "make install checks out the latest tag and needs PHP, Composer and a virtual host; the Docker image is the single-container route",
      "master is moving to WALLABAG_* environment variables in place of parameters.yml; the 2.6.15 release and its Docker image do not read them",
      "wallabag.it has a 14-day free trial; 11 EUR a year is the one-year plan, and a 3-month plan is 4 EUR"
    ],
    "fit": {
      "adaptable": 2,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README: web application installed with make install, or the wallabag/wallabag image",
      "executionModel": "no model in the stack",
      "operability": "API controllers read on tag 2.6.15 and on master; doc.wallabag.org/developer/api/oauth/ describes client creation and password-grant tokens. Same project publishes API and docs.",
      "effort": "doc.wallabag.org/admin/custom_css/ documents web/custom.css for instance-wide styling (base.html.twig loads it on 2.6.15); doc.wallabag.org/admin/parameters/ documents parameters.yml; app/config/wallabag.yml read on 2.6.15. scripts/install.sh checks out the latest tag, so the WALLABAG_* names in master's .env do not apply to an install.",
      "editions": "wallabag.it/en/pricing/ shows 4 EUR for 3 months, 11 EUR for 1 year, 30 EUR support plan; footer names Nicolas Lœuillet, the project's maintainer. Docker command from doc.wallabag.org/admin/installation/installation/.",
      "active": "commits on 2026-11-06 by the maintainers; release 2.6.15 on 2026-10-28",
      "alternativeTo": "wallabag.it page title: alternative to Pocket, Instapaper and Pinboard"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.95,
      "operability": 0.9,
      "effort": 0.8,
      "reach": 0.9,
      "editions": 0.9
    },
    "openQuestions": [],
    "sources": [
      {
        "url": "https://wallabag.org",
        "foundBy": "sourcing:notes-knowledge:curated"
      },
      {
        "url": "https://doc.wallabag.org/developer/api/oauth/",
        "foundBy": "analysis"
      },
      {
        "url": "https://wallabag.it/en/pricing/",
        "foundBy": "verification"
      }
    ],
    "published": true,
    "lastCheckedAt": "2026-11-06",
    "research": {
      "stage": "verified",
      "verdict": "approve",
      "reason": "Gates pass: MIT, 13,053 stars, maintainer commits on 2026-11-06, release 2.6.15 on 2026-10-28. OAuth2 REST API is Builder-documented and routes match on 2.6.15. The analyst's dispute is settled: web/custom.css and parameters.yml change branding, language and sign-up, so config-only holds. The record had read master's WALLABAG_* variables, which a released install does not use.",
      "disputed": []
    },
    "url": "apps/wallabag--wallabag.html",
    "coverage": "partial",
    "paid": true,
    "source": "research/verified/wallabag--wallabag.json"
  }
}
