<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Raphaël Pinson</title>
    <description>The latest articles on DEV Community by Raphaël Pinson (@raphink).</description>
    <link>https://dev.to/raphink</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F59811%2Fcdcdbc95-1306-4455-9f79-fa032c300206.jpeg</url>
      <title>DEV Community: Raphaël Pinson</title>
      <link>https://dev.to/raphink</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raphink"/>
    <language>en</language>
    <item>
      <title>Why autism hasn't disappeared — a hypothesis</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Sat, 30 May 2026 14:38:16 +0000</pubDate>
      <link>https://dev.to/raphink/why-autism-hasnt-disappeared-a-hypothesis-1b6g</link>
      <guid>https://dev.to/raphink/why-autism-hasnt-disappeared-a-hypothesis-1b6g</guid>
      <description>&lt;p&gt;In the &lt;a href="https://dev.to/raphink/two-survival-systems-two-empathy-modes-5nl"&gt;previous post&lt;/a&gt;, I described two survival systems: one oriented toward information, one toward social cohesion. The autistic information drive produces friction: the café stranger, the colleague with links when you needed a hug. But it also produces something else.&lt;/p&gt;

&lt;p&gt;Picture a tribal council. The leader has spoken. The plan is agreed. Everyone around the fire has nodded. One person says: "But the herd tracks go the other way."&lt;/p&gt;

&lt;p&gt;Silence. Eyes. The weight of having contradicted the chief in front of everyone.&lt;/p&gt;

&lt;p&gt;The tracks went the other way.&lt;/p&gt;

&lt;h1&gt;
  
  
  The puzzle
&lt;/h1&gt;

&lt;p&gt;Autism has strong genetic components — spread on many genes, with expression influenced by environmental factors. It runs in families, it clusters, it transmits. It tends to isolate affected individuals, and yet it persists at consistent rates across all human populations, across cultures, and most likely across centuries. This is the kind of pattern that usually means something.&lt;/p&gt;

&lt;p&gt;The conventional explanations for its persistence focus on the individual level: genetic linkage to advantageous traits, cognitive advantages in pattern recognition and systemizing, the so-called "geek gene" hypothesis. These are real and worth taking seriously. But they explain individual fitness. What if the answer isn't at the individual level at all, what if the whole group benefited enough from the presence of autistic members that it played in favor of the group's survival?&lt;/p&gt;

&lt;h1&gt;
  
  
  The group-level argument
&lt;/h1&gt;

&lt;p&gt;A group where everyone runs the social-harmony calculation before speaking has a specific, predictable blind spot. Information gets suppressed to preserve group comfort. Errors go uncorrected because correcting them would embarrass someone senior. The plan with the structural flaw gets executed because no one wanted to be the one who said so in front of the chief.&lt;/p&gt;

&lt;p&gt;This is not a theoretical failure mode. It has a name —groupthink— with documented consequences. And it operates precisely through the mechanism that makes neurotypical social cohesion work so well in stable conditions: the instinct to read the room, preserve relationships, avoid disruption.&lt;/p&gt;

&lt;p&gt;The autistic information drive doesn't have that brake. Not because of courage or contrarianism, but because the system that would weigh social cost against information value simply doesn't run first. The information is there, it needs to be shared, and the authority of the person in front of you is not a relevant variable.&lt;/p&gt;

&lt;p&gt;The person around the fire says the tracks go the other way. Not to challenge the chief. Not to make a point. Because the tracks go the other way and that is the only thing that matters: to speak the facts.&lt;/p&gt;

&lt;h1&gt;
  
  
  The genetic angle
&lt;/h1&gt;

&lt;p&gt;You don't need to resolve the group selection debate in evolutionary biology to find this argument useful. There's a simpler version.&lt;/p&gt;

&lt;p&gt;Autism is heritable. Which means some groups, by genetic chance, would have had more of this profile and some would have had less — either by the higher presence of some autism-related genes, or by the presence of more such biological markers in the population. A group that happened to lack it entirely would have been exposed to the groupthink failure mode with no one to interrupt it. Information suppressed. Errors uncorrected. The tracks followed in the wrong direction.&lt;/p&gt;

&lt;p&gt;Over generations, over crises, over the moments when accuracy mattered more than social harmony, that asymmetry would have had consequences.&lt;/p&gt;

&lt;p&gt;This isn't a claim that autistic individuals were selected for. It's an observation that groups containing the profile were more robust against a specific and recurring failure mode that the majority profile generates in itself.&lt;/p&gt;

&lt;h1&gt;
  
  
  What this changes
&lt;/h1&gt;

&lt;p&gt;The usual framing of autism and society runs in one direction: here is a profile that generates difficulties, how do we accommodate it. That framing isn't wrong, but it's incomplete.&lt;/p&gt;

&lt;p&gt;The profile that makes someone say the tracks go the other way, correct the stranger's restaurant recommendation, flag the error in the meeting when everyone has moved on — that profile is costly in stable, low-stakes social conditions. It produces exactly the friction described in the previous post. But a group running only the social cohesion system is vulnerable in a specific direction, and has been throughout human history.&lt;/p&gt;

&lt;p&gt;The autistic people who drove everyone slightly mad in ordinary times may have been the ones who said the thing that needed saying when it mattered most.&lt;/p&gt;

&lt;h1&gt;
  
  
  A note on epistemic honesty
&lt;/h1&gt;

&lt;p&gt;This is a hypothesis. The genetic heritability of autism is established. The groupthink failure mode is documented. The observation that cross-neurotype groups might be more robust is plausible and consistent with broader neurodiversity research. But the specific claim — that autism persists in part because groups containing it outperformed groups that didn't — is an original assembly of solid components, not a finding from the literature.&lt;/p&gt;

&lt;p&gt;I'm offering it as a frame worth considering, not a conclusion worth defending. If you work in evolutionary biology or behavioral genetics and think I'm wrong, I'd genuinely like to know why.&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>inclusion</category>
      <category>community</category>
      <category>career</category>
    </item>
    <item>
      <title>Two survival systems, two empathy modes</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Fri, 29 May 2026 06:56:49 +0000</pubDate>
      <link>https://dev.to/raphink/two-survival-systems-two-empathy-modes-5nl</link>
      <guid>https://dev.to/raphink/two-survival-systems-two-empathy-modes-5nl</guid>
      <description>&lt;p&gt;Here are two scenes. They look unrelated. They're not.&lt;/p&gt;

&lt;h1&gt;
  
  
  Scene 1
&lt;/h1&gt;

&lt;p&gt;Two people at a café, talking about a restaurant they want to try. A stranger walking past stops: "That place closed six months ago. The one on the corner is better." A brief nod, and they walk on.&lt;/p&gt;

&lt;p&gt;The two people exchange a glance, taken aback. Why did that person stop? What did they want?&lt;/p&gt;

&lt;p&gt;A few steps away, the stranger is also confused. They had useful information. They shared it. Why did these people react so strangely?&lt;/p&gt;

&lt;h1&gt;
  
  
  Scene 2
&lt;/h1&gt;

&lt;p&gt;A colleague is visibly stressed, describing a difficult situation at work. One friend pulls their chair closer, puts a hand on their arm: "That sounds really hard." Another opens their laptop: "I found something that might help — HR has a process for exactly this, I'll send you the link."&lt;/p&gt;

&lt;p&gt;The colleague leans into the first. Glances uncertainly at the second.&lt;/p&gt;

