JSON Feed Validator

Check whether your feed is valid. For more information about JSON Feed, see the specification. Find the validator source code on GitHub.

GET validation response in JSON format.

Feed source

{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Yann M. Vidamment",
  "description": "Personal site of Yann M. Vidamment, Cloud and Cybersecurity engineer based in Paris.",
  "home_page_url": "https://blog.libresoftware.cloud/",
  "feed_url": "https://blog.libresoftware.cloud/feed.json",
  "language": "en",
  "icon": "https://blog.libresoftware.cloud/images/avatar.png",
  "favicon": "https://blog.libresoftware.cloud/favicon.svg",
  "authors": [
    {
      "name": "Yann M. Vidamment",
      "email": "yann.vidamment@libresoftware.cloud"
    }
  ],
  "items": [
    {
      "id": "https://blog.libresoftware.cloud/blog/the-way/git-local-model/",
      "url": "https://blog.libresoftware.cloud/blog/the-way/git-local-model/",
      "title": "Git: commits, branches, and .gitignore",
      "summary": "Why git add . is a trap, what a commit stores, and why a deleted secret is still in your history. The local half of Git, before any remote.",
      "date_published": "2026-06-14T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    },
    {
      "id": "https://blog.libresoftware.cloud/blog/the-way/processes-and-pid-1/",
      "url": "https://blog.libresoftware.cloud/blog/the-way/processes-and-pid-1/",
      "title": "Processes, signals, and PID 1",
      "summary": "Why a long job ignores your Ctrl-C, and the handler that fixes it. Signals, the child processes a script leaves running, and the init that inherits them.",
      "date_published": "2026-06-14T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    },
    {
      "id": "https://blog.libresoftware.cloud/blog/the-way/shell-and-bash/",
      "url": "https://blog.libresoftware.cloud/blog/the-way/shell-and-bash/",
      "title": "The shell & Bash",
      "summary": "The same backup script, grown from four lines that look fine to one you can trust to fail without eating your last good backup. Quoting, exit codes, set -euo pipefail and traps, with the reason behind each line.",
      "date_published": "2026-06-14T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    },
    {
      "id": "https://blog.libresoftware.cloud/blog/the-way/users-and-permissions/",
      "url": "https://blog.libresoftware.cloud/blog/the-way/users-and-permissions/",
      "title": "Users, groups, and permissions",
      "summary": "From the universal chmod -R 777 to a directory only the service can touch. Ownership as a number, the rwx bits, and the setgid, sticky and setuid bits the hardened container leans on.",
      "date_published": "2026-06-14T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    },
    {
      "id": "https://blog.libresoftware.cloud/blog/the-way/webhook-deploy/",
      "url": "https://blog.libresoftware.cloud/blog/the-way/webhook-deploy/",
      "title": "Deploying without an SSH key in CI",
      "summary": "A pull-based deploy: CI signs a webhook, an agent on the server pulls the new image and redeploys. Plus the 401 that was never about the signature.",
      "date_published": "2026-06-12T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    },
    {
      "id": "https://blog.libresoftware.cloud/blog/ditch-x/erugo/",
      "url": "https://blog.libresoftware.cloud/blog/ditch-x/erugo/",
      "title": "Drop WeTransfer for Erugo",
      "summary": "A self-hosted file drop with OIDC, invitations and reverse shares. Sits behind my reverse proxy without leaking metadata.",
      "date_published": "2026-06-11T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    },
    {
      "id": "https://blog.libresoftware.cloud/blog/postmortem/smoke-test-wrong-container/",
      "url": "https://blog.libresoftware.cloud/blog/postmortem/smoke-test-wrong-container/",
      "title": "The smoke test that tested the wrong container",
      "summary": "Green on my machine, red in CI, same image. The bug was a single permission bit on /tmp, and the real fault was a test running the container in a shape it never ships in.",
      "date_published": "2026-06-10T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    },
    {
      "id": "https://blog.libresoftware.cloud/blog/the-way/precommit-format/",
      "url": "https://blog.libresoftware.cloud/blog/the-way/precommit-format/",
      "title": "Your CI shouldn't be your formatter",
      "summary": "A pre-commit hook that formats your code before it reaches the pipeline. No husky, no lint-staged, fifteen lines of shell.",
      "date_published": "2026-06-08T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    },
    {
      "id": "https://blog.libresoftware.cloud/blog/the-way/ci-build-publish/",
      "url": "https://blog.libresoftware.cloud/blog/the-way/ci-build-publish/",
      "title": "CI that builds, gates, and publishes your image",
      "summary": "A pipeline that lints, tests, scans and ships the image on every push, plus the monthly rebuild that stops a pinned base from rotting in silence.",
      "date_published": "2026-06-06T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    },
    {
      "id": "https://blog.libresoftware.cloud/blog/the-way/hardened-compose/",
      "url": "https://blog.libresoftware.cloud/blog/the-way/hardened-compose/",
      "title": "A hardened compose file for a web app",
      "summary": "Freeze the filesystem, drop every Linux privilege, keep the secret out of docker inspect, and publish no ports at all. The other half of running a container safely.",
      "date_published": "2026-06-04T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    },
    {
      "id": "https://blog.libresoftware.cloud/blog/the-way/hardened-dockerfile/",
      "url": "https://blog.libresoftware.cloud/blog/the-way/hardened-dockerfile/",
      "title": "A hardened Dockerfile for a web app",
      "summary": "Build in stages so no compiler ships to production, run as a user with no powers, and strip out everything an attacker could use. The Dockerfile I reach for on web projects.",
      "date_published": "2026-06-02T00:00:00.000Z",
      "tags": [

      ],
      "authors": [
        {
          "name": "Yann M. Vidamment",
          "email": "yann.vidamment@libresoftware.cloud"
        }
      ]
    }
  ]
}