RSSAmplifier

Blog

Francois Guillaume Ribreau

Full Stack CTO, Startup Advisor, Consultant, Hacker, Maker

blog.fgribreau.comRSS feed ↗25 posts

Latest posts

J'ai passé 3 câbles USB-C 240 W d'Amazon au testeur physique

Acheter un câble USB-C en 2026 sur le net, c'est un peu aimer jouer à la loterie. La fiche Amazon te promet 40 Gbit/s, 240 W, de la vidéo 8K, du Thunderbolt. Le câble d'à côté, moitié prix, promet exactement la même chose. Et le troisième, deux fois plus cher, jure que lui c'est du 80 Gbit/s et du 16K. Qui croire ? J'ai donc acheté les trois et je les ai branchés, un par un, sur un testeur de…

Releasing cargo-clean-targets — I had no idea Cargo was sitting on 773 GiB of my disk: A tiny Rust CLI to find out

773 GiB FREED 0 GIB 2 TB THE WHOLE DRIVE 38% of the disk WAS CARGO CACHE i had no idea. It's the morning of April 29, 2026. I've been chasing disk hogs with dumap for a while wondering where the hell my disk space keeps disappearing. Docker volumes? node_modules ? Old Xcode runtimes? But every time I checked back a few weeks later, I was short again. Something was leaking, and I had a hunch I knew…

Le SI est la colonne vertébrale de l’entreprise. On ne sous-traite pas sa colonne vertébrale.

