Error: The "authors" array (index 0) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 0) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 0) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 0) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 0) did not contain a required property of 'content_html'
- The "items" array (index 0) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 0) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 1) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 1) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 1) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 1) did not contain a required property of 'content_html'
- The "items" array (index 1) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 1) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 2) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 2) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 2) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 2) did not contain a required property of 'content_html'
- The "items" array (index 2) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 2) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 3) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 3) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 3) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 3) did not contain a required property of 'content_html'
- The "items" array (index 3) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 3) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 4) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 4) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 4) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 4) did not contain a required property of 'content_html'
- The "items" array (index 4) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 4) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 5) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 5) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 5) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 5) did not contain a required property of 'content_html'
- The "items" array (index 5) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 5) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 6) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 6) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 6) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 6) did not contain a required property of 'content_html'
- The "items" array (index 6) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 6) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 7) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 7) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 7) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 7) did not contain a required property of 'content_html'
- The "items" array (index 7) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 7) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 8) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 8) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 8) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 8) did not contain a required property of 'content_html'
- The "items" array (index 8) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 8) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 9) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 9) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 9) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 9) did not contain a required property of 'content_html'
- The "items" array (index 9) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 9) contains additional properties ["email"] outside of the schema when none are allowed.
Error: The "items" array (index 10) of type object did not match any of the required schemas. The schema specific errors were:
- oneOf #0:
- The "items" array (index 10) did not contain a required property of 'content_html'
- oneOf #1:
- The "items" array (index 10) did not contain a required property of 'content_text'
- oneOf #2:
- The "items" array (index 10) did not contain a required property of 'content_html'
- The "items" array (index 10) did not contain a required property of 'content_text'
Error: The object in "authors" (index 0, from array "items" index 10) contains additional properties ["email"] outside of the schema when none are allowed.
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"
}
]
}
]
}