[{"data":1,"prerenderedAt":9110},["ShallowReactive",2],{"db-company":3,"page-allarticles-en":24,"articles-list-all-articles-no-filter-en":47},{"id":4,"extension":5,"meta":6,"stem":22,"__hash__":23},"db/db/company.json","json",{"name":7,"registrationNumber":8,"businessNumber":8,"dateOfIncorporation":9,"type":8,"publicationManager":7,"registeredOffice":10,"corporateOffice":14,"emails":19,"social":20,"url":21},"Nicolas Bages","","1986",{"phone":11,"address":12},"none",{"unit":8,"street":8,"postalCode":13,"city":8,"country":8},false,{"phone":15,"address":16},"+00/00000000",{"unit":8,"street":8,"postalCode":8,"city":8,"country":8,"gps":17},{"latitude":18,"longitude":18},0,{"sales":8},{"facebook":8,"linkedin":8,"x":8,"instagram":8,"teams":8,"gmaps":8},{"website":8},"db/company","0ivZqUmrLRJhhXT1FJE9r0Yfyu61ogQvu0tIXACVB04",{"id":25,"title":26,"body":27,"description":33,"extension":34,"meta":35,"navigation":41,"path":42,"seo":43,"sitemap":44,"stem":45,"__hash__":46},"pages_en/articles.md","All articles",{"type":28,"value":29,"toc":30},"minimark",[],{"title":8,"searchDepth":31,"depth":31,"links":32},2,[],"All articles, only sorted by date.","md",{"hero":36},{"content":37,"brIndexes":40},[38],{"text":26,"style":39},"alt",[18],true,"/articles",{"title":26,"description":33},{"loc":42},"articles","d0gAPqM6U20-kkR0J89Rolk2uxjwxYaVAhy3Ugt2ATY",[48,375,1920,3029,3458,3856,4003,4121,4205,4362,4444,4609,4746,4950,5060,5132,5198,5323,5703,5835,7567,8142,8433,8563,8649,8746,9004],{"id":49,"title":50,"body":51,"description":364,"extension":34,"meta":365,"navigation":41,"path":370,"seo":371,"sitemap":372,"stem":373,"__hash__":374},"pages_en/writing/articles/strategy-sovereignty-ai-learning-loop-means-value-creation.md","Strategy, sovereignty and what the AI learning loop means for value creation",{"type":28,"value":52,"toc":348},[53,58,70,86,89,92,96,99,102,135,138,141,156,159,163,166,169,172,192,197,200,203,208,211,214,217,221,224,227,231,234,237,240,244,247,264,268,271,291,295,298,301,319,323,326,329,332,335,338,342,345],[54,55,57],"h2",{"id":56},"a-take-on-architectural-strategy-and-ai","A take on architectural strategy and AI",[59,60,61,62,69],"p",{},"When Microsoft CEO Satya Nadella published his article on X, ",[63,64,68],"a",{"href":65,"rel":66},"https://x.com/satyanadella/article/2066182223213293753?lang=en",[67],"nofollow","A frontier without an ecosystem is not stable",", I saw the tech world focused heavily on what it meant for big companies. But as I read it through it, I thought about the impact on individual creators, freelancers, and small companies like Weinto. This article is a good warning for everyone, big or small.",[59,71,72,73,77,78,81,82,85],{},"Nadella talks about a distinction between ",[74,75,76],"strong",{},"Human Capital"," (our judgment, taste, and relationships) versus ",[74,79,80],{},"Token Capital"," (the proprietary AI workflows, context, and memory we build). He warns that simply renting a frontier model like GPT, Gemini, Opus is a dead end. Models are becoming commodities. True, durable intellectual property sits in the ",[74,83,84],{},"learning loop",". The compounding cycle where human feedback refines AI systems, and those systems retain the organizational memory.",[59,87,88],{},"For freelancers or small businesses, ignoring this means falling into the \"wrapper trap\". In other words, wrapping a business value around someone else's model, instead of wrapping an AI model safely inside our own proprietary system.. Those who just use AI as a faster typewriter without a loop are just offloading execution and learning. From my personal experience, this is the best way to become entirely replaceable.",[59,90,91],{},"Then I saw a perfect connexion with my article \"Curiosity and intelligence: The case for M-Shaped professionals\" where I shared my thoughts on curiosity, learning and leveraging its practice.",[54,93,95],{"id":94},"the-connexion-between-curiosity-intelligence-and-the-learning-loop","The connexion between curiosity, intelligence and the Learning Loop",[59,97,98],{},"In my article, I exaplained that traditional \"I-shaped\" vertical experts are at risk. Under structural technological shifts, professionals often suffer from a high need for cognitive closure, retreating deeper and deeper into their silos. It is fair to say that the future belongs to M-Shaped professionals or at least the curious ones. Why? Because these profiles combine boundary spanning, metacognition, and prospective capability.",[59,100,101],{},"When we connect this to Nadella's learning loop, becoming multi-disciplinary is how you build Token Capital. This isn't trivial but the goal is to turn raw human curiosity, exploration, and judgement into a structured operational framework.",[103,104,105,114,121,128],"ul",{},[106,107,108,110,111],"li",{},[74,109,76],{}," --> (Curiosity & structured workflow) --> ",[74,112,113],{},"Systemic documentation",[106,115,116,118,119],{},[74,117,113],{}," --> (Prompt Chaining) --> ",[74,120,80],{},[106,122,123,118,125],{},[74,124,80],{},[74,126,127],{},"Compounded moat",[106,129,130,132,133],{},[74,131,127],{}," --> (Feedback loop) --> ",[74,134,76],{},[59,136,137],{},"This has to be everyone's task, not an easy one but critical, to document the vocabulary, the rules, the dependencies, the steps and the exceptions.",[59,139,140],{},"Documentation is already undervalued in small businesses but the gap will grow if they don't produces clean, structured knowledge that serves two purposes:",[142,143,144,150],"ol",{},[106,145,146,149],{},[74,147,148],{},"Feeds the team (Human Capital):"," Preserve the organizational playbooks, so the organisation's memory isn't locked in individuals' heads.",[106,151,152,155],{},[74,153,154],{},"Feeds the AI (Token Capital):"," Provide the exact context, custom knowledge bases, and ways to evaluate and improve outputs for the AI to execute autonomously.",[59,157,158],{},"By modeling the curiosity and learning architecturally, we ensure that every manual intervention or creative pivot translates into a reusable context and an improved system. We turn raw human judgment into a the \"hill climbing machine\" described by Nadella.",[54,160,162],{"id":161},"the-human-factor-to-avoid-wasting-resources","The human factor to avoid wasting resources",[59,164,165],{},"Building a learning loop is exciting and, to me, a stimulating intellectual exercise on its own already. But it must serve the business and the humans involved. Otherwise, there is no point on spending resources at it. We risk what many builders focus on, going fast but blindly toward appealing outputs rather than outcomes.",[59,167,168],{},"In an AI-native world, it's is becoming easier and easier to fall into this AI wrapper trap where we start celebrating how many prompts we have, how many skills we copy, how many token are burnt. But there is no serious and professional automated pipelines without moving a single business metric. Even if the work done is beautiful, we're here for value, not for a hobby.",[59,170,171],{},"To ensure the learning loop translates into real value, we must organize the execution withing 3 levels of work: Strategic, Operational, and Tactical.",[142,173,174,180,186],{},[106,175,176,179],{},[74,177,178],{},"Strategic work",": Vision and agnostic architecture.",[106,181,182,185],{},[74,183,184],{},"Operational work",": The Learning Loop (traces, framework like TOGAF, data, continuous improvement).",[106,187,188,191],{},[74,189,190],{},"Tactical work",": Model-assisted Execution and experimentation.",[193,194,196],"h4",{"id":195},"_1-strategic-work","1. Strategic work",[59,198,199],{},"At that level, the focus is on creating a sovereign Token Capital, the creation of intellactuall property that cannot be copy/pasted by competitors.",[59,201,202],{},"That means ensuring that the business's core intelligence lives within its own data and architecture, not inside external models. It means designing systems so we can swap out the engine (a model for example) without loosing the organisation's memory.",[204,205,207],"h3",{"id":206},"_2-operational-work","2. Operational Work",[59,209,210],{},"Here, the focus is on connecting long-term strategy to daily execution through repeatable workflows.",[59,212,213],{},"This is where the TOGAF framework can be implemented or used as an inspiration for small teams. Architect and build the infrastructure, the DBs, the MDs and any other artifacts repositories, the automated feedback loops that keeps and traces human work. Every task performed is captured to reinforce the learning environment. This operational work ensures that when a tactical task succeeds or fails, the signal is automatically kept and used to upgrade the system.",[59,215,216],{},"This is when metacognition is an asset. Being able to audit one's self work and trace it back to the architectural decisions that enabled or constrained it. It's the difference between being a thinker or a doer. Along the way, it becomes the difference between being a wrapper at risk of an underlying technology or being in control of the business.",[204,218,220],{"id":219},"_3-tactical-work","3. Tactical Work",[59,222,223],{},"Now how to do at the task level? Think short-term daily actions, feature generation, and rapid experimentation.",[59,225,226],{},"This is the domain of execution, heavily offloaded to AI models. The AI handles the bulk processing, code generation and other draft of our documents. The human should act as a supervisor with his judgement, context, and domain knowledge to guide the AI. The AI delivers the output, the human still thinks outcome at his level to craft and refine the AI loop. This is where every manual edit made is treated as a mini-experiment to train the larger \"operational system\".",[54,228,230],{"id":229},"how-to-stay-on-track","How to stay on track?",[59,232,233],{},"We have the \"Why\" of why a business of any size will be called to implement the learning loop and sovereign system around AI Token Capital while keeping Human Capital as a driver. We also thought about a framework of execution. Now come the measurement of success. It's always good to be more productive or to increase capital but to what end? How do we know it serves the business and the humans involved?",[59,235,236],{},"Not measuring a process leads to broken systems. Thus, not being able to measure the learning loop means running a lottery, not a system. Especially in a context of fast and highly contributive changes. Objectives and Key Results cannot be exported quarterly as lagging indicators. They must be measurable rapidly, continuously I'd say, so the loop can be adapted in real time.",[59,238,239],{},"Here is the operational OKR framework I use to monitor whether my system (or Weinto's) is actually serving humans and compounding capital:",[204,241,243],{"id":242},"_1-internal-value","1. Internal value",[59,245,246],{},"Help the team accept AI as a tool and not as a threat while allowing everyone to think more broadly. The goal is to make sure that the team isn't burning out but instead building their own horizontal work capabilities.",[103,248,249,257],{},[106,250,251,252,256],{},"KR1: Reduce time spent on low-cognitive, operational tasks by ",[253,254,255],"code",{},"x%",", while maintaining the current work hours in a week.",[106,258,259,260,263],{},"KR2: 100% of critical project post-mortems and client feedback cycles are systematically ingested into the private knowledge base within ",[253,261,262],{},"x"," hours of project close.",[204,265,267],{"id":266},"_2-external-value","2. External value",[59,269,270],{},"Clients don't care if we use AI or not. They care about the value we provide. If the system is working, the learning loop should compress delivery time, yes. That is where charging work by hour or by day doesn't make sense anymore. Client will give less value to time and more to whom has the best systems (AI, human or else) for their needs. Delivering faster and tailored experiences is hard, often due to a lack of time. The Token Capital can be leveraged to flip that constraint.",[103,272,273,279,285],{},[106,274,275,276,278],{},"KR1: Increase the incrementatal scope acceptance rate by ",[253,277,255],{},". In other words, how team can pivot on features and other requests wille keeping control over the delivery deadline.",[106,280,281,282,284],{},"KR2: Reduce the time to a working proof-of-concept by ",[253,283,255],{},".",[106,286,287,288,290],{},"KR3: Increase the post delivery satisfaction score by ",[253,289,262],{}," on AI-assisted outputs / outcomes. It is important to make sure that speed does not lower the quality and value provided.",[204,292,294],{"id":293},"_3-structural-value","3. Structural value",[59,296,297],{},"We've talked about a business being wrapper around AI or AI being a wrapper around the business. We want the latter. So we need to ensure that we're building toward that goal while remaining sovereign.",[59,299,300],{},"The goal is to prove that the business has real value that exists independent of people or external AI providers. In other word, is it real or just a belief?",[103,302,303,306,312],{},[106,304,305],{},"KR1: Migrate a core business workflow from one foundation model vendor to another with 0% loss in terms of context, accuracy and results.",[106,307,308,309,311],{},"KR2: Decrease by ",[253,310,255],{}," the human input required for repetitive complex workflow over 2 quarters. The loop must grow with its users.",[106,313,314,315,318],{},"KR3: ",[253,316,317],{},"100%"," of critical work and edge-cases resolutions are documented and available to the system. No knowledge loss should occur, even when a freelancer is offboarded.",[54,320,322],{"id":321},"observations","Observations",[59,324,325],{},"In theory, that approach implies teaching systems that will need less human intervention over time. As an engineer, a system (OS, software, application, etc...) could never replace my job. It's a system like a car is a system. Yes, we need less horses. Did transportation disappear? No. It increased instead !",[59,327,328],{},"In that regard, the illusion that deep technical specialization or legacy processes will shield professionals from the AI is wrong. This logic is dangerously blind to the economic reality hitting us right now. This is like a horse rider specializing in breeding an elite breed because \"a car will never be able to\"...",[59,330,331],{},"In complex engineering environments, scoping a problem is hard but not every business is a large company with hundreds or thousands of employes. True. Most small businesses don't run with 50 pages technical specifications. They sell days of human labor wrapped in some creative hype, relationship-building, or worse, emotional alignment with the client. Nothing that an AI system won't be able to provide. The difference is that we're only at the beginning.",[59,333,334],{},"That said, I don't see firing juniors or over-relying on seniors is a sustainable strategy on the long term. Businesses serve humans, even if they're not aware of it. So human should be part of the picture. They should be trained to use and build their systems. Who will build the AI loop and adapt system to human clients' needs if only AI driving?",[59,336,337],{},"AI is not just a tool. It is a structural change, a new paradigm. New architectures are emerging and each business should build its own systems. And don't believe those saysing \"the level of expertise is not matched\", they often fall short at completing the sentense by \"yet\". This mindset grants only a few months, if not lost already.",[54,339,341],{"id":340},"conclusion","Conclusion",[59,343,344],{},"For decades, freelancers and experts (myself included) have used the \"daily rate\" as a metric to bill clients. I've never really enjoyed it because it meant I was rewarded for being slow and punished for being fast. With AI, that equation gets flipped, this is good. My competitive advantage should remain my capacity to think and increase value.",[59,346,347],{},"Don't spend your energy trying to protect a legacy workflow or comforting yourself with the illusion that \"the AI still needs me to click the button\". Widen your own scope and horizon, build an ecosystem for yourself or contribute to a learning loops.",{"title":8,"searchDepth":31,"depth":31,"links":349},[350,351,352,357,362,363],{"id":56,"depth":31,"text":57},{"id":94,"depth":31,"text":95},{"id":161,"depth":31,"text":162,"children":353},[354,356],{"id":206,"depth":355,"text":207},3,{"id":219,"depth":355,"text":220},{"id":229,"depth":31,"text":230,"children":358},[359,360,361],{"id":242,"depth":355,"text":243},{"id":266,"depth":355,"text":267},{"id":293,"depth":355,"text":294},{"id":321,"depth":31,"text":322},{"id":340,"depth":31,"text":341},"Most small businesses are wrapping their value around someone else's AI engine. That's a lottery. Let's try to think the feedback loop between humans and AI to outsmart an easy trap.",{"status":366,"publication_date":367,"views":368},"published","2026-06-28",[369],"strategist","/writing/articles/strategy-sovereignty-ai-learning-loop-means-value-creation",{"title":50,"description":364},{"loc":370},"writing/articles/strategy-sovereignty-ai-learning-loop-means-value-creation","cuDu6yyHcYU7lhm6g1Mvh31epx2txMTW3ZjjpFz045g",{"id":376,"title":377,"body":378,"description":1910,"extension":34,"meta":1911,"navigation":41,"path":1915,"seo":1916,"sitemap":1917,"stem":1918,"__hash__":1919},"pages_en/building/articles/vscode-ghost-files-remote-server.md","VSCode ghost files in remote server",{"type":28,"value":379,"toc":1903},[380,387,466,469,551,561,583,586,590,597,604,648,655,668,672,675,968,978,994,1010,1017,1022,1047,1057,1060,1073,1080,1084,1091,1300,1309,1325,1824,1827,1859,1862,1869,1873,1880,1896,1899],[59,381,382,383,386],{},"Today I opened a remote SSH workspace on a server with VSCode. As an engineer, few things trigger your immediate response faster than running ",[253,384,385],{},"git status"," and finding a random, cryptic file I did not create right in the root directory of a projet.",[388,389,393],"pre",{"className":390,"code":391,"language":392,"meta":8,"style":8},"language-bash shiki shiki-themes plastic","Untracked files:\n  (use \"git add \u003Cfile>...\" to include in what will be committed)\n    ''$'\\001''4'$'\\253\\006''@W@8'\n\n","bash",[253,394,395,408,450],{"__ignoreMap":8},[396,397,400,404],"span",{"class":398,"line":399},"line",1,[396,401,403],{"class":402},"sJix2","Untracked",[396,405,407],{"class":406},"subq3"," files:\n",[396,409,410,414,417,420,423,426,429,432,435,438,441,444,447],{"class":398,"line":31},[396,411,413],{"class":412},"sGSqi","  (",[396,415,416],{"class":402},"use",[396,418,419],{"class":412}," \"",[396,421,422],{"class":406},"git add \u003Cfile>...",[396,424,425],{"class":412},"\"",[396,427,428],{"class":406}," to",[396,430,431],{"class":406}," include",[396,433,434],{"class":406}," in",[396,436,437],{"class":406}," what",[396,439,440],{"class":406}," will",[396,442,443],{"class":406}," be",[396,445,446],{"class":406}," committed",[396,448,449],{"class":412},")\n",[396,451,452,455,458,461,463],{"class":398,"line":355},[396,453,454],{"class":402},"    ''",[396,456,457],{"class":402},"$",[396,459,460],{"class":402},"'\\001''4'",[396,462,457],{"class":402},[396,464,465],{"class":402},"'\\253\\006''@W@8'\n",[59,467,468],{},"What t** h*** is this?",[388,470,472],{"className":390,"code":471,"language":392,"meta":8,"style":8},"ls -li\ntotal 20\n130323 -rw-r--r--  1 nicolasbages nicolasbages    0 Jun 21 10:15 ''$'\\001''4'$'\\253\\006''@W@8'\n[...]\n",[253,473,474,483,491,545],{"__ignoreMap":8},[396,475,476,479],{"class":398,"line":399},[396,477,478],{"class":402},"ls",[396,480,482],{"class":481},"sjrmR"," -li\n",[396,484,485,488],{"class":398,"line":31},[396,486,487],{"class":402},"total",[396,489,490],{"class":481}," 20\n",[396,492,493,496,499,502,505,507,510,513,516,519,522,525,528,531,534,537,539,542],{"class":398,"line":355},[396,494,495],{"class":402},"130323",[396,497,498],{"class":481}," -rw-r--r--",[396,500,501],{"class":481},"  1",[396,503,504],{"class":406}," nicolasbages",[396,506,504],{"class":406},[396,508,509],{"class":481},"    0",[396,511,512],{"class":406}," Jun",[396,514,515],{"class":481}," 21",[396,517,518],{"class":406}," 10:15",[396,520,521],{"class":412}," ''$'",[396,523,524],{"class":406},"\\001",[396,526,527],{"class":412},"''",[396,529,530],{"class":406},"4",[396,532,533],{"class":412},"'$'",[396,535,536],{"class":406},"\\253\\006",[396,538,527],{"class":412},[396,540,541],{"class":406},"@W@8",[396,543,544],{"class":412},"'\n",[396,546,548],{"class":398,"line":547},4,[396,549,550],{"class":412},"[...]\n",[59,552,553,554,556,557,560],{},"The file with the inode ",[253,555,495],{}," has a very strange name and is ",[253,558,559],{},"0 octet",". Empty, ok, maybe just a file created by a script. I deleted it.",[388,562,564],{"className":390,"code":563,"language":392,"meta":8,"style":8},"find . -inum 130323 -delete\n",[253,565,566],{"__ignoreMap":8},[396,567,568,571,574,577,580],{"class":398,"line":399},[396,569,570],{"class":402},"find",[396,572,573],{"class":406}," .",[396,575,576],{"class":481}," -inum",[396,578,579],{"class":481}," 130323",[396,581,582],{"class":481}," -delete\n",[59,584,585],{},"But then after reopening this project, it was back! The cybersecurity landscape being so noisy lately following supply chain attacks on NPM packages and VSCode extensions, it couldn't be left unchecked.",[54,587,589],{"id":588},"phase-1-catching-the-ghost","Phase 1: Catching the ghost",[59,591,592,593,596],{},"The filesystems ",[253,594,595],{},"ext4"," does not store the Creator PID inside a file's metadata, we cannot read who made it.",[59,598,599,600,603],{},"To catch it, we can use the Linux Audit Framework ",[253,601,602],{},"auditd"," on the remote host. By setting a filesystem watch rule on the workspace directory.",[388,605,607],{"className":390,"code":606,"language":392,"meta":8,"style":8},"apt install auditd\n\nauditctl -w /home/nicolasbages/playbook/ -p wa -k file_creation_tracker\n",[253,608,609,620,625],{"__ignoreMap":8},[396,610,611,614,617],{"class":398,"line":399},[396,612,613],{"class":402},"apt",[396,615,616],{"class":406}," install",[396,618,619],{"class":406}," auditd\n",[396,621,622],{"class":398,"line":31},[396,623,624],{"emptyLinePlaceholder":41},"\n",[396,626,627,630,633,636,639,642,645],{"class":398,"line":355},[396,628,629],{"class":402},"auditctl",[396,631,632],{"class":481}," -w",[396,634,635],{"class":406}," /home/nicolasbages/playbook/",[396,637,638],{"class":481}," -p",[396,640,641],{"class":406}," wa",[396,643,644],{"class":481}," -k",[396,646,647],{"class":406}," file_creation_tracker\n",[59,649,650,651,654],{},"After triggering the file creation by reloading VS Code, we query the audit logs using ",[253,652,653],{},"ausearch",":",[388,656,658],{"className":390,"code":657,"language":392,"meta":8,"style":8},"ausearch -k file_creation_tracker\n",[253,659,660],{"__ignoreMap":8},[396,661,662,664,666],{"class":398,"line":399},[396,663,653],{"class":402},[396,665,644],{"class":481},[396,667,647],{"class":406},[204,669,671],{"id":670},"the-footprints-left-by-the-process","The footprints left by the process",[59,673,674],{},"The kernel returns the following block:",[388,676,678],{"className":390,"code":677,"language":392,"meta":8,"style":8},"time->Sun Jun 21 10:30:42 2026\ntype=PROCTITLE msg=audit(1782030642.033:23): proctitle=2F62696E2F7368002F686F6D652F6E69636F6C617362616765732F2E7673636F64652D7365727665722F657874656E73696F6E732F6769746C61622E6769746C61622D776F726B666C6F772D362E38332E322F6173736574732F6C616E67756167652D7365727665722F7267002D2D76657273696F6E\ntype=PATH msg=audit(1782030642.033:23): item=1 name=0134AB0640574038 inode=130323 dev=08:02 mode=0100644 ouid=1000 ogid=1000 rdev=00:00 nametype=CREATE\ntype=CWD msg=audit(1782030642.033:23): cwd=\"/home/nicolasbages/playbook\"\ntype=SYSCALL msg=audit(1782030642.033:23): arch=c00000b7 syscall=56 success=yes exit=3 ppid=415372 pid=415409 comm=\"sh\" exe=\"/usr/bin/dash\" key=\"file_creation_tracker\"\n\n",[253,679,680,692,731,824,860],{"__ignoreMap":8},[396,681,682,685,689],{"class":398,"line":399},[396,683,684],{"class":412},"time-",[396,686,688],{"class":687},"sVyAn",">",[396,690,691],{"class":412},"Sun Jun 21 10:30:42 2026\n",[396,693,694,698,701,704,707,709,712,715,718,721,723,726,728],{"class":398,"line":31},[396,695,697],{"class":696},"sVs6v","type",[396,699,700],{"class":687},"=",[396,702,703],{"class":406},"PROCTITLE",[396,705,706],{"class":696}," msg",[396,708,700],{"class":687},[396,710,711],{"class":406},"audit",[396,713,714],{"class":412},"(",[396,716,717],{"class":402},"1782030642.033:23",[396,719,720],{"class":412},")",[396,722,654],{"class":406},[396,724,725],{"class":696}," proctitle",[396,727,700],{"class":687},[396,729,730],{"class":406},"2F62696E2F7368002F686F6D652F6E69636F6C617362616765732F2E7673636F64652D7365727665722F657874656E73696F6E732F6769746C61622E6769746C61622D776F726B666C6F772D362E38332E322F6173736574732F6C616E67756167652D7365727665722F7267002D2D76657273696F6E\n",[396,732,733,735,737,740,742,744,746,748,750,752,754,757,759,762,765,767,770,773,775,777,780,782,785,788,790,793,796,798,801,804,806,808,811,813,816,819,821],{"class":398,"line":355},[396,734,697],{"class":696},[396,736,700],{"class":687},[396,738,739],{"class":406},"PATH",[396,741,706],{"class":696},[396,743,700],{"class":687},[396,745,711],{"class":406},[396,747,714],{"class":412},[396,749,717],{"class":402},[396,751,720],{"class":412},[396,753,654],{"class":406},[396,755,756],{"class":696}," item",[396,758,700],{"class":687},[396,760,761],{"class":406},"1",[396,763,764],{"class":696}," name",[396,766,700],{"class":687},[396,768,769],{"class":406},"0134AB0640574038",[396,771,772],{"class":696}," inode",[396,774,700],{"class":687},[396,776,495],{"class":406},[396,778,779],{"class":696}," dev",[396,781,700],{"class":687},[396,783,784],{"class":406},"08:02",[396,786,787],{"class":696}," mode",[396,789,700],{"class":687},[396,791,792],{"class":406},"0100644",[396,794,795],{"class":696}," ouid",[396,797,700],{"class":687},[396,799,800],{"class":406},"1000",[396,802,803],{"class":696}," ogid",[396,805,700],{"class":687},[396,807,800],{"class":406},[396,809,810],{"class":696}," rdev",[396,812,700],{"class":687},[396,814,815],{"class":406},"00:00",[396,817,818],{"class":696}," nametype",[396,820,700],{"class":687},[396,822,823],{"class":406},"CREATE\n",[396,825,826,828,830,833,835,837,839,841,843,845,847,850,852,854,857],{"class":398,"line":547},[396,827,697],{"class":696},[396,829,700],{"class":687},[396,831,832],{"class":406},"CWD",[396,834,706],{"class":696},[396,836,700],{"class":687},[396,838,711],{"class":406},[396,840,714],{"class":412},[396,842,717],{"class":402},[396,844,720],{"class":412},[396,846,654],{"class":406},[396,848,849],{"class":696}," cwd",[396,851,700],{"class":687},[396,853,425],{"class":412},[396,855,856],{"class":406},"/home/nicolasbages/playbook",[396,858,859],{"class":412},"\"\n",[396,861,863,865,867,870,872,874,876,878,880,882,884,887,889,892,895,897,900,903,905,908,911,913,916,919,921,924,927,929,932,935,937,939,942,944,947,949,951,954,956,959,961,963,966],{"class":398,"line":862},5,[396,864,697],{"class":696},[396,866,700],{"class":687},[396,868,869],{"class":406},"SYSCALL",[396,871,706],{"class":696},[396,873,700],{"class":687},[396,875,711],{"class":406},[396,877,714],{"class":412},[396,879,717],{"class":402},[396,881,720],{"class":412},[396,883,654],{"class":406},[396,885,886],{"class":696}," arch",[396,888,700],{"class":687},[396,890,891],{"class":406},"c00000b7",[396,893,894],{"class":696}," syscall",[396,896,700],{"class":687},[396,898,899],{"class":406},"56",[396,901,902],{"class":696}," success",[396,904,700],{"class":687},[396,906,907],{"class":406},"yes",[396,909,910],{"class":696}," exit",[396,912,700],{"class":687},[396,914,915],{"class":406},"3",[396,917,918],{"class":696}," ppid",[396,920,700],{"class":687},[396,922,923],{"class":406},"415372",[396,925,926],{"class":696}," pid",[396,928,700],{"class":687},[396,930,931],{"class":406},"415409",[396,933,934],{"class":696}," comm",[396,936,700],{"class":687},[396,938,425],{"class":412},[396,940,941],{"class":406},"sh",[396,943,425],{"class":412},[396,945,946],{"class":696}," exe",[396,948,700],{"class":687},[396,950,425],{"class":412},[396,952,953],{"class":406},"/usr/bin/dash",[396,955,425],{"class":412},[396,957,958],{"class":696}," key",[396,960,700],{"class":687},[396,962,425],{"class":412},[396,964,965],{"class":406},"file_creation_tracker",[396,967,859],{"class":412},[59,969,970,971,973,974,977],{},"At first glance, we see ",[253,972,953],{}," but we need to check for arguments because ",[253,975,976],{},"dash"," alone, while being the \"culprit\", doesn't help much.",[59,979,980,981,984,985,654],{},"The ",[253,982,983],{},"proctitle"," field contains the raw hex of the command. Let's ",[63,986,989,990,993],{"href":987,"rel":988},"https://codebeautify.org/hex-string-converter",[67],"convert that string (",[253,991,992],{},"2F62696E2F736800...",") back into human-readable ASCII text",[388,995,997],{"className":390,"code":996,"language":392,"meta":8,"style":8},"/bin/sh /home/nicolasbages/.vscode-server/extensions/gitlab.gitlab-workflow-6.83.2/assets/language-server/rg --version\n",[253,998,999],{"__ignoreMap":8},[396,1000,1001,1004,1007],{"class":398,"line":399},[396,1002,1003],{"class":402},"/bin/sh",[396,1005,1006],{"class":406}," /home/nicolasbages/.vscode-server/extensions/gitlab.gitlab-workflow-6.83.2/assets/language-server/rg",[396,1008,1009],{"class":481}," --version\n",[59,1011,1012,1013,1016],{},"Alright, it executes ",[253,1014,1015],{},"rg",". RipGrep is a tool bundled in IDEs and extensions to parse code syntax. We will see later that it is buddled with the extension.",[59,1018,980,1019,1021],{},[253,1020,869],{}," line tells us:",[103,1023,1024,1034],{},[106,1025,1026,1029,1030,1033],{},[253,1027,1028],{},"syscall=56",": This maps to the ",[253,1031,1032],{},"openat"," system call.",[106,1035,1036,1039,1040,1043,1044,284],{},[253,1037,1038],{},"a2=241",": Translated from hex ",[253,1041,1042],{},"0x241"," into POSIX file system it means ",[253,1045,1046],{},"O_CREAT | O_WRONLY | O_TRUNC",[59,1048,1049,1050,1053,1054,284],{},"So, the process requested the OS to create a new ",[253,1051,1052],{},"WO"," file inside its current working directory ",[253,1055,1056],{},"cwd=\"/home/nicolasbages/playbook\"",[59,1058,1059],{},"At that moment in time I started to think it looked more like a bug than an attack.",[103,1061,1062,1065,1068],{},[106,1063,1064],{},"0 byte footprint.",[106,1066,1067],{},"file visible in the root directory of the project.",[106,1069,1070,1072],{},[253,1071,1015],{}," is known.",[59,1074,1075,1076,1079],{},"But, why would a simple version check ",[253,1077,1078],{},"rg --version"," create an empty file inside my project workspace?",[54,1081,1083],{"id":1082},"phase-2-looking-for-the-upstream-bug","Phase 2: Looking for the upstream bug",[59,1085,1086,1087,1090],{},"Time to investigate the ",[253,1088,1089],{},"gitlab.gitlab-workflow-6.83.2"," extension.",[388,1092,1094],{"className":390,"code":1093,"language":392,"meta":8,"style":8},"cat /home/nicolasbages/.vscode-server/extensions/gitlab.gitlab-workflow-6.83.2/assets/language-server/main-bundle-node.js | grep \"rg --version\"\n# nothing\n\ncat /home/nicolasbages/.vscode-server/extensions/gitlab.gitlab-workflow-6.83.2/assets/language-server/main-bundle-node.js | grep \"rg \"\n[...]\n(`rg already extracted at ${s}`),s;(0,AD.mkdirSync)(n,{recursive:!0});let a=`${s}.tmp.${process.pid}`;return(0,AD.writeFileSync)(a,t),process.platform!==\"win32\"&&(0,AD.chmodSync)(a,493),(0,AD.renameSync)(a,s),this.#e.info(`rg extracted to ${s}`),s}static{Lgi()}});\n[...]\n# Ah !\n",[253,1095,1096,1116,1122,1126,1143,1147,1289,1294],{"__ignoreMap":8},[396,1097,1098,1101,1104,1107,1110,1112,1114],{"class":398,"line":399},[396,1099,1100],{"class":402},"cat",[396,1102,1103],{"class":406}," /home/nicolasbages/.vscode-server/extensions/gitlab.gitlab-workflow-6.83.2/assets/language-server/main-bundle-node.js",[396,1105,1106],{"class":687}," |",[396,1108,1109],{"class":402}," grep",[396,1111,419],{"class":412},[396,1113,1078],{"class":406},[396,1115,859],{"class":412},[396,1117,1118],{"class":398,"line":31},[396,1119,1121],{"class":1120},"ssUfO","# nothing\n",[396,1123,1124],{"class":398,"line":355},[396,1125,624],{"emptyLinePlaceholder":41},[396,1127,1128,1130,1132,1134,1136,1138,1141],{"class":398,"line":547},[396,1129,1100],{"class":402},[396,1131,1103],{"class":406},[396,1133,1106],{"class":687},[396,1135,1109],{"class":402},[396,1137,419],{"class":412},[396,1139,1140],{"class":406},"rg ",[396,1142,859],{"class":412},[396,1144,1145],{"class":398,"line":862},[396,1146,550],{"class":412},[396,1148,1150,1152,1155,1157,1160,1163,1166,1169,1171,1174,1177,1180,1183,1186,1189,1192,1195,1198,1201,1203,1206,1209,1211,1214,1216,1219,1221,1224,1227,1229,1232,1234,1237,1240,1243,1246,1249,1252,1255,1257,1260,1262,1265,1267,1270,1273,1275,1277,1280,1282,1284,1286],{"class":398,"line":1149},6,[396,1151,714],{"class":412},[396,1153,1154],{"class":412},"`",[396,1156,1015],{"class":402},[396,1158,1159],{"class":406}," already extracted at ",[396,1161,1162],{"class":412},"${",[396,1164,1165],{"class":696},"s",[396,1167,1168],{"class":412},"}`",[396,1170,720],{"class":412},[396,1172,1173],{"class":402},",s",[396,1175,1176],{"class":412},";(",[396,1178,1179],{"class":402},"0,AD.mkdirSync",[396,1181,1182],{"class":412},")(",[396,1184,1185],{"class":402},"n,",[396,1187,1188],{"class":406},"{recursive:!0}",[396,1190,1191],{"class":412},");",[396,1193,1194],{"class":402},"let",[396,1196,1197],{"class":406}," a=",[396,1199,1200],{"class":412},"`${",[396,1202,1165],{"class":696},[396,1204,1205],{"class":412},"}",[396,1207,1208],{"class":406},".tmp.",[396,1210,1162],{"class":412},[396,1212,1213],{"class":696},"process",[396,1215,284],{"class":406},[396,1217,1218],{"class":696},"pid",[396,1220,1168],{"class":412},[396,1222,1223],{"class":412},";",[396,1225,1226],{"class":687},"return",[396,1228,714],{"class":412},[396,1230,1231],{"class":406},"0,AD.writeFileSync",[396,1233,1182],{"class":412},[396,1235,1236],{"class":402},"a,t",[396,1238,1239],{"class":412},"),process.platform",[396,1241,1242],{"class":687},"!",[396,1244,1245],{"class":406},"==",[396,1247,1248],{"class":402},"\"win32\"",[396,1250,1251],{"class":412},"&&(",[396,1253,1254],{"class":402},"0,AD.chmodSync",[396,1256,1182],{"class":412},[396,1258,1259],{"class":402},"a,493",[396,1261,720],{"class":412},[396,1263,1264],{"class":402},",(0,AD.renameSync",[396,1266,1182],{"class":412},[396,1268,1269],{"class":402},"a,s",[396,1271,1272],{"class":412},"),this.#e.info(",[396,1274,1154],{"class":412},[396,1276,1015],{"class":402},[396,1278,1279],{"class":406}," extracted to ",[396,1281,1162],{"class":412},[396,1283,1165],{"class":696},[396,1285,1168],{"class":412},[396,1287,1288],{"class":412},"),s}static{Lgi()}});\n",[396,1290,1292],{"class":398,"line":1291},7,[396,1293,550],{"class":412},[396,1295,1297],{"class":398,"line":1296},8,[396,1298,1299],{"class":1120},"# Ah !\n",[59,1301,1302,1303,1308],{},"Let's download Gitlab workflow language server from ",[63,1304,1307],{"href":1305,"rel":1306},"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp",[67],"Gitlab's official repository"," and look at the original source code.",[59,1310,1311,1312,1319,1320,284],{},"Turns out the piece of code found with grep in the minified code comes from ",[63,1313,1316],{"href":1314,"rel":1315},"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/blob/5af81841a354ade0d329acaca09b38b12709f52a/packages/lib_workflow_executor/src/services/default_rg_binary_provider.ts",[67],[253,1317,1318],{},"packages/lib_workflow_executor/src/services/default_rg_binary_provider.ts","\nadded ",[63,1321,1324],{"href":1322,"rel":1323},"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp/-/commit/5af81841a354ade0d329acaca09b38b12709f52a",[67],"2 months ago",[388,1326,1330],{"className":1327,"code":1328,"language":1329,"meta":8,"style":8},"language-ts shiki shiki-themes plastic","// packages/lib_workflow_executor/src/services/default_rg_binary_provider.ts\n\n  async #extractBinary(): Promise\u003Cstring> {\n    // Use Node fs to read the embedded file (works in both Bun and Node runtimes)\n    const binaryData = readFileSync(this.#embeddedPath);\n\n    const hash = createHash(\"sha256\")\n      .update(binaryData)\n      .digest(\"hex\")\n      .slice(0, 8);\n\n    const binaryName = process.platform === \"win32\" ? \"rg.exe\" : \"rg\";\n    const extractDir = join(tmpdir(), \"gitlab-duo-cli\", \"bin\", hash);\n    const extractedPath = join(extractDir, binaryName);\n\n    if (existsSync(extractedPath)) {\n      this.#logger.info(`rg already extracted at ${extractedPath}`);\n      return extractedPath;\n    }\n\n    mkdirSync(extractDir, { recursive: true });\n\n    // Write to temp file first, then atomically rename to avoid corrupted binary\n    // if process is killed mid-write\n    const tmpPath = `${extractedPath}.tmp.${process.pid}`;\n    writeFileSync(tmpPath, binaryData);\n\n    if (process.platform !== \"win32\") {\n      chmodSync(tmpPath, 0o755);\n    }\n\n    renameSync(tmpPath, extractedPath);\n\n    this.#logger.info(`rg extracted to ${extractedPath}`);\n    return extractedPath;\n  }\n","ts",[253,1331,1332,1337,1341,1370,1375,1402,1406,1429,1434,1449,1455,1460,1495,1540,1564,1569,1589,1608,1614,1620,1625,1637,1642,1648,1654,1685,1702,1707,1733,1746,1751,1756,1772,1777,1808,1818],{"__ignoreMap":8},[396,1333,1334],{"class":398,"line":399},[396,1335,1336],{"class":1120},"// packages/lib_workflow_executor/src/services/default_rg_binary_provider.ts\n",[396,1338,1339],{"class":398,"line":31},[396,1340,624],{"emptyLinePlaceholder":41},[396,1342,1343,1346,1349,1352,1355,1359,1362,1365,1367],{"class":398,"line":355},[396,1344,1345],{"class":696},"  async",[396,1347,1348],{"class":412}," #",[396,1350,1351],{"class":402},"extractBinary",[396,1353,1354],{"class":412},"(): ",[396,1356,1358],{"class":1357},"sVbv2","Promise",[396,1360,1361],{"class":687},"\u003C",[396,1363,1364],{"class":696},"string",[396,1366,688],{"class":687},[396,1368,1369],{"class":412}," {\n",[396,1371,1372],{"class":398,"line":547},[396,1373,1374],{"class":1120},"    // Use Node fs to read the embedded file (works in both Bun and Node runtimes)\n",[396,1376,1377,1380,1383,1386,1389,1391,1394,1396,1399],{"class":398,"line":862},[396,1378,1379],{"class":412},"    const ",[396,1381,1382],{"class":696},"binaryData",[396,1384,1385],{"class":687}," =",[396,1387,1388],{"class":402}," readFileSync",[396,1390,714],{"class":412},[396,1392,1393],{"class":687},"this",[396,1395,284],{"class":412},[396,1397,1398],{"class":696},"#embeddedPath",[396,1400,1401],{"class":412},");\n",[396,1403,1404],{"class":398,"line":1149},[396,1405,624],{"emptyLinePlaceholder":41},[396,1407,1408,1410,1413,1415,1418,1420,1422,1425,1427],{"class":398,"line":1291},[396,1409,1379],{"class":412},[396,1411,1412],{"class":696},"hash",[396,1414,1385],{"class":687},[396,1416,1417],{"class":402}," createHash",[396,1419,714],{"class":412},[396,1421,425],{"class":412},[396,1423,1424],{"class":406},"sha256",[396,1426,425],{"class":412},[396,1428,449],{"class":412},[396,1430,1431],{"class":398,"line":1296},[396,1432,1433],{"class":412},"      .update(binaryData)\n",[396,1435,1437,1440,1442,1445,1447],{"class":398,"line":1436},9,[396,1438,1439],{"class":412},"      .digest(",[396,1441,425],{"class":412},[396,1443,1444],{"class":406},"hex",[396,1446,425],{"class":412},[396,1448,449],{"class":412},[396,1450,1452],{"class":398,"line":1451},10,[396,1453,1454],{"class":412},"      .slice(0, 8);\n",[396,1456,1458],{"class":398,"line":1457},11,[396,1459,624],{"emptyLinePlaceholder":41},[396,1461,1463,1466,1468,1471,1473,1476,1478,1481,1483,1486,1488,1490,1492],{"class":398,"line":1462},12,[396,1464,1465],{"class":412},"    const binaryName = process.platform === ",[396,1467,425],{"class":412},[396,1469,1470],{"class":406},"win32",[396,1472,425],{"class":412},[396,1474,1475],{"class":412}," ? ",[396,1477,425],{"class":412},[396,1479,1480],{"class":406},"rg.exe",[396,1482,425],{"class":412},[396,1484,1485],{"class":412}," : ",[396,1487,425],{"class":412},[396,1489,1015],{"class":406},[396,1491,425],{"class":412},[396,1493,1494],{"class":412},";\n",[396,1496,1498,1501,1504,1506,1509,1511,1514,1517,1519,1522,1524,1527,1529,1532,1534,1536,1538],{"class":398,"line":1497},13,[396,1499,1500],{"class":696},"    const",[396,1502,1503],{"class":696}," extractDir",[396,1505,1385],{"class":687},[396,1507,1508],{"class":402}," join",[396,1510,714],{"class":412},[396,1512,1513],{"class":402},"tmpdir",[396,1515,1516],{"class":412},"(), ",[396,1518,425],{"class":412},[396,1520,1521],{"class":406},"gitlab-duo-cli",[396,1523,425],{"class":412},[396,1525,1526],{"class":412},", ",[396,1528,425],{"class":412},[396,1530,1531],{"class":406},"bin",[396,1533,425],{"class":412},[396,1535,1526],{"class":412},[396,1537,1412],{"class":696},[396,1539,1401],{"class":412},[396,1541,1543,1545,1548,1550,1552,1554,1557,1559,1562],{"class":398,"line":1542},14,[396,1544,1500],{"class":696},[396,1546,1547],{"class":696}," extractedPath",[396,1549,1385],{"class":687},[396,1551,1508],{"class":402},[396,1553,714],{"class":412},[396,1555,1556],{"class":696},"extractDir",[396,1558,1526],{"class":412},[396,1560,1561],{"class":696},"binaryName",[396,1563,1401],{"class":412},[396,1565,1567],{"class":398,"line":1566},15,[396,1568,624],{"emptyLinePlaceholder":41},[396,1570,1572,1575,1578,1581,1583,1586],{"class":398,"line":1571},16,[396,1573,1574],{"class":402},"    if",[396,1576,1577],{"class":412}," (",[396,1579,1580],{"class":402},"existsSync",[396,1582,714],{"class":412},[396,1584,1585],{"class":696},"extractedPath",[396,1587,1588],{"class":412},")) {\n",[396,1590,1592,1595,1597,1600,1602,1604,1606],{"class":398,"line":1591},17,[396,1593,1594],{"class":412},"      this.#logger.info(",[396,1596,1154],{"class":412},[396,1598,1599],{"class":406},"rg already extracted at ",[396,1601,1162],{"class":412},[396,1603,1585],{"class":696},[396,1605,1168],{"class":412},[396,1607,1401],{"class":412},[396,1609,1611],{"class":398,"line":1610},18,[396,1612,1613],{"class":412},"      return extractedPath;\n",[396,1615,1617],{"class":398,"line":1616},19,[396,1618,1619],{"class":412},"    }\n",[396,1621,1623],{"class":398,"line":1622},20,[396,1624,624],{"emptyLinePlaceholder":41},[396,1626,1628,1631,1634],{"class":398,"line":1627},21,[396,1629,1630],{"class":412},"    mkdirSync(extractDir, { recursive: ",[396,1632,1633],{"class":481},"true",[396,1635,1636],{"class":412}," });\n",[396,1638,1640],{"class":398,"line":1639},22,[396,1641,624],{"emptyLinePlaceholder":41},[396,1643,1645],{"class":398,"line":1644},23,[396,1646,1647],{"class":1120},"    // Write to temp file first, then atomically rename to avoid corrupted binary\n",[396,1649,1651],{"class":398,"line":1650},24,[396,1652,1653],{"class":1120},"    // if process is killed mid-write\n",[396,1655,1657,1659,1662,1664,1667,1669,1671,1673,1675,1677,1679,1681,1683],{"class":398,"line":1656},25,[396,1658,1500],{"class":696},[396,1660,1661],{"class":696}," tmpPath",[396,1663,1385],{"class":687},[396,1665,1666],{"class":412}," `${",[396,1668,1585],{"class":696},[396,1670,1205],{"class":412},[396,1672,1208],{"class":406},[396,1674,1162],{"class":412},[396,1676,1213],{"class":696},[396,1678,284],{"class":412},[396,1680,1218],{"class":696},[396,1682,1168],{"class":412},[396,1684,1494],{"class":412},[396,1686,1688,1691,1693,1696,1698,1700],{"class":398,"line":1687},26,[396,1689,1690],{"class":402},"    writeFileSync",[396,1692,714],{"class":412},[396,1694,1695],{"class":696},"tmpPath",[396,1697,1526],{"class":412},[396,1699,1382],{"class":696},[396,1701,1401],{"class":412},[396,1703,1705],{"class":398,"line":1704},27,[396,1706,624],{"emptyLinePlaceholder":41},[396,1708,1710,1712,1714,1716,1718,1721,1724,1726,1728,1730],{"class":398,"line":1709},28,[396,1711,1574],{"class":402},[396,1713,1577],{"class":412},[396,1715,1213],{"class":696},[396,1717,284],{"class":412},[396,1719,1720],{"class":696},"platform",[396,1722,1723],{"class":687}," !==",[396,1725,419],{"class":412},[396,1727,1470],{"class":406},[396,1729,425],{"class":412},[396,1731,1732],{"class":412},") {\n",[396,1734,1736,1739,1741,1743],{"class":398,"line":1735},29,[396,1737,1738],{"class":402},"      chmodSync",[396,1740,714],{"class":412},[396,1742,1695],{"class":696},[396,1744,1745],{"class":412},", 0o755);\n",[396,1747,1749],{"class":398,"line":1748},30,[396,1750,1619],{"class":412},[396,1752,1754],{"class":398,"line":1753},31,[396,1755,624],{"emptyLinePlaceholder":41},[396,1757,1759,1762,1764,1766,1768,1770],{"class":398,"line":1758},32,[396,1760,1761],{"class":402},"    renameSync",[396,1763,714],{"class":412},[396,1765,1695],{"class":696},[396,1767,1526],{"class":412},[396,1769,1585],{"class":696},[396,1771,1401],{"class":412},[396,1773,1775],{"class":398,"line":1774},33,[396,1776,624],{"emptyLinePlaceholder":41},[396,1778,1780,1783,1785,1788,1790,1793,1795,1797,1800,1802,1804,1806],{"class":398,"line":1779},34,[396,1781,1782],{"class":687},"    this",[396,1784,284],{"class":412},[396,1786,1787],{"class":696},"#logger",[396,1789,284],{"class":412},[396,1791,1792],{"class":402},"info",[396,1794,714],{"class":412},[396,1796,1154],{"class":412},[396,1798,1799],{"class":406},"rg extracted to ",[396,1801,1162],{"class":412},[396,1803,1585],{"class":696},[396,1805,1168],{"class":412},[396,1807,1401],{"class":412},[396,1809,1811,1814,1816],{"class":398,"line":1810},35,[396,1812,1813],{"class":696},"    return",[396,1815,1547],{"class":696},[396,1817,1494],{"class":412},[396,1819,1821],{"class":398,"line":1820},36,[396,1822,1823],{"class":412},"  }\n",[59,1825,1826],{},"This class shows:",[142,1828,1829,1840,1846],{},[106,1830,1831,1832,1835,1836,1839],{},"The code relies on Node's ",[253,1833,1834],{},"tmpdir()"," in line 50 to find a safe directory. Usually it should be ",[253,1837,1838],{},"/tmp"," but in the context of a remote SSH environment, the directory is the workspace.",[106,1841,1842,1843,284],{},"So it writes a temprary file in the workspace directory with ",[253,1844,1845],{},"writeFileSync(tmpPath)",[106,1847,1848,1849,1851,1852,1855,1856,284],{},"The kernel receives the system call ",[253,1850,1028],{}," with the ",[253,1853,1854],{},"O_CREAT flag",". It creates the inode on disk, 0-byte, with the raw-byte name ",[253,1857,1858],{},"''$'\\001''4'$'\\253\\006''@W@8'",[59,1860,1861],{},"However, during initialization, the extension multiple spawns background shell checks. If the extension or VSCode's remote extension host decides to restart the language server, it kills the process.",[59,1863,1864,1865,1868],{},"Because Node is killed mid-operation, it never reaches the ",[253,1866,1867],{},"renameSync()"," line 69 which would move and clean up the file. And because it's a hard process termination, Node's internal garbage collection and exception handlers never run.",[54,1870,1872],{"id":1871},"clean-up-and-mitigation","Clean-up and mitigation",[59,1874,1875,1876,1879],{},"Because the filename contains raw characters, ",[253,1877,1878],{},"rm"," doesn't work.",[388,1881,1882],{"className":390,"code":563,"language":392,"meta":8,"style":8},[253,1883,1884],{"__ignoreMap":8},[396,1885,1886,1888,1890,1892,1894],{"class":398,"line":399},[396,1887,570],{"class":402},[396,1889,573],{"class":406},[396,1891,576],{"class":481},[396,1893,579],{"class":481},[396,1895,582],{"class":481},[59,1897,1898],{},"At the time of writing, there is no update available for this extension so I decided to disable it for now.",[1900,1901,1902],"style",{},"html pre.shiki code .sJix2, html code.shiki .sJix2{--shiki-default:#B57EDC}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sGSqi, html code.shiki .sGSqi{--shiki-default:#A9B2C3}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sVs6v, html code.shiki .sVs6v{--shiki-default:#C6CCD7}html pre.shiki code .ssUfO, html code.shiki .ssUfO{--shiki-default:#5F6672;--shiki-default-font-style:italic}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}",{"title":8,"searchDepth":31,"depth":31,"links":1904},[1905,1908,1909],{"id":588,"depth":31,"text":589,"children":1906},[1907],{"id":670,"depth":355,"text":671},{"id":1082,"depth":31,"text":1083},{"id":1871,"depth":31,"text":1872},"VSCode creates ghost files during its initialization process on remote servers. Spoiler, it was Gitlab Workflow.",{"publication_date":1912,"views":1913,"status":366},"2026-06-21",[1914],"builder","/building/articles/vscode-ghost-files-remote-server",{"title":377,"description":1910},{"loc":1915},"building/articles/vscode-ghost-files-remote-server","Ic8TTOK41jeYA-Gv-YBtXXAHNmfTJmW37ghdpKCb_qw",{"id":1921,"title":1922,"body":1923,"description":3017,"extension":34,"meta":3018,"navigation":41,"path":3021,"seo":3022,"sitemap":3023,"stem":3027,"__hash__":3028},"pages_en/building/articles/karakeep-kubernetes-n8n-matrix.md","From saving links to an active inbox: a smarter bookmarking workflow",{"type":28,"value":1924,"toc":2992},[1925,1929,1932,1939,1948,1951,1955,1958,1961,1967,1987,1991,2011,2015,2040,2043,2054,2057,2069,2078,2082,2087,2101,2105,2110,2131,2136,2144,2149,2166,2171,2179,2183,2187,2191,2231,2235,2239,2282,2286,2318,2329,2333,2337,2340,2344,2347,2404,2414,2418,2422,2425,2509,2513,2554,2558,2561,2564,2684,2688,2691,2695,2703,2707,2713,2716,2720,2723,2902,2909,2957,2961,2974,2977,2981,2989],[54,1926,1928],{"id":1927},"overview","Overview",[59,1930,1931],{},"I've been saving URLs in different places for a long time. Sometimes to share them, sometimes to aggregate ideas, sometimes to read later. Truth is, we collect more than we use and all these links end up in a cemetery before I can sort and process them. I needed an inbox I could automate.",[59,1933,1934,1935,1938],{},"There are several bookmark managers available and I spent some time looking at them. I wanted to self-host and automate some tasks like sharing bookmarks tagged ",[253,1936,1937],{},"X"," in a Matrix room, while avoiding duplicates.",[59,1940,1941,1942,1947],{},"A few months ago I discovered ",[63,1943,1946],{"href":1944,"rel":1945},"https://karakeep.app/",[67],"Karakeep",", an open-source bookmark manager, with a Chrome extension and an iOS app. At the time it didn't have all features I needed. They are now available or under development, thanks to the active community.",[59,1949,1950],{},"So, I decided to give Karakeep and n8n a try on a weekend project.",[54,1952,1954],{"id":1953},"architecture","Architecture",[59,1956,1957],{},"Before touching the infrastructure, we must understand the topology of the stack. Karakeep operates as a multi-tiered architecture that relies on headless browser isolation and search indexes.",[59,1959,1960],{},"Here is what we're gonna build:",[1962,1963],"img",{"src":1964,"alt":1965,"style":1966},"/_content/images/karakeep-kubernetes-n8n-matrix/karakeep-n8n-matrix-kubernetes.png","Architecture diagram","display:block; width:clamp(300px, 90%, 600px); margin:2rem auto;",[1968,1969,1970],"blockquote",{},[59,1971,1972,1975,1976,1981,1982,284],{},[74,1973,1974],{},"Note:"," Karakeep relies on SQLite only but developers have ",[63,1977,1980],{"href":1978,"rel":1979},"https://github.com/karakeep-app/karakeep/issues/1782",[67],"approved Postgres"," and ",[63,1983,1986],{"href":1984,"rel":1985},"https://github.com/karakeep-app/karakeep/pull/2825",[67],"a PR is on its way",[54,1988,1990],{"id":1989},"preparation","Preparation",[103,1992,1993,1999,2008],{},[106,1994,1995,1996,284],{},"Create a DNS record for karakeep: ",[253,1997,1998],{},"karakeep.domain.tld",[106,2000,2001,2002,2007],{},"Read the ",[63,2003,2006],{"href":2004,"rel":2005},"https://docs.karakeep.app/administration/security-considerations",[67],"security considerations"," related to web crawling and multi-users.",[106,2009,2010],{},"Ensure your Matrix and n8n instance are ready and available over HTTPS.",[54,2012,2014],{"id":2013},"install-karakeep-on-kubernetes","Install Karakeep on Kubernetes",[59,2016,980,2017,2022,2023,2028,2029,2034,2035,284],{},[63,2018,2021],{"href":2019,"rel":2020},"https://github.com/karakeep-app/karakeep",[67],"Karakeep repository"," contains the sources and ",[63,2024,2027],{"href":2025,"rel":2026},"https://github.com/karakeep-app/karakeep/tree/main/kubernetes",[67],"the Kustomize manifests",".\nThe team also maintains ",[63,2030,2033],{"href":2031,"rel":2032},"https://github.com/karakeep-app/helm-charts",[67],"a Helm chart"," based on a ",[63,2036,2039],{"href":2037,"rel":2038},"https://github.com/Code-Age/helm-template-chart",[67],"template Chart",[59,2041,2042],{},"The cluster I use runs with Traefik and Cert-Manager, so I picked the Kustomize approach because it is faster to add my own manifests.",[59,2044,2045,2050,2051,284],{},[63,2046,2049],{"href":2047,"rel":2048},"https://docs.karakeep.app/configuration/environment-variables/",[67],"Environment variables"," can be set using the ",[253,2052,2053],{},".env",[59,2055,2056],{},"Secrets must be generated beforehand:",[103,2058,2059,2064],{},[106,2060,2061],{},[253,2062,2063],{},"APPLICATION_SECRET_KEY=\"\u003Cgenerate-key>\"",[106,2065,2066],{},[253,2067,2068],{},"MEILISEARCH_MASTER_KEY=\"\u003Cgenerate-key>\"",[59,2070,2071,2072,2077],{},"The documentation comes with a ",[63,2073,2076],{"href":2074,"rel":2075},"https://docs.karakeep.app/administration/troubleshooting/",[67],"troubleshooting page"," if needed.",[54,2079,2081],{"id":2080},"administration-first-steps","Administration first steps",[1968,2083,2084],{},[59,2085,2086],{},"Note: Users cannot change their username or email, so double check the values before creating the user.",[142,2088,2089,2092,2095],{},[106,2090,2091],{},"Create an admin user by signing up first.",[106,2093,2094],{},"Create a tenant by signing up second.",[106,2096,2097,2098],{},"Disable sign up: ",[253,2099,2100],{},"APPLICATION_DISABLE_SIGNUPS=true",[54,2102,2104],{"id":2103},"understanding-the-basics","Understanding the basics",[59,2106,2107,654],{},[74,2108,2109],{},"Entries",[103,2111,2112,2115],{},[106,2113,2114],{},"Karakeep separates text entries (Notes) and url entries (Bookmarks). A note is a multi-line entry with more than a URL, while a bookmark is just a link. That little detail is important to keep in mind when creating entries because the crawler won't run on a note. However, a bookmark can be edited to add a notes!",[106,2116,2117,2118,2121,2122,2121,2125,2121,2128],{},"Open bookmark first instead of opening link: ",[74,2119,2120],{},"Settings"," → ",[74,2123,2124],{},"User Info",[74,2126,2127],{},"Bookmark Click Action",[74,2129,2130],{},"Open Bookmark Details",[59,2132,2133,654],{},[74,2134,2135],{},"Tags",[103,2137,2138,2141],{},[106,2139,2140],{},"Adding tags comes after an entry is created. There is currently no way to add tags on creation.",[106,2142,2143],{},"When playing around with Rules, one cannot act on an \"entry that has no tag\".",[59,2145,2146,654],{},[74,2147,2148],{},"Lists",[103,2150,2151,2154,2157],{},[106,2152,2153],{},"Entries can belong to one list only.",[106,2155,2156],{},"Collaborations are possible on lists by inviting other users. The list owner can promote other users to owner or admin.",[106,2158,2159,2160,2165],{},"Lists can have children (sub-lists). Developers already ",[63,2161,2164],{"href":2162,"rel":2163},"https://github.com/karakeep-app/karakeep/issues/2877",[67],"approved"," the development for the feature to collaborate on sublists.",[59,2167,2168,654],{},[74,2169,2170],{},"Productivity",[103,2172,2173,2176],{},[106,2174,2175],{},"Install Chrome extension",[106,2177,2178],{},"Install iOS app",[54,2180,2182],{"id":2181},"connecting-karakeep-to-n8n-via-webhooks","Connecting Karakeep to n8n via Webhooks",[204,2184,2186],{"id":2185},"understanding-the-lifecycle","Understanding the lifecycle",[1962,2188],{"src":2189,"alt":2190,"style":1966},"/_content/images/karakeep-kubernetes-n8n-matrix/karakeep-n8n-workflow.png","Karakeep n8n workflow",[142,2192,2193,2202,2212,2221],{},[106,2194,2195,2198,2199,284],{},[74,2196,2197],{},"Trigger event",": A bookmark is added to Karakeep. It spins up Chrome headless, parses and extracts the page and generates an event ",[253,2200,2201],{},"bookmark.crawled",[106,2203,2204,2207,2208,2211],{},[74,2205,2206],{},"Webhook",": Karakeep sends an HTTP ",[253,2209,2210],{},"POST"," request containing a light payload to n8n.",[106,2213,2214,2217,2218,284],{},[74,2215,2216],{},"Authentication",": The n8n Webhook node validates the request against Header Authentication: ",[253,2219,2220],{},"Authorization: Bearer \u003Ctoken>",[106,2222,2223,2226,2227,2230],{},[74,2224,2225],{},"API call",": n8n sends an authenticated HTTP ",[253,2228,2229],{},"GET"," request back to the Karakeep API to retrieve the complete object of a bookmark.",[204,2232,2234],{"id":2233},"webhook-configuration-on-n8n","Webhook configuration on n8n",[193,2236,2238],{"id":2237},"_1-configure-the-n8n-webhook-node","1. Configure the n8n Webhook node",[103,2240,2241,2246,2251,2257],{},[106,2242,2243,2244],{},"Node type: ",[253,2245,2206],{},[106,2247,2248,2249],{},"HTTP Method: ",[253,2250,2210],{},[106,2252,2253,2254],{},"Authentication: ",[253,2255,2256],{},"Header Auth",[106,2258,2259,2260],{},"Credentials setup:\n",[103,2261,2262,2279],{},[106,2263,2264,2265],{},"Create a new credential.\n",[103,2266,2267,2273],{},[106,2268,2269,2270],{},"Name: ",[253,2271,2272],{},"Authorization",[106,2274,2275,2276,284],{},"Value: ",[253,2277,2278],{},"Bearer YOUR_SECRET_TOKEN",[106,2280,2281],{},"Execution: Save the node and copy the Production URL or Test URL for the next step.",[193,2283,2285],{"id":2284},"_2-configure-karakeep-webhook-settings","2. Configure Karakeep webhook settings",[103,2287,2288,2300,2303,2306],{},[106,2289,2290,2291,2121,2293,2121,2296,2299],{},"Navigate to ",[74,2292,2120],{},[74,2294,2295],{},"Webhooks",[74,2297,2298],{},"Add Endpoint"," in your Karakeep instance.",[106,2301,2302],{},"Target URL: Paste the URL copied from your n8n Webhook node.",[106,2304,2305],{},"Secret / Token: Paste only your raw token string (Do not include the word Bearer or spaces here; Karakeep appends the standard prefix automatically).",[106,2307,2308,2309,1526,2312,1526,2315,284],{},"Trigger events: ",[253,2310,2311],{},"crawled",[253,2313,2314],{},"created",[253,2316,2317],{},"edited",[1968,2319,2320],{},[59,2321,2322,2323,2325,2326,2328],{},"Note: Using ",[253,2324,2314],{}," executes too quickly, before Karakeep finishes fetching page summaries, titles, and screenshots. ",[253,2327,2311],{}," ensures the full webpage data is already processed.",[204,2330,2332],{"id":2331},"fetching-complete-bookmark-content","Fetching complete bookmark content",[193,2334,2336],{"id":2335},"create-a-karakeep-api-key","Create a Karakeep API Key",[59,2338,2339],{},"Go to your Karakeep account settings and generate a new API Key.",[193,2341,2343],{"id":2342},"configure-the-n8n-http-request-node","Configure the n8n HTTP Request Node",[59,2345,2346],{},"Add an HTTP Request node immediately following your Webhook node.",[103,2348,2349,2354,2384,2387,2390],{},[106,2350,2351,2352],{},"Method: ",[253,2353,2229],{},[106,2355,2356,2357],{},"URL (Expression):",[388,2358,2360],{"className":390,"code":2359,"language":392,"meta":8,"style":8},"https://karakeep.domain.tld/api/v1/bookmarks/{{ $('On: Bookmark').item.json.body.bookmarkId }}\n",[253,2361,2362],{"__ignoreMap":8},[396,2363,2364,2367,2370,2373,2376,2378,2381],{"class":398,"line":399},[396,2365,2366],{"class":402},"https://karakeep.domain.tld/api/v1/bookmarks/",[396,2368,2369],{"class":406},"{{",[396,2371,2372],{"class":412}," $(",[396,2374,2375],{"class":402},"'On: Bookmark'",[396,2377,720],{"class":412},[396,2379,2380],{"class":406},".item.json.body.bookmarkId",[396,2382,2383],{"class":406}," }}\n",[106,2385,2386],{},"Authentication: Predefined credential type",[106,2388,2389],{},"Credential Type: Header Auth",[106,2391,2392,2393],{},"Credential Parameters:",[103,2394,2395,2399],{},[106,2396,2269,2397],{},[253,2398,2272],{},[106,2400,2275,2401,284],{},[253,2402,2403],{},"Bearer \u003CYOUR_KARAKEEP_API_KEY>",[1968,2405,2406,2411],{},[59,2407,2408,654],{},[74,2409,2410],{},"Note",[59,2412,2413],{},"The object payload does not contain lists. Karakeep maintains a structural separation between items and collections.\nTo locate which list the processed bookmark belongs to, you must fetch all lists and filter them inside your workflow.",[54,2415,2417],{"id":2416},"connecting-n8n-to-matrix","Connecting n8n to Matrix",[204,2419,2421],{"id":2420},"create-a-matrix-bot","Create a Matrix bot",[59,2423,2424],{},"To protect your infrastructure's identity, always deploy isolated bots with specialized permissions rather than using your own profile.",[142,2426,2427,2486,2500,2503,2506],{},[106,2428,2429,2430],{},"Create a Matrix user for the bot from the homeserver:",[388,2431,2433],{"className":390,"code":2432,"language":392,"meta":8,"style":8},"register_new_matrix_user \\\n  -u \"$USERNAME\" \\\n  -p \"$PASSWORD\" \\\n  -c /data/homeserver.yaml \\\n  http://localhost:8008\n",[253,2434,2435,2443,2457,2471,2481],{"__ignoreMap":8},[396,2436,2437,2440],{"class":398,"line":399},[396,2438,2439],{"class":402},"register_new_matrix_user",[396,2441,2442],{"class":481}," \\\n",[396,2444,2445,2448,2450,2453,2455],{"class":398,"line":31},[396,2446,2447],{"class":481},"  -u",[396,2449,419],{"class":412},[396,2451,2452],{"class":696},"$USERNAME",[396,2454,425],{"class":412},[396,2456,2442],{"class":481},[396,2458,2459,2462,2464,2467,2469],{"class":398,"line":355},[396,2460,2461],{"class":481},"  -p",[396,2463,419],{"class":412},[396,2465,2466],{"class":696},"$PASSWORD",[396,2468,425],{"class":412},[396,2470,2442],{"class":481},[396,2472,2473,2476,2479],{"class":398,"line":547},[396,2474,2475],{"class":481},"  -c",[396,2477,2478],{"class":406}," /data/homeserver.yaml",[396,2480,2442],{"class":481},[396,2482,2483],{"class":398,"line":862},[396,2484,2485],{"class":406},"  http://localhost:8008\n",[106,2487,2488,2489,2121,2491,2121,2494,2121,2497],{},"Get Matrix bot access token by logging in and fetching the token in ",[74,2490,2120],{},[74,2492,2493],{},"Help & About",[74,2495,2496],{},"Advanced",[74,2498,2499],{},"Access Token",[106,2501,2502],{},"Invite the Matrix bot to the room where you want to share bookmarks",[106,2504,2505],{},"Join the room with the bot (need to accept the invite from the web UI) otherwise Matrix bot won't be able to send messages to the room.",[106,2507,2508],{},"Create credentials for Matrix bot in n8n",[204,2510,2512],{"id":2511},"credentials-for-matrix-bot","Credentials for Matrix bot",[103,2514,2515],{},[106,2516,2517,2518],{},"Create credentials for Matrix bot\n",[103,2519,2520,2531,2534],{},[106,2521,2522,2523,2121,2525,2121,2528],{},"Go to ",[74,2524,2120],{},[74,2526,2527],{},"Credentials",[74,2529,2530],{},"Create Credentials",[106,2532,2533],{},"Credential Type: Matrix Bot",[106,2535,2536,2537],{},"Credential Parameters:\n",[103,2538,2539,2542,2548],{},[106,2540,2541],{},"Name: Matrix Bot",[106,2543,2544,2545],{},"User ID: ",[253,2546,2547],{},"@bot:your-domain.com",[106,2549,2550,2551],{},"Access Token: ",[253,2552,2553],{},"YOUR_MATRIX_BOT_ACCESS_TOKEN",[204,2555,2557],{"id":2556},"sending-matrix-message","Sending Matrix message",[59,2559,2560],{},"Use the Matrix Bot node to send the bookmark to the Matrix room.",[59,2562,2563],{},"The message in the node can be:",[388,2565,2569],{"className":2566,"code":2567,"language":2568,"meta":8,"style":8},"language-js shiki shiki-themes plastic","{{ $('Fetch: Bookmark Details').item.json.content.title }}\n\n{{ $('Fetch: Bookmark Details').item.json.content.description }}\n\n{{ $('Fetch: Bookmark Details').item.json.content.url }}\n","js",[253,2570,2571,2610,2614,2647,2651],{"__ignoreMap":8},[396,2572,2573,2576,2578,2580,2583,2586,2588,2591,2594,2596,2598,2600,2603,2605,2608],{"class":398,"line":399},[396,2574,2575],{"class":412},"{{ ",[396,2577,457],{"class":402},[396,2579,714],{"class":412},[396,2581,2582],{"class":412},"'",[396,2584,2585],{"class":406},"Fetch: Bookmark Details",[396,2587,2582],{"class":412},[396,2589,2590],{"class":412},").",[396,2592,2593],{"class":696},"item",[396,2595,284],{"class":412},[396,2597,5],{"class":696},[396,2599,284],{"class":412},[396,2601,2602],{"class":696},"content",[396,2604,284],{"class":412},[396,2606,2607],{"class":696},"title",[396,2609,2383],{"class":412},[396,2611,2612],{"class":398,"line":31},[396,2613,624],{"emptyLinePlaceholder":41},[396,2615,2616,2618,2620,2622,2624,2626,2628,2630,2632,2634,2636,2638,2640,2642,2645],{"class":398,"line":355},[396,2617,2575],{"class":412},[396,2619,457],{"class":402},[396,2621,714],{"class":412},[396,2623,2582],{"class":412},[396,2625,2585],{"class":406},[396,2627,2582],{"class":412},[396,2629,2590],{"class":412},[396,2631,2593],{"class":696},[396,2633,284],{"class":412},[396,2635,5],{"class":696},[396,2637,284],{"class":412},[396,2639,2602],{"class":696},[396,2641,284],{"class":412},[396,2643,2644],{"class":696},"description",[396,2646,2383],{"class":412},[396,2648,2649],{"class":398,"line":547},[396,2650,624],{"emptyLinePlaceholder":41},[396,2652,2653,2655,2657,2659,2661,2663,2665,2667,2669,2671,2673,2675,2677,2679,2682],{"class":398,"line":862},[396,2654,2575],{"class":412},[396,2656,457],{"class":402},[396,2658,714],{"class":412},[396,2660,2582],{"class":412},[396,2662,2585],{"class":406},[396,2664,2582],{"class":412},[396,2666,2590],{"class":412},[396,2668,2593],{"class":696},[396,2670,284],{"class":412},[396,2672,5],{"class":696},[396,2674,284],{"class":412},[396,2676,2602],{"class":696},[396,2678,284],{"class":412},[396,2680,2681],{"class":696},"url",[396,2683,2383],{"class":412},[54,2685,2687],{"id":2686},"production-readiness","Production readiness",[59,2689,2690],{},"Well, this is a prototype for now. When it comes to production, here are some things to consider.",[204,2692,2694],{"id":2693},"documentation","Documentation",[59,2696,2697,2702],{},[63,2698,2701],{"href":2699,"rel":2700},"https://www.weinto.com/en/codex/topics/documentation",[67],"Document this software and its operations",". What is not documented does not exist.",[204,2704,2706],{"id":2705},"backup-and-restore","Backup and restore",[59,2708,2709,2710,284],{},"Because Karakeep relies on a local SQLite, backup the file ",[253,2711,2712],{},"/data/karakeep.db",[59,2714,2715],{},"Don't forget to lock the file first or the database will corrupt itself.",[204,2717,2719],{"id":2718},"healthchecks-and-monitoring","Healthchecks and monitoring",[59,2721,2722],{},"An example of probes to add to the statefulset:",[388,2724,2728],{"className":2725,"code":2726,"language":2727,"meta":8,"style":8},"language-yaml shiki shiki-themes plastic","livenessProbe:\n  httpGet:\n    path: /api/health\n    port: 3000\n    scheme: HTTP\n  initialDelaySeconds: 10\n  timeoutSeconds: 1\n  periodSeconds: 10\n  successThreshold: 1\n  failureThreshold: 3\nreadinessProbe:\n  httpGet:\n    path: /api/health\n    port: 3000\n    scheme: HTTP\n  initialDelaySeconds: 10\n  timeoutSeconds: 1\n  periodSeconds: 10\n  successThreshold: 1\n  failureThreshold: 3\n","yaml",[253,2729,2730,2739,2746,2757,2767,2777,2787,2797,2806,2815,2825,2832,2838,2846,2854,2862,2870,2878,2886,2894],{"__ignoreMap":8},[396,2731,2732,2736],{"class":398,"line":399},[396,2733,2735],{"class":2734},"sU0A5","livenessProbe",[396,2737,2738],{"class":412},":\n",[396,2740,2741,2744],{"class":398,"line":31},[396,2742,2743],{"class":2734},"  httpGet",[396,2745,2738],{"class":412},[396,2747,2748,2751,2754],{"class":398,"line":355},[396,2749,2750],{"class":2734},"    path",[396,2752,2753],{"class":412},": ",[396,2755,2756],{"class":406},"/api/health\n",[396,2758,2759,2762,2764],{"class":398,"line":547},[396,2760,2761],{"class":2734},"    port",[396,2763,2753],{"class":412},[396,2765,2766],{"class":481},"3000\n",[396,2768,2769,2772,2774],{"class":398,"line":862},[396,2770,2771],{"class":2734},"    scheme",[396,2773,2753],{"class":412},[396,2775,2776],{"class":406},"HTTP\n",[396,2778,2779,2782,2784],{"class":398,"line":1149},[396,2780,2781],{"class":2734},"  initialDelaySeconds",[396,2783,2753],{"class":412},[396,2785,2786],{"class":481},"10\n",[396,2788,2789,2792,2794],{"class":398,"line":1291},[396,2790,2791],{"class":2734},"  timeoutSeconds",[396,2793,2753],{"class":412},[396,2795,2796],{"class":481},"1\n",[396,2798,2799,2802,2804],{"class":398,"line":1296},[396,2800,2801],{"class":2734},"  periodSeconds",[396,2803,2753],{"class":412},[396,2805,2786],{"class":481},[396,2807,2808,2811,2813],{"class":398,"line":1436},[396,2809,2810],{"class":2734},"  successThreshold",[396,2812,2753],{"class":412},[396,2814,2796],{"class":481},[396,2816,2817,2820,2822],{"class":398,"line":1451},[396,2818,2819],{"class":2734},"  failureThreshold",[396,2821,2753],{"class":412},[396,2823,2824],{"class":481},"3\n",[396,2826,2827,2830],{"class":398,"line":1457},[396,2828,2829],{"class":2734},"readinessProbe",[396,2831,2738],{"class":412},[396,2833,2834,2836],{"class":398,"line":1462},[396,2835,2743],{"class":2734},[396,2837,2738],{"class":412},[396,2839,2840,2842,2844],{"class":398,"line":1497},[396,2841,2750],{"class":2734},[396,2843,2753],{"class":412},[396,2845,2756],{"class":406},[396,2847,2848,2850,2852],{"class":398,"line":1542},[396,2849,2761],{"class":2734},[396,2851,2753],{"class":412},[396,2853,2766],{"class":481},[396,2855,2856,2858,2860],{"class":398,"line":1566},[396,2857,2771],{"class":2734},[396,2859,2753],{"class":412},[396,2861,2776],{"class":406},[396,2863,2864,2866,2868],{"class":398,"line":1571},[396,2865,2781],{"class":2734},[396,2867,2753],{"class":412},[396,2869,2786],{"class":481},[396,2871,2872,2874,2876],{"class":398,"line":1591},[396,2873,2791],{"class":2734},[396,2875,2753],{"class":412},[396,2877,2796],{"class":481},[396,2879,2880,2882,2884],{"class":398,"line":1610},[396,2881,2801],{"class":2734},[396,2883,2753],{"class":412},[396,2885,2786],{"class":481},[396,2887,2888,2890,2892],{"class":398,"line":1616},[396,2889,2810],{"class":2734},[396,2891,2753],{"class":412},[396,2893,2796],{"class":481},[396,2895,2896,2898,2900],{"class":398,"line":1622},[396,2897,2819],{"class":2734},[396,2899,2753],{"class":412},[396,2901,2824],{"class":481},[59,2903,2904,2905,2908],{},"The path ",[253,2906,2907],{},"karakeep.domain.tld/api/health"," should show:",[388,2910,2913],{"className":2911,"code":2912,"language":5,"meta":8,"style":8},"language-json shiki shiki-themes plastic","{ \"status\": \"ok\", \"message\": \"Web app is working\" }\n",[253,2914,2915],{"__ignoreMap":8},[396,2916,2917,2920,2922,2925,2927,2929,2931,2934,2936,2938,2940,2943,2945,2947,2949,2952,2954],{"class":398,"line":399},[396,2918,2919],{"class":412},"{ ",[396,2921,425],{"class":412},[396,2923,2924],{"class":696},"status",[396,2926,425],{"class":412},[396,2928,2753],{"class":412},[396,2930,425],{"class":412},[396,2932,2933],{"class":406},"ok",[396,2935,425],{"class":412},[396,2937,1526],{"class":412},[396,2939,425],{"class":412},[396,2941,2942],{"class":696},"message",[396,2944,425],{"class":412},[396,2946,2753],{"class":412},[396,2948,425],{"class":412},[396,2950,2951],{"class":406},"Web app is working",[396,2953,425],{"class":412},[396,2955,2956],{"class":412}," }\n",[204,2958,2960],{"id":2959},"increase-crawlers-and-resources","Increase crawlers and resources",[59,2962,2963,2964,2971,2972,2590],{},"Increase the ",[63,2965,2968],{"href":2966,"rel":2967},"https://docs.karakeep.app/configuration/environment-variables#crawler-configs",[67],[253,2969,2970],{},"CRAWLER_NUM_WORKERS"," (default ",[253,2973,761],{},[59,2975,2976],{},"You can also increase pods' resources.",[204,2978,2980],{"id":2979},"upgrades","Upgrades",[59,2982,2983,2984,284],{},"Follow the official documentation for ",[63,2985,2988],{"href":2986,"rel":2987},"https://docs.karakeep.app/administration/hoarder-to-karakeep-migration/",[67],"upgrading Karakeep",[1900,2990,2991],{},"html pre.shiki code .sJix2, html code.shiki .sJix2{--shiki-default:#B57EDC}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sGSqi, html code.shiki .sGSqi{--shiki-default:#A9B2C3}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .sVs6v, html code.shiki .sVs6v{--shiki-default:#C6CCD7}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}",{"title":8,"searchDepth":31,"depth":31,"links":2993},[2994,2995,2996,2997,2998,2999,3000,3005,3010],{"id":1927,"depth":31,"text":1928},{"id":1953,"depth":31,"text":1954},{"id":1989,"depth":31,"text":1990},{"id":2013,"depth":31,"text":2014},{"id":2080,"depth":31,"text":2081},{"id":2103,"depth":31,"text":2104},{"id":2181,"depth":31,"text":2182,"children":3001},[3002,3003,3004],{"id":2185,"depth":355,"text":2186},{"id":2233,"depth":355,"text":2234},{"id":2331,"depth":355,"text":2332},{"id":2416,"depth":31,"text":2417,"children":3006},[3007,3008,3009],{"id":2420,"depth":355,"text":2421},{"id":2511,"depth":355,"text":2512},{"id":2556,"depth":355,"text":2557},{"id":2686,"depth":31,"text":2687,"children":3011},[3012,3013,3014,3015,3016],{"id":2693,"depth":355,"text":2694},{"id":2705,"depth":355,"text":2706},{"id":2718,"depth":355,"text":2719},{"id":2959,"depth":355,"text":2960},{"id":2979,"depth":355,"text":2980},"Collect less, use more. This guide covers setting up an automated bookmarking lifecycle that crawls pages and shares them in a Matrix room.",{"publication_date":3019,"views":3020,"status":366},"2026-06-14",[1914],"/building/articles/karakeep-kubernetes-n8n-matrix",{"title":1922,"description":3017},{"loc":3021,"images":3024},[3025,3026],{"loc":1964},{"loc":2189},"building/articles/karakeep-kubernetes-n8n-matrix","cnqqtXZ59xBPRgpXl7oOmnsRNThgtO1ZwF0EW_SkLd0",{"id":3030,"title":3031,"body":3032,"description":3449,"extension":34,"meta":3450,"navigation":41,"path":3453,"seo":3454,"sitemap":3455,"stem":3456,"__hash__":3457},"pages_en/writing/articles/curiosity-and-intelligence-the-case-for-m-shaped-professionals.md","Curiosity and intelligence: The case for M-Shaped professionals",{"type":28,"value":3033,"toc":3433},[3034,3037,3040,3043,3052,3060,3063,3066,3070,3073,3076,3079,3082,3085,3088,3092,3095,3162,3165,3168,3172,3175,3186,3189,3192,3203,3206,3210,3213,3217,3220,3224,3227,3230,3242,3262,3265,3268,3306,3310,3314,3317,3328,3332,3335,3339,3342,3346,3349,3352,3356,3359,3362,3370,3373,3384,3387,3391,3394,3399,3402,3405,3425,3427,3430],[59,3035,3036],{},"In the fields of Product Design or Engineering we often are obsessed by \"how\". How to implement, how to configure, how to transform, how to optimise.",[59,3038,3039],{},"This vertical expertise is precious. It allows us to ship and deliver value. Yet, the world changes fast. The technological landscape evolves, usages and concepts change too... Professionals who rely solely on execution risk obsolescence.",[59,3041,3042],{},"Being a M-shaped professional helps me with metacognition, the ability to step back and reflect on my own thinking process. It allows me to better understand how I learn, how I think, and how I can improve across these different fields. It also serves as a trigger to question my own assumptions and biases while noticing them in others.",[59,3044,3045,3046,1981,3049,284],{},"In this article I want to share with my point of view on intelligence, curiosity and change balancing between ",[74,3047,3048],{},"operational capabilities",[74,3050,3051],{},"prospective capabilities",[103,3053,3054,3057],{},[106,3055,3056],{},"Operational capability is the ability to build, fix, optimise on a day-to-day basis.",[106,3058,3059],{},"Prospective capability is the ability to anticipate, to understand and to leverage new paradigms to create value in the future.",[59,3061,3062],{},"For both an individual and an organisation, prospective capability is what keeps us relevant on the long run. However, cultivating curiosity and openness requires us to fight against the \"trained incapacity\" that impacts many fields. It starts by becoming aware of psychological and behavioral frictions that happen when hard-earned expertise turns into a blind spot.",[59,3064,3065],{},"What follows is a roadmap to bridge the gap between individual cognitive psychology and enterprise architecture.",[54,3067,3069],{"id":3068},"the-experts-trap-where-does-this-mindset-come-from","The expert's trap: Where does this mindset come from?",[59,3071,3072],{},"Engineers and security professionals are trained and conditioned to the \"fail early\" methodology. Finding flaws, problems and vulnerability at the start of a lifecycle is much more efficient than discovering them later. The idea is to treat failures as a data point rather than a roadblock. Being blocked often means losing time, money or reputation.",[59,3074,3075],{},"Over a career, many engineers and IT people unconsciously adopt it as a mindset and a default way to operate. Every thought goes through a strict filter of risk, failure, problems, vulnerabilities, ... They are trained experts in looking for what will not work first. But this model eventually moves over into human and social relationships.",[59,3077,3078],{},"When the professional value is tied to spotting what is broken, cross-functional communication can easily start to sound like \"blocking\". This is where cultural differences begin as an obstacle to vision and innovation. Collaborators often label such experts as negative, non team players, resistant to change, or even cynical. Team members rarely understand that very different mindsets are at play.",[59,3080,3081],{},"This phenomenon tends to quietly exclude the those who are less curious or creative from the group. Feeling misunderstood and a sense of isolation, many turn to deeper and deeper expertise to find back validation, selfworth and the feeling of being useful. As a way to psychological safety.",[59,3083,3084],{},"Unfortunately, this is a vicious circle, drives to difficulties in being able to step back and see the big picture. It is also a major source of frustration for the whole group as they end up working in silos.",[59,3086,3087],{},"Over time, this mindset can cristalize into a high Need for Cognitive Closure (NCC). A state where an individual looks for predictability and sees ambiguity as a threat.",[204,3089,3091],{"id":3090},"identifiying-biases-and-frictions-against-curiosity-and-innovation","Identifiying biases and frictions against curiosity and innovation",[59,3093,3094],{},"When an individual develops NCC, this is when biases and friction show up:",[3096,3097,3098,3114],"table",{},[3099,3100,3101],"thead",{},[3102,3103,3104,3108,3111],"tr",{},[3105,3106,3107],"th",{},"Friction",[3105,3109,3110],{},"Manifestation",[3105,3112,3113],{},"Core belief",[3115,3116,3117,3129,3140,3151],"tbody",{},[3102,3118,3119,3123,3126],{},[3120,3121,3122],"td",{},"Ego and status",[3120,3124,3125],{},"\"I know best\" or \"Never heard of it so it must be irrelevant\"",[3120,3127,3128],{},"\"Learning something new forces me to temporarily give up my position as the smartest person in the room.\"",[3102,3130,3131,3134,3137],{},[3120,3132,3133],{},"Energy and scope",[3120,3135,3136],{},"\"I don't have time to learn this\" or \"This isn't in my scope\"",[3120,3138,3139],{},"\"I'm too exhausted by operations to dedicate cognitive energy to this new/unproven/non-stable-yet subject.\"",[3102,3141,3142,3145,3148],{},[3120,3143,3144],{},"Semantic resistance",[3120,3146,3147],{},"\"They use buzzwords. It is just marketing.\"",[3120,3149,3150],{},"\"By labeling an emerging concept as \"hype\", I excuse myself from the discomfort of having to understand it.\"",[3102,3152,3153,3156,3159],{},[3120,3154,3155],{},"Sunk cost and status quo",[3120,3157,3158],{},"\"We've already invested so much in this\" or \"We've always done it this way\"",[3120,3160,3161],{},"\"Abandoning our existing systems invalidates the massive efforts and time I have invested in them.\"",[59,3163,3164],{},"The worst is when friction combine and consolidate with each other. Ultimately, an expert's identity is tied to mastery. Because new paradigms are, by definition, unvalidated and unmastered, the expert sees them as a threat to status or reputation. But being an expert isn't about how one lives through the eyes of others, it is about the expertise one built.",[59,3166,3167],{},"At an individual level, this manifests as rejection or silence. At an organizational level, it transforms into structural stagnation.",[54,3169,3171],{"id":3170},"breaking-biases-learn-to-envision-the-solved-problem-first","Breaking biases: Learn to envision the solved problem first",[59,3173,3174],{},"To counter this, one must practice metacognition. Step back and analyse internal thought processes.",[59,3176,3177,3178,3181,3182,3185],{},"In cognitive philosophy, Bertrand Russell explains that to learn something deeply, one must first encounter it in an abstract or symbolic form (",[74,3179,3180],{},"knowledge by description",") before moving to the concrete, hands-on application (",[74,3183,3184],{},"knowledge by acquaintance","). Many experts get stuck into a fixed mindset and only stay in the realm of what they master, their immediate acquaintance.",[59,3187,3188],{},"In other words, start by the big picture. Details will come later. Accept that control is counter productive.",[59,3190,3191],{},"Whenever I face innovation, I always try to answer three questions:",[103,3193,3194,3197,3200],{},[106,3195,3196],{},"What is the fundamental problem that this innovation seeks to solve?",[106,3198,3199],{},"If this problem was solved everywhere, what would be the impact on my job?",[106,3201,3202],{},"Does this innovation push the frontier of what is possible today?",[59,3204,3205],{},"By setting aside complexity, I can focus on the concept layer. I can categorise and compare innovations more easily. It is horizontal vs vertical thinking. Both approaches are valid but they must be balanced.",[204,3207,3209],{"id":3208},"horizontal-problem-solver-top-down-view","Horizontal problem solver (top-down view)",[59,3211,3212],{},"Identify an out-of-the-box technical capability and immediately look for where it could change / disrupt / improve the existing. Here, understanding the strategic purpose is enough to validate my curiosity, even if I haven't mastered the details, yet.",[204,3214,3216],{"id":3215},"vertical-expert-bottom-up-view","Vertical expert (bottom-up view)",[59,3218,3219],{},"A bottom-up approach refuses to validate an incoming tool or idea if its exact contribution cannot be measured against the current one. While I accept that this argument is a form of intellectual honesty, it often risk of missing the forest for the trees.",[54,3221,3223],{"id":3222},"operationalizing-curiosity-horizon-scanning-and-intelligence","Operationalizing curiosity: Horizon scanning and intelligence",[59,3225,3226],{},"We cannot test everything nor be experts in everything. We must prioritize what matters and be able to make decisions with incomplete information. The question is \"how?\". Well, it is not about being an expert in everything but about having a broad vision and understanding how different fields can interact to create value.",[59,3228,3229],{},"As an executive or cross-functional leader, one cannot afford to wait for a market need to materialize before beginning to read about it. It's already too late by then. The idea is to architect and build a system for anticipation.",[59,3231,3232,3233,3237,3238,3241],{},"To anticipate the future and align ",[3234,3235,3236],"em",{},"Business x IT x XD",", I practice ",[74,3239,3240],{},"horizon scanning"," that represents three steps:",[142,3243,3244,3250,3256],{},[106,3245,3246,3249],{},[74,3247,3248],{},"Detection",". Curiosity and openness to explore new fields. Proactively tracking weak signals and emerging trends.",[106,3251,3252,3255],{},[74,3253,3254],{},"Qualification",". Expertise to evaluate if a signal is relevant. How it could impact the organisation in the future.",[106,3257,3258,3261],{},[74,3259,3260],{},"Mapping",". Synthesis to understand how different fields can interact to create value.",[59,3263,3264],{},"By refusing steps (a) and (b), an expert forbids himself to play a strategic role for the business. He may be a very good expert in his field, but he cannot be a strategist.",[59,3266,3267],{},"Then, to scale from an intuition, curiosity has to be treated as an intelligence process to feed decision makers with insights and to build a collective intelligence.",[142,3269,3270,3276,3282,3288,3294,3300],{},[106,3271,3272,3275],{},[74,3273,3274],{},"Planning & Direction",": Ask the right questions. What is the problem? What do we want to know?",[106,3277,3278,3281],{},[74,3279,3280],{},"Collection",": Gather data from multiple sources.",[106,3283,3284,3287],{},[74,3285,3286],{},"Processing & Exploitation",": Translate the data into a usable format.",[106,3289,3290,3293],{},[74,3291,3292],{},"Analysis & Production",": Analyze the data and produce actionable insights.",[106,3295,3296,3299],{},[74,3297,3298],{},"Dissemination & Integration",": Provide the insights to the decision maker.",[106,3301,3302,3305],{},[74,3303,3304],{},"Feedback & Maintenance",": Get feedback from the decision maker, evaluate the results against real-world impact, and refine the process.",[54,3307,3309],{"id":3308},"systematizing-change-from-individual-to-organizational-through-enterprise-architecture","Systematizing change: From individual to organizational through Enterprise Architecture",[204,3311,3313],{"id":3312},"individual-level","Individual level",[59,3315,3316],{},"At an individual level, this process sounds like a part-time job so I try to apply some rules that directly contribute in:",[103,3318,3319,3322,3325],{},[106,3320,3321],{},"Being able to bridge gaps for stakeholders.",[106,3323,3324],{},"Understanding the \"why\" behind things.",[106,3326,3327],{},"Enabling cross-functional collaboration and building trust.",[193,3329,3331],{"id":3330},"_1-understand-the-fundamentals","1. Understand the fundamentals",[59,3333,3334],{},"Faced with information overload and informational burnout, my method is scientific. I ignore the noise of social media to go read research papers, study publications from consortiums, and analyze frameworks. Going straight to the source makes it possible to get familiar with the vocabulary and map out concepts against the current or future needs of the organization.",[193,3336,3338],{"id":3337},"_2-search-for-the-delta","2. Search for the delta",[59,3340,3341],{},"This is the most crucial point in my opinion. I look for what is different. Because value lies within the delta, in the break from classic patterns. This is what allows us to anticipate opportunities, advise a business one step ahead, and maintain its competitiveness in the market.",[193,3343,3345],{"id":3344},"_3-learn-the-vocabulary","3. Learn the vocabulary",[59,3347,3348],{},"This is a concept that multilingual people understand intuitively. Learning a new language is to open a new window to the world. Being able to translate ideas from one language to another allows us to see things from different perspectives and to understand the world in different richer way. I often say I don't think the same in english or in french...",[59,3350,3351],{},"This is the same for technology, design, psychology. Technical vocabulary is not a tool for exclusion but a toolbox for thoughts. Learning these new words and trying to understand the intention behind each term is about accepting to speak the language of the world to come, so that when the time comes, we are capable of designing solutions within it.",[204,3353,3355],{"id":3354},"organizational-level","Organizational level",[59,3357,3358],{},"We can look at the Enterprise Architecture framework TOGAF, for Phase H (Architecture Change Management).",[59,3360,3361],{},"Phase H is about preventing corporate infrastructure from quietly drifting into obsolescence. The idea is to continuously track internal triggers and external triggers to ensure the architecture delivers its original target value.",[103,3363,3364,3367],{},[106,3365,3366],{},"Internal triggers: governance requests, business growth/decline, capacity indicators, projects",[106,3368,3369],{},"External triggers: new technologies, market changes, regulations, competitors",[59,3371,3372],{},"When a meaningful shift is uncovered, the framework says that modifications must be strictly categorized to avoid over-complicating the architectural pipeline:",[103,3374,3375,3378,3381],{},[106,3376,3377],{},"Simplification: Decreasing architectural investment by retiring, de-scoping or merging redundant systems.",[106,3379,3380],{},"Incremental change: Gaining more value from existing operational and architectural investments.",[106,3382,3383],{},"Re-architecting: Making large investments to unlock new or transformative business value.",[59,3385,3386],{},"As a designer and engineer, my focus is to adapt these principles directly on to the product lifecycle and service delivery. This is a way to protect the ecosystem from obsolescence.",[54,3388,3390],{"id":3389},"build-a-team-m-shaped-professionals","Build a team: M-shaped professionals",[59,3392,3393],{},"To build an organization that can balance day-to-day operations with future discovery, recruit and train M-Shaped professionals.",[1968,3395,3396],{},[59,3397,3398],{},"An M-shaped professional possesses deep, authoritative expertise in two or more core domains, backed by a wide, collaborative literacy across adjacent disciplines.",[59,3400,3401],{},"Frameworks like ITIL and TOGAF highlight why these profiles are essential. They see through functional silos, align day-to-day tasks with the broader vision, and provide the flexibility needed to adapt to change.",[59,3403,3404],{},"When looking for talent to build a team, you can look for some cognitive psychology traits:",[103,3406,3407,3413,3419],{},[106,3408,3409,3412],{},[74,3410,3411],{},"Combinatorial creativity",": A tendency to recombine existing concepts from completely different fields into useful ideas.",[106,3414,3415,3418],{},[74,3416,3417],{},"Integrative Complexity and flexibility",": The cognitive capacity to hold multiple framework in mind at the same time, switching between them to find the best fit for the current context.",[106,3420,3421,3424],{},[74,3422,3423],{},"Boundary Spanning",": Natural \"knowledge brokers\" comfortably operating across cultural, organizational, and functional fields to translate complex ideas between siloed business groups.",[54,3426,341],{"id":340},[59,3428,3429],{},"Operational excellence keeps an organization alive today, but prospective capability is what keeps it alive tomorrow. By transforming curiosity from a personal habit into a structured, architectural discipline, we can prevent \"trained incapacity\".",[59,3431,3432],{},"Leadership is about having the courage, vocabulary, and cognitive flexibility to design the solutions of tomorrow. More than defending an expertise built yesterday.",{"title":8,"searchDepth":31,"depth":31,"links":3434},[3435,3438,3442,3443,3447,3448],{"id":3068,"depth":31,"text":3069,"children":3436},[3437],{"id":3090,"depth":355,"text":3091},{"id":3170,"depth":31,"text":3171,"children":3439},[3440,3441],{"id":3208,"depth":355,"text":3209},{"id":3215,"depth":355,"text":3216},{"id":3222,"depth":31,"text":3223},{"id":3308,"depth":31,"text":3309,"children":3444},[3445,3446],{"id":3312,"depth":355,"text":3313},{"id":3354,"depth":355,"text":3355},{"id":3389,"depth":31,"text":3390},{"id":340,"depth":31,"text":341},"A reflection on how curiosity and metacognition help to remain relevant in a world of constant change, leveraging cross-domain expertise. How combining multiple capabilities help through change.",{"status":366,"publication_date":3451,"views":3452},"2026-06-06",[369],"/writing/articles/curiosity-and-intelligence-the-case-for-m-shaped-professionals",{"title":3031,"description":3449},{"loc":3453},"writing/articles/curiosity-and-intelligence-the-case-for-m-shaped-professionals","EsFY6lU6uxBZchwoJIIsfa07iTJ5pk25FcnpWEWpwAk",{"id":3459,"title":3460,"body":3461,"description":3847,"extension":34,"meta":3848,"navigation":41,"path":3851,"seo":3852,"sitemap":3853,"stem":3854,"__hash__":3855},"pages_en/operating/articles/home-assistant-security.md","Home Assistant. Assistant of whom exactly?",{"type":28,"value":3462,"toc":3834},[3463,3467,3470,3473,3477,3486,3489,3503,3622,3654,3658,3661,3664,3675,3678,3685,3689,3693,3696,3705,3708,3713,3716,3720,3723,3738,3742,3745,3789,3793,3819,3823,3826,3828,3831],[54,3464,3466],{"id":3465},"introduction-and-context","Introduction and context",[59,3468,3469],{},"A few weeks ago, I was brought in to architect and deploy a client infrastructure that includes Home Assistant. While evaluating the tech stack and the requirements, I realised that the underlying architecture of Home Assistant demanded deep technical review. My perspective is that convenience choices made by the developers put users and infrastructure sovereignty at risk.",[59,3471,3472],{},"Security professionals must evaluate these platforms, designed for hobbyists, with strict scrutiny rather than accepting default deployment scripts.",[54,3474,3476],{"id":3475},"what-i-found","What I found",[59,3478,3479,3480,3485],{},"HAOS is not Home Assistant. Home Assistant Operating System (HAOS) is a specialized, lightweight ",[63,3481,3484],{"href":3482,"rel":3483},"https://buildroot.org/",[67],"buildroot","-based Linux system designed to run Home Assistant. Its core components include a Buildroot-based Linux system, Docker container engine, bootloaders (GRUB/U-Boot), RAUC for updates, and AppArmor for security.",[59,3487,3488],{},"Home Assistant relies on Docker containers to run. This means that HAOS is not only a Linux distribution in the traditional sense, but rather a container orchestration system for Home Assistant.",[59,3490,3491,3492,3495,3496,3499,3500,284],{},"The core risk manifests within the official deployment configuration. The deployment model requires the primary container to execute with the ",[253,3493,3494],{},"privileged: true"," flag, ",[253,3497,3498],{},"network_mode: host",", and the default user is ",[253,3501,3502],{},"root",[388,3504,3506],{"className":2725,"code":3505,"language":2727,"meta":8,"style":8},"services:\n  homeassistant:\n    container_name: homeassistant\n    image: \"ghcr.io/home-assistant/home-assistant:stable\"\n    volumes:\n      - /PATH_TO_YOUR_CONFIG:/config\n      - /etc/localtime:/etc/localtime:ro\n      - /run/dbus:/run/dbus:ro\n    restart: unless-stopped\n    privileged: true\n    network_mode: host\n    environment:\n      TZ: Europe/Amsterdam\n",[253,3507,3508,3515,3522,3532,3546,3553,3561,3568,3575,3585,3595,3605,3612],{"__ignoreMap":8},[396,3509,3510,3513],{"class":398,"line":399},[396,3511,3512],{"class":2734},"services",[396,3514,2738],{"class":412},[396,3516,3517,3520],{"class":398,"line":31},[396,3518,3519],{"class":2734},"  homeassistant",[396,3521,2738],{"class":412},[396,3523,3524,3527,3529],{"class":398,"line":355},[396,3525,3526],{"class":2734},"    container_name",[396,3528,2753],{"class":412},[396,3530,3531],{"class":406},"homeassistant\n",[396,3533,3534,3537,3539,3541,3544],{"class":398,"line":547},[396,3535,3536],{"class":2734},"    image",[396,3538,2753],{"class":412},[396,3540,425],{"class":412},[396,3542,3543],{"class":406},"ghcr.io/home-assistant/home-assistant:stable",[396,3545,859],{"class":412},[396,3547,3548,3551],{"class":398,"line":862},[396,3549,3550],{"class":2734},"    volumes",[396,3552,2738],{"class":412},[396,3554,3555,3558],{"class":398,"line":1149},[396,3556,3557],{"class":412},"      - ",[396,3559,3560],{"class":406},"/PATH_TO_YOUR_CONFIG:/config\n",[396,3562,3563,3565],{"class":398,"line":1291},[396,3564,3557],{"class":412},[396,3566,3567],{"class":406},"/etc/localtime:/etc/localtime:ro\n",[396,3569,3570,3572],{"class":398,"line":1296},[396,3571,3557],{"class":412},[396,3573,3574],{"class":406},"/run/dbus:/run/dbus:ro\n",[396,3576,3577,3580,3582],{"class":398,"line":1436},[396,3578,3579],{"class":2734},"    restart",[396,3581,2753],{"class":412},[396,3583,3584],{"class":406},"unless-stopped\n",[396,3586,3587,3590,3592],{"class":398,"line":1451},[396,3588,3589],{"class":2734},"    privileged",[396,3591,2753],{"class":412},[396,3593,3594],{"class":481},"true\n",[396,3596,3597,3600,3602],{"class":398,"line":1457},[396,3598,3599],{"class":2734},"    network_mode",[396,3601,2753],{"class":412},[396,3603,3604],{"class":406},"host\n",[396,3606,3607,3610],{"class":398,"line":1462},[396,3608,3609],{"class":2734},"    environment",[396,3611,2738],{"class":412},[396,3613,3614,3617,3619],{"class":398,"line":1497},[396,3615,3616],{"class":2734},"      TZ",[396,3618,2753],{"class":412},[396,3620,3621],{"class":406},"Europe/Amsterdam\n",[142,3623,3624,3631,3643],{},[106,3625,3626,3627,3630],{},"The configuration maps the host D-Bus socket ",[253,3628,3629],{},"/run/dbus"," directly into the container to control hardware communication protocols like Zigbee, Matter, or Bluetooth. This design choice creates a way to escape the container.",[106,3632,3633,3634,3636,3637,3639,3640,3642],{},"The application executes as the ",[253,3635,3502],{}," user inside the container. Because namespaces are not remapped by default, ",[253,3638,3502],{}," inside the container matches ",[253,3641,3502],{}," on the host operating system.",[106,3644,3645,3646,3649,3650,3653],{},"Exposing the system D-Bus allows any process inside the container to transmit arbitrary instructions to the host ",[253,3647,3648],{},"systemd"," daemon and ",[253,3651,3652],{},"NetworkManager",". It becomes easy to disable firewalls or start malicious services on the host.",[54,3655,3657],{"id":3656},"understanding-the-impact-severity-and-scope","Understanding the impact, severity and scope",[59,3659,3660],{},"Users frequently install custom integrations pulled directly from unverified, community-maintained repositories, via the Home Assistant Community Store (HACS). As easy as a click of a button. No security validation happens before installation. This pattern introduces a high risk of supply chain attack. A single compromised addon or dependency grants an external actor full root privileges over the entire local network segment.",[59,3662,3663],{},"Hobbyist operators often operate under the comforting illusion that their local network is an island. Well, to me, Home Assistant is a threat to privacy and security.",[103,3665,3666,3669,3672],{},[106,3667,3668],{},"Home Assistant and its addons manage display, archive data, watch baby monitors, cameras, microphones and other lights and sensors. A total access to exploit one's privacy.",[106,3670,3671],{},"Home assistant controls door locks, garage doors, gates and other alarms. Making it able to let anyone inside your house.",[106,3673,3674],{},"Home assistant is given access to multiple devices and appliance on a site. Allowing full control over the environment, computers included.",[59,3676,3677],{},"In other words, installing HAOS in a network without proper control exposes the entire network and the privacy of every member.",[1968,3679,3680],{},[59,3681,3682],{},[74,3683,3684],{},"Sovereignty is a method, not a gift.",[54,3686,3688],{"id":3687},"coverage","Coverage",[204,3690,3692],{"id":3691},"from-developers","From developers",[59,3694,3695],{},"The Home Assistant developers are aware of the issue. In fact, if one tries to run Home Assistant without these permissions, the software will flag the system as \"Unhealthy\" or \"Unsupported\" in the settings dashboard. They argue that because HA must control local hardware directly (Bluetooth adapters, Zigbee USB sticks, network interfaces for device discovery), it cannot function inside a locked-down sandbox.",[59,3697,3698,3699,3704],{},"They consider the problem ",[63,3700,3703],{"href":3701,"rel":3702},"https://www.home-assistant.io/security/#non-qualifying-vulnerabilities",[67],"as a non-qualifying vulnerability for their security"," and do not accept reports about it because they openly designed it to have host root access.",[59,3706,3707],{},"Translation:",[1968,3709,3710],{},[59,3711,3712],{},"We made it to be easy, not to be secure. So you can't complain about security vulnerabilities",[59,3714,3715],{},"This operational philosophy of \"convenience-first\" is a persistent vulnerability and contradicts standard security and IT operations frameworks that often mandate explicit change enablement and continuous boundary validation.",[204,3717,3719],{"id":3718},"broader-community","Broader community",[59,3721,3722],{},"I am not the first to bring up this concern and I am certainly not the first to share my frustration over a lazy Docker design.",[59,3724,3725,3726,3731,3732,3737],{},"In fact, just a week after I left the site, the ",[63,3727,3730],{"href":3728,"rel":3729},"https://nvd.nist.gov/vuln/detail/CVE-2026-34205",[67],"CVE-2026-34205"," was published with a critical severity score of 9.8. The ",[63,3733,3736],{"href":3734,"rel":3735},"https://github.com/home-assistant/core/security/advisories/GHSA-gh5m-4m97-c95h",[67],"details attached to this CVE"," show how no authentication is required and user impersonation is achieved.",[54,3739,3741],{"id":3740},"actions-and-recommendations","Actions and recommendations",[59,3743,3744],{},"Securing the infrastructure requires a defensive approach due to, as said above, the HA server must be considered untrusted, compromised.",[103,3746,3747,3753,3756,3759,3762,3765,3783,3786],{},[106,3748,3749,3752],{},[74,3750,3751],{},"DO NOT"," share the host for any other usage than Home Assistant.",[106,3754,3755],{},"Isolate the host as much as possible via network segmentation.",[106,3757,3758],{},"Place the host behind a proxy to handle external access.",[106,3760,3761],{},"Place the host behind a reverse proxy to limit direct access.",[106,3763,3764],{},"Manage your own mDNS repeater.",[106,3766,3767,3768],{},"Firewall policies must restrict traffic:\n",[103,3769,3770,3780],{},[106,3771,3772,3773,3776,3777,284],{},"Allow connections to initiate ",[3234,3774,3775],{},"only"," from the trusted user network to the Home Assistant host on the specific web port ",[253,3778,3779],{},"TCP 8123",[106,3781,3782],{},"Explicitly block the automation VLAN from initiating any connection back to the trusted network.",[106,3784,3785],{},"Continuously monitor and alert.",[106,3787,3788],{},"Reduce the surface of attack by limiting HA's scope to strictly to its core: reading sensors and executing some lightweight local automations.",[54,3790,3792],{"id":3791},"what-not-to-do","What NOT to do",[103,3794,3795,3801,3807,3813],{},[106,3796,3797,3800],{},[74,3798,3799],{},"Downplay the risk:"," The threat remains real. A compromised automation server provides an immediate ground for lateral network activity.",[106,3802,3803,3806],{},[74,3804,3805],{},"Think binary:"," Security does not operate as an all-or-nothing philosophy. It requires organisation, anticipation, structured governance, continuous risk mitigation, and systemic control.",[106,3808,3809,3812],{},[74,3810,3811],{},"Leave Home Assistant on your home network without isolation:"," Exposing your primary workstations and users to a privileged container environment opens the door to failure.",[106,3814,3815,3818],{},[74,3816,3817],{},"Install more because it's fun:"," Security is not about fun. It's about responsibility. Only install what HA is made for. No custom addons.",[54,3820,3822],{"id":3821},"acknowledgements","Acknowledgements",[59,3824,3825],{},"This analysis was made possible because of the open-source nature of the project. Contributors who maintain the transparency of the Home Assistant codebase, allow security professionals to inspect the underlying mechanics and verify root causes. While I don't agree with their operational philosophy, we must respect their transparency.",[54,3827,341],{"id":340},[59,3829,3830],{},"Moving forward, I will not include Home Assistant in any office or residential infrastructure under my management. The risks outweigh the benefits. It's a fun project for those who enjoy playing around, but not a solution that can be trusted. I will stick to professional implementations and operations.",[1900,3832,3833],{},"html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .sGSqi, html code.shiki .sGSqi{--shiki-default:#A9B2C3}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":8,"searchDepth":31,"depth":31,"links":3835},[3836,3837,3838,3839,3843,3844,3845,3846],{"id":3465,"depth":31,"text":3466},{"id":3475,"depth":31,"text":3476},{"id":3656,"depth":31,"text":3657},{"id":3687,"depth":31,"text":3688,"children":3840},[3841,3842],{"id":3691,"depth":355,"text":3692},{"id":3718,"depth":355,"text":3719},{"id":3740,"depth":31,"text":3741},{"id":3791,"depth":31,"text":3792},{"id":3821,"depth":31,"text":3822},{"id":340,"depth":31,"text":341},"Deploying Home Assistant within a managed environment introduces important architectural risks. While the platform optimizes speed and ease, it ignores basic security controls. Better be aware of some details if you want to maintain a secure environment and protect your infrastructure.",{"publication_date":3849,"views":3850},"2026-05-27",[1914],"/operating/articles/home-assistant-security",{"title":3460,"description":3847},{"loc":3851},"operating/articles/home-assistant-security","RjojSKStKpS84H15sOkK0iNcv0FfFhL_lz-v_u86YzQ",{"id":3857,"title":3858,"body":3859,"description":3993,"extension":34,"meta":3994,"navigation":41,"path":3998,"seo":3999,"sitemap":4000,"stem":4001,"__hash__":4002},"pages_en/writing/articles/reflection-on-having-kids.md","A personal reflection on the decision to have children",{"type":28,"value":3860,"toc":3985},[3861,3864,3867,3870,3873,3877,3880,3883,3894,3897,3908,3911,3914,3917,3921,3924,3927,3931,3934,3937,3941,3944,3947,3950,3953,3956,3959,3962,3966,3969,3972,3975,3978,3982],[59,3862,3863],{},"I always had this fundamental question about parenthood : \"Why ? Why want or not want a child ?\".",[59,3865,3866],{},"The verb \"to want,\" so often used in this context, has always made me wonder. I see in it a semantic and moral paradox. There is this particularly selfish dimension: an adult desires something, so they claim it for themselves. But what about the child? They didn't ask to be born into an environment where their presence more often serves the personal fulfillment of their parents rather than their own existence. Would I, too, be capable of such selfishness, to the point of considering a living being as a means to achieve my own desires? A toy?",[59,3868,3869],{},"The child is therefore forced to exist in order to legitimize the lives of their parents.",[59,3871,3872],{},"This question of \"why\" is, for me, the most important one. And it comes back every single time a parent looks at me with a funny smile and says, \"You'll see, it's the most beautiful thing in the world,\" or \"You should have a child, it changes you.\"",[54,3874,3876],{"id":3875},"a-barrier-to-dialogue","A barrier to dialogue",[59,3878,3879],{},"Sharing my point of view about the \"why\" with parents is often difficult to me, if not impossible. Their justifications rarely hold up to analysis. Few people reach the necessary objectivity to question the very foundation of their procreation.",[59,3881,3882],{},"Too often and too quickly, the debate goes straight into preconceived arguments, far removed from the initial question:",[103,3884,3885,3888,3891],{},[106,3886,3887],{},"A child allows us to fulfill ourselves.",[106,3889,3890],{},"A child teaches responsibility.",[106,3892,3893],{},"A child brings unconditional love.",[59,3895,3896],{},"Faced with these statements, which I find reductive, and sometimes insulting, I often prefer to just smile and accept that the discussion is futile, so I wouldn't create discomfort. How is it that a parent wants a child for their own benefit? I mean, seriously!",[103,3898,3899,3902,3905],{},[106,3900,3901],{},"\"A child allows us to fulfill ourselves.\" (In other words: we use a kid to give structure to our own life).",[106,3903,3904],{},"\"A child teaches responsibility.\" (In other words: we create a bond of absolute dependence to force ourselves to mature).",[106,3906,3907],{},"\"A child brings unconditional love.\" (In other words: we use a kid as an exclusive emotional source).",[59,3909,3910],{},"And then right after the birth, hormonal mechanisms and cognitive dissonance kick in to justify the sacrifices made in the name of this \"unconditional love.\" Yet, it is hard not to notice that we do not have a child for the sake of the child. I do not need parenthood to find meaning in my life, to mature, or to learn how to love. Therefore, in the absence of a need, there is no desire either.",[59,3912,3913],{},"I love kids. I love watching them exploring the world, I love being part of their path for a time and help them grow. I teach, I challenge, I feel their struggles and their moment of happiness. I feel the urge to protect them and keep the curiosity that that drives them. I love watching parents taking care of a family members and the feeling of belonging. But that does not answer the \"Why\".",[59,3915,3916],{},"I enjoy teaching or mentoring because it requires looking at kids as independent subjects and beings. It's about giving them tools, skills, and knowledge. Yet, the \"Why\" isn't about the teacher, it's about the children themselves, whom we help regardless of how they got in this world. There is a separation between \"why they are here\" and \"how do we help them\". Having them as students is validating their reality and taking the responsability of their growth without the ego of \"the creator\". I guess it's my way to be altruistic. Giving without having demanded their birth to satisfy a personal need.",[54,3918,3920],{"id":3919},"observation-of-the-real-world","Observation of the real world",[59,3922,3923],{},"Let us look lucidly and frankly at what awaits a child. Economic, educational, and housing challenges, or even the quest for security and self-esteem. The toll is heavy. Is this the best way to say \"I love you\" to a child? Is this, then, the purpose of reproduction? The selfish use of a living being to fill our own voids, only to leave them precisely at the time when we, the adults, are barely beginning to understand our own lives? I see no love or support in that. Reproduction sometimes seems dictated by a manipulative biology, entirely removing any conscious responsibility.",[59,3925,3926],{},"And then there are the parents who explain: \"Yes, but my goal is to make them independent.\" Well, thank you for that! After being the center of their parents' attention, the child grows up and develops a critical mind toward their world and their parents. It is then time for them to fend for themselves, away from the family nest and the disfunctions they start to question, though not without first being instilled with a guilt, inducing moral debt toward their family along the way.",[54,3928,3930],{"id":3929},"my-position","My position",[59,3932,3933],{},"From this perspective, I have a hard time with the cynicism of \"I want a child.\" I do not \"want\" a child. I have always said that I don't know if I will have one day or not, but it won't be because \"I want to.\" As long as, the question \"Why?\" remains centered on myself, I don't see the point. I already carry the responsibility of my own existence. Choosing not to pass my burdens onto a being who does not exist seems, to me, a much more altruistic and responsible stance than the social norm people try to impose on me.",[59,3935,3936],{},"It is my opinion that respecting the child means refusing to turn them into a therapeutic band-aid or an existential crutch.",[54,3938,3940],{"id":3939},"the-reality-of-parenthood","The reality of parenthood",[59,3942,3943],{},"To me, the perspective of \"wanting\" a kid explains many of parents’ crash out and couples’ conflicts within the first years of a baby. Let me develop an idea.",[59,3945,3946],{},"In this thesis, adults who \"wants\" a kid think about themselves. There is massive accumulation of expectations and projections into the representation of having a child. As I said, some people project love, responsabilities, the feeling of growing as an adult. Maybe they chase a social perception where other parents will finally see them as a grown up because they went through the same experience. This often leads to looking down to those who don’t have children, but this is another subject.",[59,3948,3949],{},"If wanting a child is about oneself, this is selfish. Before birth, the child is a mental avatar used to satisfy the parent's ego. But a newborn is a biological emergency machine. This little fragile creature has absolutely no care about those who \"wanted\" them. This baby has needs and all projections from his parents must disappear instantly. There is no space of an existential timeline or a desire to look like a mature adult to one's peers. Suddenly, parents crash out because they are mourning the loss of the main character status they thought the babay would elevate, rather than eliminate. They must take care about someone else.",[59,3951,3952],{},"This is what we hear from young parents more often than not: “My life is about them, I gave myself to them”. That makes total sense because they have no other choice. Their brain are forced to shift from “myself” to “the baby”. They don’t grow up and learn to be more responsible. They are forced to put their self centred world aside and accept that they are not the main character anymore.",[59,3954,3955],{},"Parents often mistake the survival-driven suppression of their own needs for moral growth. They have to comply with reality or the baby \"dies\". This isn't a moral achievement, this is a crisis response.",[59,3957,3958],{},"This moment is crucial for an adult. This is a maturity gain that many parents are forced to accept. But parenthood isn’t the only way. It is a brutal truth that breaks a cognitive dissonance built since childhood in a very short time, yes. But this eyes opening and transforming moment happens to many people without parenthood.",[59,3960,3961],{},"So, in a sense, wanting a kid is selfish, but having a kid unlocks a lesson to those who thought about a child for themselves instead of being altruistic.",[54,3963,3965],{"id":3964},"questioning-the-why","Questioning the “Why”",[59,3967,3968],{},"Now, a defender of the norm would say: \"Oh, you don't want kids? You're just afraid of the hard work. You're escaping the ultimate life lesson in selflessness\".",[59,3970,3971],{},"Then I have a question: If I am aware of the life lesson and altruism, is the fact that I choose to protect my own life without \"wanting\" a kid really just an excuse to escape responsibilities? Why do you need a crisis to teach you how to be human?",[59,3973,3974],{},"Well, I’m already an altruist. I became one through many other life experiences.",[59,3976,3977],{},"So, once again, \"Why\"? That question matters because hidden motives create predictable crises.",[54,3979,3981],{"id":3980},"my-conclusion","My conclusion",[59,3983,3984],{},"Parenthood is often praised as the ultimate school of altruism. What I see is more a crisis driven process to teach a lesson to a stuborn ego. A period that forces some adults to stop being the main character. A lesson that can, or should, be learned without forcing another soul into existence.",{"title":8,"searchDepth":31,"depth":31,"links":3986},[3987,3988,3989,3990,3991,3992],{"id":3875,"depth":31,"text":3876},{"id":3919,"depth":31,"text":3920},{"id":3929,"depth":31,"text":3930},{"id":3939,"depth":31,"text":3940},{"id":3964,"depth":31,"text":3965},{"id":3980,"depth":31,"text":3981},"When it comes to having children, I always ask myself Why. Is it really for them, or for us? An ethical reflection on the topic of having kids.",{"status":366,"publication_date":3995,"views":3996},"2026-05-25",[3997],"wanderlust","/writing/articles/reflection-on-having-kids",{"title":3858,"description":3993},{"loc":3998},"writing/articles/reflection-on-having-kids","CNIamvbW4IJb3SCZ17r1njasGrXMcWx91RkjbZUi36E",{"id":4004,"title":4005,"body":4006,"description":4112,"extension":34,"meta":4113,"navigation":41,"path":4116,"seo":4117,"sitemap":4118,"stem":4119,"__hash__":4120},"pages_en/operating/articles/why-i-dont-have-a-phone.md","Why I don't have a phone number",{"type":28,"value":4007,"toc":4105},[4008,4011,4014,4017,4024,4027,4037,4047,4051,4054,4059,4062,4066,4069,4072,4076,4079,4083,4086,4089,4092,4096,4099,4102],[59,4009,4010],{},"Operating without a phone number is a choice. This article explains the strategy behind it.",[59,4012,4013],{},"Reliance on synchronous mobile communication creates a culture of managing emergencies.\nBy eliminating my mobile, I prioritize asynchronous deep work, mobility and control.",[59,4015,4016],{},"Being \"always reachable\" is often a euphemism for \"unrestricted access to one's attention\".\nWorse, some belive that \"being available\" is a way of \"being productive\". The reality is that\ncarrying a phone is allowing the world to interrupt you whenever it wants, making your priorities\nlower than someone else's.",[59,4018,4019,4020,4023],{},"I am aware that, for some reader, the idea of not having a phone is shocking and raises a lot of questions.\n",[3234,4021,4022],{},"Is he saying he doesn't want to be reachable?"," No, I am saying I want to be reachable on my own terms.",[59,4025,4026],{},"So, how does it work in practice?",[59,4028,4029,4031,4032,4036],{},[3234,4030,2410],{},": The best way to ",[63,4033,4035],{"href":4034},"/en/contact","contact me"," is by email. I do have the device (the smartphone), I read emails on it :)",[59,4038,4039,4042,4043,284],{},[3234,4040,4041],{},"Note 2",": I mostly ",[63,4044,4046],{"href":4045},"/en/operating/articles/asynchronous-protocol","operate asynchronously",[54,4048,4050],{"id":4049},"being-asynchronous-is-about-organization-and-discipline","Being asynchronous is about organization and discipline",[59,4052,4053],{},"Modern work suffers from synchronous fatigue. I live and operate across multiple time zones.\nA phone number attached to a geography and a network. Both are constraints I do not want to live with.",[59,4055,4056],{},[3234,4057,4058],{},"If I am not in front of a terminal, I am rarely in work mode.",[59,4060,4061],{},"Having buffers allows you and me to operate at our own optimal speeds without crashing into each other.\nNot having a phone is a way to enforce this buffer. It requires the discipline to document and\ncommunicate clearly. It also asks for clarity and precision in the way we interact. On the other hand,\nthat organization allows everyone autonomy. Making phone calls unneccessary.",[54,4063,4065],{"id":4064},"the-fallacy-of-presence","The fallacy of presence",[59,4067,4068],{},"When I spend time with a partner, a client, or a friend, I am committed to that specific interaction.\nReceiving a call, or even starting one, introduces a latency into the conversation. It signals that\nthe person in front of me can be superseded by a notification at any moment.",[59,4070,4071],{},"This is an issue of Experience Design (XD). By removing the phone, I respect the time of others by\nensuring that my presence is real. If we are talking, you have my attention. Anything less is a\nfailure of empathy and a breach of the social contract. Presence (physical or virtual) is the\nprerequisite for depth.",[54,4073,4075],{"id":4074},"the-culture-of-autonomy","The culture of autonomy",[59,4077,4078],{},"Good management principles ensure that \"service value\" is delivered through stable systems, not heroic\nindividual interventions. When communication is deliberate, everyone gains peace. No one is\ndisturbed, and issues are resolved through logic rather than panic. Reliability is a managed\nsystem, not a reactive state.",[54,4080,4082],{"id":4081},"sovereignty-and-global-logic","Sovereignty and global logic",[59,4084,4085],{},"From a technical perspective, a phone number is a fragile identifier. It changes across borders,\nincurs arbitrary operational costs, and serves as a primary vector for baseband tracking and\ngeo-location. My email address remains consistent whether I am in London, Hong Kong, or a remote\nvillage in the Australian outback. It is a stable node in a global network.",[59,4087,4088],{},"Operating across multiple timezones reinforces this logic. You might be awake, but my system is\neffectively offline.",[59,4090,4091],{},"This reduces the surface area for tracking and eliminates the \"cellular leash\" that ties a person to a specific\ngeography or telecom provider.",[54,4093,4095],{"id":4094},"operational-integrity","Operational Integrity",[59,4097,4098],{},"The boundary between \"working\" and \"living\" must be strictly defined by design. Generally,\nwhen I am not at a computer, I am not working. This simple constraint ensures that when I do answer\nan email, I have the necessary tools and mental space to provide a precise, evidence-based response.",[59,4100,4101],{},"Handling an emergency should be a rare. Any event being urgent is an incident. Incidents should be\navoided by good design. Should they occur, they require full commitment and focus. Reducing even more the usage of a phone.",[59,4103,4104],{},"If a situation requires my intervention, an email or a scheduled call provides the context necessary for a high-integrity\nresolution. This is not about being unavailable. This is about being maximizing the value of my presence.",{"title":8,"searchDepth":31,"depth":31,"links":4106},[4107,4108,4109,4110,4111],{"id":4049,"depth":31,"text":4050},{"id":4064,"depth":31,"text":4065},{"id":4074,"depth":31,"text":4075},{"id":4081,"depth":31,"text":4082},{"id":4094,"depth":31,"text":4095},"A strategic rejection of interrupt-driven systems in favor of autonomy, presence, and integrity.",{"publication_date":4114,"views":4115},"2026-02-04",[369],"/operating/articles/why-i-dont-have-a-phone",{"title":4005,"description":4112},{"loc":4116},"operating/articles/why-i-dont-have-a-phone","13ZZ83_8yaLlubYy-DCswdxs3hlKfi1TY0RFZv2LxwI",{"id":4122,"title":4123,"body":4124,"description":4196,"extension":34,"meta":4197,"navigation":41,"path":4200,"seo":4201,"sitemap":4202,"stem":4203,"__hash__":4204},"pages_en/exploring/articles/french-start-by-no.md","French start by \"no\"",{"type":28,"value":4125,"toc":4191},[4126,4132,4135,4138,4142,4145,4148,4151,4154,4158,4165,4168,4175,4178,4182,4185,4188],[59,4127,4128,4129,284],{},"In France, the default starting position of any negotiation, social or professional, is often: ",[74,4130,4131],{},"No",[59,4133,4134],{},"One should not mistake this for a refusal. It is not an end, it is a prerequisite for entry. It is a request for a case.",[59,4136,4137],{},"In a culture driven by conviction, a \"yes\" must be earned through the friction of debate. When a French person gives his word, it becomes a value added in a term of giving a word. It is the transition from a casual exchange to a committed action or relationship.",[54,4139,4141],{"id":4140},"french-are-cold-really","French are cold. Really?",[59,4143,4144],{},"One often observes that the French are not immediately open. There is an \"ice wall\" like a thick barrier to entry that can be confusing for those used to the low-friction social interfaces. Looking at you North America and Australia.",[59,4146,4147],{},"Europeans often describe the US as the following: You meet a stranger, feels like best friends within minutes, and then never hears from them again. This is a high-churn social model.",[59,4149,4150],{},"The French model is different.",[59,4152,4153],{},"The initial coldness is a filter. If one takes the time to break the ice (specifically, if one makes the effort to speak the language), the experience transforms. Loyalty is a component of French relationships. Once one is \"in,\" one is stuck the long run. It is a low-churn, high-reliability system.",[54,4155,4157],{"id":4156},"a-word-about-paris","A word about Paris",[59,4159,4160,4161,4164],{},"There is a persistent belief that the French are arrogant. Often because of the \"parisian performance\". I should start by saying that Paris is not France. Paris is simply ",[3234,4162,4163],{},"in"," France.",[59,4166,4167],{},"In the capital, the environment is one of extreme competition and high stakes. People must fight to protect their interests and their relevance. Arrogance is often a defensive layer, an armor against being set aside by their peers.",[59,4169,4170,4171,4174],{},"In the city of luxe, design, fashion, finance, if you don't know ",[3234,4172,4173],{},"already"," you loose relevance. Professionals often pretend to know everything, not because they are deluded, but to avoid being set aside by their peers. To be out of the loop in design, knowledge, or involvement is a form of professional obsolescence. Who wants to work with lagging knowledge? This is Paris, France is a bigger country.",[59,4176,4177],{},"They are rarely \"surprised\" because they have been trained to \"know it already.\"",[54,4179,4181],{"id":4180},"earning-the-yes-has-value","Earning the \"yes\" has value",[59,4183,4184],{},"Understanding these cultural protocols changes the nature of the interaction. One must prepare the narrative, endure the initial \"no\", and respect the slow build of trust.",[59,4186,4187],{},"In France, the \"yes\" is a milestone, not a greeting.",[59,4189,4190],{},"It is a culture that prioritizes the depth of the commitment over the speed of the acquisition.",{"title":8,"searchDepth":31,"depth":31,"links":4192},[4193,4194,4195],{"id":4140,"depth":31,"text":4141},{"id":4156,"depth":31,"text":4157},{"id":4180,"depth":31,"text":4181},"Exploring the \"no\" as a protocol of conviction, the loyalty, and the performative arrogance of some parisian defense.",{"publication_date":4198,"views":4199},"2026-01-30",[3997],"/exploring/articles/french-start-by-no",{"title":4123,"description":4196},{"loc":4200},"exploring/articles/french-start-by-no","BLDkrjl-dNmT0WuH_uIaa-r0S96StUWJ2tKr6csB0JQ",{"id":4206,"title":4207,"body":4208,"description":4354,"extension":34,"meta":4355,"navigation":41,"path":4357,"seo":4358,"sitemap":4359,"stem":4360,"__hash__":4361},"pages_en/operating/articles/honesty-as-a-prerequisite-for-system-integrity.md","Honesty as a prerequisite for system integrity",{"type":28,"value":4209,"toc":4341},[4210,4213,4216,4219,4222,4225,4228,4232,4236,4241,4244,4247,4250,4254,4257,4260,4264,4267,4270,4274,4277,4280,4284,4288,4293,4296,4299,4302,4305,4308,4312,4315,4318,4322,4325,4328,4331],[59,4211,4212],{},"Systems require honesty to function. Without it, governance (whether of a machine or in life) is arguably impossible.",[4214,4215],"hr",{},[59,4217,4218],{},"The first time I touched a computer I was around 7 or 8 years old, at school. I remember I was typing a letter on a text editor and I found it exceptional how the computer would do only what I ask it to do. Good and also bad. I was young but I could already see the machine is incapable of pretending. A computer doesn't think, it executes. Type wrong and it will do wrong. Type right and it will do right.",[59,4220,4221],{},"I saw, in that exact moment, the mirror of my own actions. From day one, I loved the brutal truth it gives you.",[59,4223,4224],{},"Later on, as an engineer, this statement always proved true. The machine doesn't lie. You can disagree with it, but it will do what you ask it to do. If a script fails, the error is yours. Then you learn, you fix, you become better. The computer isn't kind, it is true. Should you choose to hate it for it is your choice. Mine was to thank for the feedback and to continue learning.",[59,4226,4227],{},"Along the way, I learned patience and discipline. Patience to look for evidence, to question my own assumptions. Discipline to challenge my ideas when I couldn't be intellectually honest with myself when I'd say \"I know\". The computer doesn't waste time on your beliefs or never try to make you feel good. It states facts. Take it or leave it.",[54,4229,4231],{"id":4230},"what-can-we-learn-from-this","What can we learn from this?",[204,4233,4235],{"id":4234},"_1-cognitive-dissonance-the-gap","1. Cognitive dissonance, the gap",[59,4237,4238],{},[3234,4239,4240],{},"The choice to hide for a comfortable story",[59,4242,4243],{},"Cognitive dissonance is a psychological friction that occurs when reality doesn't match your beliefs. If the dissonance isn't resolved by changing the belief, it leaves the room for the consolidation of a wrong belief, hence taking more distance from the truth.",[59,4245,4246],{},"In french there is a saying: \"Je n'ai qu'un son de cloche\" which means \"I only have one sound of a bell\". It means that you only have one side of the story. A lie thrives in this environment. It exploits cognitive biases like a 0-day vulnerability. If you don't know the mechanics of how a system (or a person) actually behaves, you will accept any simplified narrative that \"feels\" right. Including your own lies.",[59,4248,4249],{},"This is the beginning of a dependency on lies to feel good. It often manifests as a rejection of the information while looking for a social support or by trying to convince others. A way to bypass the objective proof while creating a social context to feel better.",[204,4251,4253],{"id":4252},"_2-cognitive-load-the-debt-and-the-cost","2. Cognitive load, the debt and the cost",[59,4255,4256],{},"Lying requires significant cognitive energy. It is a high-interest debt that lives in the background. A lie needs to be maintained, retold, justified. It is a burden.",[59,4258,4259],{},"The truth is stateless, it can sit here and even be forgotten. In such a case, it is still true and retriving the evidence is the only cost.",[204,4261,4263],{"id":4262},"_3-better-human-connections","3. Better human connections",[59,4265,4266],{},"Being true removes the social mask. It allows to be vulnerable and to build trust with others. There is no need to be slick and perfect all the time. It only creates a false sense of security.",[59,4268,4269],{},"I have always maintained that as long as I have the truth, I can handle any situation in the best interest of everyone involved. The moment the truth is obscured is the moment the system breaks. I do not blame a person for a difficult truth, because that truth is the first component of the solution.",[204,4271,4273],{"id":4272},"_4-truth-is-timeless","4. Truth is timeless",[59,4275,4276],{},"In engineering, a fact discovered in a log file five years ago is still a fact today. In life, truth acts as a fixed point of reference. When you build a strategy on truth, you are building on a foundation that doesn't expire. Somehow making it a long-term asset for an individual or organization.",[59,4278,4279],{},"I see a lie as a temporary fix that will cost you more in the long run. We often hear \"a lie takes the lift, the truth takes the stairs\". The fact is a lie expires as soon as the context changes. And it will change. The truth is set.",[54,4281,4283],{"id":4282},"a-method-for-integrity","A method for integrity",[204,4285,4287],{"id":4286},"_1-in-case-of-doubt-no-doubt","1. In case of doubt, no doubt",[59,4289,4290],{},[3234,4291,4292],{},"Evidence over beliefs",[59,4294,4295],{},"Believing is easy, it requires zero effort. Knowing is hard, it requires verification, focus, and the willingness to be wrong.",[59,4297,4298],{},"Look for facts, go to the source. It can take time at first but it worth it. Don't believe me on that, practice it and you'll see.",[59,4300,4301],{},"In engineering, this means to read logs, read metrics, read code, identify the chain of events. If you can't find the answer, you can't justify your claim. When someone lacks the literacy of a situation they are forced to rely on belief.",[59,4303,4304],{},"In the daily life, look for the source, ask questions to relevant people, learn and challenge your assumptions. Even the comfortable ones.",[59,4306,4307],{},"Collecting evidence is key. It helps us to stick with facts and reality. Knowing facts allows better decision making.",[204,4309,4311],{"id":4310},"_2-encourage-autonomy-through-transparency","2. Encourage autonomy through transparency",[59,4313,4314],{},"When we decide that finding the source is \"too much of a hassle\", we delegate our knowledge to a third party. The good thing about an evidence is that it is objective. It doesn't need someone to maintain it. It is here, for everyone to see. Therefore, it offers a shared truth that can be consulted autonomously, without bottleneck or constant monitoring. No gatekeepers to interpret it.",[59,4316,4317],{},"Keeping a documentation up to date is a way to keep the system honest.",[54,4319,4321],{"id":4320},"prepare-for-the-real-world","Prepare for the real world",[59,4323,4324],{},"Accepting the truth can be uncomfortable because it requires us to watch ourselves in the mirror, without the filter of the \"intentions\". Sometimes it demands to fight our common sense. But what is common sense after all? It is just a set of beliefs that have been repeated so many times that we accept them as truth. It's a \"sense\" not a \"fact\". We should be willing to debug our own narrative too. The alternative often leads to a system failure. Whether it is a software or a human social system.",[59,4326,4327],{},"The approach is the same: clear honesty and integrity. Simply refuse to have an opinion on something you haven't bothered to investigate.",[59,4329,4330],{},"The real world will always offer paths of least resistance paved with \"polite\" lies or convenient omissions and the mental peace of simplifications. But for those who value system integrity, the choice is binary.",[59,4332,4333,4334,1981,4337,4340],{},"We must treat feedback like a computer treats code. Not as a personal attack, but as data. By reducing the gap between ",[3234,4335,4336],{},"what is",[3234,4338,4339],{},"what we say",", we stop delegating our reality to others. Is it my way to be a better engineer? One of them, yes. Is it my way to be a better person? I don't know but this is a way to make better choices, yes.",{"title":8,"searchDepth":31,"depth":31,"links":4342},[4343,4349,4353],{"id":4230,"depth":31,"text":4231,"children":4344},[4345,4346,4347,4348],{"id":4234,"depth":355,"text":4235},{"id":4252,"depth":355,"text":4253},{"id":4262,"depth":355,"text":4263},{"id":4272,"depth":355,"text":4273},{"id":4282,"depth":31,"text":4283,"children":4350},[4351,4352],{"id":4286,"depth":355,"text":4287},{"id":4310,"depth":355,"text":4311},{"id":4320,"depth":31,"text":4321},"Why truth is a performance optimization, and how lying creates a technical debt that eventually breaks the system.",{"publication_date":4198,"views":4356},[369],"/operating/articles/honesty-as-a-prerequisite-for-system-integrity",{"title":4207,"description":4354},{"loc":4357},"operating/articles/honesty-as-a-prerequisite-for-system-integrity","SCAuYkURTehU1C7IYhHiYHarBAmVwkHfCTKuabxVpVI",{"id":4363,"title":4364,"body":4365,"description":4436,"extension":34,"meta":4437,"navigation":41,"path":4439,"seo":4440,"sitemap":4441,"stem":4442,"__hash__":4443},"pages_en/writing/articles/ai-hype.md","An architectural critique of the \"AI-first\" movement",{"type":28,"value":4366,"toc":4429},[4367,4371,4374,4378,4381,4385,4388,4391,4395,4398,4402,4405,4408,4411,4416,4419,4423,4426],[54,4368,4370],{"id":4369},"the-risk-of-opaque-automation","The risk of opaque automation",[59,4372,4373],{},"In late 2025, Salesforce reduced its customer support headcount by 44%. 4,000 professionals, and with them, thousands of years of memory and expertise. Management framed the reduction as a move toward efficiency. Within months, internal admissions revealed an over-estimation of current AI capabilities. Reliability issues surfaced, proving that technology is a complex instrument, not a corporate toy.",[59,4375,4376],{},[74,4377,3684],{},[59,4379,4380],{},"Salesforce didn't just fire people, they decided to replace them with a probabilistic \"black box\" they didn't fully understand.",[54,4382,4384],{"id":4383},"the-human-context","The human context",[59,4386,4387],{},"The decision to decouple 4,000 professionals from the support process had human consequences that many executives underestimated. Technology must alleviate friction, not introduce it. When AI agents fail, the remaining staff face unprecedented pressure and customer vitriol. This disregard for the human element in a high-stakes environment represents a failure in Experience Design (XD).",[59,4389,4390],{},"From a business perspective, the move targeted operational efficiency. Yet, the premature replacement of expertise with probabilistic models leads to a \"hallucination tax.\" When an AI fails to resolve a multi-turn conversation, the cost of remediation far exceeds the savings of a reduced salary bill. Institutional knowledge vanishes once purged. Those 4,000 roles represented thousands of years of undocumented edge-case handling. No current Large Language Model (LLM) simulates this experience. The reality is that, like in any company of any size, people are often the source of organizational intelligence.",[54,4392,4394],{"id":4393},"the-technical-proof","The technical proof",[59,4396,4397],{},"Technically, the Salesforce situation highlights a common engineering anti-pattern: using a probabilistic \"black box\" for tasks that are inherently deterministic. Expert analysis revealed instances where users expected AI to trigger routine events, like sending satisfaction surveys, that a simple line of code handles better. Attempting to solve structured logic problems with ambiguous intelligence is an expensive distraction. This is the equivalent of using a powerful neural network to act as a light switch. It is over-engineered and ignores the principle of using the right tool for the job.",[54,4399,4401],{"id":4400},"problems-in-the-methodology","Problems in the methodology",[59,4403,4404],{},"For the modern CIO or CTO, navigating the AI landscape requires a return to the \"Architects Who Code\" imperative. We should ensure technology serves business strategy, not the other way around. Technical leadership must act as the technical conscience of the firm. Listen to principal engineers; their skepticism is often a survival mechanism. They understand that \"what works in a demo\" rarely works at scale without significant guardrails. A mature leadership team demands proof in the form of rigorous benchmarks before authorizing irreversible changes.",[59,4406,4407],{},"Every major architectural shift must pass Weinto's \"XD x Business x IT\". Before deploying an autonomous agent, verify if the technology suits the task (IT), if the risk of failure is quantifiable (Business), and if the change improves the user experience (XD). If a system cannot pass all three checkpoints, it is a hype-driven distraction.",[59,4409,4410],{},"At Weinto we advocate for a culture of phased rollouts. This requires robust change enablement. In the context of AI, this means starting with augmentation rather than replacement. An AI \"co-pilot\" that assists a human agent is a low-risk way to gather the telemetry needed for autonomy. By running these systems in parallel, you create a \"graceful fallback\" mechanism. This approach builds a robust feedback loop that identifies model failures before they become public.",[1968,4412,4413],{},[59,4414,4415],{},"Reliability isn't luck, it's a well-managed and well designed service value system.",[59,4417,4418],{},"Finally, we must embrace a mindset of Data Sovereignty. Relying entirely on external, proprietary black boxes risks your digital independence. Organizations must invest in internal expertise to evaluate and govern their models. Understanding the \"why\" behind an AI's decision is as important as the decision itself. By focusing on deterministic systems for critical business processes, you ensure your infrastructure remains under your control.",[54,4420,4422],{"id":4421},"the-reflection-learning-from-the-mismatch","The reflection: Learning from the mismatch",[59,4424,4425],{},"The Salesforce case study serves as a necessary correction for the industry. Technical transformation requires more than capital and a mission statement. It requires humility in the face of complexity and respect for the expertise of those who build and maintain the systems. As engineering leaders, our duty is to be the voice of reality in a room filled with hype. We build systems that serve both the bottom line and the people who make that bottom line possible.",[59,4427,4428],{},"Technology is a tool and it's everyone's job to determine if it builds or breaks the enterprise. In that context, my take is that precision is the only defense against hype.",{"title":8,"searchDepth":31,"depth":31,"links":4430},[4431,4432,4433,4434,4435],{"id":4369,"depth":31,"text":4370},{"id":4383,"depth":31,"text":4384},{"id":4393,"depth":31,"text":4394},{"id":4400,"depth":31,"text":4401},{"id":4421,"depth":31,"text":4422},"AI hype-driven layoffs, Salesforce case study",{"status":366,"publication_date":4198,"views":4438},[369],"/writing/articles/ai-hype",{"title":4364,"description":4436},{"loc":4439},"writing/articles/ai-hype","vLhZOhq0N7oP4m5PMTd2okqfZMrVDtK5ubX0QQLIS1o",{"id":4445,"title":4446,"body":4447,"description":4600,"extension":34,"meta":4601,"navigation":41,"path":4604,"seo":4605,"sitemap":4606,"stem":4607,"__hash__":4608},"pages_en/building/articles/vaultwarden-post-mortem.md","Incident Report: Vaultwarden Storage Failure",{"type":28,"value":4448,"toc":4592},[4449,4456,4459,4463,4466,4489,4493,4496,4499,4503,4508,4519,4533,4537,4540,4552,4557,4561,4564,4569,4587,4589],[59,4450,4451,4452,4455],{},"Reliability is about preventing failure and, sometimes, it is about managing recovery. On January 26th, the physical infrastructure hosting my ",[253,4453,4454],{},"vaultwarden"," instance suffered a power event that exposed a critical flaw in my redundancy strategy.",[59,4457,4458],{},"No complaint here, just an analysis of why \"High Availability\" is not \"backup,\" and why sovereignty requires more than just owning the hardware.",[54,4460,4462],{"id":4461},"so-what-happened","So, what happened?",[59,4464,4465],{},"A rapid series of power outages caused a corruption of the distributed block storage system (Longhorn). Despite having three replicas across different nodes, the corruption was replicated instantly to all instances.",[103,4467,4468,4477,4483],{},[106,4469,4470,4473,4474,4476],{},[74,4471,4472],{},"Impact:"," Total loss of the ",[253,4475,4454],{}," persistent volume of the Postgres database.",[106,4478,4479,4482],{},[74,4480,4481],{},"Data Loss:"," 0% (Due to client-side caching and external backups).",[106,4484,4485,4488],{},[74,4486,4487],{},"Recovery Time:"," ~2 hours to rebuild the namespace state.",[54,4490,4492],{"id":4491},"context","Context",[59,4494,4495],{},"The infrastructure relies on a k3s cluster using Longhorn for distributed block storage. This setup is designed to handle node failures (availability). However, it assumes a somehow stable physical environment.",[59,4497,4498],{},"The event, a \"flickering\" power outage (ON-OFF-ON-OFF), was sent the rack. By the time I manually cut power to protect the hardware, the filesystem was already corrupted.",[54,4500,4502],{"id":4501},"root-cause","Root cause",[59,4504,4505],{},[74,4506,4507],{},"Why did 3 replicas fail?",[59,4509,4510,4511,4514,4515,4518],{},"One often confuse ",[3234,4512,4513],{},"Redundancy"," (Availability) with ",[3234,4516,4517],{},"Resilience"," (Integrity).\nLonghorn replicates block-level data. When the filesystem corruption occurred on the primary write operation during the power spike, Longhorn's replication engine did exactly what it was designed to do: it replicated that corruption to all three nodes immediately.",[103,4520,4521,4527],{},[106,4522,4523,4526],{},[74,4524,4525],{},"Snapshot failure:"," Even the local snapshots were marked as corrupted because the parent volume metadata was unreadable.",[106,4528,4529,4532],{},[74,4530,4531],{},"Result:"," The PVC was effectively bound to a ghost. The data existed on disk, but the filesystem map was unrecoverable.",[54,4534,4536],{"id":4535},"the-sovereignty-lesson","The \"sovereignty\" lesson",[59,4538,4539],{},"Don't rely on assumptions:",[142,4541,4542,4545],{},[106,4543,4544],{},"Longhorn replicas won't necessarily save you.",[106,4546,4547,4548,4551],{},"Bitwarden client caches (on iOS or macOS) can't really serve as a \"last resort\" backup. While the Bitwarden client stores ",[3234,4549,4550],{},"personal"," vault data locally for offline access, it does not store Organization secrets. When I exported my local vault \"just in case,\" I found that the Organization items were empty.",[59,4553,4554,4556],{},[3234,4555,1974],{}," Organization keys are retrieved dynamically. If the server is down and the session token expires or the specific cache is cleared, that data is inaccessible from the client export.",[54,4558,4560],{"id":4559},"corrective-measures","Corrective measures",[59,4562,4563],{},"The system worked because I had an external backup less than 48 hours old. Note that relying on manual intervention is not a strategy.",[59,4565,4566],{},[74,4567,4568],{},"Implemented changes:",[142,4570,4571,4577],{},[106,4572,4573,4576],{},[74,4574,4575],{},"S3 Snapshots:"," Configured Longhorn to push backups to an object storage bucket.",[106,4578,4579,4582,4583,4586],{},[74,4580,4581],{},"Database dumps:"," Added a ",[253,4584,4585],{},"cronjob"," to export the Vaultwarden SQL database to flat file storage nightly.",[54,4588,341],{"id":340},[59,4590,4591],{},"Sovereignty is a method, not a product. Owning the \"Cloud\" means you also own the outage. If you cannot recover your infrastructure from a bare-metal state using only external keys, you do not own it; you are just renting it from luck.",{"title":8,"searchDepth":31,"depth":31,"links":4593},[4594,4595,4596,4597,4598,4599],{"id":4461,"depth":31,"text":4462},{"id":4491,"depth":31,"text":4492},{"id":4501,"depth":31,"text":4502},{"id":4535,"depth":31,"text":4536},{"id":4559,"depth":31,"text":4560},{"id":340,"depth":31,"text":341},"A post-mortem analysis of a catastrophic storage failure, the limits of distributed replication, and the reality of self-hosted sovereignty.",{"publication_date":4602,"views":4603},"2026-01-26",[1914],"/building/articles/vaultwarden-post-mortem",{"title":4446,"description":4600},{"loc":4604},"building/articles/vaultwarden-post-mortem","H0sCne2qKVItZiEEdhLJHpFb-28pdfHz4xd19-YtUk8",{"id":4610,"title":4611,"body":4612,"description":4737,"extension":34,"meta":4738,"navigation":41,"path":4741,"seo":4742,"sitemap":4743,"stem":4744,"__hash__":4745},"pages_en/operating/articles/asynchronous-protocol.md","The Asynchronous Protocol",{"type":28,"value":4613,"toc":4728},[4614,4617,4620,4623,4627,4630,4633,4636,4639,4643,4650,4653,4660,4663,4667,4670,4674,4677,4680,4684,4687,4704,4707,4711,4714,4717,4720,4725],[59,4615,4616],{},"Most organizations treat communication as a byproduct of existence. I treat it as a flow of information that needs to be managed. A protocol.",[59,4618,4619],{},"Synchronous communication is \"stateful.\" It requires two or more people to align their mental state, location, and time simultaneously.",[59,4621,4622],{},"The \"asynchronous protocol\" is an attempt to structure the share of information without the need of a simultaneous presence. Digging in the architectural choice to prioritize autonomy over the illusion of \"availability.\"",[54,4624,4626],{"id":4625},"the-laziness-of-real-time","The laziness of real-time",[59,4628,4629],{},"Synchronous communication is often an act of intellectual laziness. When someone asks to \"hop on a quick call,\" they are frequently offloading the burden of clarity from the sender to the receiver. They expect a real-time conversation to compensate for their own lack of preparation.",[59,4631,4632],{},"In this context, the \"urgent\" notification is an act of trespassing one's attention.",[59,4634,4635],{},"When we ask for an immediate response, we are stating that our inability to plan justifies the destruction of someone else's focus. Therefore, to be \"always on\" is, somehow, to be a slave to the interruptions of others.",[59,4637,4638],{},"How can we be in control of our own time while accepting a system that defaults to \"real time\"?",[54,4640,4642],{"id":4641},"information-as-a-persistent-state","Information as a persistent state",[59,4644,4645,4646,4649],{},"In the article ",[63,4647,4207],{"href":4648},"/en/operating/articles/honesty-as-a-prerequisite-for-system-integrity",", I wrote that truth is stateless. It exists on its own, independent from people's memory. Asynchronous communication is the application of this principle to the way we share information.",[59,4651,4652],{},"We must treat information as permanent data, not as ephemeral messages.",[59,4654,4655,4656,4659],{},"In that sense, documenting is the first action to take. When information is centralized, we eliminate the risk of ",[3234,4657,4658],{},"one-man-know-it-all"," and\ncreate the capital of the organization. Searchable, versioned, accessible 24/7, centralized. It's about risk mitigation, transparency and scalability.",[59,4661,4662],{},"This is also about auditability and traceability. Without a persistent record, a decision or an action is just a rumor that loses its integrity over time. Prone to cognitive dissonance.",[54,4664,4666],{"id":4665},"the-protocol-rules","The protocol rules",[59,4668,4669],{},"To reclaim sovereignty, we must move from \"chat\" (or \"calls\") to \"protocol.\"",[204,4671,4673],{"id":4672},"_1-the-asynchronous-clarity-rule","1. The asynchronous clarity rule",[59,4675,4676],{},"Write as if the recipient cannot ask a follow-up question for 24 hours. This forces the sender to provide complete context,\ndesired outcomes, and necessary credentials upfront. Documentation must exist and be centralized. You can reference it too.",[59,4678,4679],{},"As the saying goes: \"If you cannot explain the task without a live conversation, you haven't understood the task well enough to delegate it\".",[204,4681,4683],{"id":4682},"_2-implementation-over-interaction","2. Implementation over interaction",[59,4685,4686],{},"Use \"If/Then\" logic in status updates.",[388,4688,4692],{"className":4689,"code":4690,"language":4691,"meta":8,"style":8},"language-diff shiki shiki-themes plastic","- Do X\n+ If `X` fails, then execute `Y`. Troubleshooting or rollback documentation is at `Z`.\n","diff",[253,4693,4694,4699],{"__ignoreMap":8},[396,4695,4696],{"class":398,"line":399},[396,4697,4698],{"class":687},"- Do X\n",[396,4700,4701],{"class":398,"line":31},[396,4702,4703],{"class":406},"+ If `X` fails, then execute `Y`. Troubleshooting or rollback documentation is at `Z`.\n",[59,4705,4706],{},"This is decoupled execution. It allows the recipient to move forward without waiting for permission or presence.",[54,4708,4710],{"id":4709},"the-courage-of-silence","The courage of silence",[59,4712,4713],{},"Experience Design (XD) in communication is about protecting cognitive resources. When a system is asynchronous, absence is no longer a risk. You can disconnect to focus on a complex task, knowing that the \"protocol\" is working in your absence.",[59,4715,4716],{},"In this world, a notification isn't an intrusive noise anymore. It's an asynchronous data point to be processed properly.",[59,4718,4719],{},"In this protocol, notifications I receive are not intrusive and noisy. They are mostly alerts I choose to receive.",[59,4721,4722],{},[3234,4723,4724],{},"Asynchronicity is a discipline. It requires the courage to be silent and the precision to be understood.",[1900,4726,4727],{},"html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":8,"searchDepth":31,"depth":31,"links":4729},[4730,4731,4732,4736],{"id":4625,"depth":31,"text":4626},{"id":4641,"depth":31,"text":4642},{"id":4665,"depth":31,"text":4666,"children":4733},[4734,4735],{"id":4672,"depth":355,"text":4673},{"id":4682,"depth":355,"text":4683},{"id":4709,"depth":31,"text":4710},"Why real-time communication undermines autonomy, and how to build a system that respects time.",{"publication_date":4739,"views":4740},"2026-01-05",[369,1914],"/operating/articles/asynchronous-protocol",{"title":4611,"description":4737},{"loc":4741},"operating/articles/asynchronous-protocol","sjfWepMgwSn7FTGeY_rJ6-vkdROvRBc4VWhfSc16hqM",{"id":4747,"title":4748,"body":4749,"description":4942,"extension":34,"meta":4943,"navigation":41,"path":4945,"seo":4946,"sitemap":4947,"stem":4948,"__hash__":4949},"pages_en/writing/articles/opening-a-different-eye-on-marketing.md","Opening a different eye on marketing",{"type":28,"value":4750,"toc":4934},[4751,4754,4757,4761,4764,4767,4770,4773,4780,4783,4787,4790,4793,4800,4803,4806,4813,4822,4825,4828,4832,4835,4838,4841,4844,4847,4850,4854,4857,4860,4863,4867,4870,4873,4876,4879,4882,4885,4888,4892,4895,4898,4901,4904,4907,4910,4913,4918,4921,4924,4927],[59,4752,4753],{},"For as long as I can remember, I've been concerned by privacy and its protection. Travelling around the world taught me that privacy means different things to different societies and groups of people. This article isn't about the technicalities of encryption; it is about the \"why\" of my relationship with Marketing.",[59,4755,4756],{},"Protecting privacy starts by understanding it, what it is and the risks associated with violations.",[54,4758,4760],{"id":4759},"the-privacy-reading","The Privacy reading",[59,4762,4763],{},"Privacy is understood differently across societies. It varies between individualistic cultures (mostly Western-styled), where it's a personal right tied to autonomy, and collectivist cultures (mostly Asian-styled), where it balances individual needs with group harmony. In Japan, the concept of Aida — the space between individuals—differs profoundly from the Western idea of a protected self. These views shape expectations around personal data, social interactions, and even physical space.",[59,4765,4766],{},"Privacy is culturally, historically, and contextually defined.",[59,4768,4769],{},"So, in some ways, privacy is a shared understanding of what is private and what is not. But what is private? Well, I have come to what I consider a fair definition. The boundary between \"private\" and \"not private\" is defined by a combination of legal frameworks, digital footprints, and cultural context.",[59,4771,4772],{},"In other words, it is not only oneself but a collection of factors that define the perimeter of our lives. That scares me. And it will continue to do so because, on a personal level, I consider private everything I don't want you to know. Private, to me, means \"what you don't know, you can't harm or use to harm.\"",[59,4774,4775,4776,4779],{},"And here comes Marketing. Marketing is about flirting with your privacy at best and discovering your darkest secrets at worst. The bigger the data, the better the profile, the better the marketing outcome. It is easy in that context to draw the opposition of ",[74,4777,4778],{},"privacy vs. marketing"," as a mental construct: Privacy vs. Violation Business. Therefore, marketing is bad, evil, and should be avoided. Better, I should leverage my engineering knowledge to build tools that help me protect my data or any signal \"they\" could capture.",[59,4781,4782],{},"The shortcut between marketing and security threat was real, deep.",[54,4784,4786],{"id":4785},"the-transparency-reading","The Transparency reading",[59,4788,4789],{},"The underlying concept of Marketing is a customer-centric philosophy. A business should identify and satisfy the needs and wants of its target audience more effectively than its competitors. This approach prioritizes value creation and long-term relationships to achieve organizational goals. One could see Marketing as a candid approach to serve a target audience.",[59,4791,4792],{},"I have a problem with that \"target audience\".",[59,4794,4795,4796,4799],{},"People are considered targets to catch and convert before being handed to sales. Marketing ",[3234,4797,4798],{},"says what the target wants to hear"," to attract it. I am of a minimalist nature, so I don't consume much aside from what I consider a need. It is easy for me to feel bombarded by false intentions and ulterior motives.",[59,4801,4802],{},"As an Experience Designer (XD), I understand the intrinsic requirement for a business to identify and satisfy a persona's or a user's needs, worries, and desires. What's the difference? I'm not trying to convince you when I work. I'm trying to help you achieve your own goals with the best experience possible. Yes, it requires data, but it is not about persuasion. It is about satisfaction. Therefore, I need much less data about you or your digital life aside from the product you're already on.",[59,4804,4805],{},"And I can be transparent with it.",[59,4807,4808,4809,4812],{},"This is where I draw the line. I ask for users' feedback as stakeholders. I work for the business but also for them. UX is about the ",[3234,4810,4811],{},"user",". Designing for a user is a collaborative dance, not a persuasion game. At least in the ethics of the job.",[59,4814,4815,4816,4821],{},"One shouldn't ignore ",[63,4817,4820],{"href":4818,"rel":4819},"https://www.deceptive.design/",[67],"deceptive patterns (aka dark patterns)",". That's is another subject.",[59,4823,4824],{},"I've always known that marketing is more about how people find the business than how to manipulate people into buying. Yet, I couldn't reconcile my values with the industry. If being seen meant hiding one's real intent or obfuscating the truth to accommodate a selling narrative, that wasn't for me. I value transparency because it allows me to act properly and ethically.",[59,4826,4827],{},"I would rather not take action than engage based on beliefs.",[54,4829,4831],{"id":4830},"influence-on-my-life-and-my-business","Influence on my life and my business",[59,4833,4834],{},"The paradox is I started my career in marketing. Not as a marketing expert, but as a web developer or UX designer for marketing campaigns. I have seen from within how personal data are often considered a commodity to be used to the maximum. I have seen how metrics could justify more intrusive practices. I have witnessed how some professional profiles would ignore basic knowledge, yet assert authority to climb their ladder and be seen first.",[59,4836,4837],{},"Of course, I am biased. I'm from the technical side, so I have a different perspective. I know exactly what data was harvested, how it was used, and the potential impact in case of misuse. Risk assessment is part of the job. One can't ask a marketer to be a security expert. However, I'm pretty sure marketers themselves would agree that, in a campaign project, marketing leads and tech follows.",[59,4839,4840],{},"They achieve great results I am profoundly humble about. But at what cost when security is undervalued?",[59,4842,4843],{},"Additionally, while winning awards was rewarding, most projects had to remain confidential due to NDAs. Furthermore, working on short-term projects lacked alignment with Weinto's core values of respect, iteration, and freedom. Marketing campaigns, by nature, have a set end-of-life date before they even begin. While it was gratifying to see our names alongside major corporations, I questioned the ultimate value delivered to the user, as user data was often collected with little to no control.",[59,4845,4846],{},"I wanted to better serve the user by providing a better chain. What is better than IT for that? IT is everywhere as a support function for every business. How better to serve the business and the user than by being strategically placed at their intersection in every single corner?",[59,4848,4849],{},"Here, on point, was Weinto's pivot.",[54,4851,4853],{"id":4852},"brewing-of-a-failure","Brewing of a failure",[59,4855,4856],{},"By the end of 2017, I moved Weinto from France to Hong Kong. I was already living abroad with my life partner. Weinto slowly moved from marketing campaigns to IT.",[59,4858,4859],{},"Up to that moment, finding work was never a problem for me. Constantly on the move, I'd be meeting people here and there, fitting into the local job markets for web developers and UX designers. My portfolio was good, and talking about it was enough to land a mission. People \"knew me\" and would \"contact me\" because I was \"here\". Never ever needed a CV.",[59,4861,4862],{},"What a very convenient situation for someone having deep issues with marketing – maintaining the illusion that I'd never need to engage in marketing while being blind to the fact that I was constantly swimming in it. Thus, reinforcing the belief that marketing isn't necessary and I could stand by my principles.",[54,4864,4866],{"id":4865},"the-crash","The crash",[59,4868,4869],{},"Then came COVID and travel restrictions. I won't develop much about how personal or medical data were (and still are) collected and used. That would fit in a privacy-focused article. The point here is that travel restrictions grounded me for long – too long.",[59,4871,4872],{},"Long enough for my professional network to switch to a more \"local\" approach. At least for the companies who survived their economic crisis.",[59,4874,4875],{},"That phenomenon didn't happen overnight. It was a slow process, but it was there, and Weinto wasn't ready for it. Little by little, Weinto lost clients and its CEO — me — wasn't keen on corrupting his values for \"money.\" To be honest, I felt marketing was scamming people and I didn't want Weinto to be part of it.",[59,4877,4878],{},"Our clients partner with us for a reason: their sovereignty. Playing with privacy and transparency would be a betrayal.",[59,4880,4881],{},"Instead of working on marketing strategy, I doubled down on expertise, tooling, and guidance. I obtained some strategic certifications, developed discipline and a better understanding of the business side of things. I thought that being hands-on better at everything was the way to go.",[59,4883,4884],{},"The idea was to nurture the remaining clients until better days. While it is always good to invest in one's self-development, it is better when aligned with the business needs for cash.",[59,4886,4887],{},"Unfortunately came the day I stopped paying myself... The crash.",[54,4889,4891],{"id":4890},"the-wake-up-call","The wake up call",[59,4893,4894],{},"The wake-up call wasn't about \"I need to change\". I knew that already as much as I needed marketing. No, the shift happened when I realized the \"how\". How to be visible without betraying values, clients, users, and the business itself?",[59,4896,4897],{},"Working with personas, metrics, KPIs, user flows, conversion rates, etc., is also part of the job of the UX designer. Finding ways to deliver value for the business is key for any designer. My point of view is that this point alone differentiates us from artists.",[59,4899,4900],{},"Artists have a more personal approach to their craft.",[59,4902,4903],{},"So what? What was I missing?",[59,4905,4906],{},"I was missing the fact that I had changed paths in my career without realizing it. As a freelancer, I was used to addressing the needs of my clients, whatever the need. Multi-disciplinary, curious about everything, expert in adaptation whether in tech, business, or design. I was used to being the one who finds solutions. Not just as \"the cloud architect,\" \"the experience designer,\" \"the developer,\" or \"the lead.\"",[59,4908,4909],{},"Weinto's business identity is linked to my personal moral compass but my problem wasn't about privacy or transparency. My problem was a gigantic imposter syndrome in anything I'd have to promote myself about. I'd feel like lying to clients about my capabilities because \"some are better\" or \"some dedicate 100% of their time to this topic.\"",[59,4911,4912],{},"Instead, I've built my expertise hidden from the crowd, for myself, for my clients.",[59,4914,4915,4916,284],{},"Who needs to brag or be seen when you can just be yourself and be hired for it? What a cognitive dissonance. It was time to accept the shift. I'm no longer just a developer or UX designer. I've spent years refining a philosophy, my philosophy, without realizing it: ",[74,4917,3236],{},[59,4919,4920],{},"Business, IT, and UX is the best combo to support enterprises with real impact on delivered value.",[59,4922,4923],{},"It took a little bit of time to put it on paper and publish a new website for Weinto. It feels again like accepting myself as this ever-changing profile I've always been across with my career and travels. Adapting to the environment to be the best version of myself.",[59,4925,4926],{},"This is time to assume the role of architect and strategist. I am because I do. Over should be the time to think I'm never ready for it.",[59,4928,4929,4930,4933],{},"Today, Weinto focuses on the market of SMEs and startups for this reason. I understand consulting companies are everywhere, and I'm not talking about ",[3234,4931,4932],{},"The Big Four",". Weinto's take is to prepare young or small companies for the future. Whether it should be handed over to a Big Four or whether Weinto should grow with them to address the evolution will be a challenge soon enough!",{"title":8,"searchDepth":31,"depth":31,"links":4935},[4936,4937,4938,4939,4940,4941],{"id":4759,"depth":31,"text":4760},{"id":4785,"depth":31,"text":4786},{"id":4830,"depth":31,"text":4831},{"id":4852,"depth":31,"text":4853},{"id":4865,"depth":31,"text":4866},{"id":4890,"depth":31,"text":4891},"How digging into my core values of transparency and privacy influenced my relationship with marketing and the pivot of Weinto.",{"status":366,"publication_date":4739,"views":4944},[369],"/writing/articles/opening-a-different-eye-on-marketing",{"title":4748,"description":4942},{"loc":4945},"writing/articles/opening-a-different-eye-on-marketing","It3gqSSInF-8iZyYgC_VTR55A1Ed-87X0-uhugQMfGo",{"id":4951,"title":4952,"body":4953,"description":5051,"extension":34,"meta":5052,"navigation":41,"path":5055,"seo":5056,"sitemap":5057,"stem":5058,"__hash__":5059},"pages_en/exploring/articles/traveler-or-tourist.md","Traveler or Tourist",{"type":28,"value":4954,"toc":5045},[4955,4958,4964,4967,4971,4974,4981,4987,4990,4994,4997,5003,5009,5012,5016,5019,5024,5029,5032,5034,5042],[59,4956,4957],{},"Movement is a constant in the human experience, yet the we engage with it depends on the system we choose to inhabit. We often distinguish between the \"Traveler\" and the \"Tourist.\"",[59,4959,4960,4963],{},[3234,4961,4962],{},"Disclaimer",": This post is not an exercise in moral judgment. It is a way to understand different frameworks.",[59,4965,4966],{},"In short, a tourist wants to escape life for a period of time. A traveler wants to experience it, the period is undefined.",[54,4968,4970],{"id":4969},"the-management-of-time","The management of time",[59,4972,4973],{},"The most visible differentiator is the allocation and perception of time.",[59,4975,4976,4977,4980],{},"For ",[3234,4978,4979],{},"the tourist",", time is a finite resource managed through a busy schedule. One plans visits to \"attraction points\" to maximize visibility within a limited window. This often stems from a narcissistic desire to make life public, to prove the presence at a landmark rather than understanding it.",[59,4982,4976,4983,4986],{},[3234,4984,4985],{},"the traveler",", time is a fluid environment.",[59,4988,4989],{},"We seek to experience the place as it is, without the artificial pressure of a checklist. A traveler finds value in the spontaneous interaction, the unplanned detour, and the company of peers found along the way. The experience is lived for itself, requiring no public validation to be complete.",[54,4991,4993],{"id":4992},"the-pursuit-of-legitimacy","The pursuit of legitimacy",[59,4995,4996],{},"The goal of the journey defines its rightfulness.",[59,4998,4999,5002],{},[3234,5000,5001],{},"The tourist"," is satisfied with a credible experience. As long as the hotel matches the photo and the landmark is recognizable, the mission is a success. The goal is to be able to say, \"I did it.\" It is a validation of status and a confirmation of the expected narrative.",[59,5004,5005,5008],{},[3234,5006,5007],{},"The traveler",", however, seeks legitimate knowledge.",[59,5010,5011],{},"We are in the pursuit of a legit experience because legitimacy is needed for learning. One does not want to simply see; one wants to be able to say, \"I know.\" This requires engaging with the systemic reality of a culture, its frictions, its logic, and its unfiltered truth. The \"credible experience\" is felt like a lie, a manipulation, sometimes a scam to get money only.",[54,5013,5015],{"id":5014},"the-protocol-of-approach","The protocol of approach",[59,5017,5018],{},"Finally, we must observe how one interacts with the \"other\" (often a locals).",[59,5020,5021,5023],{},[3234,5022,5001],{}," often uses criticism as a defense mechanism. When a new culture diverges from the familiar standard, it is judged. It is a way to maintain the integrity of one's existing social interface by refusing to adapt to a different one.",[59,5025,5026,5028],{},[3234,5027,5007],{}," prefers observation. Criticising others is considered a masked attempt to highlight our own perceived virtues by comparison. It shows one own insecurities or a need to feel superior.",[59,5030,5031],{},"We constantly evaluate what and how to integrate into our own lifestyle. Instead of judging the divergence, we studies the mechanism. We observe new cultures not to change them, but to update our own internal operating system.",[54,5033,341],{"id":340},[59,5035,5036,5037,5039,5040,284],{},"Neither mode is inherently superior. There are times when one requires the passive escape of ",[3234,5038,4979],{},", and times when the soul demands the active immersion of ",[3234,5041,4985],{},[59,5043,5044],{},"The distinction lies in the intent. We can choose how we engage with the world. Whether we are escaping or experiencing, we must be honest about our current mode of operation.",{"title":8,"searchDepth":31,"depth":31,"links":5046},[5047,5048,5049,5050],{"id":4969,"depth":31,"text":4970},{"id":4992,"depth":31,"text":4993},{"id":5014,"depth":31,"text":5015},{"id":340,"depth":31,"text":341},"Understanding the functional modes of movement—distinguishing by time, purpose, and approach without judgment.",{"status":366,"publication_date":5053,"views":5054},"2025-11-14",[3997],"/exploring/articles/traveler-or-tourist",{"title":4952,"description":5051},{"loc":5055},"exploring/articles/traveler-or-tourist","A_OqsLwfHMXPnYTa1wRkBlRVGmj-RTiWGnUUYBN1aaM",{"id":5061,"title":5062,"body":5063,"description":5123,"extension":34,"meta":5124,"navigation":41,"path":5127,"seo":5128,"sitemap":5129,"stem":5130,"__hash__":5131},"pages_en/writing/articles/the-empathy-trap.md","The empathy trap: Accountability and dissonance",{"type":28,"value":5064,"toc":5117},[5065,5068,5071,5075,5078,5081,5084,5088,5091,5094,5098,5101,5106,5109,5111,5114],[59,5066,5067],{},"In modern Experience Design (XD), empathy is often framed as the ultimate metric. We prioritize feeling what the user feels, yet in our personal lives, we've weaponized empathy to bypass accountability.",[59,5069,5070],{},"When we focus exclusively on our \"intent\" or our \"ego,\" we neglect the systemic results of our actions.",[54,5072,5074],{"id":5073},"empathy-as-a-ux-decoy","Empathy as a UX decoy",[59,5076,5077],{},"Empathy is necessary for mapping a journey, but it is a poor governor for a system. When we use it to justify a failure \"I meant well, therefore the error is excusable\", we are essentially installing a lying trick in our governance.",[59,5079,5080],{},"Sometimes I like to push the absurdity of things. So, would that mean that a sociopath is the perfect designer?",[59,5082,5083],{},"If you prioritize the comfort of the \"intent\" over the reality of the \"result,\" you are choosing intellectual laziness over system integrity.",[54,5085,5087],{"id":5086},"the-recursive-lie-loop","The recursive lie loop",[59,5089,5090],{},"Dr. Anna Lembke's research into the biological necessity of truth highlights a dangerous pattern: recreating a different lie to feel like one is fixing a previous one. This is toxic optimization. It's like patching a bug by adding an opaque layer and hiding the root cause.",[59,5092,5093],{},"The way I see it is people are not \"healing\". They are just refactoring the deception to make it more pleasing. That leads into a loop of self-deception. Down the road, at best, is depression.",[54,5095,5097],{"id":5096},"the-cognitive-dissonance-debugger","The cognitive dissonance debugger",[59,5099,5100],{},"Cognitive dissonance is the tension felt when actions contradict beliefs. It is a system warning of a conflict detected. There is an error in your mental runtime. The lazy response is to reduce this tension by shifting thoughts to match your behaviors: lying again to achieve consistency.",[59,5102,5103],{},[74,5104,5105],{},"Dissonance is a signal, not a threat.",[59,5107,5108],{},"Instead, we must use this tension as a debugger. Instead of refactoring the lie to accommodate the dissonance, we must update the behavior to satisfy the truth. Anything less is just a managed dependency on a false reality.",[54,5110,341],{"id":340},[59,5112,5113],{},"In the case of technologies or personal relationships, the rules are the same: clear honesty is the only way to adapt.",[59,5115,5116],{},"We must stop treating empathy as a hall-pass for mediocrity. If we want to build robust systems, we must treat feedback like a computer treats code. It is not personal. It is data.",{"title":8,"searchDepth":31,"depth":31,"links":5118},[5119,5120,5121,5122],{"id":5073,"depth":31,"text":5074},{"id":5086,"depth":31,"text":5087},{"id":5096,"depth":31,"text":5097},{"id":340,"depth":31,"text":341},"Why prioritizing empathy over accountability creates a recursive loop of self-deception.",{"status":366,"publication_date":5125,"views":5126},"2025-10-30",[369],"/writing/articles/the-empathy-trap",{"title":5062,"description":5123},{"loc":5127},"writing/articles/the-empathy-trap","oHC4fcvWO8oKR5XoVpxY9wEchgtrdM3kLI9NJTXKXgA",{"id":5133,"title":5134,"body":5135,"description":5189,"extension":34,"meta":5190,"navigation":41,"path":5193,"seo":5194,"sitemap":5195,"stem":5196,"__hash__":5197},"pages_en/writing/articles/the-sovereign-reset.md","Sovereign reset",{"type":28,"value":5136,"toc":5184},[5137,5140,5143,5147,5150,5161,5164,5168,5171,5174,5178,5181],[59,5138,5139],{},"Infrastructure is easy to build when the sun is shining. The true test of an architect is the integrity of the stack when the budget hits zero.",[59,5141,5142],{},"I am currently navigating a significant business downturn with Weinto. To be radically honest: we are facing bankruptcy. In a world of filtered successes and \"wonderful\" narratives, this is a point that most prefer to hide. I choose to document it. It's a way to be true to myself and to my values.",[54,5144,5146],{"id":5145},"the-resilience-of-the-stack","The resilience of the stack",[59,5148,5149],{},"While the financial layer of the business has collapsed, the \"sovereign layer\" remains intact.",[103,5151,5152,5155,5158],{},[106,5153,5154],{},"My data is not trapped in a proprietary SaaS I can no longer afford.",[106,5156,5157],{},"My infrastructure runs on clusters I own and maintain.",[106,5159,5160],{},"My system is documented and requires no subscription.",[59,5162,5163],{},"This is the practical value of Intellectual Sovereignty. It is the difference between a \"pivot\" (which often implies desperation) and a \"reset\" (which implies a deliberate return to root).",[54,5165,5167],{"id":5166},"cognitive-debt-vs-system-integrity","Cognitive debt vs. system integrity",[59,5169,5170],{},"Lying about failure is tempting but it is a debt. It consumes the mental capacity needed for recovery. By acknowledging this reset publicly, I am trying to free my intellectual background thoughts.",[59,5172,5173],{},"I am no longer an \"founder chasing growth\". I have neglected some aspects of my business, and I am now focusing on what matters.",[54,5175,5177],{"id":5176},"whats-next","What's next?",[59,5179,5180],{},"I am currently in a marketing sprint. After upgrading my certifications. I'll be focusing on making Weinto visible and accessible to an audience.",[59,5182,5183],{},"If you value a partner who has been through the structural stress test of failure and emerged with their integrity and stack intact, let's talk.",{"title":8,"searchDepth":31,"depth":31,"links":5185},[5186,5187,5188],{"id":5145,"depth":31,"text":5146},{"id":5166,"depth":31,"text":5167},{"id":5176,"depth":31,"text":5177},"Reflecting on business failure and the resilience of a sovereign architecture.",{"publication_date":5191,"status":366,"views":5192},"2025-02-06",[369],"/writing/articles/the-sovereign-reset",{"title":5134,"description":5189},{"loc":5193},"writing/articles/the-sovereign-reset","bSXpEJpb-oKTwEJAN2SB7ueiJT7rkiL_dsyo-pmxNSI",{"id":5199,"title":5200,"body":5201,"description":5314,"extension":34,"meta":5315,"navigation":41,"path":5318,"seo":5319,"sitemap":5320,"stem":5321,"__hash__":5322},"pages_en/writing/articles/the-importance-of-intellectual-sovereignty.md","The importance of intellectual sovereignty",{"type":28,"value":5202,"toc":5307},[5203,5206,5209,5213,5216,5219,5222,5225,5232,5236,5239,5242,5245,5248,5259,5262,5266,5269,5272,5275,5278,5282,5285,5288,5291,5294,5298,5301,5304],[59,5204,5205],{},"Sovereignty is the exercise of power over a territory and a population. Here, I am not discussing political ideology. I am defending the idea of Intellectual Sovereignty as the development of objective and personal knowledge. A necessary tool for free will.",[59,5207,5208],{},"It is the individual's ability to think autonomously and make decisions based on their own reasoning rather than adopting ideas imposed by others.",[54,5210,5212],{"id":5211},"the-simplification-paradox","The simplification paradox",[59,5214,5215],{},"The interdependencies of our information systems and their integration into our daily lives suggest a dangerous pact. Faced with information overload, we are told that mental balance can only come from a blind trust in these systems and their intentions. In this context, Intellectual Sovereignty is gradually dispraised.",[59,5217,5218],{},"It goes against the \"mental peace\" offered by the simplification of the concepts that govern our technologies.",[59,5220,5221],{},"Has knowledge and its pursuit become superfluous?",[59,5223,5224],{},"We are bombarded with slogans and ultra-simplified messages that aim to obscure existing alternatives. This is a form of manipulation that consists of annihilating critical thinking by depriving it of all intelligence. If an idea takes more than 10 minutes of focus to be understood, it is deemed \"too complex.\"",[59,5226,5227,5228,5231],{},"This leaves room for an ",[74,5229,5230],{},"intellectual laziness"," that favors belief over verification.",[54,5233,5235],{"id":5234},"sovereignty-as-a-method","Sovereignty as a method",[59,5237,5238],{},"A sovereign is someone who is autonomous and independent. One is sovereign in one's own home for what needs to happen there.",[59,5240,5241],{},"Sovereignty is therefore a method. It is having the controls in hand.",[59,5243,5244],{},"The direction taken with these controls is a second step, but it can only be chosen if one has the controls in the first place. Intellectual Sovereignty is strongly linked to the notions of Privacy and Freedom. How can one make decisions that preserve one's interests if the information acquired is delegated to subjective, opaque sources?",[59,5246,5247],{},"Several behaviors illustrate the abandonment of this method:",[103,5249,5250,5253,5256],{},[106,5251,5252],{},"Developing an argument solely on the basis of a briefly read headline.",[106,5254,5255],{},"Deciding that searching for a source is \"too long.\"",[106,5257,5258],{},"Dismissing a statement as \"too much of a hassle\" to debate.",[59,5260,5261],{},"These behaviors signify the delegation of knowledge to the \"stranger.\" This is abandoning pedagogy, verification, and objectivity. This is losing Intellectual Sovereignty.",[54,5263,5265],{"id":5264},"stupidity-vs-intelligence","Stupidity vs Intelligence",[59,5267,5268],{},"Intelligence is the ability to adapt, to choose means of action based on circumstances. It is the capacity to understand, reflect, and know in order to achieve one's goals when environments shift.",[59,5270,5271],{},"In other words, and in a more direct tone: if stupidity is addressed, one becomes stupid.",[59,5273,5274],{},"There are professionals of stupidity on television and social media. If one's intelligence is addressed, one becomes intelligent. This is not about being \"elitist\" or \"thinking too hard.\" It is about refusing to stoop low.",[59,5276,5277],{},"I think it is terrible to staging obscure discourse and mediocrity as a form of \"freedom.\"",[54,5279,5281],{"id":5280},"the-technical-ignorance-paradox","The technical ignorance paradox",[59,5283,5284],{},"Recently, we can observe that everyone has an opinion on Facebook, WhatsApp, or their iPhone, but nobody knows what an IP address, a server, or the Cloud truly is. People don't know the mechanics, yet they are passionately for or against a digital passport.",[59,5286,5287],{},"I think we have the right to be for or against, provided we know what it's truly about.",[59,5289,5290],{},"That famous encrypted QR code... what is it? Understanding the \"under the hood\" reality is what I call \"developing one's intelligence.\" Some are in denial, fleeing through negation to avoid facing the inevitable. Others think that diving into a subject is a waste of time. They believe that \"common sense\" is enough.",[59,5292,5293],{},"I think that believing is not knowing. Common sense is often the weakness that exploits cognitive biases.",[54,5295,5297],{"id":5296},"conclusion-adapting-or-abandoning","Conclusion: Adapting or Abandoning",[59,5299,5300],{},"In the case of new technologies, they will come out of their boxes; we won't put them back in. We must think very clearly about the personal, professional, and social implications of these systems.",[59,5302,5303],{},"Understanding is a prerequisite for adapting.",[59,5305,5306],{},"For all these reasons, I am opposed to trivializing a risk because we don't understand its proportion. Refusing Intellectual Sovereignty is a form of abandoning free will. It is a managed dependency on a reality one no longer controls.",{"title":8,"searchDepth":31,"depth":31,"links":5308},[5309,5310,5311,5312,5313],{"id":5211,"depth":31,"text":5212},{"id":5234,"depth":31,"text":5235},{"id":5264,"depth":31,"text":5265},{"id":5280,"depth":31,"text":5281},{"id":5296,"depth":31,"text":5297},"Developing objective and personal knowledge as a prerequisite for free will in an age of excessive simplification.",{"status":366,"publication_date":5316,"views":5317},"2023-04-03",[369],"/writing/articles/the-importance-of-intellectual-sovereignty",{"title":5200,"description":5314},{"loc":5318},"writing/articles/the-importance-of-intellectual-sovereignty","RDuQDR7O09_AvParWlVkhrb-O0NMvjRE2__0o6XBj8E",{"id":5324,"title":5325,"body":5326,"description":5694,"extension":34,"meta":5695,"navigation":41,"path":5698,"seo":5699,"sitemap":5700,"stem":5701,"__hash__":5702},"pages_en/operating/articles/what-is-wrong-with-sms-authentication.md","What is wrong with SMS-based 2FA?",{"type":28,"value":5327,"toc":5672},[5328,5332,5335,5349,5351,5354,5357,5360,5363,5366,5370,5373,5376,5379,5383,5386,5395,5398,5417,5426,5429,5432,5440,5444,5447,5462,5465,5468,5476,5480,5483,5486,5494,5503,5506,5519,5523,5526,5530,5539,5543,5546,5549,5553,5556,5559,5563,5566,5570,5574,5577,5581,5584,5587,5591,5594,5598,5602,5605,5609,5612,5616,5619,5622,5625,5629,5632,5635,5638,5641,5645,5648,5651,5654,5657,5661,5666,5669],[5329,5330,5325],"h1",{"id":5331},"what-is-wrong-with-sms-based-2fa",[59,5333,5334],{},"In short:",[1968,5336,5337,5340,5343,5346],{},[59,5338,5339],{},"One reason why you should not use SMS for TOTP (Time-based One-Time Password) is that SMS messages are not secure. SMS messages are transmitted over cellular networks and can be intercepted by attackers. This means that if an attacker is able to intercept an SMS message containing a TOTP, they could potentially use it to gain unauthorized access to a user's account.",[59,5341,5342],{},"In contrast, TOTP generators use cryptographic algorithms to generate one-time passwords that are difficult for attackers to guess or recreate. These passwords are typically displayed on the user's device, rather than being transmitted over an insecure network, which makes them more secure than SMS-based TOTPs.",[59,5344,5345],{},"Another reason to avoid using SMS for TOTP is that SMS messages can be delayed or not delivered at all, which can cause problems for users who rely on them for authentication. In these cases, the user may not be able to access their account if the SMS-based TOTP does not arrive in time.",[59,5347,5348],{},"Overall, it is generally recommended to use TOTP generators instead of SMS for TOTP, as they are more secure and reliable.",[4214,5350],{},[59,5352,5353],{},"In today's digital age, online security is more important than ever. With cyber attacks on the rise, it's essential to take steps to protect your sensitive information from hackers and other malicious actors. One of the most effective ways to do this is through the use of two-factor authentication, or 2FA for short.",[59,5355,5356],{},"2FA is a method of verifying your identity during the authentication process (ex: when you log into an online account, in addition to providing a username and password). It works by requiring you to provide two different forms of authentication: something you know (like a password) and something you have (like a smartphone or security key).",[59,5358,5359],{},"Authentication via SMS is attractive to business. Pretty much everyone has a mobile phone so it’s easy to implement and businesses don’t need to worry about smartphone operating system compatibility or the management of physical tokens. It’s a very practical solution, and it’s clear that using 2FA via SMS provides much, much greater protection for their assets than implementing no multi-factor authentication at all – but have you heard about the \"Security vs Convenience concept\" ?",[59,5361,5362],{},"Online security threats are becoming increasingly sophisticated, and traditional username and password combinations are no longer sufficient to protect your accounts. Two-factor authentication adds an extra layer of security by requiring a second factor, in addition to your password, to gain access to your account.",[59,5364,5365],{},"In this post, we will discuss why SMS-based 2FA can compromise security, the historical reasons why SMS messages are not encrypted, and alternative 2FA methods that are more secure than SMS-based 2FA.",[54,5367,5369],{"id":5368},"chapter-i-how-sms-based-2fa-can-compromise-security","Chapter I: How SMS-based 2FA can compromise security",[59,5371,5372],{},"While 2FA is an important tool in online security, SMS-based 2FA is not the most secure method. Attackers can intercept SMS messages, compromising the security of your account.",[59,5374,5375],{},"SMS attacks either compromise phones/phone numbers or the messaging centers themselves within mobile networks. These messages are in plain text form — they’re not encrypted between sender and receiver, so if an attacker can access the message, they can read the content.",[59,5377,5378],{},"Last but not least, providers can be tricked into issuing a new SIM for a target’s phone number. Then any SMS message can be read.",[54,5380,5382],{"id":5381},"chapter-ii-how-easy-and-affordable-it-is-to-intercept-an-sms","Chapter II: How easy and affordable it is to intercept an SMS",[59,5384,5385],{},"SMS messages can be easily intercepted because they are not encrypted – creating vulnerabilities for SMS-based 2FA. Therefore malicious actors can exploit these vulnerabilities. In addition, SMS messages are transmitted over a radio signal, which can be intercepted using simple equipment.",[59,5387,5388,5389,5394],{},"Cybercriminals and authorities can exploit vulnerabilities in SMS-based 2FA by intercepting the SMS message containing the one-time code. They can do this by using a fake cell phone tower (",[63,5390,5393],{"href":5391,"rel":5392},"https://en.wikipedia.org/wiki/Stingray_phone_tracker",[67],"stingrays",") or by using a malware-infected app on your device.",[59,5396,5397],{},"Phones periodically and automatically broadcast their presence to the cell tower that is nearest to them, so that the phone carrier’s network can provide them with service in that location. They do this even when the phone is not being used to make or receive a call. When a phone communicates with a cell tower, it reveals the unique ID or IMSI number (International Mobile Subscriber Identity) associated with the SIM card. The IMSI number identifies that phone and its owner as a paying customer of a cell carrier, and that number can be matched by the carrier to the owner’s name, address, and phone number.",[59,5399,5400,5401,1981,5406,5411,5412],{},"A stingray masquerades as a cell tower in order to get phones to ping it instead of legitimate cell towers, and in doing so, reveal the phones’ IMSI numbers. In the past, it did this by emitting a signal that was stronger than the signal generated by legitimate cell towers around it. The switch to 4G networks was supposed to address this in part by adding an authentication step so that mobile phones could tell if a cell tower is legitimate. Even ",[63,5402,5405],{"href":5403,"rel":5404},"https://arxiv.org/abs/1607.05171",[67],"for 4G",[63,5407,5410],{"href":5408,"rel":5409},"https://arxiv.org/abs/1809.06925",[67],"5G",". Though the 5G protocol offers a feature that encrypts the IMSI when it’s disclosed during pre-authentication communication, law enforcement would simply be able to ask phone carriers to decrypt it for them. ",[63,5413,5416],{"href":5414,"rel":5415},"https://homepage.divms.uiowa.edu/~comarhaider/publications/LTE-torpedo-NDSS19.pdf",[67],"Or simply guess it",[59,5418,5419,5420,5425],{},"An other common method is through ",[63,5421,5424],{"href":5422,"rel":5423},"https://www.youtube.com/watch?v=87JRbuujIuQ",[67],"SIM swapping",", where an attacker convinces your mobile service provider to transfer your phone number to a SIM card under their control. This allows them to intercept any SMS messages sent to your phone, including those containing 2FA codes.",[59,5427,5428],{},"Another way is through phishing attacks, where an attacker tricks you into providing your 2FA code by posing as a legitimate service or website. They may send you a fake login page or email that looks like it came from a trusted source, and then use the code you provide to access your account.",[59,5430,5431],{},"Lastly, attackers can also intercept SMS messages through software vulnerabilities or by using specialized equipment to intercept and read the messages as they are transmitted over the airwaves. Intercepting SMS messages is not a difficult or expensive process. Cybercriminals can purchase a device that can intercept SMS messages for as little as $20 on the dark web.",[59,5433,5434,5439],{},[63,5435,5438],{"href":5436,"rel":5437},"https://www.nextinpact.com/lebrief/71046/smishing-cinq-escrocs-mis-en-examen-pour-424-000-sms-envoyes-via-imsi-catchers",[67],"In France, in february 2023",", five people have been charged, including three placed in provisional detention, for sending 424,000 SMiShing (SMS phishing) messages pretending to be from the French health insurance company (Assurance Maladie) between September 2022 and February 2023. Unlike traditional phishing campaigns, the scammers used IMSI-catchers installed in cars.",[204,5441,5443],{"id":5442},"iia-ss7-vulnerabilities","II.A: SS7 vulnerabilities",[59,5445,5446],{},"SS7 (Signaling System No. 7) interception refers to the act of intercepting telecommunications traffic that passes through the SS7 protocol. SS7 is a set of protocols used for exchanging information between network elements in the public switched telephone network (PSTN). It allows telecom operators to exchange information about call routing, number translation, and other functions.",[59,5448,5449,5450,5455,5456,5461],{},"At the time of writing this post, it's been 6 years, since the National Institute of Standards and Technology (NIST) ",[63,5451,5454],{"href":5452,"rel":5453},"https://pages.nist.gov/800-63-3/sp800-63-3.html",[67],"called for the deprecation of SMS authentication as a second factor for strong authentication"," (2FA). But the ",[63,5457,5460],{"href":5458,"rel":5459},"https://en.wikipedia.org/wiki/Signalling_System_No._7",[67],"SS7 protocols set"," has been developed and is still in use since 1975.",[59,5463,5464],{},"In 2008, vulnerabilities that permitted geo-tracking where published. Same thing in 2014 during the Chaos Communication Congress.",[59,5466,5467],{},"Then in 2017, O2 Telefónica, a German mobile service provider, confirmed that the SS7 vulnerabilities had been exploited to bypass 2FA to achieve unauthorized withdrawals from bank accounts.",[59,5469,5470,5471,284],{},"In 2020, Sergey Puzantov, a telecom security expert at Positive Technologies ",[63,5472,5475],{"href":5473,"rel":5474},"https://i.blackhat.com/asia-20/Friday/asia-20-Puzankov-Back-To-The-Future-Cross-Protocol-Attacks-In-The-Era-Of-5G.pdf",[67],"showed how 5G is still weak due to SS7",[204,5477,5479],{"id":5478},"iib-a-phone-number-is-easy-to-hijack","II.B: A phone number is easy to hijack",[59,5481,5482],{},"A SIM swap scam is when a hacker tricks your mobile phone carrier into giving them control of your phone number. They can do this by pretending to be you and providing some personal information. Once they have control of your number. In other words, it doesn't necesseraly target a phone, but it targets the network.",[59,5484,5485],{},"SIM swap fraud takes advantage of a mobile phone provider's ability to move your phone number to a different SIM card. This is usually done when someone loses their phone, gets it stolen, or switches to a new phone. Criminals use this feature to transfer your phone number to their own SIM card.",[59,5487,5488,5489,284],{},"A number of high-profile hacks have occurred utilizing SIM swapping, including some on the social media sites Instagram and Twitter. In 2019, ",[63,5490,5493],{"href":5491,"rel":5492},"https://www.theverge.com/2019/8/31/20841448/jack-dorsey-twitter-hacked-account-sim-swapping",[67],"Twitter CEO Jack Dorsey's Twitter account was hacked via this method",[59,5495,5496,5497,5502],{},"It all starts with gathering personnal data about the victim. Yes, a phone number is a personnal data. This is why the ",[63,5498,5501],{"href":5499,"rel":5500},"https://www.businessinsider.com/stolen-data-of-533-million-facebook-users-leaked-online-2021-4",[67],"533 million Facebook users' phone numbers"," is a major problem. When the frauders has obtained these details, they then contact the mobile provider to port the victim's phone number to the frauder's SIM. This can be done by impersonating the victim using personnal data to appear authentic and claim they've lost their phone. Once done, the victim will lose connection to the network and the frauder will receive SMS and voice calls previously intended for the victim. Allowing to in receive OTP sent by SMS as well.",[59,5504,5505],{},"Europol arrested criminals for stealing over USD 100 millions in cryptocurrencies by using this technic.",[59,5507,5508,5513,5514,284],{},[63,5509,5512],{"href":5510,"rel":5511},"https://blog.twitter.com/en_us/topics/product/2023/an-update-on-two-factor-authentication-using-sms-on-twitter",[67],"Twitter has announced"," that starting with March 20, users who don’t pay the Twitter Blue subscription will no longer be able to use the SMS-based two-factor authentication (2FA) option. The reason? ",[63,5515,5518],{"href":5516,"rel":5517},"https://threadreaderapp.com/thread/1626956327317565440.html",[67],"It's convenient but not safe",[204,5520,5522],{"id":5521},"iic-a-physical-access-is-quick-and-discret","II.C: A physical access is quick and discret",[59,5524,5525],{},"Reading or cloning SIM card can be done in a matter of minutes. Though, not all of them are cloneable. Once done, the attacker can impersonate the victim. Blank SIM cards and writer devices are available from Amazon. Softwares are publicly available as well.",[204,5527,5529],{"id":5528},"iid-os-security","II.D: OS security",[59,5531,5532,5533,5538],{},"Android and iOS are operating system like Windows, macOS and Linux. Therefore, they come with their strenghs and their weaknesses. Android has been highllighted recently following some research from ",[63,5534,5537],{"href":5535,"rel":5536},"https://research.checkpoint.com/2020/rampant-kitten-an-iranian-espionage-campaign/",[67],"Check Point Research",". The attack was able to steal existing SMS and forward 2FA SMS to a phone number provided by the attacker.",[204,5540,5542],{"id":5541},"iie-spoofing-in-still-very-common-today","II.E: Spoofing in still very common today",[59,5544,5545],{},"Spoofing is the act of disguising a communication from an unknown source as being from a known, trusted source. A SMS isn't signed or encrypted either, making it easy to spoof.",[59,5547,5548],{},"Although this technic is not a SMS exploit by nature it benefits from its lack of security to allow some phishing and spoofing. This technic might need to be combined with phishing to gain access but once done it allows the attacker to falsify a message to appear like it's coming from a legitimate source. The idea is to impersonate a bank website for example. The message will alert the victim that they need to reply with the security code. At the same time, the hacker will trigger a login 2FA request. If the victim replies with that code, the hacker can use it to gain access.",[54,5550,5552],{"id":5551},"chapter-iii-why-sms-messages-are-not-encrypted","Chapter III: Why SMS messages are not encrypted",[59,5554,5555],{},"SMS or Short Message Service was introduced in 1992 as part of the GSM standard for mobile phones. It was initially designed as a way for network operators to send short text messages to their subscribers. However, it quickly became popular among users as a way to communicate with each other using text messages. Despite its popularity, SMS is not end-to-end encrypted, meaning that it's possible for anyone who manages to intercept the text to read its content. This makes SMS-based 2FA vulnerable to interception.",[59,5557,5558],{},"SMS messages have never been encrypted since their creation, making them an attractive target. Although some encrypted messaging services over SMS have been introduced like the RCS (Rich Communication Services) protocol, these services are not widely used and do not provide end-to-end encryption like popular messaging apps. As a result, SMS messages can be intercepted and read by anyone who has access to the message, such as mobile carriers or attackers who are able to intercept the messages during transmission.",[54,5560,5562],{"id":5561},"chapter-iv-alternative-2fa-methods","Chapter IV: Alternative 2FA methods",[59,5564,5565],{},"SMS-based 2FA is vulnerable to several types of interception and cybercriminals can exploit these vulnerabilities to gain access to your accounts. It's important to use a more secure 2FA method to protect your sensitive information.",[204,5567,5569],{"id":5568},"iva-hardware-authentication","IV.A: Hardware authentication",[193,5571,5573],{"id":5572},"iva1-physical-tokens","IV.A.1: Physical tokens",[59,5575,5576],{},"Physical tokens are small devices that generate one-time codes for 2FA. These tokens are more secure than SMS-based 2FA because they do not rely on a communication channel that can be intercepted.",[204,5578,5580],{"id":5579},"iva2-security-keys","IV.A.2: Security keys",[59,5582,5583],{},"Security keys are a form of hardware-based authentication that use cryptographic algorithms to secure access to online accounts. These keys can take the form of a USB device or a wireless dongle that communicates with your computer or mobile device. When you use a security key, you'll be prompted to insert it into your device and tap a button to authenticate your login.",[59,5585,5586],{},"Security keys are extremely secure and are considered to be one of the strongest forms of 2FA available. They're not susceptible to phishing attacks or other forms of social engineering, as they require physical access to the device.",[204,5588,5590],{"id":5589},"iva3-hardware-security-keys","IV.A.3: Hardware security keys",[59,5592,5593],{},"Hardware security keys are small physical devices that you can plug into your computer or mobile device to authenticate your identity. They use encryption and digital signatures to ensure that your login information is secure. Popular hardware security keys include YubiKey, Google Titan Security Key, and Feitian MultiPass FIDO Security Key. However, it is important to note that they can be physically lost or stolen by the owner. The mecanism is good but the vulnerabilities lies somewhere else.",[204,5595,5597],{"id":5596},"ivb-software-authentication","IV.B: Software authentication",[193,5599,5601],{"id":5600},"ivb1-authenticator-apps","IV.B.1: Authenticator apps",[59,5603,5604],{},"Authentication apps provide a more secure alternative to SMS-based 2FA by generating unique and time-based one-time codes. These codes are significantly more secure because they are locally generated on the user's device and cannot be intercepted over-the-air. They work offline. As a result, authenticator apps provide a stronger layer of protection for online accounts and are a recommended method of 2FA.",[204,5606,5608],{"id":5607},"ivb2-email-based-2fa","IV.B.2: Email-Based 2FA",[59,5610,5611],{},"Email-based 2FA works similarly to SMS-based 2FA, but instead of receiving a text message, you receive an email with a one-time code. While email-based 2FA is more secure than SMS-based 2FA, it's still vulnerable to phishing attacks.",[204,5613,5615],{"id":5614},"ivb3-biometric-authentication","IV.B.3: Biometric authentication",[59,5617,5618],{},"Biometric authentication is a method of using your physical characteristics to verify your identity, such as your fingerprint, face, or iris. This form of authentication is becoming more popular on mobile devices, with many smartphones now featuring fingerprint or facial recognition technology.",[59,5620,5621],{},"Biometric authentication is very convenient and can be faster than entering a password or using a security key. However, it's important to note that biometric data can be compromised if it's stored improperly. Additionally, not all devices support biometric authentication, so it may not be a feasible option for all users.",[59,5623,5624],{},"One day I will write about biometric authentication and why I will never recommand that.",[54,5626,5628],{"id":5627},"chapter-v-2fa-in-real-mobility-life-when-there-is-no-network-or-no-sim-card-at-all","Chapter V: 2FA in real mobility life, when there is no network or no SIM card at all",[59,5630,5631],{},"Finally I would like to talk about something I've been experiencing since 2012 when I dropped my SIM card. As a traveler, I gave up on the idea of buying new SIM cards everywhere I was. I also gave up on the idea of paying big chuncks of money every months for an international plans. Instead, I use WiFi everywhere and a VPN. That said, I will never receive an SMS.",[59,5633,5634],{},"In a simplier way, many places in the world offer an internet connexion (via WiFi or cable) while there is no phone network around. Think also about no roaming due to maintenance or missing plan.",[59,5636,5637],{},"Then there is a very simple use case. When your phone is low battery.",[59,5639,5640],{},"For these reasons, it makes absolutely no sense to send an SMS (on a dedicated network) while you're using internet (another more secured network). Services should propose the same network or provide an offline solution like these hardware and software solutions listed above.",[54,5642,5644],{"id":5643},"chapter-vi-conclusion","Chapter VI. Conclusion",[59,5646,5647],{},"In this article, we've explored the security risks of SMS-based two-factor authentication (2FA) and why it's a bad choice for online security. While SMS-based 2FA may seem like a convenient option, it's actually vulnerable to interception and hacking, making it easy for cybercriminals to gain access to your accounts and sensitive information.",[59,5649,5650],{},"It's important to choose a secure 2FA method that can provide better protection against these risks. Alternative methods like authenticator apps or hardware tokens are more secure options that can be used instead of SMS-based 2FA. These methods use encryption and generate unique codes that can only be used once, making it much harder for cybercriminals to gain access to your accounts.",[59,5652,5653],{},"As everyday internet users, it's our responsibility to protect our sensitive information from malicious actors. By choosing a secure 2FA method and being vigilant about our online security, we can help prevent cyberattacks and keep our information safe.",[59,5655,5656],{},"In conclusion, while SMS-based 2FA may seem like an easy and convenient option, it's not worth the security risks it poses. Choosing a more secure 2FA method and taking steps to protect our sensitive information is essential for maintaining our online security in today's digital world.",[54,5658,5660],{"id":5659},"chapter-vii-bonus","Chapter VII. Bonus",[59,5662,5663],{},[74,5664,5665],{},"How can I tell if a website or service is using SMS-based 2FA?",[59,5667,5668],{},"One way to determine if a website or service is using SMS-based 2FA is to check their security or authentication settings. Look for an option to enable two-factor authentication or multi-factor authentication. If SMS is the only option listed, it's likely that the website or service is using SMS-based 2FA. Additionally, some websites or services may explicitly state that they use SMS-based 2FA as a form of authentication in their documentation or security policies. If in doubt, you can contact the website or service's customer support team for more information.",[59,5670,5671],{},"A good indicator can also come when websites ask for a phone number. One day I will write about that too. Why I don't like to give a phone number or why I don't like phones in general.",{"title":8,"searchDepth":31,"depth":31,"links":5673},[5674,5675,5682,5683,5691,5692,5693],{"id":5368,"depth":31,"text":5369},{"id":5381,"depth":31,"text":5382,"children":5676},[5677,5678,5679,5680,5681],{"id":5442,"depth":355,"text":5443},{"id":5478,"depth":355,"text":5479},{"id":5521,"depth":355,"text":5522},{"id":5528,"depth":355,"text":5529},{"id":5541,"depth":355,"text":5542},{"id":5551,"depth":31,"text":5552},{"id":5561,"depth":31,"text":5562,"children":5684},[5685,5686,5687,5688,5689,5690],{"id":5568,"depth":355,"text":5569},{"id":5579,"depth":355,"text":5580},{"id":5589,"depth":355,"text":5590},{"id":5596,"depth":355,"text":5597},{"id":5607,"depth":355,"text":5608},{"id":5614,"depth":355,"text":5615},{"id":5627,"depth":31,"text":5628},{"id":5643,"depth":31,"text":5644},{"id":5659,"depth":31,"text":5660},"Why SMS-based 2FA is not the most secure method of 2FA.",{"publication_date":5696,"views":5697},"2023-03-18",[369,1914],"/operating/articles/what-is-wrong-with-sms-authentication",{"title":5325,"description":5694},{"loc":5698},"operating/articles/what-is-wrong-with-sms-authentication","Mj4X40UOXPwTvWXFy2ifYA-UsaO3lfvy288VJ4j1qQA",{"id":5704,"title":5705,"body":5706,"description":5826,"extension":34,"meta":5827,"navigation":41,"path":5830,"seo":5831,"sitemap":5832,"stem":5833,"__hash__":5834},"pages_en/writing/articles/the-simplification-fallacy.md","Is simplification a fallacy? I think so.",{"type":28,"value":5707,"toc":5821},[5708,5711,5714,5717,5720,5723,5726,5729,5732,5735,5739,5742,5745,5789,5792,5796,5799,5802,5810,5813,5815,5818],[59,5709,5710],{},"When one is young, naivety often masks the complexity of the world. We assume that systems function according to the most intricate logic we know. Yet, the knowledge of a neophyte is, by definition, limited. This naivety leads us to believe that most things are simple, which is a structural error.",[59,5712,5713],{},"When confronted with complexity, only two options exist: learn to understand or refuse to learn.",[59,5715,5716],{},"Choosing to remain a neophyte is a personal responsibility. We all have our constraints, our contexts, and our objectives. However, in any society, there are certain subjects where the choice to ignore is not a valid strategy. We must learn to navigate taxes, we must learn a trade, and we must learn to drive before taking the wheel.",[59,5718,5719],{},"Humans are not born with a genetic package of knowledge. We have the permanent obligation to learn throughout our lives.",[59,5721,5722],{},"It is increasingly evident that our society is losing the capacity for honest, logical, and informed discourse on critical issues. In its place, we experience fiction, manipulation, and the loud diatribes of the uninformed.",[59,5724,5725],{},"Those who refuse to learn often justify it as a search for \"simplification\" or a desire to not \"overthink it.\"",[59,5727,5728],{},"This search for simplicity leads to a polarized and immobilized society. I have experienced the cost of this fallacy personally. For years, I shared travel photos, believing that sharing these moments with family was a positive act. I soon realized this transparency was working against my interests.",[59,5730,5731],{},"Clients looked. Corporations looked.",[59,5733,5734],{},"By lack of knowledge, and through the lens of simplification (naivety), these observers concluded that I was less professional than they had thought. They assumed I was spending more time in tourism than in labor. I removed my photos from the web to protect my confidentiality. Private data in the hands of family is handled differently than private data in the hands of professionals.",[54,5736,5738],{"id":5737},"the-knowledge-lifecycle","The knowledge lifecycle",[59,5740,5741],{},"Intellectual hygiene consists of stripping away opinions in favor of verifiable facts. This is difficult today because refusing to wear one's opinions as a badge is often seen as a refusal to identify. If one limits themselves to facts, they accept that others will project whatever narrative they wish onto them.",[59,5743,5744],{},"Developing knowledge is not a linear event; it is a lifecycle. One must:",[103,5746,5747,5753,5759,5765,5771,5777,5783],{},[106,5748,5749,5752],{},[74,5750,5751],{},"Collect"," raw signals.",[106,5754,5755,5758],{},[74,5756,5757],{},"Analyze"," the data.",[106,5760,5761,5764],{},[74,5762,5763],{},"Connect"," the patterns.",[106,5766,5767,5770],{},[74,5768,5769],{},"Test"," the hypothesis.",[106,5772,5773,5776],{},[74,5774,5775],{},"Compare"," the results.",[106,5778,5779,5782],{},[74,5780,5781],{},"Document"," the findings.",[106,5784,5785,5788],{},[74,5786,5787],{},"Maintain"," the knowledge.",[59,5790,5791],{},"The \"simplifiers\" prefer to ignore these steps under the pretext of \"saving time.\" In reality, they are avoiding the humility required to accept that they must learn.",[54,5793,5795],{"id":5794},"case-study-the-health-pass-paradox","Case study: The health pass paradox",[59,5797,5798],{},"The lack of nuance in modern discourse creates dangerous absurdities. Consider the 2022 distinction in France between the vaccine and the \"Health Pass\" (Pass Sanitaire).",[59,5800,5801],{},"The naive saw a false but convenient reciprocation: that those who refused the pass were against the vaccine. This is a staggering vacuum of knowledge.",[103,5803,5804,5807],{},[106,5805,5806],{},"The vaccine is an individual medical act related to health.",[106,5808,5809],{},"The health pass is a structural violation of privacy, sanctioned by a government.",[59,5811,5812],{},"Opposing a violation of privacy is perfectly compatible with supporting a medical act. To conflate the two is to abandon analysis for the sake of a simpler, more aggressive narrative. This phenomenon is exacerbated by the need for public posture and social tribalism.",[54,5814,341],{"id":340},[59,5816,5817],{},"When we fail to understand our interlocutor and immediately resort to labels, we are at \"Level 0\" of analysis. This leads to emotional escalation and the slow, certain death of objectivity and truth.",[59,5819,5820],{},"We must reclaim the humility to collect information and accept the confrontation of ideas. Nuance is not a bug in the system; it is the infrastructure of a civilized society.",{"title":8,"searchDepth":31,"depth":31,"links":5822},[5823,5824,5825],{"id":5737,"depth":31,"text":5738},{"id":5794,"depth":31,"text":5795},{"id":340,"depth":31,"text":341},"Why choosing \"simple\" over \"correct\" is an act of intellectual surrender and a threat to sovereign agency.",{"status":366,"publication_date":5828,"views":5829},"2022-10-02",[369],"/writing/articles/the-simplification-fallacy",{"title":5705,"description":5826},{"loc":5830},"writing/articles/the-simplification-fallacy","cP4KUCTVlD19UfRJFUrGeBqCeaDzer6ugxgxlq69riQ",{"id":5836,"title":5837,"body":5838,"description":7558,"extension":34,"meta":7559,"navigation":41,"path":7562,"seo":7563,"sitemap":7564,"stem":7565,"__hash__":7566},"pages_en/building/articles/retropie.md","Retropie",{"type":28,"value":5839,"toc":7543},[5840,5852,5856,5859,5869,5872,5936,5939,5952,5956,6310,6314,6321,6330,6334,6337,6346,6350,6353,6368,6371,6385,6388,6413,6417,6429,6433,6436,6439,6453,6457,6460,6478,6482,6499,6511,6519,6526,6529,6565,7518,7522,7529,7533,7540],[59,5841,5842,5846,5847,284],{},[63,5843,5837],{"href":5844,"rel":5845},"https://retropie.org.uk/",[67]," is a Raspberri Pi OS distribution with a\nbunch of emulators and drivers embeded. An other distribution to have a look at\nis ",[63,5848,5851],{"href":5849,"rel":5850},"https://www.youtube.com/watch?v=gYwlGeWeFuE",[67],"Mega Retro",[54,5853,5855],{"id":5854},"installation","Installation",[59,5857,5858],{},"The Rapsberry Pi Imager is now able to install Retropie itself. It is even better because it avoids creating a user and setting the system. However you'll need a keyboard.",[59,5860,2522,5861,5864,5865,5868],{},[253,5862,5863],{},"Emulation and game OS"," > ",[253,5866,5867],{},"RetroPie"," > Choose your version.",[59,5870,5871],{},"Once done:",[388,5873,5875],{"className":390,"code":5874,"language":392,"meta":8,"style":8},"apt-get update && apt-get upgrade -y && apt-get install openssh-server\nsystemctl enable ssh\nsystemctl start ssh\nnc -zvw100 [IP] 22\n",[253,5876,5877,5905,5916,5925],{"__ignoreMap":8},[396,5878,5879,5882,5885,5888,5890,5893,5896,5898,5900,5902],{"class":398,"line":399},[396,5880,5881],{"class":402},"apt-get",[396,5883,5884],{"class":406}," update",[396,5886,5887],{"class":412}," && ",[396,5889,5881],{"class":402},[396,5891,5892],{"class":406}," upgrade",[396,5894,5895],{"class":481}," -y",[396,5897,5887],{"class":412},[396,5899,5881],{"class":402},[396,5901,616],{"class":406},[396,5903,5904],{"class":406}," openssh-server\n",[396,5906,5907,5910,5913],{"class":398,"line":31},[396,5908,5909],{"class":402},"systemctl",[396,5911,5912],{"class":406}," enable",[396,5914,5915],{"class":406}," ssh\n",[396,5917,5918,5920,5923],{"class":398,"line":355},[396,5919,5909],{"class":402},[396,5921,5922],{"class":406}," start",[396,5924,5915],{"class":406},[396,5926,5927,5930,5933],{"class":398,"line":547},[396,5928,5929],{"class":402},"nc",[396,5931,5932],{"class":481}," -zvw100",[396,5934,5935],{"class":412}," [IP] 22\n",[59,5937,5938],{},"Edit the SSH server configuration:",[388,5940,5942],{"className":390,"code":5941,"language":392,"meta":8,"style":8},"vi /etc/ssh/sshd_config\n",[253,5943,5944],{"__ignoreMap":8},[396,5945,5946,5949],{"class":398,"line":399},[396,5947,5948],{"class":402},"vi",[396,5950,5951],{"class":406}," /etc/ssh/sshd_config\n",[204,5953,5955],{"id":5954},"a-quick-and-dirty-script-to-install-some-basics","A quick and dirty script to install some basics",[388,5957,5959],{"className":390,"code":5958,"language":392,"meta":8,"style":8},"#! /bin/bash\n\nNICO_PASSWORD=\"XXXXX\"\nNICO_SSH_PUB_KEY=\"SSSSSSS\"\nPI_PASSWORD=\"YYYYY\"\n\n# Update and install packages\napt-get update && apt-get upgrade -y && apt-get install -y openssh-server\nsystemctl enable ssh\nsystemctl start ssh\n\n# Manage users and SSH config\nuseradd -m -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi nicolasbages\nusermod --password \"$(echo NICO_PASSWORD | openssl passwd -1 -stdin)\" nicolasbages\nusermod --password \"$(echo PI_PASSWORD | openssl passwd -1 -stdin)\" pi\n\nmkdir /home/nicolasbages/.ssh\ncat \u003C\u003CEOT >> /home/nicolasbages/.ssh/authorized_keys\n$NICO_SSH_PUB_KEY\nEOT\n\nchown -R nicolasbages:nicolasbages /home/nicolasbages/.ssh\n\n# Configure controllers\nwget -P /opt/retropie/configs/all/retroarch/autoconfig\n https://github.com/libretro/retroarch-joypad-autoconfig/blob/master/udev/8BitDo_SN30_Pro%2B_BT_X.cfg\n\nchown pi:pi /opt/retropie/configs/all/retroarch/autoconfig/8BitDo_SN30_Pro%2B_BT_X.cfg\n\ncat \u003C\u003CEOT >> /opt/retropie/configs/all/retroarch-core-options.cfg\npcsx_rearmed_pad1type = \"dualshock\"\npcsx_rearmed_pad2type = \"dualshock\"\npcsx_rearmed_pad3type = \"none\"\npcsx_rearmed_pad4type = \"none\"\npcsx_rearmed_pad5type = \"none\"\npcsx_rearmed_pad6type = \"none\"\npcsx_rearmed_pad7type = \"none\"\npcsx_rearmed_pad8type = \"none\"\nEOT\n\n",[253,5960,5961,5966,5970,5984,5998,6012,6016,6021,6045,6053,6061,6065,6070,6087,6124,6152,6156,6164,6180,6185,6190,6194,6207,6211,6216,6227,6232,6236,6246,6250,6263,6268,6273,6278,6283,6288,6293,6299,6305],{"__ignoreMap":8},[396,5962,5963],{"class":398,"line":399},[396,5964,5965],{"class":1120},"#! /bin/bash\n",[396,5967,5968],{"class":398,"line":31},[396,5969,624],{"emptyLinePlaceholder":41},[396,5971,5972,5975,5977,5979,5982],{"class":398,"line":355},[396,5973,5974],{"class":696},"NICO_PASSWORD",[396,5976,700],{"class":687},[396,5978,425],{"class":412},[396,5980,5981],{"class":406},"XXXXX",[396,5983,859],{"class":412},[396,5985,5986,5989,5991,5993,5996],{"class":398,"line":547},[396,5987,5988],{"class":696},"NICO_SSH_PUB_KEY",[396,5990,700],{"class":687},[396,5992,425],{"class":412},[396,5994,5995],{"class":406},"SSSSSSS",[396,5997,859],{"class":412},[396,5999,6000,6003,6005,6007,6010],{"class":398,"line":862},[396,6001,6002],{"class":696},"PI_PASSWORD",[396,6004,700],{"class":687},[396,6006,425],{"class":412},[396,6008,6009],{"class":406},"YYYYY",[396,6011,859],{"class":412},[396,6013,6014],{"class":398,"line":1149},[396,6015,624],{"emptyLinePlaceholder":41},[396,6017,6018],{"class":398,"line":1291},[396,6019,6020],{"class":1120},"# Update and install packages\n",[396,6022,6023,6025,6027,6029,6031,6033,6035,6037,6039,6041,6043],{"class":398,"line":1296},[396,6024,5881],{"class":402},[396,6026,5884],{"class":406},[396,6028,5887],{"class":412},[396,6030,5881],{"class":402},[396,6032,5892],{"class":406},[396,6034,5895],{"class":481},[396,6036,5887],{"class":412},[396,6038,5881],{"class":402},[396,6040,616],{"class":406},[396,6042,5895],{"class":481},[396,6044,5904],{"class":406},[396,6046,6047,6049,6051],{"class":398,"line":1436},[396,6048,5909],{"class":402},[396,6050,5912],{"class":406},[396,6052,5915],{"class":406},[396,6054,6055,6057,6059],{"class":398,"line":1451},[396,6056,5909],{"class":402},[396,6058,5922],{"class":406},[396,6060,5915],{"class":406},[396,6062,6063],{"class":398,"line":1457},[396,6064,624],{"emptyLinePlaceholder":41},[396,6066,6067],{"class":398,"line":1462},[396,6068,6069],{"class":1120},"# Manage users and SSH config\n",[396,6071,6072,6075,6078,6081,6084],{"class":398,"line":1497},[396,6073,6074],{"class":402},"useradd",[396,6076,6077],{"class":481}," -m",[396,6079,6080],{"class":481}," -G",[396,6082,6083],{"class":406}," pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi",[396,6085,6086],{"class":406}," nicolasbages\n",[396,6088,6089,6092,6095,6098,6101,6104,6107,6110,6113,6116,6119,6122],{"class":398,"line":1542},[396,6090,6091],{"class":402},"usermod",[396,6093,6094],{"class":481}," --password",[396,6096,6097],{"class":412}," \"$(",[396,6099,6100],{"class":402},"echo",[396,6102,6103],{"class":406}," NICO_PASSWORD ",[396,6105,6106],{"class":687},"|",[396,6108,6109],{"class":402}," openssl",[396,6111,6112],{"class":406}," passwd ",[396,6114,6115],{"class":481},"-1",[396,6117,6118],{"class":481}," -stdin",[396,6120,6121],{"class":412},")\"",[396,6123,6086],{"class":406},[396,6125,6126,6128,6130,6132,6134,6137,6139,6141,6143,6145,6147,6149],{"class":398,"line":1566},[396,6127,6091],{"class":402},[396,6129,6094],{"class":481},[396,6131,6097],{"class":412},[396,6133,6100],{"class":402},[396,6135,6136],{"class":406}," PI_PASSWORD ",[396,6138,6106],{"class":687},[396,6140,6109],{"class":402},[396,6142,6112],{"class":406},[396,6144,6115],{"class":481},[396,6146,6118],{"class":481},[396,6148,6121],{"class":412},[396,6150,6151],{"class":406}," pi\n",[396,6153,6154],{"class":398,"line":1571},[396,6155,624],{"emptyLinePlaceholder":41},[396,6157,6158,6161],{"class":398,"line":1591},[396,6159,6160],{"class":402},"mkdir",[396,6162,6163],{"class":406}," /home/nicolasbages/.ssh\n",[396,6165,6166,6168,6171,6174,6177],{"class":398,"line":1610},[396,6167,1100],{"class":402},[396,6169,6170],{"class":687}," \u003C\u003C",[396,6172,6173],{"class":412},"EOT",[396,6175,6176],{"class":687}," >>",[396,6178,6179],{"class":406}," /home/nicolasbages/.ssh/authorized_keys\n",[396,6181,6182],{"class":398,"line":1616},[396,6183,6184],{"class":696},"$NICO_SSH_PUB_KEY\n",[396,6186,6187],{"class":398,"line":1622},[396,6188,6189],{"class":412},"EOT\n",[396,6191,6192],{"class":398,"line":1627},[396,6193,624],{"emptyLinePlaceholder":41},[396,6195,6196,6199,6202,6205],{"class":398,"line":1639},[396,6197,6198],{"class":402},"chown",[396,6200,6201],{"class":481}," -R",[396,6203,6204],{"class":406}," nicolasbages:nicolasbages",[396,6206,6163],{"class":406},[396,6208,6209],{"class":398,"line":1644},[396,6210,624],{"emptyLinePlaceholder":41},[396,6212,6213],{"class":398,"line":1650},[396,6214,6215],{"class":1120},"# Configure controllers\n",[396,6217,6218,6221,6224],{"class":398,"line":1656},[396,6219,6220],{"class":402},"wget",[396,6222,6223],{"class":481}," -P",[396,6225,6226],{"class":406}," /opt/retropie/configs/all/retroarch/autoconfig\n",[396,6228,6229],{"class":398,"line":1687},[396,6230,6231],{"class":402}," https://github.com/libretro/retroarch-joypad-autoconfig/blob/master/udev/8BitDo_SN30_Pro%2B_BT_X.cfg\n",[396,6233,6234],{"class":398,"line":1704},[396,6235,624],{"emptyLinePlaceholder":41},[396,6237,6238,6240,6243],{"class":398,"line":1709},[396,6239,6198],{"class":402},[396,6241,6242],{"class":406}," pi:pi",[396,6244,6245],{"class":406}," /opt/retropie/configs/all/retroarch/autoconfig/8BitDo_SN30_Pro%2B_BT_X.cfg\n",[396,6247,6248],{"class":398,"line":1735},[396,6249,624],{"emptyLinePlaceholder":41},[396,6251,6252,6254,6256,6258,6260],{"class":398,"line":1748},[396,6253,1100],{"class":402},[396,6255,6170],{"class":687},[396,6257,6173],{"class":412},[396,6259,6176],{"class":687},[396,6261,6262],{"class":406}," /opt/retropie/configs/all/retroarch-core-options.cfg\n",[396,6264,6265],{"class":398,"line":1753},[396,6266,6267],{"class":406},"pcsx_rearmed_pad1type = \"dualshock\"\n",[396,6269,6270],{"class":398,"line":1758},[396,6271,6272],{"class":406},"pcsx_rearmed_pad2type = \"dualshock\"\n",[396,6274,6275],{"class":398,"line":1774},[396,6276,6277],{"class":406},"pcsx_rearmed_pad3type = \"none\"\n",[396,6279,6280],{"class":398,"line":1779},[396,6281,6282],{"class":406},"pcsx_rearmed_pad4type = \"none\"\n",[396,6284,6285],{"class":398,"line":1810},[396,6286,6287],{"class":406},"pcsx_rearmed_pad5type = \"none\"\n",[396,6289,6290],{"class":398,"line":1820},[396,6291,6292],{"class":406},"pcsx_rearmed_pad6type = \"none\"\n",[396,6294,6296],{"class":398,"line":6295},37,[396,6297,6298],{"class":406},"pcsx_rearmed_pad7type = \"none\"\n",[396,6300,6302],{"class":398,"line":6301},38,[396,6303,6304],{"class":406},"pcsx_rearmed_pad8type = \"none\"\n",[396,6306,6308],{"class":398,"line":6307},39,[396,6309,6189],{"class":412},[204,6311,6313],{"id":6312},"failed-to-add-service-already-in-use","Failed to add service - already in use?",[59,6315,6316,6317,6320],{},"If EmulationStation is not launched due to an error like ",[253,6318,6319],{},"* failed to add service - already in use? *",". Execute RetroPie setup, reinstall all core packages and update all.",[388,6322,6324],{"className":390,"code":6323,"language":392,"meta":8,"style":8},"/home/pi/RetroPie-Setup/retropie_setup.sh\n",[253,6325,6326],{"__ignoreMap":8},[396,6327,6328],{"class":398,"line":399},[396,6329,6323],{"class":402},[204,6331,6333],{"id":6332},"first-boot-up-of-retropie-comes-up-with-a-command-line","First boot up of retropie comes up with a command line",[59,6335,6336],{},"If the first boot up of retropie comes up with a command line. Start EmulationStation manully.",[388,6338,6340],{"className":390,"code":6339,"language":392,"meta":8,"style":8},"emulationstation\n",[253,6341,6342],{"__ignoreMap":8},[396,6343,6344],{"class":398,"line":399},[396,6345,6339],{"class":402},[54,6347,6349],{"id":6348},"roms","Roms",[59,6351,6352],{},"Visit these websites to download some roms but never forget that it will be\nillegal to download a game without paying it at first. That said, I only\ndownloaded games previoulsy bought when I was a kid. Basically those I still\nhave the cartbridge or the CD of.",[103,6354,6355,6362],{},[106,6356,6357],{},[63,6358,6361],{"href":6359,"rel":6360},"https://www.retrostic.com/roms",[67],"Retostic",[106,6363,6364],{},[63,6365,6366],{"href":6366,"rel":6367},"https://virtualman.freeforums.net/",[67],[59,6369,6370],{},"Roms can use a lot of your storage. It is common to see a PSX game somewhere\nbetween 300Mo and 600Mo. It can be a good idea to keep them on an SSD drive\nmounted via USB.",[59,6372,6373,6374,6377,6378,6381,6382,284],{},"Raspberry Pi OS mounts USD external storages in ",[253,6375,6376],{},"/media",". Mine got mounted by\ndefault in ",[253,6379,6380],{},"/media/usb0",". Retropie on the other hands requires you to place roms\nin ",[253,6383,6384],{},"/home/pi/Retropie/roms/\u003Cplatform>",[59,6386,6387],{},"From that point there are 2 options:",[103,6389,6390,6402],{},[106,6391,6392,6393,6396,6397,2753,6399],{},"Create a symbolic link from ",[253,6394,6395],{},"/media/usb0/\u003Cplatform>"," to\n",[253,6398,6384],{},[253,6400,6401],{},"ln -s /media/usb0/\u003Cplatform> /home/pi/Retropie/roms/\u003Cplatform>",[106,6403,6404,6409,6410],{},[63,6405,6408],{"href":6406,"rel":6407},"https://www.raspberrypi.org/documentation/configuration/external-storage.md",[67],"Mount","\nthe USB storage in ",[253,6411,6412],{},"/home/pi/Retropie/roms",[54,6414,6416],{"id":6415},"memory-card","Memory Card",[59,6418,6419,6420,6425,6426,284],{},"Every emulator has its own method. Most of our games are ",[63,6421,6424],{"href":6422,"rel":6423},"https://github.com/RetroPie/RetroPie-Docs/blob/master/docs/Playstation-1.md",[67],"Playstation\n1","\ngames so Memory Card saves are located in ",[253,6427,6428],{},"/home/pi/RetroPie/roms/psx/",[54,6430,6432],{"id":6431},"game-controllers","Game controllers",[59,6434,6435],{},"The chosen controllers are 8BitDo SN30 Pro+.",[59,6437,6438],{},"Bluetooth MAC addresses:",[103,6440,6441,6447],{},[106,6442,6443,6444],{},"Original: ",[253,6445,6446],{},"E4:17:D8:60:12:0D",[106,6448,6449,6450],{},"Pink: ",[253,6451,6452],{},"E4:17:D8:19:6C:01",[204,6454,6456],{"id":6455},"upgrade-the-firmware","Upgrade the firmware",[59,6458,6459],{},"Do this for each controller:",[142,6461,6462,6469,6472,6475],{},[106,6463,6464,6465],{},"Download the fireware updater: ",[63,6466,6467],{"href":6467,"rel":6468},"https://support.8bitdo.com/firmware-updater.html",[67],[106,6470,6471],{},"Open the firmware updater",[106,6473,6474],{},"Plug the controller to your mac",[106,6476,6477],{},"Follow instructions",[204,6479,6481],{"id":6480},"install-the-controller","Install the controller",[103,6483,6484,6491],{},[106,6485,6486],{},[63,6487,6490],{"href":6488,"rel":6489},"https://github.com/RetroPie/RetroPie-Docs/blob/master/docs/8Bitdo-Controller.md",[67],"How to install a 8BitDo\nController",[106,6492,6493,6494],{},"Youtube Video of ",[63,6495,6498],{"href":6496,"rel":6497},"https://www.youtube.com/watch?v=Lt9Xu3r9k4o&ab_channel=RetroGamingGuy",[67],"8BitDo SN30 Pro+ Gamepad Controller Setup Guide On RetroPie - RetroPie Guy - How To Setup Guide",[59,6500,6501,6502,6507,6508],{},"Download ",[63,6503,6506],{"href":6504,"rel":6505},"https://github.com/libretro/retroarch-joypad-autoconfig/blob/master/udev/8BitDo_SN30_Pro%2B_BT_X.cfg",[67],"Retroarch joypad autoconfig for 8BitDo_SN30_Pro BT_X"," and place it in ",[253,6509,6510],{},"/opt/retropie/configs/all/retroarch/autoconfig",[59,6512,6513,6514],{},"Enable joypads in section \"The Controller Problem: Digital-Only & Analog\" by following the ",[63,6515,6518],{"href":6516,"rel":6517},"https://retropie.org.uk/docs/Playstation-1",[67],"playstation documentation",[59,6520,6521,6522,6525],{},"Eventually, the file ",[253,6523,6524],{},"/opt/retropie/configs/all/retroarch-core-options.cfg","\nneeds to be edited. At least to activate the joypads.",[59,6527,6528],{},"Important lines are :",[388,6530,6532],{"className":2566,"code":6531,"filename":6524,"language":2568,"meta":8,"style":8},"pcsx_rearmed_pad1type = \"dualshock\";\npcsx_rearmed_pad2type = \"dualshock\";\n",[253,6533,6534,6550],{"__ignoreMap":8},[396,6535,6536,6539,6541,6543,6546,6548],{"class":398,"line":399},[396,6537,6538],{"class":696},"pcsx_rearmed_pad1type",[396,6540,1385],{"class":687},[396,6542,419],{"class":412},[396,6544,6545],{"class":406},"dualshock",[396,6547,425],{"class":412},[396,6549,1494],{"class":412},[396,6551,6552,6555,6557,6559,6561,6563],{"class":398,"line":31},[396,6553,6554],{"class":696},"pcsx_rearmed_pad2type",[396,6556,1385],{"class":687},[396,6558,419],{"class":412},[396,6560,6545],{"class":406},[396,6562,425],{"class":412},[396,6564,1494],{"class":412},[388,6566,6568],{"className":2566,"code":6567,"filename":6524,"language":2568,"meta":8,"style":8},"cap32_autorun = \"enabled\"\ncap32_combokey = \"y\"\ncap32_Model = \"6128\"\ncap32_Ram = \"128\"\nfbneo-diagnostic-input = \"Hold Start\"\nfuse_machine = \"Spectrum 128K\"\ngambatte_gb_colorization = \"custom\"\nmame2003_dcs-speedhack = \"enabled\"\nmame2003_samples = \"enabled\"\nmame2003_skip_disclaimer = \"enabled\"\nmgba_allow_opposing_directions = \"no\"\nmgba_color_correction = \"OFF\"\nmgba_frameskip = \"0\"\nmgba_gb_model = \"Autodetect\"\nmgba_idle_optimization = \"Remove Known\"\nmgba_interframe_blending = \"OFF\"\nmgba_sgb_borders = \"ON\"\nmgba_skip_bios = \"OFF\"\nmgba_solar_sensor_level = \"0\"\nmgba_use_bios = \"ON\"\nnet_retropad_ip_octet1 = \"0\"\nnet_retropad_ip_octet2 = \"0\"\nnet_retropad_ip_octet3 = \"0\"\nnet_retropad_ip_octet4 = \"0\"\nnet_retropad_port = \"55400\"\npcsx_rearmed_analog_axis_modifier = \"circle\"\npcsx_rearmed_async_cd = \"sync\"\npcsx_rearmed_bios = \"auto\"\npcsx_rearmed_display_internal_fps = \"disabled\"\npcsx_rearmed_dithering = \"enabled\"\npcsx_rearmed_drc = \"enabled\"\npcsx_rearmed_duping_enable = \"enabled\"\npcsx_rearmed_frameskip = \"0\"\npcsx_rearmed_gteregsunneeded = \"disabled\"\npcsx_rearmed_gunconadjustratiox = \"1\"\npcsx_rearmed_gunconadjustratioy = \"1\"\npcsx_rearmed_gunconadjustx = \"0\"\npcsx_rearmed_gunconadjusty = \"0\"\npcsx_rearmed_idiablofix = \"disabled\"\npcsx_rearmed_inuyasha_fix = \"disabled\"\npcsx_rearmed_memcard2 = \"disabled\"\npcsx_rearmed_multitap1 = \"auto\"\npcsx_rearmed_multitap2 = \"auto\"\npcsx_rearmed_negcon_deadzone = \"0\"\npcsx_rearmed_negcon_response = \"linear\"\npcsx_rearmed_neon_enhancement_enable = \"disabled\"\npcsx_rearmed_neon_enhancement_no_main = \"disabled\"\npcsx_rearmed_neon_interlace_enable = \"disabled\"\npcsx_rearmed_nocdaudio = \"enabled\"\npcsx_rearmed_nogteflags = \"disabled\"\npcsx_rearmed_nosmccheck = \"disabled\"\npcsx_rearmed_noxadecoding = \"enabled\"\npcsx_rearmed_pad1type = \"dualshock\"\npcsx_rearmed_pad2type = \"dualshock\"\npcsx_rearmed_pad3type = \"none\"\npcsx_rearmed_pad4type = \"none\"\npcsx_rearmed_pad5type = \"none\"\npcsx_rearmed_pad6type = \"none\"\npcsx_rearmed_pad7type = \"none\"\npcsx_rearmed_pad8type = \"none\"\npcsx_rearmed_pe2_fix = \"disabled\"\npcsx_rearmed_psxclock = \"57\"\npcsx_rearmed_region = \"auto\"\npcsx_rearmed_show_bios_bootlogo = \"disabled\"\npcsx_rearmed_spu_interpolation = \"simple\"\npcsx_rearmed_spu_reverb = \"enabled\"\npcsx_rearmed_spuirq = \"disabled\"\npcsx_rearmed_vibration = \"enabled\"\n",[253,6569,6570,6584,6598,6612,6626,6651,6665,6679,6697,6710,6723,6737,6751,6765,6779,6793,6806,6820,6833,6846,6859,6872,6885,6898,6911,6925,6939,6953,6967,6981,6994,7007,7020,7033,7046,7059,7072,7085,7098,7111,7125,7139,7153,7167,7181,7196,7210,7224,7238,7252,7266,7280,7294,7307,7320,7334,7348,7362,7376,7390,7404,7418,7433,7447,7461,7476,7490,7504],{"__ignoreMap":8},[396,6571,6572,6575,6577,6579,6582],{"class":398,"line":399},[396,6573,6574],{"class":696},"cap32_autorun",[396,6576,1385],{"class":687},[396,6578,419],{"class":412},[396,6580,6581],{"class":406},"enabled",[396,6583,859],{"class":412},[396,6585,6586,6589,6591,6593,6596],{"class":398,"line":31},[396,6587,6588],{"class":696},"cap32_combokey",[396,6590,1385],{"class":687},[396,6592,419],{"class":412},[396,6594,6595],{"class":406},"y",[396,6597,859],{"class":412},[396,6599,6600,6603,6605,6607,6610],{"class":398,"line":355},[396,6601,6602],{"class":696},"cap32_Model",[396,6604,1385],{"class":687},[396,6606,419],{"class":412},[396,6608,6609],{"class":406},"6128",[396,6611,859],{"class":412},[396,6613,6614,6617,6619,6621,6624],{"class":398,"line":547},[396,6615,6616],{"class":696},"cap32_Ram",[396,6618,1385],{"class":687},[396,6620,419],{"class":412},[396,6622,6623],{"class":406},"128",[396,6625,859],{"class":412},[396,6627,6628,6631,6634,6637,6639,6642,6644,6646,6649],{"class":398,"line":862},[396,6629,6630],{"class":696},"fbneo",[396,6632,6633],{"class":687},"-",[396,6635,6636],{"class":696},"diagnostic",[396,6638,6633],{"class":687},[396,6640,6641],{"class":696},"input",[396,6643,1385],{"class":687},[396,6645,419],{"class":412},[396,6647,6648],{"class":406},"Hold Start",[396,6650,859],{"class":412},[396,6652,6653,6656,6658,6660,6663],{"class":398,"line":1149},[396,6654,6655],{"class":696},"fuse_machine",[396,6657,1385],{"class":687},[396,6659,419],{"class":412},[396,6661,6662],{"class":406},"Spectrum 128K",[396,6664,859],{"class":412},[396,6666,6667,6670,6672,6674,6677],{"class":398,"line":1291},[396,6668,6669],{"class":696},"gambatte_gb_colorization",[396,6671,1385],{"class":687},[396,6673,419],{"class":412},[396,6675,6676],{"class":406},"custom",[396,6678,859],{"class":412},[396,6680,6681,6684,6686,6689,6691,6693,6695],{"class":398,"line":1296},[396,6682,6683],{"class":696},"mame2003_dcs",[396,6685,6633],{"class":687},[396,6687,6688],{"class":696},"speedhack",[396,6690,1385],{"class":687},[396,6692,419],{"class":412},[396,6694,6581],{"class":406},[396,6696,859],{"class":412},[396,6698,6699,6702,6704,6706,6708],{"class":398,"line":1436},[396,6700,6701],{"class":696},"mame2003_samples",[396,6703,1385],{"class":687},[396,6705,419],{"class":412},[396,6707,6581],{"class":406},[396,6709,859],{"class":412},[396,6711,6712,6715,6717,6719,6721],{"class":398,"line":1451},[396,6713,6714],{"class":696},"mame2003_skip_disclaimer",[396,6716,1385],{"class":687},[396,6718,419],{"class":412},[396,6720,6581],{"class":406},[396,6722,859],{"class":412},[396,6724,6725,6728,6730,6732,6735],{"class":398,"line":1457},[396,6726,6727],{"class":696},"mgba_allow_opposing_directions",[396,6729,1385],{"class":687},[396,6731,419],{"class":412},[396,6733,6734],{"class":406},"no",[396,6736,859],{"class":412},[396,6738,6739,6742,6744,6746,6749],{"class":398,"line":1462},[396,6740,6741],{"class":696},"mgba_color_correction",[396,6743,1385],{"class":687},[396,6745,419],{"class":412},[396,6747,6748],{"class":406},"OFF",[396,6750,859],{"class":412},[396,6752,6753,6756,6758,6760,6763],{"class":398,"line":1497},[396,6754,6755],{"class":696},"mgba_frameskip",[396,6757,1385],{"class":687},[396,6759,419],{"class":412},[396,6761,6762],{"class":406},"0",[396,6764,859],{"class":412},[396,6766,6767,6770,6772,6774,6777],{"class":398,"line":1542},[396,6768,6769],{"class":696},"mgba_gb_model",[396,6771,1385],{"class":687},[396,6773,419],{"class":412},[396,6775,6776],{"class":406},"Autodetect",[396,6778,859],{"class":412},[396,6780,6781,6784,6786,6788,6791],{"class":398,"line":1566},[396,6782,6783],{"class":696},"mgba_idle_optimization",[396,6785,1385],{"class":687},[396,6787,419],{"class":412},[396,6789,6790],{"class":406},"Remove Known",[396,6792,859],{"class":412},[396,6794,6795,6798,6800,6802,6804],{"class":398,"line":1571},[396,6796,6797],{"class":696},"mgba_interframe_blending",[396,6799,1385],{"class":687},[396,6801,419],{"class":412},[396,6803,6748],{"class":406},[396,6805,859],{"class":412},[396,6807,6808,6811,6813,6815,6818],{"class":398,"line":1591},[396,6809,6810],{"class":696},"mgba_sgb_borders",[396,6812,1385],{"class":687},[396,6814,419],{"class":412},[396,6816,6817],{"class":406},"ON",[396,6819,859],{"class":412},[396,6821,6822,6825,6827,6829,6831],{"class":398,"line":1610},[396,6823,6824],{"class":696},"mgba_skip_bios",[396,6826,1385],{"class":687},[396,6828,419],{"class":412},[396,6830,6748],{"class":406},[396,6832,859],{"class":412},[396,6834,6835,6838,6840,6842,6844],{"class":398,"line":1616},[396,6836,6837],{"class":696},"mgba_solar_sensor_level",[396,6839,1385],{"class":687},[396,6841,419],{"class":412},[396,6843,6762],{"class":406},[396,6845,859],{"class":412},[396,6847,6848,6851,6853,6855,6857],{"class":398,"line":1622},[396,6849,6850],{"class":696},"mgba_use_bios",[396,6852,1385],{"class":687},[396,6854,419],{"class":412},[396,6856,6817],{"class":406},[396,6858,859],{"class":412},[396,6860,6861,6864,6866,6868,6870],{"class":398,"line":1627},[396,6862,6863],{"class":696},"net_retropad_ip_octet1",[396,6865,1385],{"class":687},[396,6867,419],{"class":412},[396,6869,6762],{"class":406},[396,6871,859],{"class":412},[396,6873,6874,6877,6879,6881,6883],{"class":398,"line":1639},[396,6875,6876],{"class":696},"net_retropad_ip_octet2",[396,6878,1385],{"class":687},[396,6880,419],{"class":412},[396,6882,6762],{"class":406},[396,6884,859],{"class":412},[396,6886,6887,6890,6892,6894,6896],{"class":398,"line":1644},[396,6888,6889],{"class":696},"net_retropad_ip_octet3",[396,6891,1385],{"class":687},[396,6893,419],{"class":412},[396,6895,6762],{"class":406},[396,6897,859],{"class":412},[396,6899,6900,6903,6905,6907,6909],{"class":398,"line":1650},[396,6901,6902],{"class":696},"net_retropad_ip_octet4",[396,6904,1385],{"class":687},[396,6906,419],{"class":412},[396,6908,6762],{"class":406},[396,6910,859],{"class":412},[396,6912,6913,6916,6918,6920,6923],{"class":398,"line":1656},[396,6914,6915],{"class":696},"net_retropad_port",[396,6917,1385],{"class":687},[396,6919,419],{"class":412},[396,6921,6922],{"class":406},"55400",[396,6924,859],{"class":412},[396,6926,6927,6930,6932,6934,6937],{"class":398,"line":1687},[396,6928,6929],{"class":696},"pcsx_rearmed_analog_axis_modifier",[396,6931,1385],{"class":687},[396,6933,419],{"class":412},[396,6935,6936],{"class":406},"circle",[396,6938,859],{"class":412},[396,6940,6941,6944,6946,6948,6951],{"class":398,"line":1704},[396,6942,6943],{"class":696},"pcsx_rearmed_async_cd",[396,6945,1385],{"class":687},[396,6947,419],{"class":412},[396,6949,6950],{"class":406},"sync",[396,6952,859],{"class":412},[396,6954,6955,6958,6960,6962,6965],{"class":398,"line":1709},[396,6956,6957],{"class":696},"pcsx_rearmed_bios",[396,6959,1385],{"class":687},[396,6961,419],{"class":412},[396,6963,6964],{"class":406},"auto",[396,6966,859],{"class":412},[396,6968,6969,6972,6974,6976,6979],{"class":398,"line":1735},[396,6970,6971],{"class":696},"pcsx_rearmed_display_internal_fps",[396,6973,1385],{"class":687},[396,6975,419],{"class":412},[396,6977,6978],{"class":406},"disabled",[396,6980,859],{"class":412},[396,6982,6983,6986,6988,6990,6992],{"class":398,"line":1748},[396,6984,6985],{"class":696},"pcsx_rearmed_dithering",[396,6987,1385],{"class":687},[396,6989,419],{"class":412},[396,6991,6581],{"class":406},[396,6993,859],{"class":412},[396,6995,6996,6999,7001,7003,7005],{"class":398,"line":1753},[396,6997,6998],{"class":696},"pcsx_rearmed_drc",[396,7000,1385],{"class":687},[396,7002,419],{"class":412},[396,7004,6581],{"class":406},[396,7006,859],{"class":412},[396,7008,7009,7012,7014,7016,7018],{"class":398,"line":1758},[396,7010,7011],{"class":696},"pcsx_rearmed_duping_enable",[396,7013,1385],{"class":687},[396,7015,419],{"class":412},[396,7017,6581],{"class":406},[396,7019,859],{"class":412},[396,7021,7022,7025,7027,7029,7031],{"class":398,"line":1774},[396,7023,7024],{"class":696},"pcsx_rearmed_frameskip",[396,7026,1385],{"class":687},[396,7028,419],{"class":412},[396,7030,6762],{"class":406},[396,7032,859],{"class":412},[396,7034,7035,7038,7040,7042,7044],{"class":398,"line":1779},[396,7036,7037],{"class":696},"pcsx_rearmed_gteregsunneeded",[396,7039,1385],{"class":687},[396,7041,419],{"class":412},[396,7043,6978],{"class":406},[396,7045,859],{"class":412},[396,7047,7048,7051,7053,7055,7057],{"class":398,"line":1810},[396,7049,7050],{"class":696},"pcsx_rearmed_gunconadjustratiox",[396,7052,1385],{"class":687},[396,7054,419],{"class":412},[396,7056,761],{"class":406},[396,7058,859],{"class":412},[396,7060,7061,7064,7066,7068,7070],{"class":398,"line":1820},[396,7062,7063],{"class":696},"pcsx_rearmed_gunconadjustratioy",[396,7065,1385],{"class":687},[396,7067,419],{"class":412},[396,7069,761],{"class":406},[396,7071,859],{"class":412},[396,7073,7074,7077,7079,7081,7083],{"class":398,"line":6295},[396,7075,7076],{"class":696},"pcsx_rearmed_gunconadjustx",[396,7078,1385],{"class":687},[396,7080,419],{"class":412},[396,7082,6762],{"class":406},[396,7084,859],{"class":412},[396,7086,7087,7090,7092,7094,7096],{"class":398,"line":6301},[396,7088,7089],{"class":696},"pcsx_rearmed_gunconadjusty",[396,7091,1385],{"class":687},[396,7093,419],{"class":412},[396,7095,6762],{"class":406},[396,7097,859],{"class":412},[396,7099,7100,7103,7105,7107,7109],{"class":398,"line":6307},[396,7101,7102],{"class":696},"pcsx_rearmed_idiablofix",[396,7104,1385],{"class":687},[396,7106,419],{"class":412},[396,7108,6978],{"class":406},[396,7110,859],{"class":412},[396,7112,7114,7117,7119,7121,7123],{"class":398,"line":7113},40,[396,7115,7116],{"class":696},"pcsx_rearmed_inuyasha_fix",[396,7118,1385],{"class":687},[396,7120,419],{"class":412},[396,7122,6978],{"class":406},[396,7124,859],{"class":412},[396,7126,7128,7131,7133,7135,7137],{"class":398,"line":7127},41,[396,7129,7130],{"class":696},"pcsx_rearmed_memcard2",[396,7132,1385],{"class":687},[396,7134,419],{"class":412},[396,7136,6978],{"class":406},[396,7138,859],{"class":412},[396,7140,7142,7145,7147,7149,7151],{"class":398,"line":7141},42,[396,7143,7144],{"class":696},"pcsx_rearmed_multitap1",[396,7146,1385],{"class":687},[396,7148,419],{"class":412},[396,7150,6964],{"class":406},[396,7152,859],{"class":412},[396,7154,7156,7159,7161,7163,7165],{"class":398,"line":7155},43,[396,7157,7158],{"class":696},"pcsx_rearmed_multitap2",[396,7160,1385],{"class":687},[396,7162,419],{"class":412},[396,7164,6964],{"class":406},[396,7166,859],{"class":412},[396,7168,7170,7173,7175,7177,7179],{"class":398,"line":7169},44,[396,7171,7172],{"class":696},"pcsx_rearmed_negcon_deadzone",[396,7174,1385],{"class":687},[396,7176,419],{"class":412},[396,7178,6762],{"class":406},[396,7180,859],{"class":412},[396,7182,7184,7187,7189,7191,7194],{"class":398,"line":7183},45,[396,7185,7186],{"class":696},"pcsx_rearmed_negcon_response",[396,7188,1385],{"class":687},[396,7190,419],{"class":412},[396,7192,7193],{"class":406},"linear",[396,7195,859],{"class":412},[396,7197,7199,7202,7204,7206,7208],{"class":398,"line":7198},46,[396,7200,7201],{"class":696},"pcsx_rearmed_neon_enhancement_enable",[396,7203,1385],{"class":687},[396,7205,419],{"class":412},[396,7207,6978],{"class":406},[396,7209,859],{"class":412},[396,7211,7213,7216,7218,7220,7222],{"class":398,"line":7212},47,[396,7214,7215],{"class":696},"pcsx_rearmed_neon_enhancement_no_main",[396,7217,1385],{"class":687},[396,7219,419],{"class":412},[396,7221,6978],{"class":406},[396,7223,859],{"class":412},[396,7225,7227,7230,7232,7234,7236],{"class":398,"line":7226},48,[396,7228,7229],{"class":696},"pcsx_rearmed_neon_interlace_enable",[396,7231,1385],{"class":687},[396,7233,419],{"class":412},[396,7235,6978],{"class":406},[396,7237,859],{"class":412},[396,7239,7241,7244,7246,7248,7250],{"class":398,"line":7240},49,[396,7242,7243],{"class":696},"pcsx_rearmed_nocdaudio",[396,7245,1385],{"class":687},[396,7247,419],{"class":412},[396,7249,6581],{"class":406},[396,7251,859],{"class":412},[396,7253,7255,7258,7260,7262,7264],{"class":398,"line":7254},50,[396,7256,7257],{"class":696},"pcsx_rearmed_nogteflags",[396,7259,1385],{"class":687},[396,7261,419],{"class":412},[396,7263,6978],{"class":406},[396,7265,859],{"class":412},[396,7267,7269,7272,7274,7276,7278],{"class":398,"line":7268},51,[396,7270,7271],{"class":696},"pcsx_rearmed_nosmccheck",[396,7273,1385],{"class":687},[396,7275,419],{"class":412},[396,7277,6978],{"class":406},[396,7279,859],{"class":412},[396,7281,7283,7286,7288,7290,7292],{"class":398,"line":7282},52,[396,7284,7285],{"class":696},"pcsx_rearmed_noxadecoding",[396,7287,1385],{"class":687},[396,7289,419],{"class":412},[396,7291,6581],{"class":406},[396,7293,859],{"class":412},[396,7295,7297,7299,7301,7303,7305],{"class":398,"line":7296},53,[396,7298,6538],{"class":696},[396,7300,1385],{"class":687},[396,7302,419],{"class":412},[396,7304,6545],{"class":406},[396,7306,859],{"class":412},[396,7308,7310,7312,7314,7316,7318],{"class":398,"line":7309},54,[396,7311,6554],{"class":696},[396,7313,1385],{"class":687},[396,7315,419],{"class":412},[396,7317,6545],{"class":406},[396,7319,859],{"class":412},[396,7321,7323,7326,7328,7330,7332],{"class":398,"line":7322},55,[396,7324,7325],{"class":696},"pcsx_rearmed_pad3type",[396,7327,1385],{"class":687},[396,7329,419],{"class":412},[396,7331,11],{"class":406},[396,7333,859],{"class":412},[396,7335,7337,7340,7342,7344,7346],{"class":398,"line":7336},56,[396,7338,7339],{"class":696},"pcsx_rearmed_pad4type",[396,7341,1385],{"class":687},[396,7343,419],{"class":412},[396,7345,11],{"class":406},[396,7347,859],{"class":412},[396,7349,7351,7354,7356,7358,7360],{"class":398,"line":7350},57,[396,7352,7353],{"class":696},"pcsx_rearmed_pad5type",[396,7355,1385],{"class":687},[396,7357,419],{"class":412},[396,7359,11],{"class":406},[396,7361,859],{"class":412},[396,7363,7365,7368,7370,7372,7374],{"class":398,"line":7364},58,[396,7366,7367],{"class":696},"pcsx_rearmed_pad6type",[396,7369,1385],{"class":687},[396,7371,419],{"class":412},[396,7373,11],{"class":406},[396,7375,859],{"class":412},[396,7377,7379,7382,7384,7386,7388],{"class":398,"line":7378},59,[396,7380,7381],{"class":696},"pcsx_rearmed_pad7type",[396,7383,1385],{"class":687},[396,7385,419],{"class":412},[396,7387,11],{"class":406},[396,7389,859],{"class":412},[396,7391,7393,7396,7398,7400,7402],{"class":398,"line":7392},60,[396,7394,7395],{"class":696},"pcsx_rearmed_pad8type",[396,7397,1385],{"class":687},[396,7399,419],{"class":412},[396,7401,11],{"class":406},[396,7403,859],{"class":412},[396,7405,7407,7410,7412,7414,7416],{"class":398,"line":7406},61,[396,7408,7409],{"class":696},"pcsx_rearmed_pe2_fix",[396,7411,1385],{"class":687},[396,7413,419],{"class":412},[396,7415,6978],{"class":406},[396,7417,859],{"class":412},[396,7419,7421,7424,7426,7428,7431],{"class":398,"line":7420},62,[396,7422,7423],{"class":696},"pcsx_rearmed_psxclock",[396,7425,1385],{"class":687},[396,7427,419],{"class":412},[396,7429,7430],{"class":406},"57",[396,7432,859],{"class":412},[396,7434,7436,7439,7441,7443,7445],{"class":398,"line":7435},63,[396,7437,7438],{"class":696},"pcsx_rearmed_region",[396,7440,1385],{"class":687},[396,7442,419],{"class":412},[396,7444,6964],{"class":406},[396,7446,859],{"class":412},[396,7448,7450,7453,7455,7457,7459],{"class":398,"line":7449},64,[396,7451,7452],{"class":696},"pcsx_rearmed_show_bios_bootlogo",[396,7454,1385],{"class":687},[396,7456,419],{"class":412},[396,7458,6978],{"class":406},[396,7460,859],{"class":412},[396,7462,7464,7467,7469,7471,7474],{"class":398,"line":7463},65,[396,7465,7466],{"class":696},"pcsx_rearmed_spu_interpolation",[396,7468,1385],{"class":687},[396,7470,419],{"class":412},[396,7472,7473],{"class":406},"simple",[396,7475,859],{"class":412},[396,7477,7479,7482,7484,7486,7488],{"class":398,"line":7478},66,[396,7480,7481],{"class":696},"pcsx_rearmed_spu_reverb",[396,7483,1385],{"class":687},[396,7485,419],{"class":412},[396,7487,6581],{"class":406},[396,7489,859],{"class":412},[396,7491,7493,7496,7498,7500,7502],{"class":398,"line":7492},67,[396,7494,7495],{"class":696},"pcsx_rearmed_spuirq",[396,7497,1385],{"class":687},[396,7499,419],{"class":412},[396,7501,6978],{"class":406},[396,7503,859],{"class":412},[396,7505,7507,7510,7512,7514,7516],{"class":398,"line":7506},68,[396,7508,7509],{"class":696},"pcsx_rearmed_vibration",[396,7511,1385],{"class":687},[396,7513,419],{"class":412},[396,7515,6581],{"class":406},[396,7517,859],{"class":412},[204,7519,7521],{"id":7520},"fix-bluetooth-connexion-issue-for-8bitdo-sn30-pro-controller","Fix Bluetooth connexion issue for 8bitdo SN30 Pro+ Controller",[59,7523,7524,7525],{},"Source: ",[63,7526,7527],{"href":7527,"rel":7528},"https://retropie.org.uk/forum/topic/29996/issue-connecting-bluetooth-8bitdo-sn30-pro-controller/5",[67],[54,7530,7532],{"id":7531},"install-additional-bios","Install additional BIOS",[59,7534,7535],{},[63,7536,7539],{"href":7537,"rel":7538},"https://www.youtube.com/watch?v=xbNaDD4pHa8&t=188s&ab_channel=RetroGamingGuy",[67],"Add PlayStation BIOS Files On RetroPie - Start Button Fix On PlayStation Roms RetroPie Guy Tutorial",[1900,7541,7542],{},"html pre.shiki code .sJix2, html code.shiki .sJix2{--shiki-default:#B57EDC}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sGSqi, html code.shiki .sGSqi{--shiki-default:#A9B2C3}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .ssUfO, html code.shiki .ssUfO{--shiki-default:#5F6672;--shiki-default-font-style:italic}html pre.shiki code .sVs6v, html code.shiki .sVs6v{--shiki-default:#C6CCD7}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}",{"title":8,"searchDepth":31,"depth":31,"links":7544},[7545,7550,7551,7552,7557],{"id":5854,"depth":31,"text":5855,"children":7546},[7547,7548,7549],{"id":5954,"depth":355,"text":5955},{"id":6312,"depth":355,"text":6313},{"id":6332,"depth":355,"text":6333},{"id":6348,"depth":31,"text":6349},{"id":6415,"depth":31,"text":6416},{"id":6431,"depth":31,"text":6432,"children":7553},[7554,7555,7556],{"id":6455,"depth":355,"text":6456},{"id":6480,"depth":355,"text":6481},{"id":7520,"depth":355,"text":7521},{"id":7531,"depth":31,"text":7532},"A quick and dirty documentation about my own installation. Hope it can help.",{"publication_date":7560,"views":7561},"2021-05-07T18:27:16.506Z",[1914],"/building/articles/retropie",{"title":5837,"description":7558},{"loc":7562},"building/articles/retropie","35glKVvNsA_dadeKCcfuWl02ieNdwJEuVavJh1ElWGs",{"id":7568,"title":7569,"body":7570,"description":8133,"extension":34,"meta":8134,"navigation":41,"path":8137,"seo":8138,"sitemap":8139,"stem":8140,"__hash__":8141},"pages_en/building/articles/what-is-markdown.md","What is Markdown?",{"type":28,"value":7571,"toc":8123},[7572,7575,7578,7592,7595,7599,7602,7606,7761,7765,8029,8033,8036,8039,8043,8052,8059,8085,8089,8095,8106,8113,8117,8120],[59,7573,7574],{},"In recent years, Markdown has become the preferred markup language for developers. Its adoption has expanded beyond technical circles into the workflows of writers and researchers. To the uninitiated, it may seem like an unnecessary layer of complexity over a simple text file, but its value lies in its efficiency and portability.",[59,7576,7577],{},"What is Markdown? In general terms, it refers to two distinct but related concepts:",[142,7579,7580,7586],{},[106,7581,7582,7585],{},[74,7583,7584],{},"The Language",": A lightweight markup language designed to format plain text through simple syntax.",[106,7587,7588,7591],{},[74,7589,7590],{},"The Interpreter",": A software component that parses this syntax and converts it into structured HTML.",[59,7593,7594],{},"The primary goal of Markdown is to enable the creation and maintenance of content in a format that is as easy to read and write as possible. Once written, Markdown is typically converted into HTML for publication.",[54,7596,7598],{"id":7597},"the-markup-syntax","The Markup Syntax",[59,7600,7601],{},"The foundation of Markdown is a lightweight syntax that allows one to format text during the writing process itself.",[204,7603,7605],{"id":7604},"markdown-source-example","Markdown Source Example",[388,7607,7611],{"className":7608,"code":7609,"language":7610,"meta":8,"style":8},"language-markdown shiki shiki-themes plastic","### What is Markdown?\n\nIt is a simple markup language designed to be readable\nby both humans and machines.\n\nAt [Weinto](https://www.weinto.com), we use Markdown\nfor **all our writing**:\n\n- Technical specifications\n- Internal wikis\n- Blog posts\n\nMany interpreters also provide native syntax\nhighlighting for `code` blocks.\n\n```js\n// file: index.js\n\nconst foo = \"bar\";\n\nexport default foo;\n```\n","markdown",[253,7612,7613,7621,7625,7630,7635,7639,7650,7661,7665,7670,7675,7680,7684,7689,7703,7707,7712,7717,7721,7740,7744,7756],{"__ignoreMap":8},[396,7614,7615,7618],{"class":398,"line":399},[396,7616,7617],{"class":412},"### ",[396,7619,7620],{"class":2734},"What is Markdown?\n",[396,7622,7623],{"class":398,"line":31},[396,7624,624],{"emptyLinePlaceholder":41},[396,7626,7627],{"class":398,"line":355},[396,7628,7629],{"class":412},"It is a simple markup language designed to be readable\n",[396,7631,7632],{"class":398,"line":547},[396,7633,7634],{"class":412},"by both humans and machines.\n",[396,7636,7637],{"class":398,"line":862},[396,7638,624],{"emptyLinePlaceholder":41},[396,7640,7641,7644,7647],{"class":398,"line":1149},[396,7642,7643],{"class":412},"At [",[396,7645,7646],{"class":406},"Weinto",[396,7648,7649],{"class":412},"](https://www.weinto.com), we use Markdown\n",[396,7651,7652,7655,7659],{"class":398,"line":1291},[396,7653,7654],{"class":412},"for ",[396,7656,7658],{"class":7657},"skdKL","**all our writing**",[396,7660,2738],{"class":412},[396,7662,7663],{"class":398,"line":1296},[396,7664,624],{"emptyLinePlaceholder":41},[396,7666,7667],{"class":398,"line":1436},[396,7668,7669],{"class":412},"- Technical specifications\n",[396,7671,7672],{"class":398,"line":1451},[396,7673,7674],{"class":412},"- Internal wikis\n",[396,7676,7677],{"class":398,"line":1457},[396,7678,7679],{"class":412},"- Blog posts\n",[396,7681,7682],{"class":398,"line":1462},[396,7683,624],{"emptyLinePlaceholder":41},[396,7685,7686],{"class":398,"line":1497},[396,7687,7688],{"class":412},"Many interpreters also provide native syntax\n",[396,7690,7691,7694,7696,7698,7700],{"class":398,"line":1542},[396,7692,7693],{"class":412},"highlighting for ",[396,7695,1154],{"class":412},[396,7697,253],{"class":406},[396,7699,1154],{"class":412},[396,7701,7702],{"class":412}," blocks.\n",[396,7704,7705],{"class":398,"line":1566},[396,7706,624],{"emptyLinePlaceholder":41},[396,7708,7709],{"class":398,"line":1571},[396,7710,7711],{"class":412},"```js\n",[396,7713,7714],{"class":398,"line":1591},[396,7715,7716],{"class":1120},"// file: index.js\n",[396,7718,7719],{"class":398,"line":1610},[396,7720,624],{"emptyLinePlaceholder":41},[396,7722,7723,7726,7729,7731,7733,7736,7738],{"class":398,"line":1616},[396,7724,7725],{"class":1357},"const",[396,7727,7728],{"class":696}," foo",[396,7730,1385],{"class":687},[396,7732,419],{"class":412},[396,7734,7735],{"class":406},"bar",[396,7737,425],{"class":412},[396,7739,1494],{"class":412},[396,7741,7742],{"class":398,"line":1622},[396,7743,624],{"emptyLinePlaceholder":41},[396,7745,7746,7749,7752,7754],{"class":398,"line":1627},[396,7747,7748],{"class":687},"export",[396,7750,7751],{"class":687}," default",[396,7753,7728],{"class":696},[396,7755,1494],{"class":412},[396,7757,7758],{"class":398,"line":1639},[396,7759,7760],{"class":412},"```\n",[204,7762,7764],{"id":7763},"generated-html-output","Generated HTML Output",[388,7766,7770],{"className":7767,"code":7768,"language":7769,"meta":8,"style":8},"language-html shiki shiki-themes plastic","\u003Ch3>What is Markdown?\u003C/h3>\n\u003Cp>\n  It is a simple markup language designed to be readable by both humans and\n  machines.\n\u003C/p>\n\u003Cp>\n  At \u003Ca href=\"https://www.weinto.com\">Weinto\u003C/a>, we use Markdown for\n  \u003Cstrong>all our writing\u003C/strong>.\n\u003C/p>\n\u003Cul>\n  \u003Cli>Technical specifications\u003C/li>\n  \u003Cli>Internal wikis\u003C/li>\n  \u003Cli>Blog posts\u003C/li>\n\u003C/ul>\n\u003Cp>\n  Many interpreters also provide native syntax highlighting for\n  \u003Ccode>code\u003C/code> blocks.\n\u003C/p>\n\n\u003Cpre>\n  \u003Ccode class=\"language-javascript\">// file: index.js\n\nconst foo = 'bar'\n\nexport default foo;\n\u003C/code>\n\u003C/pre>\n","html",[253,7771,7772,7786,7794,7799,7804,7813,7821,7849,7864,7872,7880,7893,7906,7919,7927,7935,7940,7954,7962,7966,7974,7995,7999,8004,8008,8013,8021],{"__ignoreMap":8},[396,7773,7774,7776,7778,7781,7783],{"class":398,"line":399},[396,7775,1361],{"class":412},[396,7777,204],{"class":2734},[396,7779,7780],{"class":412},">What is Markdown?\u003C/",[396,7782,204],{"class":2734},[396,7784,7785],{"class":412},">\n",[396,7787,7788,7790,7792],{"class":398,"line":31},[396,7789,1361],{"class":412},[396,7791,59],{"class":2734},[396,7793,7785],{"class":412},[396,7795,7796],{"class":398,"line":355},[396,7797,7798],{"class":412},"  It is a simple markup language designed to be readable by both humans and\n",[396,7800,7801],{"class":398,"line":547},[396,7802,7803],{"class":412},"  machines.\n",[396,7805,7806,7809,7811],{"class":398,"line":862},[396,7807,7808],{"class":412},"\u003C/",[396,7810,59],{"class":2734},[396,7812,7785],{"class":412},[396,7814,7815,7817,7819],{"class":398,"line":1149},[396,7816,1361],{"class":412},[396,7818,59],{"class":2734},[396,7820,7785],{"class":412},[396,7822,7823,7826,7828,7832,7834,7836,7839,7841,7844,7846],{"class":398,"line":1291},[396,7824,7825],{"class":412},"  At \u003C",[396,7827,63],{"class":2734},[396,7829,7831],{"class":7830},"sVC51"," href",[396,7833,700],{"class":412},[396,7835,425],{"class":412},[396,7837,7838],{"class":406},"https://www.weinto.com",[396,7840,425],{"class":412},[396,7842,7843],{"class":412},">Weinto\u003C/",[396,7845,63],{"class":2734},[396,7847,7848],{"class":412},">, we use Markdown for\n",[396,7850,7851,7854,7856,7859,7861],{"class":398,"line":1296},[396,7852,7853],{"class":412},"  \u003C",[396,7855,74],{"class":2734},[396,7857,7858],{"class":412},">all our writing\u003C/",[396,7860,74],{"class":2734},[396,7862,7863],{"class":412},">.\n",[396,7865,7866,7868,7870],{"class":398,"line":1436},[396,7867,7808],{"class":412},[396,7869,59],{"class":2734},[396,7871,7785],{"class":412},[396,7873,7874,7876,7878],{"class":398,"line":1451},[396,7875,1361],{"class":412},[396,7877,103],{"class":2734},[396,7879,7785],{"class":412},[396,7881,7882,7884,7886,7889,7891],{"class":398,"line":1457},[396,7883,7853],{"class":412},[396,7885,106],{"class":2734},[396,7887,7888],{"class":412},">Technical specifications\u003C/",[396,7890,106],{"class":2734},[396,7892,7785],{"class":412},[396,7894,7895,7897,7899,7902,7904],{"class":398,"line":1462},[396,7896,7853],{"class":412},[396,7898,106],{"class":2734},[396,7900,7901],{"class":412},">Internal wikis\u003C/",[396,7903,106],{"class":2734},[396,7905,7785],{"class":412},[396,7907,7908,7910,7912,7915,7917],{"class":398,"line":1497},[396,7909,7853],{"class":412},[396,7911,106],{"class":2734},[396,7913,7914],{"class":412},">Blog posts\u003C/",[396,7916,106],{"class":2734},[396,7918,7785],{"class":412},[396,7920,7921,7923,7925],{"class":398,"line":1542},[396,7922,7808],{"class":412},[396,7924,103],{"class":2734},[396,7926,7785],{"class":412},[396,7928,7929,7931,7933],{"class":398,"line":1566},[396,7930,1361],{"class":412},[396,7932,59],{"class":2734},[396,7934,7785],{"class":412},[396,7936,7937],{"class":398,"line":1571},[396,7938,7939],{"class":412},"  Many interpreters also provide native syntax highlighting for\n",[396,7941,7942,7944,7946,7949,7951],{"class":398,"line":1591},[396,7943,7853],{"class":412},[396,7945,253],{"class":2734},[396,7947,7948],{"class":412},">code\u003C/",[396,7950,253],{"class":2734},[396,7952,7953],{"class":412},"> blocks.\n",[396,7955,7956,7958,7960],{"class":398,"line":1610},[396,7957,7808],{"class":412},[396,7959,59],{"class":2734},[396,7961,7785],{"class":412},[396,7963,7964],{"class":398,"line":1616},[396,7965,624],{"emptyLinePlaceholder":41},[396,7967,7968,7970,7972],{"class":398,"line":1622},[396,7969,1361],{"class":412},[396,7971,388],{"class":2734},[396,7973,7785],{"class":412},[396,7975,7976,7978,7980,7983,7985,7987,7990,7992],{"class":398,"line":1627},[396,7977,7853],{"class":412},[396,7979,253],{"class":2734},[396,7981,7982],{"class":7830}," class",[396,7984,700],{"class":412},[396,7986,425],{"class":412},[396,7988,7989],{"class":406},"language-javascript",[396,7991,425],{"class":412},[396,7993,7994],{"class":412},">// file: index.js\n",[396,7996,7997],{"class":398,"line":1639},[396,7998,624],{"emptyLinePlaceholder":41},[396,8000,8001],{"class":398,"line":1644},[396,8002,8003],{"class":412},"const foo = 'bar'\n",[396,8005,8006],{"class":398,"line":1650},[396,8007,624],{"emptyLinePlaceholder":41},[396,8009,8010],{"class":398,"line":1656},[396,8011,8012],{"class":412},"export default foo;\n",[396,8014,8015,8017,8019],{"class":398,"line":1687},[396,8016,7808],{"class":412},[396,8018,253],{"class":2734},[396,8020,7785],{"class":412},[396,8022,8023,8025,8027],{"class":398,"line":1704},[396,8024,7808],{"class":412},[396,8026,388],{"class":2734},[396,8028,7785],{"class":412},[54,8030,8032],{"id":8031},"interpreters-and-ecosystems","Interpreters and Ecosystems",[59,8034,8035],{},"To transform the text into its final visual state, an interpreter is required. The most prominent implementations include GitHub Flavored Markdown (GFM), CommonMark, Pandoc, and MultiMarkdown.",[59,8037,8038],{},"These engines are integrated into platforms such as GitLab, GitHub, and various content management systems, often with custom extensions (plugins) for diagrams (Mermaid), mathematics (MathJax), or syntax highlighting (Linguist).",[54,8040,8042],{"id":8041},"standardization-and-rfcs","Standardization and RFCs",[59,8044,8045,8046,1981,8049,284],{},"For a long time, Markdown lacked a formal standard, leading to fragmentation where different engines produced varying results from the same source. This ambiguity was addressed in 2016 with the publication of ",[74,8047,8048],{},"RFC 7763",[74,8050,8051],{},"RFC 7764",[59,8053,8054,8055,8058],{},"These specifications established the official MIME type ",[253,8056,8057],{},"text/markdown"," and documented common variants, introducing features that are now standard in professional environments:",[103,8060,8061,8067,8073,8079],{},[106,8062,8063,8066],{},[74,8064,8065],{},"Metadata (Frontmatter)",": Headers for titles, authors, and dates.",[106,8068,8069,8072],{},[74,8070,8071],{},"Footnotes",": For academic or technical referencing.",[106,8074,8075,8078],{},[74,8076,8077],{},"Tables",": For structured data presentation.",[106,8080,8081,8084],{},[74,8082,8083],{},"Code Syntax Highlighting",": For technical legibility.",[54,8086,8088],{"id":8087},"the-security-layer","The Security Layer",[59,8090,8091,8092,284],{},"Because Markdown is converted into HTML, it inherits the security considerations of web content, specifically regarding ",[74,8093,8094],{},"Cross-Site Scripting (XSS)",[59,8096,8097,8098,8101,8102,8105],{},"Markdown itself is not inherently vulnerable, but the conversion process can be exploited if the interpreter allows raw HTML injection without proper sanitization. If an interpreter accepts malicious ",[253,8099,8100],{},"\u003Cscript>"," tags or ",[253,8103,8104],{},"javascript:"," URIs within links, it can facilitate unauthorized access to user data.",[59,8107,8108,8109,8112],{},"To secure a system, one must either disable raw HTML parsing within the conversion engine or apply a secondary sanitization filter (such as ",[74,8110,8111],{},"kses",") post-conversion to strip undesirable HTML elements.",[54,8114,8116],{"id":8115},"protocol-over-interface","Protocol over interface",[59,8118,8119],{},"Markdown represents a shift from interface-driven formatting to protocol-driven content. By using a standard-based, plain-text approach, one ensures that documentation remains durable, searchable, and secure. It is a tool of precision designed for those who value the structural integrity of their work.",[1900,8121,8122],{},"html pre.shiki code .sGSqi, html code.shiki .sGSqi{--shiki-default:#A9B2C3}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .skdKL, html code.shiki .skdKL{--shiki-default:#A9B2C3;--shiki-default-font-weight:bold}html pre.shiki code .ssUfO, html code.shiki .ssUfO{--shiki-default:#5F6672;--shiki-default-font-style:italic}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .sVs6v, html code.shiki .sVs6v{--shiki-default:#C6CCD7}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}",{"title":8,"searchDepth":31,"depth":31,"links":8124},[8125,8129,8130,8131,8132],{"id":7597,"depth":31,"text":7598,"children":8126},[8127,8128],{"id":7604,"depth":355,"text":7605},{"id":7763,"depth":355,"text":7764},{"id":8031,"depth":31,"text":8032},{"id":8041,"depth":31,"text":8042},{"id":8087,"depth":31,"text":8088},{"id":8115,"depth":31,"text":8116},"A practical introduction to Markdown, exploring its role as a lightweight markup language, its syntax, standardization, and security implications.",{"publication_date":8135,"views":8136},"2021-05-07",[369,1914],"/building/articles/what-is-markdown",{"title":7569,"description":8133},{"loc":8137},"building/articles/what-is-markdown","Kbbnlc9-gApkcrGkkHNSiAlYmYVmKyiasPnxbAidaIA",{"id":8143,"title":8144,"body":8145,"description":8424,"extension":34,"meta":8425,"navigation":41,"path":8428,"seo":8429,"sitemap":8430,"stem":8431,"__hash__":8432},"pages_en/writing/articles/i-have-nothing-to-hide.md","I have nothing to hide",{"type":28,"value":8146,"toc":8415},[8147,8150,8158,8161,8165,8168,8199,8202,8205,8208,8216,8225,8230,8233,8237,8240,8243,8246,8249,8259,8268,8271,8278,8282,8285,8288,8291,8294,8302,8305,8309,8312,8315,8319,8322,8325,8335,8338,8342,8345,8348,8366,8369,8372,8376,8379,8382,8385,8395,8398,8400,8403,8406],[59,8148,8149],{},"\"I have nothing to hide\" is an argument that maintains that data harvesting, data analysis, and surveillance are not a problem for privacy. At least, as long as this privacy is not the subject of activities punishable by local law. This argument is regularly used in discussions concerning privacy and its respect. Would the notion of privacy therefore be an anomaly?",[59,8151,8152,8153,284],{},"The fact is that the majority of people believe that these processes are not directed against them because \"they are nobody.\" These same beliefs designate the targets as \"Thugs, criminals, those who engage in activities punishable by law\" despite almost daily evidence indicating that ",[63,8154,8157],{"href":8155,"rel":8156},"https://snowdenarchive.cjfe.org/greenstone/cgi-bin/library.cgi",[67],"the surveillance of individuals is a daily occurrence",[59,8159,8160],{},"\"I have nothing to hide\" often comes with the fact of not knowing what is done with one's personal data. Otherwise, we would hear \"I have nothing to share\" more often.",[54,8162,8164],{"id":8163},"clarification-on-a-few-notions","Clarification on a few notions",[59,8166,8167],{},"Before starting to talk about privacy, it is important to agree on a few vocabulary points used in the introduction.",[3096,8169,8170,8181],{},[3099,8171,8172],{},[3102,8173,8174,8178],{},[3105,8175,8177],{"align":8176},"left","Notion",[3105,8179,8180],{"align":8176},"Description",[3115,8182,8183,8191],{},[3102,8184,8185,8188],{},[3120,8186,8187],{"align":8176},"Privacy",[3120,8189,8190],{"align":8176},"Privacy is the ability for a person or a group of people to isolate themselves in order to protect their well-being.",[3102,8192,8193,8196],{},[3120,8194,8195],{"align":8176},"Surveillance",[3120,8197,8198],{"align":8176},"Surveillance is the act of observing activities. It can be secret or obvious.",[59,8200,8201],{},"To understand the importance of such a subject, one must first look at its definition. Privacy is the ability for a person to isolate themselves in order to protect their well-being. The notion of privacy assumes the notions of freedom of conscience and private property. The concept of privacy also opposes the concept of public life. In this sense, privacy can sometimes echo anonymity and the desire to remain out of public life.",[59,8203,8204],{},"The notion of privacy is distinct from the private home. Everything that happens in a private home falls under privacy, but privacy also extends to public places. Thus, the public revelation of a person's private life, particularly on the Internet, can compromise their reputation, rightly or wrongly.",[59,8206,8207],{},"In this context, saying that respect for privacy accepts exceptions is false. Whether it is to justify a collective security measure or because we wrongly judge that internal private information is less important than that of a criminal. To realize this, one simply needs to replace \"government\" with \"hacker.\"",[103,8209,8210,8213],{},[106,8211,8212],{},"I have nothing to hide \"from the government (or such a company)\"",[106,8214,8215],{},"I have nothing to hide \"from a hacker\"",[59,8217,8218,8219,8224],{},"In summary, the government would have the right to spy on individuals but hackers would not? ",[63,8220,8223],{"href":8221,"rel":8222},"https://www.un.org/en/about-us/universal-declaration-human-rights#:~:text=Article%2012,protection%20of%20the%20law%20against%20such%20interference%20or%20attacks.",[67],"Article 12"," of the Universal Declaration of Human Rights tells us:",[1968,8226,8227],{},[59,8228,8229],{},"No one shall be subjected to arbitrary interference with his privacy, family, home or correspondence, nor to attacks upon his honour and reputation. Everyone has the right to the protection of the law against such interference or attacks.",[59,8231,8232],{},"In law, a government must justify its intrusion precisely because privacy is a right. It must not create laws that will legitimize any exception, implying a violation.",[54,8234,8236],{"id":8235},"the-importance-of-privacy","The importance of privacy",[59,8238,8239],{},"In absolute terms, we do not need to have \"something to hide\" to hide \"something.\" The important thing is not to have something to hide, but rather the experience of possessing a private, intimate area that can be hidden, or whose access can be restricted. From a psychological point of view, we become individuals when we discover that we have the power to hide something from others.",[59,8241,8242],{},"Would we go as far as installing cameras in our toilets, in our bedrooms? The answer is no. Yet, our actions in these places are, a priori, all legal. Why not equip all children with them to fight against acts of pedophilia? It would be absurd, wouldn't it? This discomfort felt when reading these examples is what happens during an infringement of privacy.",[59,8244,8245],{},"Another example. Imagine now that when leaving the office, you find individuals rummaging through the trash to recover information about your clients, employees, contracts... No reason to worry. There is \"nothing to hide,\" right?",[59,8247,8248],{},"The first example illustrates a need for intimacy. The second highlights a need to protect the private information of an organization's members.",[1968,8250,8251],{},[59,8252,8253,8254],{},"Arguing that you don't care about the right to privacy because you have nothing to hide is no different than saying you don't care about free speech because you have nothing to say. – ",[3234,8255,8256],{},[74,8257,8258],{},"Edward Snowden",[59,8260,8261,8262,8267],{},"Some people may wish to conceal behavior that is poorly accepted by the dominant culture. Others prefer to remain silent about their finances, family, or work. People who have \"nothing to hide\" do not always realize the extent to which data crossing allows one ",[63,8263,8266],{"href":8264,"rel":8265},"https://signal.org/blog/the-instagram-ads-you-will-never-see/",[67],"to obtain pushed information on their situation",". Social networks, search engines, emails, banking companies, frequently visited stores... are all sources of information that allow a psychological and emotional profile of a person to be established. This profile can then be used to detect their love life, their needs, their lifestyle, or their financial situation.",[59,8269,8270],{},"More generally, the fact for an individual to know they are potentially monitored can lead them to modify their behavior and to self-censor.",[59,8272,8273,8274,8277],{},"In his novel ",[3234,8275,8276],{},"1984",", George Orwell explains that the most dangerous thing in such a situation is not to be continuously monitored, but to know that one is liable to be at any moment (since it is impossible to verify whether one is observed or not).",[54,8279,8281],{"id":8280},"protecting-oneself-and-others","Protecting oneself and others",[59,8283,8284],{},"Not feeling concerned by the collection of one's personal data is one thing; but for some, defending their privacy also amounts to defending that of those around them. The principle is as follows: if personally I do not place importance on the data of my exchanges and communications being collected, nothing assures me that among my correspondents, everyone will be of the same opinion. Protecting one's privacy is also and above all protecting that of one's loved ones, or even that of unknown individuals whose path one crosses.",[59,8286,8287],{},"How do smugglers hunt rhinos? By analyzing the photos of tourists which allow them to extract the GPS positions of the animals during the day.",[59,8289,8290],{},"How could a pedophile monitor a child? In the same way, by analyzing the photos that parents post on social networks.",[59,8292,8293],{},"A surveillance system that targets an individual will also take an interest in their more or less close entourage. Someone who has \"nothing to hide\" can find themselves involved by one of their contacts. Everyone is therefore not only responsible for the privacy of those around them but also liable to be placed under surveillance according to their relatives.",[59,8295,8296,8297,2590],{},"Edward Snowden's revelations showed that when the NSA monitors an individual, it also monitors up to 3 levels of their relationships. The French application StopCovid / TousAntiCovid monitors social relationships. To my knowledge, the French Intelligence has not said thank you publicly (",[63,8298,8301],{"href":8299,"rel":8300},"https://www.numerama.com/tech/679961-les-donnees-du-tousanticovid-singapourien-peuvent-etre-utilis%C3%A9es-par-la-police.html",[67],"in Singapore, it is already done",[59,8303,8304],{},"That is the whole point. When we talk about privacy protection, it includes one's own protection, but also that of the people who surround us. Not feeling concerned by this protection on a personal scale is one thing. However, one must keep in mind that this negligence also puts our contacts at risk: our loved ones, our professional environment, and even strangers in the street when it comes to photos for example.",[54,8306,8308],{"id":8307},"the-misuse-of-collected-data","The misuse of collected data",[59,8310,8311],{},"Any entity collecting data can disseminate information about a person that is likely to harm them, or use information about them to deny them access to certain services. Even if this person has committed no bad action. It is therefore possible to cause harm to someone by mistake, from collected data. It is not excluded that data be disseminated by mistake or that someone obtain it by theft.",[59,8313,8314],{},"The question of reusing data also arises. When data is not collected transparently, is it possible to ensure that there will be no drift?",[54,8316,8318],{"id":8317},"the-harvesters-the-greatest-defenders-of-their-own-privacy","The harvesters, the greatest defenders of their own privacy",[59,8320,8321],{},"The heads of organizations that set up data analysis programs are not always inclined to make the concessions on their own privacy that they intend to impose on others. In the same way, those who have \"nothing to hide\" are reluctant to disseminate their health status, their finances, their sexual practices, or the intimate information of their children.",[59,8323,8324],{},"During a question on privacy, Senator Durbin asked Mark Zuckerberg (CEO of Facebook) if he could share before the Senate the name of the hotel where he was staying.",[59,8326,8327],{},[63,8328,8331],{"href":8329,"rel":8330},"https://www.youtube.com/watch?v=sWDwh5UxWMs",[67],[1962,8332],{"alt":8333,"src":8334},"Sen. Durbin asks for name of Zuckerberg's hotel in privacy question","https://img.youtube.com/vi/sWDwh5UxWMs/0.jpg",[59,8336,8337],{},"Mr. Zuckerberg answered \"No\" but he could just as well have continued with: \"but I can tell you where you slept last night.\"",[54,8339,8341],{"id":8340},"motivations-not-always-stated","Motivations not always stated",[59,8343,8344],{},"Communication towards monitored individuals is complex. Also, the use of a cover is almost always necessary.",[59,8346,8347],{},"For example:",[103,8349,8350,8353,8360],{},[106,8351,8352],{},"Accepting the vaccine pass or refusing to travel, to eat at a restaurant, or any social activity.",[106,8354,8355,284],{},[63,8356,8359],{"href":8357,"rel":8358},"https://www.numerama.com/tech/677068-vie-privee-pourquoi-facebook-se-sert-des-pme-et-des-medias-pour-attaquer-apple-et-ios-14.html",[67],"SMEs and media will die if Apple allows users to control the respect of their privacy by Facebook",[106,8361,8362,284],{},[63,8363,8365],{"href":8299,"rel":8364},[67],"The StopCovid (TousAntiCovid) application to warn us or face the danger of the virus",[59,8367,8368],{},"The first element to detect a cover is to observe the emotional response of individuals. The objective being to direct fear onto a subject that seems more concrete in terms of effect and time. Losing the freedom to travel this summer speaks more than losing health insurance in 3 years. Losing a bit of advertising revenue today speaks more than losing the sovereignty of one's online business in the long term.",[59,8370,8371],{},"This emotional response is used so that individuals authorize what they would not have authorized otherwise.",[54,8373,8375],{"id":8374},"privacy-is-important-for-everyone","Privacy is important for everyone",[59,8377,8378],{},"So, why should we worry about general surveillance whatever the source (A government, a health organization, a private company, an individual)? After all, if we do nothing serious, we have no reason to worry.",[59,8380,8381],{},"The translation of this idea demonstrates the abandonment of our rights. It is a way of denying the need for these rights in the future because it is not important now, and believing that surveillance is conducted in the interest of the monitored individuals. Rights are important because we do not know when we will need them.",[59,8383,8384],{},"Everyone should be able to lead their life as they see fit, without having to worry about what a surveillance report will think of these actions in the future, how they risk being used or interpreting possible intentions. We need trust in our environment; yet this is only a facade if privacy is not respected.",[1968,8386,8387],{},[59,8388,8389,8390],{},"I need privacy not because my actions are questionable, but because your judgment and intentions are. – ",[3234,8391,8392],{},[74,8393,8394],{},"Reddit, anonymous",[59,8396,8397],{},"In the end, the argument \"I have nothing to hide\" is only a method to divert the debate on privacy protection. This argument only takes into account part of the problem. It can trap you because it forces the debate to focus on a very narrow understanding of privacy. But when confronted with misuse, collection, surveillance, and disclosure, this argument is ultimately irrelevant.",[4214,8399],{},[59,8401,8402],{},"For those of you who speak English, I invite you to watch this video.",[59,8404,8405],{},"\"I have nothing to hide\", Data Privacy in 2020 | Nelio Leone | TEDxAmityUniversityDubai",[59,8407,8408],{},[63,8409,8412],{"href":8410,"rel":8411},"https://www.youtube.com/watch?v=Oc_ux91TPxM",[67],[1962,8413],{"alt":8405,"src":8414},"https://img.youtube.com/vi/Oc_ux91TPxM/0.jpg",{"title":8,"searchDepth":31,"depth":31,"links":8416},[8417,8418,8419,8420,8421,8422,8423],{"id":8163,"depth":31,"text":8164},{"id":8235,"depth":31,"text":8236},{"id":8280,"depth":31,"text":8281},{"id":8307,"depth":31,"text":8308},{"id":8317,"depth":31,"text":8318},{"id":8340,"depth":31,"text":8341},{"id":8374,"depth":31,"text":8375},"I have nothing to hide often comes with not knowing what is done with one's personal data. Otherwise, we would hear more often I have nothing to share.",{"status":366,"publication_date":8426,"views":8427},"2021-05-02T17:04:16.506Z",[369],"/writing/articles/i-have-nothing-to-hide",{"title":8144,"description":8424},{"loc":8428},"writing/articles/i-have-nothing-to-hide","AmE6McCB58rNKzTBFXPnyS7-k2PSsSOyjNGf_I2xr-Q",{"id":8434,"title":8435,"body":8436,"description":8554,"extension":34,"meta":8555,"navigation":41,"path":8558,"seo":8559,"sitemap":8560,"stem":8561,"__hash__":8562},"pages_en/writing/articles/the-digital-green-certificate-a-false-security.md","The digital green certificate, a false security",{"type":28,"value":8437,"toc":8547},[8438,8447,8450,8457,8461,8468,8471,8475,8484,8498,8501,8504,8508,8511,8514,8518,8521,8524,8531,8535,8538,8541,8544],[1968,8439,8440],{},[59,8441,8442,8443,8446],{},"EDIT 2020-06-09: This analysis was originally drafted before the publication of the French ",[3234,8444,8445],{},"TousAntiCovid"," solution. Further investigations into this solution have reinforced the structural privacy concerns I outlined here.",[59,8448,8449],{},"In the pursuit of public health, the end does not always justify the means, especially when the means are ineffective. As governments seek to facilitate \"free movement\" through digital documentation, they often introduce new, systemic layers of discrimination and surveillance.",[59,8451,8452,8453,8456],{},"The 2021 proposal for a ",[74,8454,8455],{},"Digital Green Certificate"," (or \"Health Pass\") provides a critical case study in the tension between perceived security and sovereign privacy.",[54,8458,8460],{"id":8459},"the-problem-of-duplication","The problem of duplication",[59,8462,8463,8464,8467],{},"One must ask: why create a regional digital solution when a global standard already exists? The WHO ",[74,8465,8466],{},"International Certificate of Vaccination"," is a paper-based document recognized by 195 countries. It is portable, autonomous, and respects the discretion of the individual in that sense that the data is not stored in a centralized database.",[59,8469,8470],{},"To duplicate this globally accepted system with a regional digital one is not merely redundant; it is an act of centralization that shifts the control of medical data from the individual to the state.",[54,8472,8474],{"id":8473},"the-signature-fallacy","The signature fallacy",[59,8476,8477,8478,1981,8481,284],{},"The European Commission presents the certificate as \"digital proof.\" However, one must distinguish between ",[74,8479,8480],{},"digital evidence",[74,8482,8483],{},"scientific proof",[103,8485,8486,8492],{},[106,8487,8488,8491],{},[74,8489,8490],{},"Digital evidence",": A digital signature ensures that the data has not been altered since it was signed. It authenticates the author, not the content.",[106,8493,8494,8497],{},[74,8495,8496],{},"Scientific proof",": A verifiable medical truth (immunity or vaccination status) that relies on replicable demonstration.",[59,8499,8500],{},"A digital signature does not prevent fraud; it merely confirms that the fraud was signed by an authorized key. If a scrupulous entity signs a false declaration, the \"digital seal\" remains intact. To conflate a cryptographic signature with a medical reality is a fundamental error in logic. Some could even argue that it is a form of forgery.",[59,8502,8503],{},"How does one verify the link between the data and the individual's biological reality? By an immune test? And does that test differentiate between a vaccine and a prior infection? Cryptography cannot solve a problem of medical verification.",[54,8505,8507],{"id":8506},"the-entrapment-of-mobility","The entrapment of mobility",[59,8509,8510],{},"\"Free movement\" is, by definition, unhindered. To \"facilitate\" it by requiring a specific digital document is to introduce a new barrier. The proposal is a form of digital apartheid.",[59,8512,8513],{},"By creating a framework that favors those with the certificate, the solution introduces systemic discrimination. This is a structural violation of proportionality and necessity. Some EU member states already envision using these certificates to gate access to restaurants, cultural venues, and social life—effectively transforming a temporary health measure into a permanent tool for social partitioning.",[54,8515,8517],{"id":8516},"digital-profiling","Digital profiling",[59,8519,8520],{},"Under the GDPR, health data is strictly private. The request for such data outside of a direct medical context is a violation of privacy.",[59,8522,8523],{},"When an individual's identity is tied to their health status in a centralized national database, the risk becomes toxic. Centralization allows for uncontrolled consultation by third parties. It is a target for interception by hackers and by governments seeking to refine their methods of digital profiling.",[59,8525,8526,8527,8530],{},"The use of a ",[3234,8528,8529],{},"QR Code"," further threatens privacy. Unlike a paper document read by a human, a QR code requires a digital interface. This interface can — and often does — create a silent copy of the sensitive data it interprets. By facilitating the duplication of medical records, the digital system makes their violation inevitable.",[54,8532,8534],{"id":8533},"conclusion-the-urgency-of-caution","Conclusion: The urgency of caution",[59,8536,8537],{},"Taking decisions in a state of emergency often leads to long-term catastrophes. One does not solve a medical crisis through digital surveillance.",[59,8539,8540],{},"The European Commission argues that the interest of the majority outweighs individual concerns. However, the \"interest\" of the majority is not served by a system that introduces discrimination, centralization, and the potential for a wide-scale leak of medical data.",[59,8542,8543],{},"The best way to avoid a digital leak is to not harvest the data in the first place.",[59,8545,8546],{},"Sovereignty is the ability to move without being tracked, to exist without being profiled, and to be healthy without being documented. Nuance is the infrastructure of freedom. Any system that sacrifices either for the sake of \"immediacy\" is a system built on a false promise of security.",{"title":8,"searchDepth":31,"depth":31,"links":8548},[8549,8550,8551,8552,8553],{"id":8459,"depth":31,"text":8460},{"id":8473,"depth":31,"text":8474},{"id":8506,"depth":31,"text":8507},{"id":8516,"depth":31,"text":8517},{"id":8533,"depth":31,"text":8534},"A technical and ethical audit of the EU Digital Green Certificate and the structural risks of digital health profiling.",{"status":366,"publication_date":8556,"views":8557},"2020-04-02",[369],"/writing/articles/the-digital-green-certificate-a-false-security",{"title":8435,"description":8554},{"loc":8558},"writing/articles/the-digital-green-certificate-a-false-security","KARwfpVdJ3FfTqcIqexfcCVdE3MMov9mZta-kSEcTok",{"id":8564,"title":8565,"body":8566,"description":8637,"extension":34,"meta":8638,"navigation":41,"path":8644,"seo":8645,"sitemap":8646,"stem":8647,"__hash__":8648},"pages_en/exploring/articles/always-put-your-hand-luggage-under-the-seat-in-front-of-you.md","Always put your hand luggage under the seat in front of you",{"type":28,"value":8567,"toc":8631},[8568,8573,8577,8580,8583,8587,8590,8593,8596,8599,8603,8606,8610,8613,8616,8619,8622],[59,8569,8570],{},[1962,8571],{"alt":8,"src":8572},"/_content/images/always-put-your-hand-luggage-under-the-seat-in-front-of-you/cover.jpg",[54,8574,8576],{"id":8575},"no-need-to-bother-the-neighbors","No need to bother the neighbors",[59,8578,8579],{},"Even though we all love the window seat, we all pray for our neighbor to be\nmissing! Damn it! He’s here! You’ll have to stride over him every time you need\nsomething in your bag. It could be simple things such as a pen to fill the\ncustom form or your book.",[59,8581,8582],{},"When my bag is here, my flight mate can sleep in peace :)",[54,8584,8586],{"id":8585},"always-know-where-is-your-bag","Always know where is your bag",[59,8588,8589],{},"Ok, you have a aisle seat and you don’t really care about waking up this buddy.\nYou are comfortably installed. Your sleeping mask is already on your nose and\nyou’re ready to sleep. Well, bags always decide to walk away when you don’t keep\nan eye on them.",[59,8591,8592],{},"Did you know that no storage space is assigned to passengers?",[59,8594,8595],{},"Another passenger has a bigger bag and your lovely flight attendant needs to\nrearrange the space in “your” storage. Actually storage boxes are here to be\nhandy but 80% of the passengers take more stuff in the cabin to avoid to pay\nadditional charges or simply because they are scared to be bored. Your bag could\nand probably would move without prior notice and you know what happens when they\ntake walk? They becomes open minded and are happy to be opened by a stranger.",[59,8597,8598],{},"Keep in mind that someone who can open your bag to take your belongings could\nalso put something inside.",[54,8600,8602],{"id":8601},"safe-also-means-you-can-avoid-damages","Safe also means you can avoid damages",[59,8604,8605],{},"You will often cross path with that kind of passenger who definitely doesn’t\ncare about your luggage as long as his bag is in the storage above himself. That\nsaid, be ready to find your bag totally mashed up… If you travel with some\nelectronics devices and a notebook, you will become relatively creative on how\nto mash up his face.",[54,8607,8609],{"id":8608},"keep-it-light-and-simple","Keep it light and simple",[59,8611,8612],{},"Traveling light is the best. Experienced travelers know how much it is important\nto not carry heavy and big things.",[59,8614,8615],{},"Sometime you have to run. Sometime there is just a tiny space for your stuff. We\nnever need everything at the same time and most of the time, your daily bag can\nbe enough for a week!",[59,8617,8618],{},"Back to the front seat. If your bag is small and if it contain only what you\nreally need, it won’t bother you and you’ll have space for your legs.",[59,8620,8621],{},"How to now what you really need or not? Think about how you’re gonna spend your\ntime before packing. Back to your room, think about what you used and what you\ndidn’t then remove what was useless. To give you an idea, my travel bag weighs\nbetween 7kg and 9.5kg anywhere I go.",[1968,8623,8624],{},[59,8625,8626,8627,8630],{},"Tips: The question isn't \"What can I bring with me?\" but \"What can I do to\n",[74,8628,8629],{},"not"," take anything?\".",{"title":8,"searchDepth":31,"depth":31,"links":8632},[8633,8634,8635,8636],{"id":8575,"depth":31,"text":8576},{"id":8585,"depth":31,"text":8586},{"id":8601,"depth":31,"text":8602},{"id":8608,"depth":31,"text":8609},"Being polite, safe and handy can be very simple on board.",{"options":8639,"publication_date":8642,"views":8643},{"status":366,"dates":8640},{"publication":8641},"2014-11-12T16:01:16.506Z","2014-11-12",[3997],"/exploring/articles/always-put-your-hand-luggage-under-the-seat-in-front-of-you",{"title":8565,"description":8637},{"loc":8644},"exploring/articles/always-put-your-hand-luggage-under-the-seat-in-front-of-you","Kc_hwb2Pv0hFkYSRSlZbSnkAg8UMEJOFLspvxJMVf14",{"id":8650,"title":8651,"body":8652,"description":8737,"extension":34,"meta":8738,"navigation":41,"path":8741,"seo":8742,"sitemap":8743,"stem":8744,"__hash__":8745},"pages_en/exploring/articles/travel-vs-holidays.md","Travel vs Holidays",{"type":28,"value":8653,"toc":8734},[8654,8657,8660,8663,8666,8669,8671,8704,8706,8709,8712,8715,8719,8722,8725,8728,8731],[59,8655,8656],{},"We often encounters the assumption that traveling is merely an extended holiday. This is a fundamental misunderstanding of the state of transience.",[59,8658,8659],{},"Holidays are an escape from responsibility; travel is the assumption of total accountability.",[59,8661,8662],{},"In the industry of tourism, one is a consumer. The client delegates security, logistics, and comfort to a centralized provider—the hotel, the tour operator, the \"All-Inclusive\" interface, recommendations on Instagram or Youtube videos. It is a passive state designed to rest the mind by delegating the actual responsibility.",[59,8664,8665],{},"Traveling, on the other hand, is a full-time job.",[59,8667,8668],{},"Consider the following exchange during a solo transit through Malaysia. After three days of persistent insomnia, a friend and I had the following conversation.",[4214,8670],{},[8672,8673,8674,8675,8674,8679,8674,8683,8674,8686,8674,8689,8674,8691,8674,8694,8674,8696,8674,8699,8674,8701],"dl",{},"\n  ",[8676,8677,8678],"dt",{},"Aïda",[8680,8681,8682],"dd",{},"How are you?",[8676,8684,8685],{},"Nico",[8680,8687,8688],{},"Insomnias… 3rd day.",[8676,8690,8678],{},[8680,8692,8693],{},"Why don’t you take a pill? This situation is crazy, you need to sleep or you will fall sick.",[8676,8695,8685],{},[8680,8697,8698],{},"I’m in Malaysia. I don’t trust pills here since I’m a foreigner… and alone. Security is more important than an uncontrolled sleeping period.",[8676,8700,8678],{},[8680,8702,8703],{},"Right.",[4214,8705],{},[59,8707,8708],{},"This is the essence of what I call operational readiness.",[59,8710,8711],{},"When I travel, I am my own bodyguard. I cannot afford the luxury of an uncontrolled state when the external environment is unknown and the support systems are absent. I must manage my own vulnerability with the same rigor one applies to a mission-critical system.",[59,8713,8714],{},"Sleep, nutrition, and safety are not \"vacation items\"; they are resources and maintenance.",[54,8716,8718],{"id":8717},"travelling-is-a-full-time-job","Travelling is a full time job",[59,8720,8721],{},"We all took holidays to rest. We all understand that. Travels, on the other hand, is about experiencing life at its most unfiltered. This requires a constant evaluation of the context, anticipation and to vigilant. Even on fun times responsability is in a corner of my head.",[59,8723,8724],{},"Travel is not about finding yourself. It is about maintaining yourself while exposing yourself to the unknown, learn, grow and adapt. They are many ways to \"find yourself\" and travelling is a good way to do it. But it is not the only way.",[59,8726,8727],{},"The traveler must navigate shifting legal frameworks, cultural nuances, and the persistent presence of the unknown. There is no manager to call, no help desk for the loss of a passport or a medical emergency in a non-neutral territory.",[59,8729,8730],{},"Sovereignty is the baseline.",[59,8732,8733],{},"If one is not prepared to own his own survival, he's better suited for the holiday. True travel is the pursuit of legitimate experience, and legitimacy requires the cost of vigilance.",{"title":8,"searchDepth":31,"depth":31,"links":8735},[8736],{"id":8717,"depth":31,"text":8718},"Comparing the passive consumption of holidays with the active, sovereign state of travel as a full-time job.",{"publication_date":8739,"views":8740},"2014-01-02",[3997],"/exploring/articles/travel-vs-holidays",{"title":8651,"description":8737},{"loc":8741},"exploring/articles/travel-vs-holidays","GRpSTiyJbck0KlYVHCRTWR9fpBHOYcScEI__Xze92ag",{"id":8747,"title":8748,"body":8749,"description":8991,"extension":34,"meta":8992,"navigation":41,"path":8999,"seo":9000,"sitemap":9001,"stem":9002,"__hash__":9003},"pages_en/exploring/articles/you-know-you-re-a-traveler-when.md","You know you're a traveler when",{"type":28,"value":8750,"toc":8989},[8751,8864,8869,8984],[142,8752,8753,8756,8759,8762,8765,8768,8771,8774,8777,8780,8783,8786,8789,8792,8795,8798,8801,8804,8807,8810,8813,8816,8819,8822,8825,8828,8831,8834,8837,8840,8843,8846,8849,8852,8855,8858,8861],{},[106,8754,8755],{},"When your backpack is less than 8kg",[106,8757,8758],{},"Most of your jewelry is made of twine",[106,8760,8761],{},"A 6 hours journey by bus is short!",[106,8763,8764],{},"You re-wear all of your clothes, including underwear, at least twice",[106,8766,8767],{},"You know how to say hello and thank you in at least 15 languages",[106,8769,8770],{},"The shoes you brought from home broke or were stolen months ago. Now you live in $2 flip flop -- which you consider expensive",[106,8772,8773],{},"Your life fits in 6 plastic bags in your backpack",[106,8775,8776],{},"You smoke, but every time you light up, you announce to anyone in ear shot that you really only smoke when you're traveling",[106,8778,8779],{},"Spicy food is also a good way to clean your stomach",[106,8781,8782],{},"You have intense cravings for Burger King...even though you're \"mostly a vegetarian\" back home",[106,8784,8785],{},"Tuk-tuk and taxis say hello instead of \"tuk-tuk sir?\"",[106,8787,8788],{},"You have at least five currencies in your wallet at any given time",[106,8790,8791],{},"Your passport has a unlimited stay at any embassy but you can provide copies ;)",[106,8793,8794],{},"You no longer really care about the answers to questions like, \"Where are you from?\" and, \"How long are you traveling?\" but ask them automatically.",[106,8796,8797],{},"You no longer remember your address but your passport number",[106,8799,8800],{},"You have no idea what day of the week it is, but you know how many days until your visa expires",[106,8802,8803],{},"You can fix all your injuries with water and lipstick.",[106,8805,8806],{},"You can name the national beer of choice from every place you've been",[106,8808,8809],{},"If it was only you, you'd have 6 wives, 4 children, 5 houses and I'm counting only moms proposals for their daughters.",[106,8811,8812],{},"Whenever you come across a roll of toilet paper, you take half with you",[106,8814,8815],{},"Last time you bought soap and toothpaste was 6 month ago before a 10 days trek because you knew free accommodation doesn't provide any of them",[106,8817,8818],{},"You are fluent in several languages: US (tank top), UK (vest), and Australian (singlet) English",[106,8820,8821],{},"You no longer drink as hell because you like to wake up early and see the town waking up.",[106,8823,8824],{},"You love airports. They have the best coffee and bathrooms! (Lexie, US girl)",[106,8826,8827],{},"You already have a pre-thought answers to all questions and tricky technics from apparently friendly tuk-tuk, city guides and children.",[106,8829,8830],{},"You have gotten great at goodbyes but still hate them",[106,8832,8833],{},"Home currency isn't your reference anymore. You still think in filipino pesos or lao kip.",[106,8835,8836],{},"You've had amazing conversations using only pointing, miming and facial expressions",[106,8838,8839],{},"When your friend don't want to believe your stories because Discovery Channel didn't mention this and \"man vs wild\" looks like Winnie the pooh.",[106,8841,8842],{},"Things like emergency exits and seat belts are no longer a priority.",[106,8844,8845],{},"Chuck Norris asked you for directions",[106,8847,8848],{},"Hostel discard piles are as good as H&M",[106,8850,8851],{},"An instant noodles soup is worth it!",[106,8853,8854],{},"You begin at least two sentences a day with “When I was in… “ or « My friend from… »",[106,8856,8857],{},"You lust after fast internet (for uploading photos) and 3G has the best speed ever",[106,8859,8860],{},"You can recite the safety speech of an air plane and you know the differences between the companies",[106,8862,8863],{},"Your have never used the mosquito net you packed (Lexie)",[59,8865,8866],{},[1962,8867],{"alt":8,"src":8868},"/_content/images/you-know-you-re-a-traveler-when/cover.jpg",[142,8870,8871,8874,8877,8880,8883,8886,8889,8892,8895,8898,8901,8911,8914,8917,8920,8923,8926,8929,8932,8935,8938,8941,8944,8947,8950,8953,8956,8959,8962,8965,8968,8971,8974,8977,8981],{"start":6301},[106,8872,8873],{},"You never had mosquito net because mosquitoes are your travel mates now... (Nico)",[106,8875,8876],{},"You make lifelong friends with people you meet for a few hours",[106,8878,8879],{},"When you stopped counting how many month you're travelling for",[106,8881,8882],{},"You feel inappropriate in shorts that are just slightly above the knee",[106,8884,8885],{},"Sleeping with a girl/guy is no longer an achievement but a good way to save money on accommodation",[106,8887,8888],{},"You know how to order traditional dishes that aren't even on the menu",[106,8890,8891],{},"Back home you know how to drive cars, asian motorbikes, western motorbikes, small buses, traditional boats of several countries, tuk-tuk, horse carts and you never worried about a licence.",[106,8893,8894],{},"You have used plants and other homeopathic remedies because you know they'll be more effective than the local doctor",[106,8896,8897],{},"You take planes like your previous boss takes the subway",[106,8899,8900],{},"You get cold when it's 24 degrees Celsius (you're American and use Celsius)",[106,8902,8903,8904,8907,8908,720],{},"$1 is expensive. ( ",[253,8905,8906],{},"\u003Ctroll>","You're French and you realize it's not even 1 EUR ",[253,8909,8910],{},"\u003C/troll>",[106,8912,8913],{},"You own one or more of the following: fake Ray Bans, hippie pants, cheap trekking shoes, local beer logo shirts, beaded bracelets",[106,8915,8916],{},"You can use forks and spoons in a dozen ways according to the country you're thinking about",[106,8918,8919],{},"Because 50 is nice but now you're here so... \"Why not keep going\"?",[106,8921,8922],{},"You realized long ago that there is a huge difference between long term travel and vacation. Travel is a ton more work and much less glamorous, but you wouldn't trade it for the fanciest all-inclusive resort in the world.",[106,8924,8925],{},"If you lost your pack, you could be totally comfortable with only your day pack",[106,8927,8928],{},"You have a blog. Last update? Six months ago.",[106,8930,8931],{},"Your Facebook news feed is dominated by people you met two weeks ago",[106,8933,8934],{},"You can organise your tasks in two categories. Online, offline.",[106,8936,8937],{},"You have photos of yourself scuba diving, rock climbing, trekking, and getting wasted",[106,8939,8940],{},"A simple lace looks like a hundred features tool to you",[106,8942,8943],{},"Gchat has been replaced by Facebook messenger and whatsapp",[106,8945,8946],{},"You spent nights in the middle of nowhere but you know where is \"nowhere\"",[106,8948,8949],{},"You know your a traveler when you miss hot showers and your family equally",[106,8951,8952],{},"You didn't talk to your mom for weeks and she's fine with that",[106,8954,8955],{},"You’re planning one trip while on another",[106,8957,8958],{},"There are at least ten different songs that take you back to ten different places with a tear in your eye and a smile on your face.",[106,8960,8961],{},"You have a collection of SIM cards from around the world and you keep all of them, just in case…",[106,8963,8964],{},"You have an irrational love of flags",[106,8966,8967],{},"You’re named after a city/country ",[106,8969,8970],{},"The local friend you met on the road surprises you by visiting you… on the road.",[106,8972,8973],{},"You have no route but an expiration day on your visa",[106,8975,8976],{},"Your friends go back home and say \"I use drawers\" and you use Google image to remind you how drawer looks like!",[106,8978,8979,8980],{},"You're back home for 4 days and you didn't get your backpack empty. 'Cause you know... we never know "," I even found myself putting back the toothbrush in the plastic bag this morning!",[106,8982,8983],{},"Time zones are not connected to geography anymore",[59,8985,8986],{},[1962,8987],{"alt":8,"src":8988},"/_content/images/you-know-you-re-a-traveler-when/walks.jpg",{"title":8,"searchDepth":31,"depth":31,"links":8990},[],"73 signs that show how lost in wanderlust we are",{"contributors":8993,"publication_date":8997,"views":8998},[8994],{"name":8995,"url":8996},"Lexie Koss","https://www.instagram.com/whosthekoss/","2013-11-08",[3997],"/exploring/articles/you-know-you-re-a-traveler-when",{"title":8748,"description":8991},{"loc":8999},"exploring/articles/you-know-you-re-a-traveler-when","I7T9HOTNRhdppG_h0G8D09x9M6diF5hCrIvbhnNShMs",{"id":9005,"title":9006,"body":9007,"description":9101,"extension":34,"meta":9102,"navigation":41,"path":9105,"seo":9106,"sitemap":9107,"stem":9108,"__hash__":9109},"pages_en/exploring/articles/a-quick-introduction.md","A quick introduction",{"type":28,"value":9008,"toc":9096},[9009,9014,9018,9021,9024,9027,9030,9035,9043,9046,9049,9052,9056,9059,9071,9075,9078,9081,9084,9093],[59,9010,9011],{},[1962,9012],{"alt":8,"src":9013},"/_content/images/a-quick-introduction/cover.jpg",[54,9015,9017],{"id":9016},"why-what-and-how","Why, what and how?",[59,9019,9020],{},"My long term travels started by Australia and a van in 2008. The experience I\nhad there changed my life forever. I can't stop thinking that we have so much to\nsee, so much to live, so much to experience and finally so much to learn about\nourself as well as about the world.",[59,9022,9023],{},"I wanted to learn and to work so I started by a point. I drew a route on the\nglobe by being looking for a life purpose and my future; while learning about myself as much\nas I learned about others. Today I have the feeling that I found a lot but guess\nwhat!? It makes me want to explore even more.",[59,9025,9026],{},"I travel for persuing the silence needed to look at an inner self. I travel for the lights and the smells. I travel to understand and to\nbe understood. I don't travel for a map. Not anymore.",[59,9028,9029],{},"We hear many saying “I travel to meet people, to talk to people” like they are\ngoing to the zoo to watch locals like we watch animals in cages. I like to be the foreigner :)",[1968,9031,9032],{},[59,9033,9034],{},"I travel to observe people and the nature facing their daily life to find ways\nto improve ours.",[59,9036,9037,9038,9042],{},"As a ",[63,9039,9041],{"href":7838,"rel":9040},[67],"UX designer",", I apply the methods and processes I use every day to find new\nideas and new solutions - solving new problems. It's amazing how impressive it is\nto discover a new point of view.",[59,9044,9045],{},"On top of that you might think I did everything by myself. Travels are made\nof unexpected encounters even though I figured out that everything happens when\nyou need it. I couldn't say “I did this” without mentioning and thanking\neveryone I met on the road. Without human interactions I think I'd still be\ntrying to find who I am.",[59,9047,9048],{},"That's why I'd love to meet you, your friends, your family, your work, your\nhobbies or everything you'd like to share! Feel free to drop a message if you think we have something to share. Send me a place to go :)",[59,9050,9051],{},"Be careful anyway. We could become friends!",[54,9053,9055],{"id":9054},"countries","Countries",[59,9057,9058],{},"For those who ask how many countries I traveled : 36 so far.",[59,9060,9061],{},[3234,9062,9063,9066,9067],{},[396,9064,9065],{},"EDIT: 2021-05-12"," The actual list has ",[63,9068,9070],{"href":9069},"/en/exploring/countries","it's own page",[54,9072,9074],{"id":9073},"how-about-the-photo","How about the photo?",[59,9076,9077],{},"The cover? Ahah! Well, it wouldn't be an introduction without introducing\nmyself so, I took the first picture I found with a funny background story because\nI don't want this blog to be too serious!",[59,9079,9080],{},"It was one of the funniest haircut I ever had. I really needed\nit so my friends Milka & Patrick drove me to a mall in Cebu, Philippines.",[59,9082,9083],{},"The guy did it without shampoo, actually without water either. Anyhow, I had the feeling to be a\nVIP getting ready for a talk show ",[59,9085,9086,9087,9092],{},"He started by having a look at my hair implantation\nthen he started to cut everything with a razor. Yeah, not the electric razor but a straight one. I never had such a precise and cleanhair cut even though\nthe final looked more like a perfect ",[63,9088,9091],{"href":9089,"rel":9090},"https://www.google.com/search?q=playbobil+character+blond&tbm=isch",[67],"Playmobil"," than a publicly correct hair style.",[59,9094,9095],{},"Well, I had a great massage before leaving and and went to fix my hair in a rearview.",{"title":8,"searchDepth":31,"depth":31,"links":9097},[9098,9099,9100],{"id":9016,"depth":31,"text":9017},{"id":9054,"depth":31,"text":9055},{"id":9073,"depth":31,"text":9074},null,{"publication_date":9103,"views":9104},"2013-11-01",[3997],"/exploring/articles/a-quick-introduction",{"title":9006,"description":9101},{"loc":9105},"exploring/articles/a-quick-introduction","SyogpfxabP8H8BFjTlUYOG1k2uaT_e392n5pzccLpQo",1782716745383]