&lt;p&gt;The second person doesn't understand why sitting close and saying "that sounds hard" counts as helping. You haven't solved anything. The first doesn't understand why anyone would respond to distress with links.&lt;/p&gt;




&lt;p&gt;Both scenes end the same way: people on both sides convinced they did the right thing, confused by the other's reaction. The mismatch is mutual and invisible from the inside.&lt;/p&gt;

&lt;h1&gt;
  
  
  Two survival instincts, two empathy systems
&lt;/h1&gt;

&lt;p&gt;For many &lt;em&gt;autistic&lt;/em&gt; people, information is a &lt;strong&gt;survival&lt;/strong&gt; mechanism. Uncertainty is threat, missing information is a vulnerability, and the drive to correct and share runs below conscious awareness. &lt;strong&gt;Empathy, expressed through that system&lt;/strong&gt;, looks like giving someone what keeps you safe: accurate information, solutions, resources. The social preamble before sharing — announcing yourself, softening the approach — doesn't arise as a concept. Why would useful information require an introduction?&lt;/p&gt;

&lt;p&gt;For many &lt;em&gt;neurotypical&lt;/em&gt; people, social safety is a &lt;strong&gt;survival&lt;/strong&gt; mechanism. Group cohesion and reading others accurately are what keep people safe. &lt;strong&gt;Empathy, expressed through that system&lt;/strong&gt;, looks like presence: mirroring distress, making someone feel held, maintaining the social fabric. An uninvited approach from a stranger bypasses the protocol that signals safe intent — and that protocol isn't a nicety, it's the unlock code. Without it, the content can't land regardless of how useful it is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fll3p3bkxfe9auwyvxzoq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fll3p3bkxfe9auwyvxzoq.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The social preamble is as foreign a concept to the autistic person as the direct approach is unsettling to the neurotypical person. The information response is as opaque to the neurotypical person as emotional attunement is to the autistic person. Neither protocol is natural to the other system. The incomprehension runs in both directions, with equal depth.&lt;/p&gt;

&lt;h1&gt;
  
  
  Milton's double empathy problem
&lt;/h1&gt;

&lt;p&gt;In 2012, autistic researcher Damian Milton described what he called the double empathy problem: cross-neurotype communication difficulties aren't a deficit on one side, they're a mismatch between two coherent systems that are mutually opaque to each other. Historically, the autistic side has been asked to compensate, the neurotypical system treated as the default rather than as one particular survival logic among two.&lt;/p&gt;

&lt;p&gt;What these two scenes show is that both sides are trying to care for the other, each in the only language their system knows, and neither is being received as care.&lt;/p&gt;

&lt;p&gt;That's not a deficit. That's two survival systems, built for different threats, each expressing empathy in the only currency it has.&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>inclusion</category>
      <category>community</category>
      <category>career</category>
    </item>
    <item>
      <title>Rest is not what you think</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Wed, 27 May 2026 08:25:00 +0000</pubDate>
      <link>https://dev.to/raphink/rest-is-not-what-you-think-1mbc</link>
      <guid>https://dev.to/raphink/rest-is-not-what-you-think-1mbc</guid>
      <description>&lt;p&gt;My wife says she's never seen me rest.&lt;/p&gt;

&lt;p&gt;She's not wrong, exactly. But I think we've been working with different definitions.&lt;/p&gt;

&lt;p&gt;When someone tells me to rest, they usually mean: do something calm. Low stimulation. A walk in nature, a beach, quiet time.&lt;/p&gt;

&lt;p&gt;For a long time I couldn't explain why that didn't work for me. It wasn't that I didn't want to rest. It was that what counted as rest seemed to be defined by other people's nervous systems, not mine.&lt;/p&gt;

&lt;p&gt;Here's what I eventually figured out.&lt;/p&gt;

&lt;p&gt;Rest, for me, is not about low stimulation. It's about low novelty load on the threat and navigation system.&lt;/p&gt;

&lt;p&gt;I can blast metal music at full volume through headphones and come out of it genuinely restored. Not despite the intensity, because of something specific about it: my brain knows every note, every transition, every moment of that record. It keeps registering "I know this. I know this. I know this." No decisions required. No scanning. The system can stop.&lt;/p&gt;

&lt;p&gt;A beach is the opposite. It looks calm. But for my nervous system it's a continuous stream of unclassified inputs: people passing at unpredictable intervals, sounds I don't recognize, movements in peripheral vision, social situations I might need to navigate. My brain doesn't get to stop. It has to keep evaluating, filing, preparing. That's not rest. That's work with good lighting.&lt;/p&gt;

&lt;p&gt;The axis isn't intensity versus calm. It's known versus unknown. More precisely: does this input require a response decision, or not?&lt;/p&gt;

&lt;p&gt;This connects to something I've written about before — the background scan, the nervous system running in a kind of permanent low-level threat detection mode. What that system needs to rest isn't silence. It needs to be released from decision load. Familiar music does that. An unfamiliar environment doesn't, regardless of how peaceful it looks from the outside.&lt;/p&gt;

&lt;p&gt;I think this is why a lot of autistic people have very specific, sometimes surprising rest rituals that look nothing like relaxation to others. It's not quirk or preference. It's load management.&lt;/p&gt;

&lt;p&gt;The well-meaning advice to "just relax" or "get some fresh air" isn't wrong about rest being necessary. It's using a definition of rest built for a different nervous system.&lt;/p&gt;

&lt;p&gt;What actually restores you might look nothing like what's supposed to.&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>inclusion</category>
      <category>community</category>
      <category>career</category>
    </item>
    <item>
      <title>Sharing is caring</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Mon, 25 May 2026 06:45:00 +0000</pubDate>
      <link>https://dev.to/raphink/sharing-is-caring-1bif</link>
      <guid>https://dev.to/raphink/sharing-is-caring-1bif</guid>
      <description>&lt;p&gt;Last month, I wrote a series on autism from the inside. The response surprised me — several people said it helped them understand someone in their life, or themselves. This is a follow-up on something I've been thinking about since.&lt;/p&gt;

&lt;p&gt;Autistic people who talk at length about their interests are easy to misread. They seem oblivious to whether you're engaged. They circle back to the same subject even after the conversation has moved on. From the outside, it looks like self-centeredness: I want to talk about this, so I will.&lt;/p&gt;

&lt;p&gt;I suggest the mechanism is almost the opposite.&lt;/p&gt;

&lt;p&gt;For an autistic brain, information isn't incidental. It's closer to what navigation instruments are to a pilot: not nice to have, but required to function. I've written before about the constant background scan — the nervous system collecting data continuously, because any gap in the map is a potential trapdoor. That's the context this runs in.&lt;/p&gt;

&lt;p&gt;If information has that level of value — survival-level value, not intellectual curiosity — then sharing information is the most generous thing you can do. When I've spent weeks or months going deep on a subject, and I find something that genuinely matters, the instinct to share it isn't "let me talk about myself." It's closer to "I found something you need to know."&lt;/p&gt;

&lt;p&gt;It's "I found water."&lt;/p&gt;

&lt;p&gt;The social form looks like monologue. The underlying intent is contribution, especially when this knowledge contributes to lowering anxiety, consciously or not.&lt;/p&gt;

&lt;p&gt;This also explains the other side of the equation: small talk. The common framing is that autistic people find it boring, or that we prefer "meaningful" conversation. That's not quite it either. The information channel runs in survival mode. Low-signal input — the weather, a filler comment, a pleasantry that carries no new information — doesn't just fail to help. It occupies bandwidth that the system is trying to keep clear. It's not boredom. It's closer to noise pollution in a critical instrument.&lt;/p&gt;