Henri Verdier est intervenu auprès d'une commission d'enquête et il porte un message que j'aimerais entendre plus souvent. Les chefs d'entreprise commencent tout juste à prendre conscience que leur supply-chain n'est pas seulement physique, elle est aussi numérique et qu'il faut la sécuriser. Cela passera autant que possible par le choix de solutions open-source (ouvertes, adaptables, facilement…

Releasing 3D LiDAR Scans of Machu Picchu, Sacsayhuaman, and Other Ancient Sites

November 2024. I'm standing at 2,430 meters on a ridge above the Urubamba Valley, staring at Machu Picchu. Like millions before me, I'm blown away. Unlike most of them, I have an iPhone with a LiDAR sensor in my backpack. I'd been annoyed for a while by how hard it is to find downloadable 3D data of major archaeological sites. You get blurry photogrammetry on Sketchfab, paywalled academic…

Releasing mcp-matomo - from frustration to Open Source: Building MCP Matomo in 30 Minutes

It’s Friday, December 19th. The coffee roasted spelt is still hot, and Hook0 team just pushed the "deploy" button. We just shipped a massive update: a brand new design and completely overhauled documentation for Hook0 , the open-source webhook sending infrastructure I co-founded. It feels good. But as the dust settled, I realized we needed to implement analytics on the new documentation pages.…

Releasing n8n-nodes-signal-cli - How I automatically transcribe Signal voice messages with my own n8n node extension

I was fed up with receiving 5-minute voice messages on Signal just to find out someone was asking if I'm free next Tuesday. No automatic transcription, no way to quickly scan the content. You have to listen to the whole thing, often at the worst possible moment. So I built n8n-nodes-signal-cli - an n8n extension that integrates with Signal CLI to automatically transcribe voice messages and send…

Filtrer les messages de sensibilisation à la cybersécurité et aux phishing de avantdecliquer.com

Si tu travailles pour de grands groupes, tu as peut-être déjà entendu parler de https://avantdecliquer.com/ . Cette plateforme aide les entreprises à sensibiliser leurs salariés aux dangers du phishing en leur envoyant des faux e-mails de phishing. Alors, comment gérer ce flux d'emails sans se noyer, surtout si, comme moi, tu reçois déjà entre 150 et 200 e-mails chaque jour ? Pas de panique ! Si…

How to add a label to previously created annotation in MakeSense.ai when you forgot to select a default one

Yes. Like the title said. function selectOption(f){ const a = document.querySelector('.DropdownOption'); if(a===null){ return setTimeout(selectOption.bind(null, f), 1); } a.click(); setTimeout(f, 1); } function selectLabel(label, f){ label.click(); selectOption(f); } function selectLabels(labels, f){ function _do(){ if(labels.length === 0){ return f(); } const l = labels.shift(); selectLabel(l,…

IntelliJ IDEA - Import PostgreSQL connection string with Data Source from URL feature

IntelliJ IDEA does not support out of the box "Data Source from URL" import with standard PostgreSQL connection string like postgresql://username:password@host:port/database It sucks. Here is how to fix it: File > New > Driver Find "PostgreSQL" existing driver Click "+" in the URL templates section to add a new url template Type: "postgresql://{user}:{password}@{host}:{port}/{database}" Click "OK"…

Lettre à l'ARCEP concernant l'annulation par le Conseil d'État des fréquences utilisées par Starlink

A l'attention de l'Arcep, Je suis client Starlink depuis le 9 février 2021. Ma femme et moi avons besoin d'un accès internet pour notre travail (elle possède son propre site e-commerce et de mon côté je crée et maintient des Software as a Service (SaaS) en ligne 1 2 3 4 ainsi qu'une activité de CTO as a Service ). Nous habitons dans un lieu-dit à 3km de la ville la plus proche (Les Essarts en…

How to migrate from AWS Route 53 to Scaleway DNS

I've spent the last 2 days talking with Scaleway DNS (domain) team reporting bugs I found while preparing Cloud-IAM DNS migration from Amazon AWS Route53 to Scaleway DNS and was amazed by how fast they fixed these bugs. It's so unusual for a cloud provider to be this responsive, I had to start this blog post saying it! What an amazing team! If you also use Scaleway for hosting, join their Slack .…

[Bug] Google Cloud Run decodes url search part before reaching your app

Today I discovered a (insane 🤯) bug in Google Cloud Run. I was trying to understand WHY 😵‍💫 Image-Charts works on Google Kubernetes Engine (GKE) but the same container does not work on Cloud-Run. To be precise, why the signed URL (HMAC) below works on GKE and not on Cloud-Run…

[fr] oxmoto.fr — stratégie e-commerce 1 an plus tard

Cela fait maintenant 1 an (2020) que j'ai rejoins en tant qu'associé Oxmoto afin d'y développer la partie e-commerce de Oxmoto.fr grâce à un suivi hebdomadaire. Fin 2021 nous avons maintenant franchit une étape importante car le CA réalisé chaque semaine correspond au CA annuel de 2020. C'est le résultat d'efforts continus de la part de toute l'équipe, d'une approche aggressive #lean et d'une…

[Fr] Une sombre histoire de vaccin, d'erreur 500 de FSM et de routing

L’infirmière a une erreur 500 sur AmeliPro lorsqu’elle souhaitait valider ma première dose de vaccin 🥲 Bien entendu — comme tout utilisateur — elle fait donc un retour arrière mais l’application ne respectant pas les principes du web : pas d’état porté par l’url -> 🔥💥☠️🥲 Qu’a-t-elle donc fait ? Recommencer le cheminement à 0 🥲 Chez Cloud-IAM, Hook0 et feu Redsmin et Bringr nous respect(i)ons…

How to setup your own tmate server with docker

tmate is an awesome tool I use to do work/debug session on someone else terminal. Learn more about tmate here . Sadly their default server is not available anymore, at the time of writing this article you have to setup your own tmate server, I could not find a lot of documentation on internet so here we are! # ssh into your server (e.g. 51.158.172.10) # install docker mkdir tmate && cd tmate #…

[Fr] La signature numérique de Sylae ? Bonjour Sisyphe, bienvenue en enfer

L'histoire suivante se passe sur le site Sylae, un site du service-public. Quelques "MINUTES" pour afficher un formulaire de signature numérique ?!. C'est forcément parce que vous êtes en train de me générer une clé avec une complexité de tarée right ? RIGHT ? Moi dans ces cas là, j'ai juste pas la patience (après 10 secondes d'attente), je check le code-source. Et comme c'est un service publique,…

How to upload Shopify PDF invoices to Google Drive with Zapier

Yesterday I discovered that my fiancée was manually downloading every invoice (generated with Order Printer Pro app) from Shopify so then she could upload them to her Google Drive "invoices" folder. It's more than a hundred manual operations per month and that number is growing. FAST. Let's automate that with Zapier 😇. Step 1: Trigger Zap on new Shopify paid order First thing first, create a new…

How to fix "there is no timer running, must be called from the context of Tokio runtime"

Some context You just tried to compile your Rust project and got the there is no timer running, must be called from the context of Tokio runtime error? You are desesperatly trying to understand what is going on? So did I! For future reference, my project relied on tokio v0.3. I added a dependency ( bollard ) that was relying on tokio v0.2. Even when my code was in the execution context of a tokio…

How PostgreSQL triggers works when called with a PostgREST PATCH HTTP request

Wonder what values are set or not inside your new.column_name and old.column_name when you are calling PostgREST with a PATCH request? This article is for you! Create a private schema for our sample app, we will expose the public schema for our PostgREST API: create schema private; A city table: create table private.city ( city__id integer not null primary key , name text not null, countrycode…

🤝 14 étapes pour vendre son SaaS en 3 mois (et pas 2 ans)

J'ai fait l'erreur il y a 2 ans de penser que la vente de mon SaaS, Redsmin.com (je parle de son histoire ici ), serait naturelle. Malgré les demandes reçues au fil du temps, rien ne me convenait. Il y a 3 mois, j'ai décidé de me prendre en main ce qui a eu pour résultat une vente de Redsmin jeudi dernier (20 août 2020). Cet article retrace les étapes que j'ai suivies. 1 - Attendre un miracle Cela…

FinOps - Reducing Google Cloud Storage costs

🤯 Inter-region network transfer can be a real PITA. My latest Google-Cloud Invoice for my Image-Charts Saas was ~40% related with inter-region transfer. 💸💸 - Why ? 🧐 - I'm glad you asked 😍! GCP billing report confirms that 40% came from Google Cloud Storage. Drilling down I saw that the main costs were related with GCP "Storage egress between NA and EU" and "GCP Storage egress between EU and…

How to automatically activate PostgreSQL Row Level Security on tables with at least one policy attached

Row level security is an awesome feature that let you control how your database (PostgreSQL in my case) manage access to each row of a table based on some policies declared upfront. It's also really useful when you expose your database through a REST API with a gateway like PostgREST . I already talked enough about that :) . I often forgot to add the ALTER TABLE schema.table ENABLE ROW LEVEL…

PostgREST "response.headers guc must be a JSON array composed of objects with a single key and a string value" error

Yep. You are wondering why it's working locally and not in production right? Or maybe why PostgREST login feature is not working at all? The response.headers guc must be a JSON array composed of objects with a single key and a string value is often related to the fact that some call were made to set a header field but the value to be set was empty. Take a look at your settings.secrets table. If…

How to expose all public stored function in PostgREST/SubZero

DO $$ DECLARE schema_name INFORMATION_SCHEMA.routines.routine_schema%TYPE = 'api'; fns CURSOR FOR select routine_name from INFORMATION_SCHEMA.routines WHERE routine_schema = schema_name; BEGIN FOR fn_record IN fns LOOP EXECUTE 'grant execute on function ' || schema_name || '.' || fn_record.routine_name || ' to anonymous;'; END LOOP; END$$; Will expose all store functions from the api public schema…

How to expose all public views in PostgREST/SubZero

DO $$ DECLARE schema_name INFORMATION_SCHEMA.views.table_schema%TYPE = 'api'; views CURSOR FOR select table_name from INFORMATION_SCHEMA.views WHERE table_schema = schema_name; BEGIN FOR view_record IN views LOOP EXECUTE 'grant select, insert, update, delete on ' || schema_name || '.' || view_record.table_name || ' to anonymous;'; END LOOP; END$$; Will expose all views from the api public schema…