&lt;p&gt;The frustration when no one seems interested in what you're sharing, and the discomfort with small talk, come from the same place: a brain that has assigned extreme functional value to information, operating in a world where most social exchange treats information as incidental.&lt;/p&gt;

&lt;p&gt;None of this makes the social friction disappear. Knowing the mechanism doesn't mean the other person stops feeling talked over. But it changes the question. The question isn't "why are they so self-absorbed?" The question is: what does it mean to be generous when your native currency isn't attention, but knowledge?&lt;/p&gt;

&lt;p&gt;For a lot of autistic people, sharing is genuinely how we care. We're just not always aware that the gift doesn't always land the way it was meant.&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>inclusion</category>
      <category>community</category>
      <category>career</category>
    </item>
    <item>
      <title>Neurodiversity and the two layers of cognition</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Fri, 22 May 2026 10:46:47 +0000</pubDate>
      <link>https://dev.to/raphink/neurodiversity-and-the-two-layers-of-cognition-42dp</link>
      <guid>https://dev.to/raphink/neurodiversity-and-the-two-layers-of-cognition-42dp</guid>
      <description>&lt;p&gt;About twenty years ago, while studying Gestion Mentale, a pedagogy framework developed by French educator Antoine de la Garanderie, our group was asked to do a simple mental calculation. Something like 47+35. Then explain what happened in our heads.&lt;/p&gt;

&lt;p&gt;The results were staggering.&lt;/p&gt;

&lt;p&gt;One person talked to themselves through it. Another wrote the numbers on an imaginary blackboard, in their own handwriting. Someone else saw their primary school teacher's handwriting instead. One person had visual bars and immediate access to the result, with no intermediate steps they could describe. Ten people, ten different internal processes, one correct answer.&lt;/p&gt;

&lt;p&gt;Nobody had assumed everyone else did it the same way. But nobody had ever questioned it either, because there had never been a reason to ask.&lt;/p&gt;

&lt;p&gt;That exercise made something visible that is almost always invisible: the internal process and the expected output are two separate things, and they don't have to map onto each other in any particular way.&lt;br&gt;
I saw this confirmed during an internship with a Gestion Mentale practitioner working with a child struggling with long divisions. Over several sessions they had found a method that worked for the child, that he understood and could use reliably. Then the teacher called him to the board, he used his method, and she dismissed it. She hadn't taught it, she didn't recognize it, so as far as she was concerned it wasn't valid.&lt;/p&gt;

&lt;p&gt;The practitioner spent the next session reframing things. There are two layers, he told the child: how you perform a task, and what the world expects as output. Those are separate problems. Let's find a way to convert your method into the expected format.&lt;/p&gt;

&lt;p&gt;I've recently been writing about autism, following my own diagnosis at 43. Autism adds a cost to this picture. When your internal process doesn't map naturally onto what the social world expects as output, there is a translation layer running constantly — reading faces, calibrating tone, tracking when to speak and when to stop. For most people this is automatic, effectively free. For an autistic person it runs consciously, alongside every interaction.&lt;/p&gt;

&lt;p&gt;The result looks the same. The cost doesn't show. Which is why late diagnosis is so common: the output passes inspection, so nobody looks at the process.&lt;/p&gt;

&lt;p&gt;Happy to hear how this lands — particularly from those of you who recognize the translation cost from your own experience, whether or not you have a diagnosis.&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>inclusion</category>
      <category>community</category>
      <category>career</category>
    </item>
    <item>
      <title>You can't know what you don't know</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Wed, 29 Apr 2026 07:30:00 +0000</pubDate>
      <link>https://dev.to/raphink/you-cant-know-what-you-dont-know-37ap</link>
      <guid>https://dev.to/raphink/you-cant-know-what-you-dont-know-37ap</guid>
      <description>&lt;p&gt;This is the fourteenth and final post in my autism awareness month series.&lt;/p&gt;

&lt;p&gt;This series almost didn't happen. I shared a comic strip on April 2nd because it was autism awareness day. A colleague asked a question, I answered, and somehow that turned into thirteen posts.&lt;/p&gt;

&lt;p&gt;That's fitting, actually. The whole premise of the series is that you can't know what you don't know, and the series itself is proof of it. I didn't plan to spend a month writing about autism. I didn't know there was this much to say, or that this many people were waiting to hear it.&lt;/p&gt;

&lt;p&gt;What you've been reading across these posts is what's called masking. Every post described a different aspect of it: the information-gathering that runs constantly, the sensory system that doesn't filter, the tasks that won't start without a valid reason, the submission reflex that isn't there, the friendships that fade without a maintenance impulse. None of it is a character flaw. All of it is compensation: conscious or unconscious strategies developed over a lifetime to navigate a world not designed for this wiring.&lt;/p&gt;

&lt;p&gt;Masking has a cost. Extended periods of running above capacity produce what's called autistic burnout: not laziness, not a mood, a system that needs to shut down. In undiagnosed adults, that burnout is frequently misread as depression or anxiety, and treated as such. The problem: treatments designed for depression can make autistic burnout worse. The framework matters. And most people never get the right one, partly because the system doesn't make it easy — GPs often discourage diagnosis in adults, particularly those who are managing well from the outside.&lt;/p&gt;

&lt;p&gt;But managing well from the outside is exactly the profile most at risk. The higher the masking, the later the crisis, and the more accumulated cost when it arrives.&lt;/p&gt;

&lt;p&gt;Diagnosis changes the framework. Not "what is wrong with me psychologically" but "what does my nervous system actually need." That reframe changes what help looks like, which changes whether help actually helps. You don't need the diagnosis today. But at some point, the cost of running above capacity will come due. Having the right framework before that moment is the difference between understanding what's happening and spending years in the wrong treatment.&lt;/p&gt;

&lt;p&gt;If anything in this series resonated, the RAADS-R is a good starting point. It's a clinically validated screening tool — not a diagnosis, but a signal worth taking seriously.&lt;/p&gt;

&lt;p&gt;I built a free tool at &lt;a href="https://raphink.github.io/raads-r/" rel="noopener noreferrer"&gt;https://raphink.github.io/raads-r/&lt;/a&gt; that walks you through it and generates an AI-enhanced report. It's free to use, though report generation has a cost on my end. Generate ahead if you can, and if it doesn't work, feel free to DM me.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/raphink" rel="noopener noreferrer"&gt;
        raphink
      &lt;/a&gt; / &lt;a href="https://github.com/raphink/raads-r" rel="noopener noreferrer"&gt;
        raads-r
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;RAADS-R Test - Autism Diagnostic Scale&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;🌐 &lt;a href="https://raphink.github.io/raads-r/?lang=en" rel="nofollow noopener noreferrer"&gt;Access the UI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A web-based implementation of the &lt;strong&gt;Ritvo Autism Asperger Diagnostic Scale - Revised (RAADS-R)&lt;/strong&gt;, a widely-used screening tool for autism spectrum disorders in adults.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌟 Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🌍 &lt;strong&gt;Multilingual Support&lt;/strong&gt;
&lt;/h3&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;French&lt;/strong&gt; and &lt;strong&gt;English&lt;/strong&gt; interfaces&lt;/li&gt;
&lt;li&gt;Dynamic language switching with persistent preferences&lt;/li&gt;
&lt;li&gt;Localized date formatting and content&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;⌨️ &lt;strong&gt;Comprehensive Keyboard Navigation&lt;/strong&gt;
&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A/B/C/D&lt;/strong&gt; - Select answer options&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tab&lt;/strong&gt; - Focus comment field&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Esc&lt;/strong&gt; - Exit comment field&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P/N&lt;/strong&gt; - Navigate previous/next questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enter&lt;/strong&gt; - Continue to next question&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shift+Enter&lt;/strong&gt; - Continue from comment field&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;📊 &lt;strong&gt;Detailed Results&lt;/strong&gt;
&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Total score calculation (0-240 points)&lt;/li&gt;
&lt;li&gt;Category breakdowns:
&lt;ul&gt;
&lt;li&gt;Social Interactions (117 points max)&lt;/li&gt;
&lt;li&gt;Sensory Motor (60 points max)&lt;/li&gt;
&lt;li&gt;Restricted Interests (42 points max)&lt;/li&gt;
&lt;li&gt;Language (21 points max)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Clinical interpretation with color-coded severity levels&lt;/li&gt;
&lt;li&gt;Export options (text summary and full JSON)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📋 About the RAADS-R&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;Ritvo Autism Asperger Diagnostic Scale - Revised&lt;/strong&gt; is a clinical assessment tool designed…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/raphink/raads-r" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;You can't know what you don't know. But now you have a door.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is part of my April 2026 autism awareness month series. First published &lt;a href="https://www.linkedin.com/posts/raphink_autism-autismawareness-actuallyautistic-share-7451734247188492289-0Dqf" rel="noopener noreferrer"&gt;on LinkedIn on 2026-04-29&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>inclusion</category>
      <category>community</category>
      <category>career</category>
    </item>
    <item>
      <title>'I don't know' — The invisible crisis</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Tue, 28 Apr 2026 09:25:00 +0000</pubDate>
      <link>https://dev.to/raphink/i-dont-know-the-invisible-crisis-3383</link>
      <guid>https://dev.to/raphink/i-dont-know-the-invisible-crisis-3383</guid>
      <description>&lt;p&gt;This is the thirteenth post in my autism awareness month series.&lt;/p&gt;

&lt;p&gt;When someone asks me what I want to eat, or which color I prefer, or what I should work on next, something happens at times that's hard to describe to people who don't experience it.&lt;/p&gt;

&lt;p&gt;From the outside, my response might look like indifference. I might say "I don't know" and smile quietly. To the person asking, this can read as not caring, not being engaged, not valuing their question or the interaction.&lt;/p&gt;

&lt;p&gt;But inside, something very different is happening.&lt;/p&gt;

&lt;p&gt;Most people think "I don't know" just needs an answer, any answer. But to the autistic brain, the question creates a demand for the right answer, and there might not be enough data to determine what that is.&lt;/p&gt;

&lt;p&gt;It's not psychological anxiety. I'm not worried about choosing wrong or disappointing someone. It's more fundamental than that. The question creates a void, an abyss with no foothold. Imagine someone climbing a wall, and another person telling them to put their foot in a hole that should be right there — but the climber cannot see or feel that hole anywhere. It's not that they're afraid to step. The ground they're being told to step on simply doesn't exist for them.&lt;/p&gt;

&lt;p&gt;"What do you want to eat?" sounds like a simple preference question. But my processing system receives it as: given all parameters — nutritional needs, energy levels, what I last ate, what's available, time constraints, current sensory state — what is the optimal answer? If those parameters aren't fully specified, or if I can't access my internal state clearly enough to know what my body needs, the equation can't be solved. There's no answer to give because the question, as received, is computationally incomplete.&lt;/p&gt;

&lt;p&gt;And here's where the social trap closes: while experiencing this groundlessness, this inability to locate the answer, I also don't know how to adapt my social behavior to signal what's happening. I might smile (a learned safe default) or keep a blank face (because I have no spare processing capacity for managing expressions while searching for ground that isn't there).&lt;/p&gt;

&lt;p&gt;This gets interpreted as exactly the opposite of what's happening. The person asking sees indifference. But the "I don't know" isn't about not caring. It might signal the opposite — needing the right answer rather than just any answer, needing sufficient information rather than being able to approximate casually.&lt;/p&gt;

&lt;p&gt;The person asking has no idea their simple question created this effect. They think they asked for a preference and got apathy in return.&lt;/p&gt;

&lt;p&gt;This is part of why the "you can't know what you don't know" principle matters so much. Until I understood that for neurotypical people, "I don't know what I want to eat" often just means "I have no strong preference," I didn't realize my processing was different. I thought everyone experienced that demand for the right answer. This will be the topic of the last post tomorrow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is part of my April 2026 autism awareness month series. First published &lt;a href="https://www.linkedin.com/posts/raphink_autism-autismawareness-actuallyautistic-share-7454821938780123136-ukMM/" rel="noopener noreferrer"&gt;on LinkedIn on 2026-04-28&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>inclusion</category>
      <category>community</category>
      <category>career</category>
    </item>
    <item>
      <title>Autism as a catalyst</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Mon, 27 Apr 2026 07:00:00 +0000</pubDate>
      <link>https://dev.to/raphink/autism-as-a-catalyst-322e</link>
      <guid>https://dev.to/raphink/autism-as-a-catalyst-322e</guid>
      <description>&lt;p&gt;This is the twelfth post in my autism awareness month series.&lt;/p&gt;

&lt;p&gt;Over the past few weeks, I've described a lot of different things: a brain that gathers information constantly, a sensory system that doesn't filter, tasks that won't start without a valid reason, authority that doesn't register, friendships that fade without a maintenance impulse. These aren't separate quirks, they're expressions of the same underlying configuration.&lt;/p&gt;

&lt;p&gt;One way to understand that configuration is through what I'd call the catalyst effect.&lt;/p&gt;

&lt;p&gt;Autism hardly create effects directly. It amplifies whatever is already present, in both directions. High IQ combined with the constant information-gathering drive produces unusual pattern recognition and cross-domain connections. A food sensitivity combined with a sensory system that doesn't suppress signals produces amplified disruption. A structured environment with clear purpose combined with deep focus and low tolerance for ambiguity produces unusual loyalty and output. The same wiring in different conditions produces different amplified results.&lt;/p&gt;

&lt;p&gt;This is why autism resists simple characterization. The genius stereotype and the burnout are not opposites, they're actually the same amplifier applied to different inputs. The person who seems to thrive and the person who is struggling may be running nearly identical hardware. What differs is the load, the environment, and how well the conditions match what the system actually needs.&lt;/p&gt;

&lt;p&gt;It also means the costs and the strengths are inseparable. There is no version of the wiring that keeps the pattern recognition and removes the sensory overload. No version that keeps the deep focus and removes the demand avoidance. The gain is turned up on everything, both the useful and the costly alike.&lt;/p&gt;

&lt;p&gt;Is autism a defect? A defect is a variation with negative consequences. The consequences here are real. But they're located in the mismatch between the wiring and the environment, not in a malfunction. The same configuration that generates friction in one context generates exceptional output in another. The question worth asking isn't how to fix the wiring, but rather how to design conditions where it can actually function.&lt;/p&gt;

&lt;p&gt;In the next post, I'll explore one of the most invisible struggles in autism: what happens when 'I don't know' doesn't mean what people think it means.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is part of my April 2026 autism awareness month series. First published &lt;a href="https://www.linkedin.com/posts/raphink_autism-autismawareness-actuallyautistic-activity-7454424089462702080-LYly" rel="noopener noreferrer"&gt;on LinkedIn on 2026-04-27&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>inclusion</category>
      <category>community</category>
      <category>career</category>
    </item>
    <item>
      <title>Testing GCP Cloud Functions Locally with Docker Compose and Summon</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Fri, 24 Apr 2026 09:38:50 +0000</pubDate>
      <link>https://dev.to/raphink/testing-gcp-cloud-functions-locally-with-docker-compose-and-summon-4p2i</link>
      <guid>https://dev.to/raphink/testing-gcp-cloud-functions-locally-with-docker-compose-and-summon-4p2i</guid>
      <description>&lt;p&gt;I use GCP Cloud Functions quite a bit, but testing them locally can be challenging.&lt;/p&gt;

&lt;p&gt;Here's how I do it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Package and run with Docker
&lt;/h1&gt;

&lt;p&gt;The first step is to build one container per function. I use Docker for this, with two steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add an executable entrypoint
&lt;/h2&gt;

&lt;p&gt;My functions are written in Go, so I add a &lt;code&gt;cmd/main.go&lt;/code&gt; to my codebase to run an HTTP server that calls the function logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;

    &lt;span class="c"&gt;// Blank-import the function package so the init() runs&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="s"&gt;"yourfunctionpackage"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/GoogleCloudPlatform/functions-framework-go/funcframework"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Use PORT environment variable, or default to 8080.&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"8080"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;envPort&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PORT"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;envPort&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;envPort&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;funcframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"funcframework.Start: %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Orchestration
&lt;/h2&gt;

&lt;p&gt;I then create a &lt;code&gt;docker-compose.yaml&lt;/code&gt; file in my project to easily start and stop the stack, and expose the ports on my machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;myfunction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MY_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${MY_API_KEY}&lt;/span&gt;
      &lt;span class="na"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${DB_PASSWORD}&lt;/span&gt;
      &lt;span class="na"&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/root/.config/gcloud/application_default_credentials.json"&lt;/span&gt;
      &lt;span class="na"&gt;FUNCTION_TARGET&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MyFunction&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;~/.config/gcloud:/root/.config/gcloud:ro"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Secrets
&lt;/h1&gt;

&lt;p&gt;The next issue is secrets. My functions are configured to take secrets as environment variables so I can pass them from GCP Secret Manager.&lt;/p&gt;

&lt;p&gt;But locally? I could be tempted to do one of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeping a &lt;code&gt;.env&lt;/code&gt; file around (and hoping you didn't commit it)&lt;/li&gt;
&lt;li&gt;Hardcoding values in your shell profile&lt;/li&gt;
&lt;li&gt;Commenting out the secret-fetching logic and replacing it manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But all of these create drift between local and prod, as well as --and mainly-- a risk of leaking secrets.&lt;/p&gt;

&lt;p&gt;Fortunately, there's a cleaner way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pattern
&lt;/h2&gt;

&lt;p&gt;Three tools, working together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GCP Secret Manager&lt;/strong&gt; — single source of truth for secret values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://cyberark.github.io/summon/" rel="noopener noreferrer"&gt;Summon&lt;/a&gt;&lt;/strong&gt; — injects secrets as env vars at process startup, without writing them to disk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose&lt;/strong&gt; — builds and runs your functions locally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result: &lt;code&gt;summon docker compose up&lt;/code&gt; — and your containers get the same secrets they'd get in production, pulled live from Secret Manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Looks Like
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The summon GCP plugin
&lt;/h3&gt;

&lt;p&gt;Summon is a pluggable tool. You can provide your own script to map between your secret vault, the keys you want to pass, and the values you want to retrieve.&lt;/p&gt;

&lt;p&gt;In our case, the vault is GCP Secret Manager, and I want to retrieve secrets by passing the project name and secret name, so I have a plugin that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Install this file in /usr/local/lib/summon/gcloud&lt;/span&gt;

&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; PROJECT SECRET VERSION &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;

gcloud secrets versions access &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VERSION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PROJECT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SECRET&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make this script executable and place it in the Summon library (typically &lt;code&gt;/usr/local/lib/summon/&lt;/code&gt;), and you're ready for the next step! &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;secrets.yml&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This is the only file you maintain. It maps environment variable names to GCP secret paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;MY_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!var&lt;/span&gt; &lt;span class="s"&gt;my-project my-api-key latest&lt;/span&gt;
&lt;span class="na"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!var&lt;/span&gt; &lt;span class="s"&gt;my-project db-password latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When called, Summon will read this file and resolve each &lt;code&gt;!var&lt;/code&gt; entry by calling the configured secret provider we've just configured above.&lt;/p&gt;

&lt;p&gt;Couple this with the Docker Compose file we wrote earlier, and all you need to do is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;summon docker compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Summon resolves the secrets, exports them into the environment, and Docker Compose inherits them. No &lt;code&gt;.env&lt;/code&gt; file, no plaintext values on disk.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Deploy Side
&lt;/h1&gt;

&lt;p&gt;In production, your deploy script simply needs to map the same secret names as env vars using the &lt;code&gt;--set-secrets&lt;/code&gt; flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud functions deploy my-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set-secrets&lt;/span&gt; &lt;span class="nv"&gt;MY_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my-api-key:latest &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set-secrets&lt;/span&gt; &lt;span class="nv"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;db-password:latest &lt;span class="se"&gt;\&lt;/span&gt;
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just make sure the secrets are shared with the compute service account so it's allowed to access them when starting the functions.&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>development</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Maintaining friendships on the spectrum</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Fri, 24 Apr 2026 07:10:00 +0000</pubDate>
      <link>https://dev.to/raphink/maintaining-friendships-on-the-spectrum-42lc</link>
      <guid>https://dev.to/raphink/maintaining-friendships-on-the-spectrum-42lc</guid>
      <description>&lt;p&gt;This is the eleventh post in my autism awareness month series.&lt;/p&gt;

&lt;p&gt;My wife tells me I have friends. She's probably right. But I don't feel like I do — not in the way the cultural template describes. The deep reciprocal bond, the person you call when something happens, the relationship that persists without a reason to persist. That version of friendship feels mostly out of reach, and I've spent a long time wondering why.&lt;/p&gt;

&lt;p&gt;The answer isn't that I can't connect with people. I can, and often do, sometimes intensely. The issue is maintenance.&lt;/p&gt;

&lt;p&gt;Most people have something like a social maintenance reflex: an impulse that fires unprompted, that makes you think of someone and reach out, that keeps a connection warm between meetings. I don't have that reliably. Not because I don't care, but because the impulse simply doesn't fire. The friendship is real when the context is there: a shared project, a recurring situation, a work relationship with natural touchpoints. When the context goes, the connection quietly fades. Not from indifference. From the absence of the trigger.&lt;/p&gt;

&lt;p&gt;This produces a pattern that can look, from the outside, like something it isn't. The person who engages intensely when you're in the same context, then goes quiet when you're not. The person who seems fine, then suddenly withdraws. The person who doesn't follow up after a conflict — not because they're stonewalling, but because internally the matter felt resolved, and the follow-up impulse never came. These can get read as manipulation, as using people, as not really caring. None of them are.&lt;/p&gt;

&lt;p&gt;There's a flip side worth naming. The same system that doesn't store the emotional weight of a friendship also doesn't store the emotional weight of a conflict. Grudges don't accumulate. Wounds don't fester. When the context returns, the connection picks up with a freshness that can feel surprising to the other person — and genuine, because it is.&lt;/p&gt;

&lt;p&gt;And when the structure is there — a shared purpose, a recurring reason to engage — the intensity and loyalty that show up are real. It's not that the caring isn't there. It's that it needs something to hang on.&lt;/p&gt;

&lt;p&gt;Next post: on autism as a catalyst&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is part of my April 2026 autism awareness month series. First published &lt;a href="https://www.linkedin.com/posts/raphink_autism-autismawareness-actuallyautistic-activity-7453337458513141760-JWsl" rel="noopener noreferrer"&gt;on LinkedIn on 2026-04-24&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>inclusion</category>
      <category>community</category>
      <category>career</category>
    </item>
    <item>
      <title>Autism and the "genius" effect</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Wed, 22 Apr 2026 06:25:00 +0000</pubDate>
      <link>https://dev.to/raphink/autism-and-the-genius-effect-k86</link>
      <guid>https://dev.to/raphink/autism-and-the-genius-effect-k86</guid>
      <description>&lt;p&gt;This is the tenth post in my autism awareness month series.&lt;/p&gt;

&lt;p&gt;When people think of autism, they often think of Rain Man or Sheldon Cooper. On one end, the severely affected person who needs full-time care. On the other, the socially awkward genius whose extraordinary abilities more than compensate. When I tell friends I am on the spectrum, I often hear: "But you don't look autistic."&lt;/p&gt;

&lt;p&gt;Neither stereotype is wrong exactly. Both exist, but neither is representative. The vast middle is invisible, largely because it masks.&lt;/p&gt;

&lt;p&gt;Before we go further, let's clarify on terminology. "Asperger's syndrome" is no longer a clinical diagnosis: it was folded into the single autism spectrum disorder classification in 2013. It was often used as shorthand for "high-functioning autistic," which is itself problematic, because functioning labels measure visibility of difficulty, not actual experience. The DSM-5 support levels measure required support, not intelligence, not severity of internal experience. A level 1 autistic person isn't mildly autistic. They're autistic in a way that currently requires less visible support, often because they've learned to compensate. That compensation has a cost that isn't measured.&lt;/p&gt;

&lt;p&gt;Now, to address the genius question.&lt;/p&gt;

&lt;p&gt;High IQ and autism are independent variables. Autism doesn't cause exceptional intelligence, and most autistic people don't have exceptional IQ. What is true though is that high-IQ autistic people are disproportionately visible: they function in professional environments, get diagnosed later, and are the face of autism in public discourse. The genius stereotype is largely a visibility problem.&lt;/p&gt;

&lt;p&gt;What autism contributes, independently of IQ, is the constant information-gathering drive that I described two weeks ago in my fourth post. That drive never reaches a point of satisfaction. High IQ adds processing power to that endless process, producing denser cross-domain connections and stronger pattern recognition as a byproduct. The IQ doesn't change the drive. It simply amplifies the output.&lt;/p&gt;

&lt;p&gt;But don't be fooled, this is a double-edged sword! The same wiring that produces unusual thinking also produces the exhaustion, the sensory overload, and the social friction described throughout this series. There is no version that keeps the upside and removes the cost. The consequences are real. But they're located in the mismatch between the wiring and the environment, not in a malfunction. And so the autistic people who seem the better socially adapted (through intellectual masking adjustments) are usually the ones experiencing the most anxiety as a result, and most likely to experience a burnout in their 30s or 40s.&lt;/p&gt;

&lt;p&gt;In short: autism is not a cause of genius, but it can work as an amplifier for high throughput brains.&lt;/p&gt;

&lt;p&gt;Next: on maintaining friendships, and what gets misread as manipulation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is part of my April 2026 autism awareness month series. First published &lt;a href="https://www.linkedin.com/posts/raphink_autism-autismawareness-actuallyautistic-share-7452603793260580865-FQCj" rel="noopener noreferrer"&gt;on LinkedIn on 2026-04-22&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>inclusion</category>
      <category>community</category>
      <category>career</category>
    </item>
    <item>
      <title>Building MCP Servers for Genealogy: AI-Powered Historical Research</title>
      <dc:creator>Raphaël Pinson</dc:creator>
      <pubDate>Tue, 21 Apr 2026 16:58:46 +0000</pubDate>
      <link>https://dev.to/raphink/building-mcp-servers-for-genealogy-ai-powered-historical-research-261p</link>
      <guid>https://dev.to/raphink/building-mcp-servers-for-genealogy-ai-powered-historical-research-261p</guid>
      <description>&lt;p&gt;For years now, I’ve been writing a book tracing four family branches across Europe, the Middle East, and South Africa. One thread follows Louis Rau, my 3rd great-uncle, who was president of Compagnie Continentale Edison (CCE) in the early 1900s. He was an Edison Pioneer, part of the inner circle that brought Edison's electrical systems to Europe.&lt;/p&gt;

&lt;p&gt;Last year, I found that Thomas Edison's papers were digitized at Rutgers University. So I navigated to &lt;a href="http://edisondigital.rutgers.edu" rel="noopener noreferrer"&gt;edisondigital.rutgers.edu&lt;/a&gt;, typed "Louis Rau" into the search box, and hit enter, and 847 results were returned.&lt;/p&gt;

&lt;p&gt;Somewhere in those 847 documents was the correspondence that would explain Louis Rau's business relationship with Élie Moïse Léon, co-founder of CCE. Somewhere were the letters that traced his movements between Paris and Geneva. Somewhere were the details of CCE's electrical installations across Europe.&lt;/p&gt;

&lt;p&gt;But I'd have to click through them one by one, read the snippets, open promising documents, cross-reference dates, take notes, come back later and forget which ones I'd already checked…&lt;/p&gt;

&lt;p&gt;A few weeks ago, I started feeding genealogy documents to Claude AI, but that was still pretty tedious, and I kept hitting image upload limits in conversations. And then it clicked: why not build an MCP server, so Claude could perform the search directly?&lt;/p&gt;

&lt;p&gt;That question became three MCP servers, a transformed research workflow, and a fundamentally different relationship with historical archives.&lt;/p&gt;

&lt;h1&gt;
  
  
  First Win: The Edison Papers MCP
&lt;/h1&gt;

&lt;p&gt;The Edison Papers has an API. I didn't know that initially — I just knew they had a website with a search box. But a quick look at the network tab showed clean REST endpoints returning JSON.&lt;/p&gt;

&lt;p&gt;I opened Claude Code and asked it to build an MCP server that wrapped the Edison Papers API. A few hours of iteration later, I had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;edison_search&lt;/code&gt;: Query with field-level precision (&lt;code&gt;creator:"Rau, Louis"&lt;/code&gt;, &lt;code&gt;recipient:"Léon, Élie"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;edison_get_document&lt;/code&gt;: Retrieve full metadata and transcriptions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;edison_browse_series&lt;/code&gt;: Navigate document collections systematically&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;edison_get_images&lt;/code&gt;: Access high-resolution scans&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/raphink" rel="noopener noreferrer"&gt;
        raphink
      &lt;/a&gt; / &lt;a href="https://github.com/raphink/edison-archive-mcp" rel="noopener noreferrer"&gt;
        edison-archive-mcp
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      MCP server for the Edison Archive
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Edison Papers MCP Server&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An MCP server for querying the &lt;a href="https://edisondigital.rutgers.edu" rel="nofollow noopener noreferrer"&gt;Thomas A. Edison Papers&lt;/a&gt; (Rutgers University) — ~150,000 documents, public domain (CC0).&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tools&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;edison_search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full-text search by keyword, author, or recipient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;edison_get_document&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetch full metadata and transcription for a document by call number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;edison_browse_series&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List all documents in an archive series&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Use with Claude.ai (hosted)&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Deploy the server online so Claude.ai can connect to it via HTTP.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Deploy to Railway (free)&lt;/h3&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Push this repo to GitHub&lt;/li&gt;
&lt;li&gt;Go to &lt;a href="https://railway.app" rel="nofollow noopener noreferrer"&gt;railway.app&lt;/a&gt; → &lt;strong&gt;New Project → Deploy from GitHub repo&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select your repo, then add this environment variable:
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;MCP_TRANSPORT = http
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
(&lt;code&gt;PORT&lt;/code&gt; is set automatically by Railway)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Deploy&lt;/strong&gt; (~2 minutes)&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings → Networking → Generate Domain&lt;/strong&gt; to get your public URL&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2. Connect to Claude.ai&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Go to &lt;strong&gt;Claude.ai → Settings → Integrations → Add custom integration&lt;/strong&gt; and enter:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;https://your-app.up.railway.app/mcp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Use with Claude Desktop (local)&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Install&lt;/h3&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/raphink/edison-archive-mcp" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Now instead of clicking through 847 results, I could ask Claude:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find correspondence where Louis Rau is the creator, dated 1892-1895, mentioning electrical installations or Paris operations."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And Claude would orchestrate the full research pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt;: Call Edison Papers MCP → retrieve all matching results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Triage&lt;/strong&gt;: Read all abstracts, decide which documents warrant full analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track&lt;/strong&gt;: Create a Notion database entry for each document with analysis status&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritize&lt;/strong&gt;: Rank documents by relevance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep read&lt;/strong&gt;: For priority documents, get high-resolution images and use OCR for full context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summary:&lt;/strong&gt; Provide a summary of all findings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What would have taken hours of manual clicking, note-taking, and cross-referencing now happens in one conversation.&lt;/p&gt;

&lt;p&gt;This was immediately useful. But it surfaced a new problem: where do all these findings go?&lt;/p&gt;

&lt;h1&gt;
  
  
  The Organization Problem: Enter Notion MCP
&lt;/h1&gt;

&lt;p&gt;I was already using Notion to organize my research: person profiles, document summaries, research questions. And Claude already had an MCP for Notion.&lt;/p&gt;

&lt;p&gt;So now when I asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Search Edison Papers for Louis Rau correspondence from 1892-1895, create a Notion page summarizing the findings, and link it to Louis Rau's profile."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt;: Call Edison Papers MCP → retrieve all matching results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Triage&lt;/strong&gt;: Read all abstracts, decide which documents warrant full analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track&lt;/strong&gt;: Create a Notion database entry for each document with analysis status&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritize&lt;/strong&gt;: Rank documents by relevance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep read&lt;/strong&gt;: For priority documents, get high-resolution images and use OCR for full context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document&lt;/strong&gt;: Update Notion pages with findings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect&lt;/strong&gt;: Update profile pages for people mentioned (Louis Rau, Élie Léon, etc.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This was amazing. Structured knowledge, automatically organized, all in one conversation.&lt;/p&gt;

&lt;p&gt;But then Claude started hallucinating.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Hallucination Problem: Claude Needs Ground Truth
&lt;/h1&gt;

&lt;p&gt;Claude would find documents mentioning for example Samuel Léon and Élie Léon, and confidently conclude that they that Samuel was Élie's nephew, completely making it up.&lt;/p&gt;

&lt;p&gt;Or it would claim someone was born in 1847 when they were actually born in 1867. Dates off by decades. Family relationships invented wholesale.&lt;/p&gt;

&lt;p&gt;The problem: Claude had access to &lt;em&gt;documents&lt;/em&gt; (via Edison Papers MCP) and &lt;em&gt;research notes&lt;/em&gt; (via Notion MCP), but not the actual genealogy data. It was inferring family structure from fragmentary mentions in letters and my incomplete notes.&lt;/p&gt;

&lt;p&gt;I needed to give Claude access to the tree itself, the actual source of truth about who's related to whom and when they lived.&lt;/p&gt;

&lt;h1&gt;
  
  
  Attempt 1: GEDCOM MCP (Local)
&lt;/h1&gt;

&lt;p&gt;My family tree lives in Geni — a collaborative genealogy platform to build a unique World family tree. Geni has an API, but OAuth kept failing when I tried it and I wanted something working &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So I took a shortcut. From time to time, I export data from Geni to GEDCOM (the genealogy standard format), with about 25000 individuals in my export. I used airy10's GEDCOM MCP to make it queryable locally.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/airy10" rel="noopener noreferrer"&gt;
        airy10
      &lt;/a&gt; / &lt;a href="https://github.com/airy10/GedcomMCP" rel="noopener noreferrer"&gt;
        GedcomMCP
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      MCP Server to create or query GEDCOM files
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;GEDCOM MCP Server&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Genealogy for AI Agents, by AI Agents&lt;/p&gt;
&lt;p&gt;A robust MCP server for creating, editing and querying genealogical data from GEDCOM files
Works great with qwen-cli and gemini-cli&lt;/p&gt;
&lt;p&gt;This project provides a comprehensive set of tools for AI agents to work with family history data
enabling complex genealogical research, data analysis, and automated documentation generation.&lt;/p&gt;
&lt;p&gt;The server has been recently improved with fixes for critical bugs, enhanced error handling,
and better code quality while maintaining full backward compatibility.&lt;/p&gt;
&lt;p&gt;Some sample complex prompts:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;   Load gedcom "myfamily.ged"
   Make a complete, detailled biography of &amp;lt;name of some people from the GEDCOM&amp;gt; and his fammily. Use as much as you can from this genealogy, including any notes from him or his relatives
   You can try to find some info on Internet to complete the document, add some historical or geographic context, etc. Be as complete as possible to tell us a nice&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/airy10/GedcomMCP" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;This worked! Now Claude could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search for individuals by name&lt;/li&gt;
&lt;li&gt;Verify relationships ("Is X related to Y?")&lt;/li&gt;
&lt;li&gt;Check birth/death dates&lt;/li&gt;
&lt;li&gt;Trace lineage paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more hallucinated family connections. The GEDCOM became a &lt;strong&gt;hypothesis database&lt;/strong&gt;, and claims in documents could be verified against known family structure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why Geni as my main database?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;I use Geni instead of maintaining a private tree because genealogy is collaborative research. Multiple people contribute information, sources get peer-reviewed, duplicates get merged. A tree on Geni is a &lt;em&gt;shared&lt;/em&gt; knowledge base, not siloed private data that might be duplicated (and wrong) across dozens of individual researchers' files.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the GEDCOM approach had limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It only works in Claude Desktop (local MCP)&lt;/li&gt;
&lt;li&gt;It requires manually re-exporting GEDCOM whenever the tree updated&lt;/li&gt;
&lt;li&gt;No access in &lt;a href="http://claude.ai" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt; web sessions (or phone)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I needed the real API.&lt;/p&gt;

&lt;h1&gt;
  
  
  Back to Geni: Tackling OAuth
&lt;/h1&gt;

&lt;p&gt;So I went back to the Geni API. A few more hours of iteration with Claude Code, and I had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full OAuth implementation (access tokens, refresh flow)&lt;/li&gt;
&lt;li&gt;13 tools: profile CRUD, relationship pathfinding, merge candidate detection, family traversal&lt;/li&gt;
&lt;li&gt;Search by name, verify relationships, trace lineage paths programmatically&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/raphink" rel="noopener noreferrer"&gt;
        raphink
      &lt;/a&gt; / &lt;a href="https://github.com/raphink/geni-mcp" rel="noopener noreferrer"&gt;
        geni-mcp
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An MCP Server for Geni
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;geni-mcp&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An MCP (Model Context Protocol) server that gives Claude access to &lt;a href="https://www.geni.com" rel="nofollow noopener noreferrer"&gt;Geni&lt;/a&gt; — the collaborative genealogy platform. Use Claude to browse, search, correct, and extend your family tree.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_authorization_url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start the OAuth flow — get the URL to authorize Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exchange_code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Complete OAuth — exchange the code for tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_my_profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get your own Geni profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Look up any profile by ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;update_profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Correct names, dates, locations, biography&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Add a new person to Geni&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_immediate_family&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get parents, siblings, spouses, children&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_relationship_path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Find relationship path between two profiles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_union&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get a family unit (couple + children)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;add_relation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Add a parent, child, sibling, or spouse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_profiles&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search by name with optional birth/death filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_merge_candidates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Find potential duplicate profiles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;merge_profiles&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Merge a duplicate into a base profile&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Prerequisites&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;A Geni account at &lt;a href="https://www.geni.com" rel="nofollow noopener noreferrer"&gt;geni.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A registered Geni app — create one at &lt;a href="https://www.geni.com/platform/developer/apps" rel="nofollow noopener noreferrer"&gt;geni.com/platform/developer/apps&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Node.js 20+&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Clone &amp;amp;&lt;/h3&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/raphink/geni-mcp" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Now I could ask mid-conversation: "Is Samuel Léon related to Élie Moïse Léon?" and get the relationship path instantly, whether I was in Claude Desktop or &lt;a href="http://claude.ai" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The tree became &lt;strong&gt;queryable context&lt;/strong&gt; accessible anywhere, not just on my local machine with an up-to-date GEDCOM file.&lt;/p&gt;

&lt;h1&gt;
  
  
  Third Server: Newspapers MCP
&lt;/h1&gt;

&lt;p&gt;With Edison Papers and Geni working, I could trace business connections and verify family relationships. But I was still missing contemporary context: how did the &lt;em&gt;public&lt;/em&gt; see these people? What did newspapers say about CCE's operations? Were there announcements, obituaries, social mentions?&lt;/p&gt;

&lt;p&gt;Historical newspapers are digitized across dozens of national archives. Each has its own interface. Searching them all manually meant opening multiple websites, running the same query in different systems, downloading results individually.&lt;/p&gt;

&lt;p&gt;So I built a newspapers MCP that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aggregates multiple national newspaper archives&lt;/li&gt;
&lt;li&gt;Searches across collections simultaneously&lt;/li&gt;
&lt;li&gt;Returns snippets as base64-encoded images (because OCR quality varies)&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/raphink" rel="noopener noreferrer"&gt;
        raphink
      &lt;/a&gt; / &lt;a href="https://github.com/raphink/newspapers-mcp" rel="noopener noreferrer"&gt;
        newspapers-mcp
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Newspapers MCP Server&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An MCP (Model Context Protocol) server for searching online newspaper archives across multiple countries and regions. This server provides unified access to newspaper collections from around the world through a single, standardized interface.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Supported Archives&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Archive&lt;/th&gt;
&lt;th&gt;Region&lt;/th&gt;
&lt;th&gt;Source key&lt;/th&gt;
&lt;th&gt;Full-text search&lt;/th&gt;
&lt;th&gt;OCR text&lt;/th&gt;
&lt;th&gt;Snippet images&lt;/th&gt;
&lt;th&gt;API key&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Europeana Collections&lt;/td&gt;
&lt;td&gt;Europe (multi-country)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;europeana&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Optional (&lt;a href="https://pro.europeana.eu/pages/get-api" rel="nofollow noopener noreferrer"&gt;get key&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gallica (BnF)&lt;/td&gt;
&lt;td&gt;France&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gallica&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deutsche Digitale Bibliothek&lt;/td&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ddb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;digiPress (BSB)&lt;/td&gt;
&lt;td&gt;Germany / Bavaria&lt;/td&gt;
&lt;td&gt;&lt;code&gt;digipress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ANNO (Austrian NL)&lt;/td&gt;
&lt;td&gt;Austria / Austro-Hungarian Empire&lt;/td&gt;
&lt;td&gt;&lt;code&gt;anno&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delpher (KB)&lt;/td&gt;
&lt;td&gt;Netherlands&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delpher&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chronicling America (LoC)&lt;/td&gt;
&lt;td&gt;United States&lt;/td&gt;
&lt;td&gt;&lt;code&gt;chronicling_america&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;eLuxemburgensia (BnL)&lt;/td&gt;
&lt;td&gt;Luxembourg&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eluxemburgensia&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trove (NLA)&lt;/td&gt;
&lt;td&gt;Australia&lt;/td&gt;
&lt;td&gt;&lt;code&gt;trove&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Required (free — &lt;a href="https://trove.nla.gov.au/about/create-something/using-api" rel="nofollow noopener noreferrer"&gt;get key&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Norwegian NL (nb.no)&lt;/td&gt;
&lt;td&gt;Norway&lt;/td&gt;
&lt;td&gt;&lt;code&gt;norwegian&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/raphink/newspapers-mcp" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Here’s a real example:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;I asked Claude to search for "Joseph Dreyfus grain Paris 1895" (a grain merchant in the family who had a financial collapse). The MCP found the &lt;em&gt;concordataire liquidation&lt;/em&gt; announcement in French commercial journals. That single search led to discovering a 90-page Archives de Paris dossier (D14U³/89) I'm still analyzing.&lt;/p&gt;

&lt;p&gt;One search. Ten minutes. What would have been days of archive website navigation.&lt;/p&gt;

&lt;h1&gt;
  
  
  How They Work Together: Finding Solomon Rau in Munich
&lt;/h1&gt;

&lt;p&gt;Here's a recent example showing how the MCPs orchestrate together:&lt;/p&gt;

&lt;p&gt;I asked Claude to search for Solomon Rau's activity in Munich newspapers. The newspapers MCP returned various results, including this advertisement:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ch2earn53443pwxiifw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ch2earn53443pwxiifw.png" alt="DDSG Announcement" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This ad showed Solomon Rau advertising the reimbursement of DDSG (Danube Steam Shipping Company) stock — a discovery that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Revealed his business activity (financial/stock trading)&lt;/li&gt;
&lt;li&gt;Connected him to DDSG, a major shipping company&lt;/li&gt;
&lt;li&gt;Provided a concrete date and location (Munich)&lt;/li&gt;
&lt;li&gt;Led to further discoveries about other family members' activities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude then cross-referenced this against the Geni tree to verify Solomon's identity and relationships, and documented the finding in Notion with the newspaper snippet as a source.&lt;/p&gt;

&lt;p&gt;It then correlated it to the DDSG stock that Adolphe Grünberg, Solomon’s son-in-law, had in his post-mortem inventory the next year in 1878, and added another note there.&lt;/p&gt;

&lt;p&gt;Have you built AI integration for research yourself? What were your best findings?&lt;/p&gt;

</description>
      <category>genealogy</category>
      <category>ai</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
