Vue normale

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.
À partir d’avant-hierFlux principal

Claude Code prend la fuite

Par : Korben
1 avril 2026 à 07:06

60 Mo de source maps (ces fichiers qui permettent de remonter du code minifié à l'original) ont été oubliés dans un paquet npm. Et voilà comment Anthropic a involontairement balancé en public le code source complet de Claude Code, son outil à 2.5 milliards de dollars de revenus annuels.

Alors qu'est-ce qui s'est passé exactement ?

Hé bien hier, la version 2.1.88 du package @anthropic-ai/claude-code sur le registre npm embarquait un fichier .map de 59.8 Mo. Un truc normalement réservé au debug interne, sauf que ce fichier .map contenait les pointeurs vers les 1 900 fichiers TypeScript originaux, en clair. Chaofan Shou, un développeur chez Solayer Labs, a alors repéré la boulette et l'a partagée sur X. Le temps qu'Anthropic réagisse, le code était déjà mirroré partout sur GitHub, avec 41 500+ forks en quelques heures. Autant dire que le dentifrice ne rentrera pas dans le tube !

Pour ma part, j'avais un petit dépôt à moi assez ancien avec quelques trucs relatifs à Claude Code, qui n'avait rien à voir avec tout ça, qui s'est même retrouvé striké... Ils ratissent large avec leur DMCA donc.

Et là, c'est la fête pour les curieux comme moi parce que les entrailles de l'outil révèlent pas mal de surprises. Côté architecture, on découvre environ 40 outils internes avec gestion de permissions, un moteur de requêtes de 46 000 lignes de TypeScript, un système multi-agents capable de spawner des essaims de sous-tâches en parallèle, et un pont de communication entre le terminal et votre éditeur VS Code ou JetBrains. Le tout tourne sur Bun (pas Node.js ^^) avec Ink pour l'interface terminal. Par contre, pas de tests unitaires visibles dans le dump.

Côté mémoire, c'est plutôt bien pensé puisqu'au lieu de tout stocker bêtement dans la fenêtre de contexte du modèle, l'outil utilise un fichier texte MEMORY.md ultra-léger (genre 150 caractères par entrée) qui sert d'index de pointeurs. Les vraies données, elles, sont distribuées dans des fichiers thématiques chargés à la demande, et les transcripts bruts ne sont jamais relus entièrement, mais juste fouillés à la recherche d'identifiants précis. L'agent traite en fait sa propre mémoire comme un "hint" ce qui le force à vérifier toujours le vrai code avant d'agir. En gros, il a une mémoire sceptique, et pour moi c'est clairement le truc le plus intéressant du dump.

Y'a aussi un truc qui s'appelle KAIROS (mentionné 150 fois dans le code) qui est un genre de mode daemon autonome. En fait, pendant que vous allez chercher votre café, l'agent tourne en arrière-plan et fait ce qu'ils appellent autoDream : il consolide sa mémoire dans des fichiers JSON, vire les contradictions et transforme les observations vagues en données structurées. Comme ça, quand vous revenez devant votre écran, le contexte est nettoyé.

Et puis le code balance aussi la roadmap interne d'Anthropic (bon courage au service comm ^^). On y trouve les noms de code des modèles... Capybara pour un variant de Claude 4.6, Fennec pour Opus 4.6, et un mystérieux Numbat qui n'est pas encore sorti. D'ailleurs, les commentaires internes révèlent que Capybara v8 a un taux de fausses affirmations qui tourne autour de 30%, ce qui est une grosse régression par rapport aux 17% de la v4. Y'a même un "Undercover Mode" qui permet à l'agent de contribuer à des repos publics sans révéler d'infos internes (c'est sympa pour les projets open source).

Anthropic a confirmé la fuite : "C'était un problème de packaging lié à une erreur humaine, pas une faille de sécurité. Aucune donnée client n'a été exposée." Mouais, attention quand même, parce que le code est déjà partout et n'en repartira pas. Et même si aucun secret client n'a fuité, exposer l'architecture complète d'un agent IA à 2.5 milliards de revenus, c'est pas rien non plus.

Bon, et maintenant qu'est-ce qu'on peut en faire ? Bah pas mal de choses en fait.

Par exemple, le système de mémoire auto-correcteur est un pattern directement réutilisable pour vos propres agents IA. L'architecture "index léger + fichiers à la demande" résout élégamment le problème de la pollution de contexte qui fait halluciner les LLM sur les longues sessions. Les +40 outils internes permettent aussi de comprendre comment structurer un système de permissions granulaires dans un agent autonome . Et le concept KAIROS/autoDream, la consolidation mémoire pendant l'idle, c'est une idée qu'aucun outil open source n'implémente encore. Autant dire que les alternatives open source à Claude Code ou Codex vont monter en gamme dans les jours qui viennent. Et le code est déjà nettoyé, réécris en Rust et mis sur GitHub si vous voulez fouiller. Bon, pas sûr que le pattern autoDream soit simple à reimplémenter, mais le système de mémoire oui.

Je trouve ça assez marrant que le code proprio d'une boite qui a aspiré tout l'open source du monde voire plus, sans autorisation, pour le revendre sous la forme de temps machine / tokens, devienne lui aussi en quelque sorte "open source" sans qu'on leur demande leur avis ^^. La vie est bien faite.

Maintenant, pour les développeurs qui publient sur npm, la leçon est limpide : Vérifiez votre .npmignore et votre champ files dans package.json. Ou plutôt, lancez la commande npm pack --dry-run dans votre terminal avant chaque publish. Ça prend 2 secondes et ça vous montre exactement ce qui sera inclus dans le paquet. Ça aurait évité 60 Mo de secrets industriels qui partent en public.

Bref, un .npmignore bien configuré, ça coûte 0 euro. Alors qu'une fuite de propriété intellectuelle évaluée à 2.5 milliards... un peu plus !

Source

Axios, l'une des bibliothèques les plus populaires de npm, piratée pour installer un cheval de Troie

Par : Korben
1 avril 2026 à 07:02

La bibliothèque JavaScript Axios, téléchargée plus de 100 millions de fois par semaine, a été compromise. Un attaquant a détourné le compte du mainteneur principal pour y glisser un malware multiplateforme qui vise aussi bien macOS que Windows et Linux.

Un compte piraté, deux versions vérolées

Tout est parti du compte npm de jasonsaayman, le mainteneur principal d'Axios. L'attaquant a réussi à prendre le contrôle du compte, a changé l'adresse mail vers un ProtonMail anonyme, et a publié deux versions malveillantes : axios 1.14.1 et axios 0.30.4.

Les deux ont été mises en ligne en l'espace de 39 minutes, et pas via le processus habituel. Au lieu de passer par GitHub Actions, le pipeline d'intégration continue du projet, les paquets ont été poussés directement avec la ligne de commande npm. Un détail qui aurait pu alerter plus tôt, mais qui est passé entre les mailles du filet pendant deux à trois heures avant que npm ne retire les versions concernées.

Un malware bien préparé, avec auto-destruction

Le plus vicieux dans l'affaire, c'est la méthode. Plutôt que de modifier directement le code d'Axios, l'attaquant a ajouté une dépendance fantôme appelée plain-crypto-js. Elle n'est jamais importée dans le code source, son seul rôle est d'exécuter un script d'installation qui fonctionne comme un programme d'installation de malware. 

Ce qui veut dire que dès que vous faites un npm install, le script contacte un serveur de commande en moins de deux secondes et télécharge un programme malveillant adapté à votre système : un daemon déguisé sur macOS, un script PowerShell sur Windows, une porte dérobée en Python sur Linux. Et une fois le malware déployé, le script se supprime, remplace son propre fichier de configuration par une version propre, et fait comme si de rien n'était. Même un npm list affiche alors un numéro de version différent pour brouiller les pistes.

Une attaque attribuée à la Corée du Nord

StepSecurity et Socket.dev ont été les premiers à repérer la compromission. Selon Ashish Kurmi, CTO de StepSecurity, ce n'est pas du tout une attaque opportuniste. La dépendance malveillante avait été préparée 18 heures à l'avance, trois programmes malveillants différents étaient prêts pour trois systèmes d'exploitation, et les deux branches de publication ont été touchées en moins de 40 minutes.

Elastic a de son côté relevé que le binaire macOS présente des similitudes avec WAVESHAPER, une porte dérobée en C++ déjà documentée par Mandiant et attribué à un acteur nord-coréen identifié sous le nom UNC1069. Pour les chercheurs en sécurité, le message est clair : si vous avez installé axios 1.14.1 ou axios 0.30.4, considérez votre machine comme compromise. Il faut supprimer la dépendance, faire tourner les identifiants, et dans certains cas, réinstaller la machine.

Franchement, c'est le genre d'attaque qui fait froid dans le dos. Axios, c'est une brique de base pour à peu près tous les projets JavaScript qui font des appels réseau. Et là, en deux heures, un attaquant a réussi à transformer cette brique en porte d'entrée pour un cheval de Troie, y compris sur Mac.

Le plus déroutant, c'est que le système de publication npm permet encore de pousser un paquet manuellement sans que personne ne bronche. Bon par contre, il faut reconnaître que StepSecurity et Socket.dev ont fait du bon boulot en détectant le problème aussi vite.

Sans eux, la fenêtre d'exposition aurait pu être bien plus large, c'est faramineux quand on y pense. Et quand on sait que la piste nord-coréenne revient de plus en plus souvent dans ce genre d'opérations, on se dit que la sécurité de la chaîne logicielle mérite qu'on s'y intéresse de près.

Source : The Register

GitHub envahi par de fausses alertes VS Code qui propagent un malware

Par : Korben
30 mars 2026 à 13:42

Des milliers de faux messages imitant des notifications de sécurité Visual Studio Code ont été postés sur GitHub. Le but : rediriger les développeurs vers un site malveillant qui collecte leurs données système. La méthode est franchement vicieuse.

Une campagne massive sur GitHub Discussions

Les chercheurs en sécurité de Socket viennent de mettre le doigt sur une opération d'ampleur. Des centaines, voire des milliers de messages quasi identiques ont été publiés en quelques minutes sur la section Discussions de nombreux dépôts GitHub.

Chaque message reprend le même modèle : un titre alarmiste du type "Vulnérabilité grave Mise à jour immédiate requise", un faux identifiant CVE pour faire sérieux, et un lien vers une prétendue extension VS Code corrigée hébergée sur Google Drive.

Les comptes utilisés sont soit tout neufs, soit quasi inactifs, mais ils se font passer pour des mainteneurs de projets ou des chercheurs en sécurité. Et comme GitHub envoie des notifications par e-mail aux personnes qui suivent un dépôt ou qui sont taguées, les fausses alertes arrivent directement dans la boîte mail des développeurs. Vous pouvez donc vous faire avoir sans même ouvrir GitHub.

Un système de filtrage avant le malware

Bien sûr, le lien Google Drive ne vous amène pas d'un coup vers un fichier infecté. Il déclenche avant une série de redirections qui vous emmènent inlassablement vers un domaine bien foireux, où un script JavaScript va se charger du sale boulot.

Ce script collecte automatiquement le fuseau horaire, la langue, le système d'exploitation, l'identifiant du navigateur et même des indicateurs d'automatisation. Tout est envoyé vers un serveur de commande sans que vous n'ayez à cliquer sur quoi que ce soit.

L'idée derrière ce dispositif, c'est de trier les visiteurs. Les robots et les chercheurs en sécurité sont écartés, et seuls les vrais humains reçoivent la suite de l'attaque. Les chercheurs de Socket n'ont d'ailleurs pas réussi à capturer le malware de deuxième étape, ce qui montre que le filtrage fonctionne plutôt bien.

Ce n'est pas la première fois

GitHub a déjà été ciblé par ce genre de campagne. En mars 2025, une attaque similaire avait touché 12 000 dépôts avec de fausses alertes de sécurité qui poussaient les développeurs à autoriser une application OAuth malveillante.

Cette fois-là, les pirates obtenaient un accès direct aux comptes GitHub des victimes. En juin 2024, c'était via des commentaires et des demandes de fusion bidon que les attaquants redirigeaient vers des pages d'hameçonnage.

Le procédé est malin. Utiliser les notifications GitHub pour donner une apparence officielle à des messages bidons, c'est le genre d'astuce qui marche bien sur des développeurs pressés. 

Bon par contre, un lien Google Drive dans une alerte de sécurité, ça devrait quand même mettre la puce à l'oreille. Si vous recevez ce type de message, vérifiez toujours le CVE sur le site du NVD ou de MITRE avant de cliquer où que ce soit. Et si le lien pointe ailleurs que sur la boutique officielle de VS Code, passez votre chemin.

Source : Bleeping Computer

Samsung’s $400 Tab Keyboard Costs More Than Apple’s: Worth It?

Par : JC Torres
1 avril 2026 à 13:20

The tablet-as-laptop pitch has been a hard sell for years, and a lot of the blame lands on the accessories. Keyboard covers for Android tablets have historically been thin on features and even thinner on build quality, which makes the whole productivity argument feel shakier than it should. Samsung’s $1,200 Galaxy Tab S11 Ultra is serious hardware, and for a while, its keyboard options weren’t keeping up.

The Galaxy Tab S11 Ultra Pro Keyboard is Samsung’s answer to that. Available in Gray and Silver for $399.99, it connects via pogo pins at the rear of the tablet, with no Bluetooth pairing or cables required. Opening the lid wakes the device, and closing it puts everything to sleep, so the whole thing behaves less like an accessory and more like a laptop right from the start.

Designer: Samsung

The build quality reflects the price in most of the right ways. The body is aluminum alloy, the hinge is reinforced metal, and a secondary kickstand at the rear props the whole assembly into a stable, laptop-like posture at whatever angle you prefer. The result looks noticeably more considered than Samsung’s Book Cover Keyboard Slim, which never really felt like it belonged on a $1,200 device.

The 80-key layout goes beyond a standard QWERTY arrangement. A dedicated DeX key switches the Tab S11 Ultra into Samsung’s desktop mode, where apps run in freely movable windows, closer in feel to Windows than Android. A Galaxy AI key gives you one-press access to AI tools without switching apps, and three customizable function keys can each be mapped to open whatever you need most.

For long stretches of writing or working across multiple documents, those shortcuts matter more than they might look on a spec sheet. The pogo pin connection also eliminates the Bluetooth pairing and dropout issues that plague most wireless keyboard accessories. And since the Pro Keyboard draws power directly from the tablet, there’s no separate battery to charge, and nothing to run out at an inconvenient moment.

The trackpad is 14.6% larger than the one on Samsung’s previous keyboard accessory, a small percentage that translates to real estate you’ll actually notice in DeX mode. The extra surface area gives you more room for precise gestures and window management, and that significantly reduces the number of times you’re forced to reach up and touch the screen during long work sessions.

At $399.99, the Pro Keyboard is nearly twice the price of Samsung’s own Book Cover Keyboard Slim and $50 more than Apple’s Magic Keyboard for the 13-inch iPad Pro. Adding it to the Galaxy Tab S11 Ultra’s $1,200 starting price puts the total at around $1,600, which puts you in comfortable MacBook Air territory, minus the dedicated operating system and the convenience of a unified device.

There are also some obvious gaps at this price. The Pro Keyboard has no backlighting, a noticeable oversight for anyone who regularly works late or in dim spaces. It also doesn’t protect the back of the tablet, which is a curious omission for a $400 accessory. And since it’s designed exclusively for the Galaxy Tab S11 Ultra, there’s no using it with anything else in Samsung’s lineup.

The post Samsung’s $400 Tab Keyboard Costs More Than Apple’s: Worth It? first appeared on Yanko Design.

8 Best Desk Gadgets Every Digital Nomad Quietly Keeps in Their Bag & Finally Deserves a Permanent Home

1 avril 2026 à 11:40

Most desk setups are inherited. The nomad’s is earned. Everything that makes it into the bag has already passed a strict and largely unconscious test — weight, versatility, the ability to make a stranger’s table feel like a place worth working from. Over months and years of moving between cities, time zones, and co-working spaces, the digital nomad ends up with a carefully curated set of tools that are small by necessity but thoughtful by design.

The interesting thing about these objects is what happens when the travel slows down. When a lease gets signed, a proper desk arrives, and the bag starts being unpacked with more intention. The tools that survived the road do not lose their relevance on a permanent surface. Many of them were built with the kind of considered design that rewards exactly this kind of scrutiny. They look better than most things bought specifically for a home office, hold up longer, and carry the kind of personal history that makes a workspace feel genuinely inhabited. This is for that moment. Eight objects that lived in the bag for a reason, and deserve a permanent home for the same one.

1. OrigamiSwift Folding Mouse

The OrigamiSwift is what happens when industrial design takes portability seriously. Weighing just 40 grams and folding flat to a profile thin enough to slip between notebook pages, it removes the usual tension between compact and comfortable. On a desk, it unfolds in under half a second, snapping into a full-sized ergonomic shape that sits naturally in the hand. For anyone who has suffered through the cramped mechanics of a standard travel mouse, this feels like a genuine upgrade.

The Bluetooth connectivity is quick, and the origami-inspired fold keeps the mechanism tactile enough that using it becomes a small ritual rather than a chore. At the desk, it earns a permanent spot not because it compensates for a lack of options, but because the transformation itself is satisfying. It is the kind of tool that makes you reconsider how you work, and then makes the work feel slightly more considered. Portable by design, permanent by choice.

Click Here to Buy Now: $85.00

What we like

  • Folds to near-invisible thinness at just 4.5mm, making it one of the most carry-friendly mice ever built without compromising on ergonomic full-size comfort
  • Activates in under half a second with a single flip, making the transition from travel bag to working mouse feel immediate and effortless

What we dislike

  • At 40 grams, the lightweight build may feel insubstantial for users accustomed to the heft and resistance of a traditional full-sized mouse
  • Bluetooth-only connectivity means no wired fallback for tasks where even minor wireless latency becomes a frustration

2. Fidget Cube

The Fidget Cube arrived at a time when open-plan offices made visible restlessness a liability and invisible anxiety a norm. Antsy Labs built something straightforward in response: a small cube with six distinct tactile surfaces, each mapped to a different kind of fidget. Click. Glide. Flip. Breathe. Roll. Spin. The vocabulary is simple, the execution is precise, and the result is a desk object that earns its keep without demanding attention from anyone but you.

For digital nomads who have spent years suppressing the impulse to tap or spin something through a long layover or tense client call, the Fidget Cube offers quiet permission. On a permanent desk, it sits within reach without asking for attention. The black and graphite colorways blend cleanly into most setups, looking less like a toy and more like a considered detail. It is not a gimmick. It is self-awareness shaped into an object.

What we like

  • Six distinct tactile surfaces cover a wide range of fidgeting behaviors in a single pocket-sized cube, making it genuinely versatile across different stress responses and focus modes
  • Discreet colorways like Midnight Black and Graphite blend seamlessly into professional setups without drawing unwanted attention in shared or client-facing workspaces

What we dislike

  • The clicking surfaces can produce audible sounds that may distract colleagues in quiet, open-plan, or library-style work environments
  • The cube format offers no digital or productivity-tracking integration for users who want data on their focus habits or stress patterns

3. Nothing Power (1) Battery Bank

Nothing built its reputation on the Glyph interface, a grid of LED lights that turned the back of a phone into a notification display and a design statement. The Power (1) carries that language into a battery bank, using transparent layers, bold light paths, and illuminated interactions to make a utilitarian object feel worth looking at. The design philosophy is direct: good design is not just about appearance, it is about how an object makes you feel when you reach for it.

For a nomad who has charged devices from airport benches and café stools, a power bank is rarely a display piece. The Nothing Power (1) challenges that. Sitting on a desk, the Glyph illumination gives charging status a visual presence that feels more like an ambient display than a simple indicator light. It treats the desk as a stage and every object on it as a conscious choice. Few battery banks have ever earned that kind of consideration.

What we like

  • The Glyph interface turns a charging indicator into a visual experience, making it arguably the only power bank designed to look genuinely intentional, sitting on a desk permanently
  • Transparent design layers reflect Nothing’s ethos of honest, open construction, giving the object a premium quality that stands apart from every other battery bank on the market

What we dislike

  • The Nothing Power (1) is currently a concept design and is not yet available as a finished commercial product
  • Exact battery capacity, output wattage, and pricing remain unconfirmed, making direct comparison with available alternatives difficult at this stage

4. HubKey Gen2

Desk clutter tends to accumulate in layers: a dock for the monitor, an adapter for the second screen, a hub for storage. Somewhere between them sits a tangle of cables that each solves a single problem in isolation. The HubKey Gen2 treats that as a design problem worth solving from the inside out. It is an 11-in-1 USB-C hub with a hardware control surface on top, offering programmable shortcut keys, a central dial, 100W power delivery, and 2.5Gbps Ethernet in a compact cube footprint.

The display support is what separates it from a standard hub. Two HDMI ports, each running a 4K display at 60Hz, mean a laptop becomes a proper dual-monitor workstation without extra adapters. For a nomad settling in, that shift from single-screen café work to a dual-screen editing setup is significant. The shortcut keys and central dial bring a physical control layer to software-heavy workflows, keeping hands on the desk rather than hunting through menus on a trackpad.

What we like

  • Dual 4K HDMI outputs at 60Hz eliminate the need for a separate display dock when transitioning from a travel setup to a full home workstation
  • The programmable shortcut keys and central knob return a satisfying physical dimension to digital workflows, reducing time spent navigating software menus

What we dislike

  • The compact cube form factor may feel crowded once all 11 ports are simultaneously in active use, which limits clean cable management around the unit
  • Fully customizing the shortcut keys requires additional software configuration, adding a setup investment before the productivity benefit becomes fully apparent

5. Rolling World Clock

Keeping track of time zones is one of the quieter friction points of nomadic life. The Rolling World Clock solves it most physically: you roll it. A 12-sided form with each face representing a major timezone city, a single hand reads the local time wherever it lands. London. Tokyo. New York. The gesture is intuitive, and the result is a genuinely useful desk object without trying to be more.

Available in black and white, this is the kind of object that earns its place through curiosity rather than scale. Guests pick it up. Colleagues ask about it. It turns a functional necessity into a small conversation. For the nomad who has lived across time zones and built relationships across continents, there is something quietly satisfying about having those cities represented not on a screen, but held in your hand.

Click Here to Buy Now: $49.00

What we like

  • The tactile rolling interaction makes checking international time a deliberate, physical gesture rather than a reflexive phone unlock
  • Covers 12 major timezone cities in a clean, minimalist form that works equally well as a functional desk piece or a shelf object

What we dislike

  • Limited to 12 preset cities, which may not include every timezone relevant to users with contacts in less commonly represented regions
  • The single analog hand offers general time orientation rather than precise minute-level accuracy, which may not suit users with tight cross-timezone scheduling needs

6. Orbitkey Desk Mat Slim

A desk mat either disappears into the background or it becomes the visual anchor of the entire setup. The Orbitkey Desk Mat Slim is built for the second outcome, designed with the restraint of the first. Made from premium vegan leather on top and 100% recycled PET felt underneath, it layers material integrity with practical function. The anti-slip backing holds the mat planted, while the magnetic cable holder keeps wires from drifting toward the edges, where they become a distraction.

Notes, receipts, and napkin sketches are the inevitable artifacts of nomadic work, and they tend to pile up without a clear home. The document hideaway is the detail that tips this mat from surface to organizer. The slim front pocket keeps loose papers horizontal, accessible, and out of sight. For someone accustomed to a shared café counter or a hotel tray table, this level of surface order feels less like a feature and more like a quiet exhale.

What we like

  • The document hideaway pocket reduces visible desk clutter without adding bulk, making it one of the more intelligent storage details found on any desk mat
  • Vegan leather and recycled PET felt construction deliver both a refined visual quality and a material responsibility that most desk accessories still lack

What we dislike

  • The slim format may feel too narrow for users with wide multi-monitor setups who need significant horizontal coverage across their full desk surface
  • The magnetic cable holder works best with a small number of cables and may become less effective in more heavily wired configurations

7. Flow Timer

The Pomodoro method has been around since the late 1980s, and most people who use it rely on a phone timer or a browser tab. Neither is ideal. The Flow Timer replaces that with something solid. Cast in metal, with dual customizable presets for focus and break intervals, it lives on the desk as a functional timer and an object of intention. The visual arc tells you where you are in the session without a notification or a screen unlock.

For nomads who have long been their own productivity managers, a physical timer brings a different quality of commitment than a screen-based one. The act of setting it is deliberate. The focus-to-break transition is automatic. Sitting in a permanent spot, it becomes a small anchor for the rhythm of the day. Available in three colorways, the Flow Timer is one of those rare accessories that improves both how you work and how the desk looks while you do it.

What we like

  • Automatic switching between focus and break intervals removes the friction of resetting a timer mid-session, keeping the workflow continuous and uninterrupted
  • Solid metal construction and three considered colorways make it an aesthetic desk object as much as a productivity tool

What we dislike

  • The absence of a digital display means reading the visual arc requires a brief adjustment period before the feedback becomes truly instinctive
  • As a dedicated single-function device, it competes for surface space against multi-purpose tools in more minimal or compact desk setups

8. Memento Business Card Log

There is a specific quality to the business cards that collect at the bottom of a travel bag. Each one marks a moment, a conversation, a person worth remembering. The Memento Business Card Log was made for exactly this. Designed by Re+g, a Japanese brand with roots in thoughtful stationery craft, it holds up to 120 cards with a dedicated handwriting space beside each one for a characteristic, a date, or a detail that brings the memory back clearly.

The two-point slit system keeps cards secure without sleeves or adhesive, and the special binding allows pages to be easily reordered as professional relationships evolve. For a nomad building a network across cities and industries, this is the kind of object that earns its desk placement not through technology but through intention. It is a record of everywhere you have been and everyone who mattered enough to keep. That is rare, and the design knows it.

Click Here to Buy Now: $35.00

What we like

  • The two-point slit system and reorderable binding make the organization genuinely flexible, allowing the log to grow and shift alongside a professional network over time
  • Handwritten note spaces beside each card transform a simple storage product into a meaningful personal archive of the conversations that shaped a career on the road

What we dislike

  • A maximum of 120 cards may feel limiting for high-volume networkers who accumulate contacts rapidly across multiple cities, conferences, and industries
  • The analog format, while entirely intentional, offers no digital sync or search capability for users who need to cross-reference contacts across devices

These Gadgets Were Never Just for the Bag

There is a moment in every nomad’s life when the bag starts feeling less like freedom and more like a deadline. When the tools that carried you through airports and co-working spaces deserve something more settled. These eight objects were always portable by design, but built with the kind of intention that reads just as well on a permanent desk. Good design does not ask where it is. It just works.

The idea here is not to stop moving. It is to stop treating permanence as a downgrade. A folding mouse, a tactile timer, a rolling clock, a mat that holds your cables and your notes — taken together, they form a desk that feels chosen rather than assembled. The nomad who gives these a home is not giving anything up. They are just finally working somewhere worthy of the tools they already carry.

The post 8 Best Desk Gadgets Every Digital Nomad Quietly Keeps in Their Bag & Finally Deserves a Permanent Home first appeared on Yanko Design.

Razer Just Proved Ergonomic Keyboards Don’t Have to Be Miserable

Par : JC Torres
1 avril 2026 à 10:07

Ergonomic keyboards have a reputation problem. They work, technically, but most of them look like they were designed by someone who’d never sat through a full workday. The splits are too wide, the angles too aggressive, and the learning curve steep enough to make you miss the flat keys you’ve always known. Plenty of people give it a try and quietly go back to what they had before.

Razer’s answer is the Pro Type Ergo, its first wireless split ergonomic keyboard, built with that frustration clearly in mind. Rather than throwing you into a radical new layout, it’s tuned to feel approachable from the very first keystroke. The split gently angles your hands into a more natural alignment, easing the sideways reach that makes most forearms ache by mid-afternoon, without asking you to completely relearn how to type.

Designer: Razer

One of the more interesting layout choices is the dual “B” key arrangement, with one on each side of the split, along with an extra backspace tucked between two space bars. The idea is that both thumbs take on common actions, so you’re reaching less and crossing your fingers over each other less throughout the day. It’s a small shift that makes more sense the longer you sit with it.

The keycaps are ultra-low-profile, fitted with subtle spherical indents that nudge your fingertips into the right position without you having to think about it. Sound-dampening layers and tuned stabilizers underneath keep the typing noise low enough for open offices and video calls. Shorter key travel also means less physical effort per keystroke, which doesn’t sound like much until you’ve been at your desk for six hours straight.

The wrist rest is permanently integrated rather than removable, which turns out to be a feature rather than a limitation. It’s just always there, supporting your wrists from the moment you sit down without any extra setup. A 10-degree base slope sets the starting angle, and five tilt positions, from flat to seven degrees forward or back, let you dial in the fit depending on your desk height and preference.

A Razer Command Dial lets you assign up to eight functions, expandable to 100 via Razer Synapse, while five macro keys along the left side keep your most-used shortcuts within easy reach. There’s also a dedicated AI Prompt Master key that handles things like drafting emails, summarizing blocks of text, or kicking off a research query in a single press, without pulling you out of whatever window you’re already in.

Connectivity spans Razer HyperSpeed Wireless at 2.4 GHz, three Bluetooth profiles, and USB-C wired mode, with support for up to five devices total. Razer Chroma RGB backlighting covers 19 customizable zones and can be switched off entirely for offices where animated key lighting might not go over well. The design is clean and understated, a far cry from the aggressively lit gaming keyboards Razer is better known for.

The Pro Type Ergo retails at $189.99, about $30 more than Razer’s conventional Pro Type Ultra from 2021. For anyone who types for a living and has been quietly working around the ache of a standard keyboard layout, that extra cost starts to feel a lot less significant once you’ve spent a full day on something that actually fits how your hands are supposed to sit.

The post Razer Just Proved Ergonomic Keyboards Don’t Have to Be Miserable first appeared on Yanko Design.

Sortie VGA sur un PIC18 : quand l'optimisation hardware devient un art

Par : Korben
26 mars 2026 à 13:11

Générer un signal VGA avec un microcontrôleur 8 bits PIC18 est un défi technique de taille. Ce projet Hackaday montre comment détourner les ressources limitées d'un processeur rudimentaire pour produire une image stable. Une petite plongée dans le bit-banging pur et dur.

Le défi du timing analogique

Le standard VGA impose une rigueur chronométrique absolue à celui qui s'y frotte. Pour obtenir une image stable, typiquement en 640x480 à 60 Hz, le contrôleur doit générer des signaux de synchronisation horizontale (H-sync) et verticale (V-sync) avec une précision de l'ordre de la microseconde. Sur une architecture PIC18 cadencée à quelques dizaines de mégahertz, chaque cycle d'instruction est précieux. L'astuce réside ici dans l'utilisation intelligente des timers internes et des interruptions prioritaires pour maintenir cette cadence sans aucune dérive temporelle, sous peine de voir l'image se désynchroniser immédiatement.

Un DAC rudimentaire pour les couleurs

Côté matériel, la solution retenue est ultra simple (si on peut dire). Pour transformer les sorties numériques binaires du microcontrôleur en signaux analogiques exploitables par un moniteur CRT ou LCD, l'auteur a implémenté une échelle de résistances, aussi appelée DAC R-2R. Ce montage passif permet de convertir des combinaisons de bits en niveaux de tension spécifiques pour les canaux Rouge, Vert et Bleu. C'est une approche classique en électronique "low-cost" qui permet d'obtenir une palette de couleurs certes limitée, mais parfaitement fonctionnelle pour de l'affichage de texte ou de graphismes simples.

L'art du bit-banging et des périphériques détournés

L'envoi des données de pixels vers l'écran nécessite une bande passante que le CPU seul peinerait à fournir en mode pur "bit-banging". Pour optimiser le processus, le développeur détourne souvent le module SPI ou le port série synchrone (MSSP) du PIC pour envoyer les octets de données à la vitesse de l'horloge système. Cela permet de déléguer une partie de la charge de travail au hardware interne et de libérer quelques cycles processeur pour gérer la logique d'affichage. C'est un équilibre précaire où la moindre latence logicielle se traduit par des pixels décalés ou des lignes de travers. Chaud donc.

Ce projet illustre bien l'adage selon lequel la contrainte stimule la créativité. Là où nous utilisons aujourd'hui des processeurs multi-cœurs pour la moindre interface, ce hack prouve qu'un vieux microcontrôleur 8 bits peut encore faire le job. C’est une leçon d'architecture informatique qui permet de comprendre concrètement comment l'information devient image. C'est aussi une forme de résistance face à la démesure logicielle actuelle.

Source : Hackaday

This mobile controller is "opulent" for Xbox Cloud Gaming — top-class controls, feedback, and design for a fair price

The Razer Kishi Ultra is a phenomenal controller that elevates Xbox Cloud Gaming to new heights of fun while being comfy to use, and its steep price has been cut by 55% to make it more accessible.

Razer Kishi Ultra

The Razer Kishi Ultra in action.

Intel's impressive Core Ultra 5 250KF Plus is now available in limited quantities — Don't miss an "incredible deal for content creators who moonlight as gamers"

Intel's eagerly anticipated Core Ultra 250KF Plus desktop CPU, the most affordable of the bunch, is now available to buy in limited quantities. It's a perfect option for value-conscious gamers and creators, and I don't expect stock to last long.

Intel Core Ultra 200S Plus processor reverse side showing LGA 1851 contacts

A look at the new Core Ultra 200S Plus desktop processor held between two fingers.

Our favorite premium Xbox controller has gotten its best discount yet for the Amazon Spring Sale — with 1000Hz polling, you will never lose again

The durable, responsive, and ergonomic Razer Wolverine V3 Pro Xbox controller is one of many gaming accessories that have been massively price-chopped for the Amazon Spring Sale.

AI-Generated image of the Razer Wolverine V3 Pro controller visualized

AI-Generated image of the Razer Wolverine V3 Pro

I'm no competitive gamer, but this new top-tier Razer mouse makes me feel like one — the latest version of the industry's favorite is here

Razer's Viper V4 Pro gaming mouse improves upon its predecessor, though it's still very expensive. Even so, it's a top-tier option for competitive players.

The Razer Viper V4 Pro

The Razer Viper V4 Pro is a refresh of its popular predecessor, and improves upon it with a variety of elevated features and functionalities.

Intel's vPro platform expands to Core Ultra Series 3 processors to keep your next work laptop safe — with local AI and efficiency

Intel's latest vPro upgrades on Core Ultra mean enterprise‑ready laptops with the efficiency of Panther Lake, and a more secure PC for your job.

Intel vPro with Core Ultra Series 3 samples on display

Intel's new vPro platform wants to save your battery and your data.

Time to ditch my old gaming headset for one of Razer's best: An "industry-leading mic, longer-lasting battery life," and more

The Razer BlackShark V2 Pro is an outstanding gaming headset for PC we'd recommend any time it's on sale, and that time is now, as it's currently 36% off for a limited time.

Image of the Razer BlackShark V2 Pro (2023).

<p>The Razer BlackShark V2 Pro (2023) in front of its retail box, along with the detachable mic and two included, braided cables.</p>

Save desk space while saving the World of Warcraft with this MMO mouse and gaming keyboard — both nearly 40% off

Two of Razer's best mid-range PC gaming accessories are on sale for Amazon's Spring Sale, just in time for World of Warcraft: Midnight's first Season.

AI-Generated background of elves using a Razer keyboard and mouse as weapons against the Void, visualized

Fight back Xal'atath's armies with the power of Razer technology

Quand 10 000 bots volent 8 millions aux artistes sur Spotify

Par : Korben
25 mars 2026 à 15:38

Un mec de 54 ans vient de plaider coupable pour avoir siphonné 8 millions de dollars aux artistes musicaux en utilisant 10 000 bots et de la musique générée par IA. Michael Smith, résident de Cornelius en Caroline du Nord, a monté pendant des années une ferme à streams qui écoutait en boucle des centaines de milliers de fausses chansons sur Spotify et Apple Music.

Le truc, c'est que ces plateformes ne paient pas un tarif fixe par écoute. Elles fonctionnent avec un pot commun mensuel qu'elles redistribuent proportionnellement au nombre de streams. Du coup, chaque fausse écoute générée par les bots de Smith grignotait directement la part des vrais artistes. En gros, c'est pas Spotify qui se faisait voler, c'est les musiciens qui galèrent déjà à vivre de leur art !

Pour le contenu, Smith avait en fait trouvé un deal avec le CEO d'une boîte de musique IA qui lui pondait des milliers de morceaux par semaine. Les fichiers WAV arrivaient sous forme de chaînes aléatoires de lettres et de chiffres, et il les renommait avec des noms d'artistes fictifs du genre "Calorie Event", "Calms Scorching" ou encore "Calypso Xored" (on sent le générateur de noms random). Les titres, pareil... "Zygotes", "Zyme Bedewing"... si vous tombez là-dessus dans votre discover, y'a de quoi tiquer quand même mais bon...

Et ce problème, ça pose une question que Spotify connaît bien : comment distinguer les vrais streams des faux quand les bots sont suffisamment dispersés sur des milliers de morceaux ? Smith avait justement calibré ses 10 000 bots pour ne pas déclencher les alertes anti-fraude, en répartissant les écoutes sur un catalogue énorme plutôt que de matraquer un seul titre. Pas con.

Mais le bonhomme s'est quand même fait choper. Il a accepté de rendre la totalité des 8 091 843 dollars et risque jusqu'à 5 ans de prison lors de son procès qui aura lieu le 29 juillet prochain. Pas sûr que le ratio risque/récompense en valait la chandelle, en fait.

Le problème de fond, c'est que cette affaire n'est probablement que la partie émergée de l'iceberg. Et je suis sûr que y'en a en France qui font la même... bah sachez que c'est pas cool et que vous risquez d'avoir de GROS ennuis... Avec les outils de génération musicale par IA qui se démocratisent, n'importe qui peut inonder les plateformes de contenu synthétique pour gratter des royalties.

Et tant que le modèle de rémunération repose sur un pot commun plutôt que sur un paiement direct par utilisateur, il sera vulnérable. Encore une fois, les vrais perdants, c'est pas les plateformes (elles prennent leur commission quoi qu'il arrive), mais ce sont les artistes indépendants qui voient leur part du gâteau fondre à chaque bot supplémentaire.

Moche...

Bref, la prochaine fois que votre playlist de découvertes vous propose un artiste nommé "Calypso Xored" ou un connerie de ce style... méfiance !

Source

Sora ferme - Comment sauvegarder vos vidéos IA avant la coupure

Par : Korben
25 mars 2026 à 14:22

Sora, c’est fini les amis !

Hé oui, cest chacals d'OpenAI ferment leur plateforme de vidéos IA, et franchement, ça me rend un peu triste. À vrai dire, même si c’était que de la vidéo générée à partir de prompts, moi je me marrais bien. C'était fun de regarder le produit de ses prompts mais aussi de regarder les conneries des autres. Les versions québécoises, aïe aïe aïe, c’était quelque chose quand même !

Mais bon, le plus urgent maintenant, c’est de sauvegarder vos vidéos avant que tout disparaisse. OpenAI n’a pas encore communiqué de date précise pour la coupure, juste un vague « on vous dira bientôt ». Du coup, autant ne pas traîner, parce que quand ce genre de service cloud ferme, en général c’est pas 6 mois de préavis qu’on vous file...

Depuis la fuite du modèle jusqu’à aujourd’hui, Sora aura fait parler de lui. Côté raisons, c’est Fidji Simo (la patronne de la division Applications) qui a lâché le morceau : ils éparpillent leurs efforts sur trop d’apps, d’API et de stacks serveur différents, et ça les ralentit. En gros, entre préparer une entrée en bourse pour fin 2026 et cramer du GPU H100 sur des vidéos de chats en IA, le choix est vite fait. L’équipe de recherche Sora, elle, continuera à bosser sur la simulation de mondes 3D... mais pour la robotique. Et le fameux deal à 1 milliard de dollars avec Disney pour des films et séries ? Pouf, magie magie, c'est envolé !!

Faut dire que les chiffres n’étaient pas glorieux non plus. Après un lancement en fanfare fin 2024 (et une app iOS lancée à l’automne 2025 qui avait cartonné dans les charts), les téléchargements sur l’App Store avaient plongé de 32% entre novembre et décembre 2025. La hype, ça dure qu’un temps.

Mais maintenant les gens, on passe aux choses sérieuses !

Sora Backup - le script qui sauve vos vidéos

Je n'avais absolument pas de temps aujourd'hui, mais j'ai quand même taffé pour vous développer un petit script JavaScript qui récupère TOUTES vos vidéos Sora d’un coup, avec les prompts et les métadonnées, et qui vous génère un joli ZIP prêt à archiver. Pas besoin d’installer quoi que ce soit, pas d’extension louche. Vous avez juste besoin d'être connecté à votre profil Sora et d'un navigateur.

Comment ça marche

Allez sur sora.com , connectez-vous à votre compte, puis ouvrez la console JavaScript de votre navigateur (F12 sur Chrome ou Firefox, onglet Console). Ensuite, glissez-déplacez ou collez le script ci-dessous dedans et appuyez sur Entrée.

Le script va automatiquement récupérer votre token d’authentification (pas besoin de le chercher vous-même), puis il va paginer sur votre profil Sora pour récupérer tous vos posts publiés. Pour chaque post, il extrait les vidéos attachées (MP4), les télécharge, et empaquette le tout dans un fichier ZIP directement dans votre navigateur.

Y’a même un fichier manifest.json dans le ZIP qui contient tous vos prompts, les dimensions, les durées, les permalinks, les dates de création... bref, tout ce qu’il faut pour retrouver vos petits. Le ZIP est généré en format STORE (pas compressé, parce que compresser du MP4 ça sert à rien), avec un calcul CRC32 maison et sans aucune librairie externe.

Le script complet

Voici le code à coller dans la console :

// ==========================================================
// SORA BACKUP - Sauvegarde complète vidéos + images + prompts par Korben
// ==========================================================
// Usage : Ouvrir https://sora.com, F12 > Console, coller ce script
// Les fichiers sont téléchargés via le navigateur (dossier Downloads)
// Un fichier manifest.json récapitule tout (prompts, metadata, URLs)
// ==========================================================

(async () => {
 // --- Mini ZIP builder (STORE, pas de lib externe) ---
 const crc32table = new Uint32Array(256);
 for (let i = 0; i < 256; i++) {
 let c = i;
 for (let j = 0; j < 8; j++) c = (c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1);
 crc32table[i] = c;
 }
 function crc32(buf) {
 let c = 0xFFFFFFFF;
 for (let i = 0; i < buf.length; i++) c = crc32table[(c ^ buf[i]) & 0xFF] ^ (c >>> 8);
 return (c ^ 0xFFFFFFFF) >>> 0;
 }
 const zipFiles = []; // {name, data (Uint8Array), crc, size}

 const PAGE_SIZE = 50;
 const DELAY_MS = 1500;
 const manifest = [];
 let totalDownloaded = 0;
 let totalErrors = 0;

 // --- Auth : récupérer le Bearer token ---
 // OPTION 1 : Coller ton token ici (Network tab > Authorization header)
 // OPTION 2 : Laisser vide, le script tentera de le récupérer auto
 let AUTH_TOKEN = '';

 async function getAuthToken() {
 if (AUTH_TOKEN) return AUTH_TOKEN;

 // Auto-detect : endpoint session ChatGPT
 for (const path of ['/api/auth/session', '/backend-api/auth/session']) {
 try {
 const r = await fetch(path, { credentials: 'include' });
 if (r.ok) {
 const json = await r.json();
 if (json.accessToken) {
 AUTH_TOKEN = json.accessToken;
 console.log(' 🔑 Token récupéré automatiquement');
 return AUTH_TOKEN;
 }
 }
 } catch(e) {}
 }

 // Fallback : demander à l'utilisateur
 const input = prompt(
 'Token non trouvé automatiquement.\n\n' +
 'Pour le récupérer :\n' +
 '1. F12 > onglet Réseau\n' +
 '2. Rafraîchis la page\n' +
 '3. Clique sur une requête /backend/...\n' +
 '4. Copie le header Authorization\n\n' +
 'Colle le token ici (Bearer eyJ...):'
 );
 if (input) {
 AUTH_TOKEN = input.replace(/^Bearer\s+/i, '').trim();
 return AUTH_TOKEN;
 }

 console.error(' ❌ Pas de token. Annulation.');
 return null;
 }

 // --- Fetch API avec auth ---
 async function apiFetch(url) {
 const token = await getAuthToken();
 const headers = {};
 if (token) headers['Authorization'] = 'Bearer ' + token;

 // oai-device-id requis par certains endpoints
 const deviceId = localStorage.getItem('oai-did') || '';
 if (deviceId) headers['oai-device-id'] = deviceId;

 const resp = await fetch(url, {
 method: 'GET',
 credentials: 'include',
 headers
 });

 if (!resp.ok) throw new Error(`HTTP ${resp.status} for ${url}`);
 return resp.json();
 }

 // --- Pagination générique ---
 async function fetchAllPages(baseUrl, dataField = 'data', cursorParam = 'after', cursorField = 'last_id') {
 let allItems = [];
 let cursor = '';
 let page = 0;

 while (true) {
 let url = baseUrl;
 if (cursor) url += `&${cursorParam}=${cursor}`;

 console.log(` 📄 Page ${++page} (${allItems.length} items so far)...`);
 const json = await apiFetch(url);

 const items = json[dataField];
 if (!Array.isArray(items) || items.length === 0) break;

 allItems = allItems.concat(items);
 cursor = json[cursorField] || '';

 if (!json.has_more && !cursor) break;
 await sleep(DELAY_MS);
 }

 return allItems;
 }

 // Variante pour les endpoints project_y (cursor-based)
 async function fetchAllPagesCursor(baseUrl) {
 let allItems = [];
 let cursor = '';
 let page = 0;

 while (true) {
 let url = baseUrl;
 if (cursor) url += `&cursor=${cursor}`;

 console.log(` 📄 Page ${++page} (${allItems.length} items so far)...`);
 const json = await apiFetch(url);

 const items = json.items;
 if (!Array.isArray(items) || items.length === 0) break;

 allItems = allItems.concat(items);
 cursor = json.cursor || '';

 if (!cursor) break;
 await sleep(DELAY_MS);
 }

 return allItems;
 }

 function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }

 // --- Extraire URL du média depuis une generation ---
 function getMediaUrl(gen) {
 return gen?.encodings?.source?.path
 || gen?.downloadable_url
 || gen?.url
 || '';
 }

 // --- Extraire le prompt (peut être dans actions, prompt, ou input_text) ---
 function getPrompt(item, gen) {
 // Prompt direct
 if (gen?.prompt) return gen.prompt;
 if (item?.prompt) return item.prompt;
 if (item?.input_text) return item.input_text;
 // Storyboard : les actions sont les descriptions des scènes
 if (item?.actions && typeof item.actions === 'object') {
 return Object.entries(item.actions)
 .sort((a,b) => Number(a[0]) - Number(b[0]))
 .map(([frame, desc]) => `[frame ${frame}] ${desc}`)
 .join(' | ');
 }
 if (gen?.actions && typeof gen.actions === 'object') {
 return Object.entries(gen.actions)
 .sort((a,b) => Number(a[0]) - Number(b[0]))
 .map(([frame, desc]) => `[frame ${frame}] ${desc}`)
 .join(' | ');
 }
 return '';
 }

 // --- Dérouler les items du profil Sora en items plats ---
 function flattenProfileItems(items) {
 const flat = [];
 for (const item of items) {
 const post = item.post || item;
 const attachments = post.attachments || [];
 if (attachments.length === 0) continue;

 for (const att of attachments) {
 const url = att.encodings?.source?.path || att.downloadable_url || att.url || '';
 if (!url) continue;

 flat.push({
 id: post.id || att.generation_id || '',
 generation_id: att.generation_id || '',
 task_id: att.task_id || '',
 title: att.title || post.discovery_phrase || '',
 prompt: post.text || '',
 emoji: post.emoji || '',
 type: att.generation_type || att.kind || '',
 width: att.width || 0,
 height: att.height || 0,
 duration_s: att.duration_s || 0,
 is_public: !!post.posted_to_public,
 created_at: post.posted_at ? new Date(post.posted_at * 1000).toISOString() : '',
 url: url,
 permalink: post.permalink || '',
 username: item.profile?.username || '',
 });
 }
 }
 return flat;
 }

 // --- Sanitize filename ---
 function sanitize(name) {
 return name.replace(/[<>:"\/\\|?*\x00-\x1f]/g, '_').substring(0, 100);
 }

 // --- Ajouter un fichier au ZIP ---
 async function addToZip(url, filename) {
 try {
 const resp = await fetch(url);
 if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
 const buf = await resp.arrayBuffer();
 const data = new Uint8Array(buf);
 zipFiles.push({ name: filename, data, crc: crc32(data), size: data.length });
 totalDownloaded++;
 return true;
 } catch(e) {
 console.warn(` ⚠️ Erreur ${filename}:`, e.message);
 totalErrors++;
 return false;
 }
 }

 // --- Déduire l'extension ---
 function getExt(url, type) {
 if (!url) return type === 'video' ? '.mp4' : '.png';
 const m = url.match(/\.(mp4|webm|mov|png|jpg|jpeg|webp|gif)/i);
 return m ? '.' + m[1].toLowerCase() : (type === 'video' ? '.mp4' : '.png');
 }

 // ==========================================================
 // MAIN
 // ==========================================================
 const origin = window.location.origin;
 console.log('🎬 SORA BACKUP - Démarrage');
 console.log('='.repeat(50));

 // 1. Mes posts Sora (profil)
 console.log('\n📦 1/2 - Récupération de mes posts Sora...');
 let myPosts = [];
 try {
 myPosts = await fetchAllPagesCursor(
 `${origin}/backend/project_y/profile_feed/me?limit=${PAGE_SIZE}&cut=nf2`
 );
 console.log(`  ${myPosts.length} posts de profil`);
 // Debug premier item
 if (myPosts.length > 0) {
 const first = myPosts[0];
 console.log(' 🔍 Premier item - clés:', Object.keys(first).join(', '));
 console.log(' 🔍 URL:', first.url?.substring(0, 80) || 'none');
 console.log(' 🔍 DL:', first.downloadable_url?.substring(0, 80) || 'none');
 console.log(' 🔍 ENC:', first.encodings?.source?.path?.substring(0, 80) || 'none');
 console.log(' 🔍 GENS:', first.generations?.length || 'none');
 console.log(' 🔍 TITLE:', first.title || 'none');
 }
 } catch(e) {
 console.warn(' ⚠️ profil failed:', e.message);
 }

 // 2. Mes likes sur Sora
 console.log('\n📦 2/2 - Récupération de mes likes Sora...');
 let myLikes = [];
 try {
 myLikes = await fetchAllPagesCursor(
 `${origin}/backend/project_y/profile_feed/me?limit=${PAGE_SIZE}&cut=appearances`
 );
 if (myCameos.length) console.log(`  ${myCameos.length} cameos trouvés`);
 } catch(e) {}

 // --- Dérouler les generations et dédupliquer ---
 console.log('\n🔄 Extraction des vidéos...');
 const rawAll = [...myPosts, ...myLikes];
 const flatItems = flattenProfileItems(rawAll);

 const seen = new Set();
 const allItems = [];
 for (const item of flatItems) {
 if (item.id && seen.has(item.id)) continue;
 // Filtrer : vidéos uniquement
 const isVideo = item.type === 'video_gen' || item.url.includes('/videos/') || item.url.includes('.mp4');
 if (!isVideo) continue;
 if (item.id) seen.add(item.id);
 allItems.push(item);
 }

 console.log(`📊 Total unique: ${allItems.length} vidéos à télécharger`);
 console.log('='.repeat(50));

 // --- Construire le manifest et télécharger ---
 console.log('\n⬇️ Téléchargement en cours...');
 console.log('(Les fichiers arrivent dans ton dossier Downloads)');

 for (let i = 0; i < allItems.length; i++) {
 const meta = allItems[i];
 const url = meta.url;

 if (!url) {
 console.log(` ⏭️ [${i+1}/${allItems.length}] ${meta.id} - pas d'URL, skip`);
 meta.downloaded = false;
 manifest.push(meta);
 continue;
 }

 const type = (meta.task_type === 'image_gen' || url.match(/\.(png|jpg|jpeg|webp|gif)/i)) ? 'image' : 'video';
 const ext = getExt(url, type);
 const nameBase = meta.title
 ? sanitize(meta.title)
 : (meta.prompt ? sanitize(meta.prompt.substring(0, 60)) : meta.id);
 const filename = `sora_${String(i+1).padStart(4,'0')}_${nameBase}${ext}`;

 console.log(` ⬇️ [${i+1}/${allItems.length}] ${filename}`);
 meta.filename = filename;
 meta.downloaded = await addToZip(url, filename);
 manifest.push(meta);

 // Pause entre downloads pour pas surcharger
 if (i < allItems.length - 1) await sleep(800);
 }

 // --- Ajouter le manifest au ZIP ---
 console.log('\n📝 Ajout du manifest au ZIP...');
 const manifestData = new TextEncoder().encode(JSON.stringify(manifest, null, 2));
 zipFiles.push({ name: 'manifest.json', data: manifestData, crc: crc32(manifestData), size: manifestData.length });

 // --- Générer le ZIP (format STORE, pas de compression) ---
 console.log('\n📦 Génération du ZIP...');
 const enc = new TextEncoder();
 const blobParts = [];
 const centralParts = [];
 let offset = 0;

 for (const f of zipFiles) {
 const nameBytes = enc.encode(f.name);
 // Local file header (30 bytes + name)
 const lh = new ArrayBuffer(30);
 const lv = new DataView(lh);
 lv.setUint32(0, 0x04034b50, true);
 lv.setUint16(4, 20, true);
 lv.setUint16(8, 0, true); // STORE
 lv.setUint32(14, f.crc, true);
 lv.setUint32(18, f.size, true);
 lv.setUint32(22, f.size, true);
 lv.setUint16(26, nameBytes.length, true);
 blobParts.push(new Uint8Array(lh), nameBytes, f.data);

 // Central directory entry (46 bytes + name)
 const ch = new ArrayBuffer(46);
 const cv = new DataView(ch);
 cv.setUint32(0, 0x02014b50, true);
 cv.setUint16(4, 20, true);
 cv.setUint16(6, 20, true);
 cv.setUint16(10, 0, true); // STORE
 cv.setUint32(16, f.crc, true);
 cv.setUint32(20, f.size, true);
 cv.setUint32(24, f.size, true);
 cv.setUint16(28, nameBytes.length, true);
 cv.setUint32(42, offset, true);
 centralParts.push(new Uint8Array(ch), nameBytes);

 offset += 30 + nameBytes.length + f.size;
 }

 const centralSize = centralParts.reduce((s, p) => s + p.length, 0);
 const eocd = new ArrayBuffer(22);
 const ev = new DataView(eocd);
 ev.setUint32(0, 0x06054b50, true);
 ev.setUint16(8, zipFiles.length, true);
 ev.setUint16(10, zipFiles.length, true);
 ev.setUint32(12, centralSize, true);
 ev.setUint32(16, offset, true);

 const zipBlob = new Blob([...blobParts, ...centralParts, new Uint8Array(eocd)], { type: 'application/zip' });

 const zipName = `sora_backup_${new Date().toISOString().split('T')[0]}.zip`;
 const a = document.createElement('a');
 a.href = URL.createObjectURL(zipBlob);
 a.download = zipName;
 document.body.appendChild(a);
 a.click();
 document.body.removeChild(a);
 URL.revokeObjectURL(a.href);

 // --- Résumé ---
 const sizeMB = (zipBlob.size / 1024 / 1024).toFixed(1);
 console.log('\n' + '='.repeat(50));
 console.log('🎬 SORA BACKUP TERMINÉ');
 console.log(`  Vidéos dans le ZIP : ${totalDownloaded}`);
 console.log(`  Erreurs : ${totalErrors}`);
 console.log(` 📦 Fichier : ${zipName} (${sizeMB} MB)`);
 console.log(` 📝 manifest.json inclus dans le ZIP`);
 console.log('='.repeat(50));
})();

Quelques précisions

Si le token n’est pas récupéré automatiquement (ça peut arriver selon votre config), le script vous demandera de le coller manuellement. Pour le trouver, c’est simple : F12 > onglet Réseau > rafraîchissez la page > cliquez sur n’importe quelle requête vers /backend/... > copiez le header Authorization.

D’ailleurs, si la vidéo IA vous branche toujours, Higgsfield propose des séries entièrement générées par IA. C’est pas la même approche que Sora, mais c’est un signe que la vidéo IA ne meurt pas avec la fermeture d’un seul service.

Bon, bref, c’est la fin d’un truc sympa. Moi je préférais largement scroller sur Sora sur d'aller sur TikTok ou Instagram parce qu'au moins c'était drôle !

Merci à mes Patreons qui me permettent de prendre le temps de développer ce genre de petits outils pour vous. Sans eux, j’aurais jamais pu me poser une après-midi pour coder ça.

Source

Plus de 1 000 environnements cloud infectés après une attaque sur le scanner Trivy

Par : Korben
25 mars 2026 à 13:30

Un groupe de pirates a compromis Trivy, un scanner de vulnérabilités open source très utilisé dans les pipelines de développement. Résultat : plus de 1 000 environnements SaaS infectés par un malware qui vole des clés API, des identifiants cloud et des tokens GitHub.

Un scanner de sécurité devenu vecteur d'attaque

Trivy est un outil open source maintenu par Aqua Security. Il sert à détecter des failles, des mauvaises configurations et des secrets exposés dans du code, et il est intégré dans les chaînes de déploiement continu (CI/CD) d'un très grand nombre d'entreprises. Le groupe TeamPCP a réussi à compromettre la version 0.69.4 de Trivy en exploitant une mauvaise configuration dans le composant GitHub Action du projet.

En février, ils ont volé un token d'accès privilégié, et ce token n'a jamais été correctement révoqué. En mars, les attaquants l'ont utilisé pour injecter du code malveillant directement dans le projet, en poussant des images Docker et des versions GitHub vérolées vers les utilisateurs.

Le résultat : 75 des 76 tags de trivy-action ont été remplacés par des versions malveillantes.

La contamination s'étend

L'attaque ne s'est pas arrêtée à Trivy. Le même groupe a aussi compromis liteLLM, une bibliothèque Python qui sert d'interface pour les modèles de langage et qui est présente dans 36 % des environnements cloud.

Ils ont aussi touché KICK (un outil d'analyse statique de Checkmarx) et déployé CanisterWorm, un ver qui se propage via des paquets npm vérolés. Le malware installé est un infostealer qui extrait les clés API, les identifiants de bases de données, les tokens GitHub et toute information sensible accessible dans l'environnement de build.

Mandiant, la branche cybersécurité de Google, estime que plus de 1 000 environnements SaaS sont actuellement compromis, et que ce chiffre pourrait grimper à 10 000. TeamPCP travaillerait avec le groupe Lapsus$, connu pour ses attaques contre Microsoft, Nvidia et Uber.

Des révélations à la conférence RSA

Les détails de l'attaque ont été rendus publics lors de la conférence RSA. Le chercheur en sécurité Paul McCarty a été le premier à tirer la sonnette d'alarme, suivi par les équipes de Socket, Wiz et Aikido.dev. Aqua Security a vu ses 44 dépôts GitHub internes défacés, avec une exposition du code source et des configurations CI/CD.

L'affaire montre à quel point les outils de sécurité open source, quand ils sont mal protégés, peuvent devenir le point d'entrée idéal pour une attaque à grande échelle.

C'est quand même un comble : un scanner de vulnérabilités qui devient lui-même le vecteur d'une attaque. Le fait qu'un simple token non révoqué ait suffi pour compromettre toute la chaîne montre que la sécurité des projets open source reste un vrai sujet. Et quand on sait que liteLLM est présent dans plus d'un tiers des environnements cloud, on mesure l'ampleur du problème...

Source : The Register

PowerToys - Quand Microsoft corrige les manques de Windows

Par : Korben
24 mars 2026 à 12:25

Si vous êtes sous Windows 10 ou 11, vous avez forcément déjà ragé sur un truc tout bête. Genre redimensionner 50 photos d'un coup, renommer des fichiers en masse, ou juste organiser vos fenêtres proprement sur un écran ultra-large. Tout ça, Windows ne sait pas le faire nativement et c'est bien dommage ! Heureusement, c'est là que les PowerToys entrent en jeu... Si vous ne connaissez pas encore ça, sachez simplement qu'il s'agit d'un pack d'une trentaine d'utilitaires open source, maintenus par Microsoft eux-mêmes qui s'installent comme ceci dans un powershell lancé en admin :

winget install Microsoft.PowerToys -s winget

C'est gratuit, c'est dispo sur GitHub, et franchement, c'est à se demander pourquoi tout ça n'est pas intégré par défaut dans l'OS. C'est fou quand même !

Le premier truc qui change la vie, c'est FancyZones. Si vous avez un grand écran, le Snap Layout de Windows 11 c'est... limité. Avec FancyZones, vous créez vos propres zones de dépôt. Vous maintenez MAJ, vous glissez une fenêtre, hop, elle se cale exactement où vous voulez. Une fois qu'on y a goûté, impossible de revenir en arrière.

Autre indispensable c'est PowerToys Run. Tapez Alt + Espace et une barre de recherche épurée apparaît comme Spotlight sur Mac. Ça cherche vos applis, vos fichiers, ça fait calculatrice et conversion d'unités. Bref, vous pouvez oublier le menu Démarrer (et ses pubs).

Pour garder une fenêtre au premier plan quoi que vous fassiez, Win + Ctrl + T et c'est réglé. Always on Top, ça s'appelle et ça se matérialise sous la forme d'une bordure colorée qui apparaît pour vous montrer que la fenêtre est "clouée". Pratique quand vous suivez un tuto tout en tapant du code à côté.

Côté renommage de fichiers, PowerRename remplace avantageusement des outils comme Ant Renamer . Clic droit sur vos fichiers, search & replace avec support des regex pour les plus courageux. Du coup, fini le renommage un par un comme en 2003.

Y'a aussi Color Picker (Win + Maj + C) qui transforme votre curseur en pipette pour chopper n'importe quel code couleur à l'écran. Et Text Extractor (Win + Maj + T) qui fait de l'OCR instantané sur une zone de votre écran. Attention, ça marche pas toujours selon la police, mais ça évite de retaper du texte à la main.

Le plus dingue, c'est Crop and Lock. Vous faites Win + Ctrl + Maj + R et vous découpez une zone d'une appli pour en faire une fenêtre indépendante. Genre un graphique ou un flux d'infos. Sous le capot, ça crée une sorte de proxy visuel de la fenêtre originale, et vous pouvez même continuer à interagir dedans.

Et si vous avez deux PC côte à côte, Mouse Without Borders vous permet de les contrôler avec la même souris et le même clavier. Vous passez d'un écran à l'autre comme si c'était la même machine. Et d'ailleurs, si vous perdez votre curseur sur vos écrans géants, y'a aussi un utilitaire ici pour retrouver sa souris facilement.

Après j'ai pas tout listé. Y'a par exemple un éditeur de variables d'environnement hyper fastoche à utiliser, un aperçu du registre (pour éviter les bêtises), une fonction "Command Not Found" pour vous aider dans le terminal, un redimensionneur d'images intégré au clic droit...etc. Bref, à vous de fouiller mais ce que je retiens c'est que Microsoft a mis 30 ans à admettre que son OS avait des manques, et au lieu d'y répondre au cœur de Windows, ils ont fait ce side project devenu indispensable.

Et pour ceux qui veulent gérer leurs installs avec une interface graphique, allez voir WingetUI . C'est le complément parfait.

Voilà. Installez ça et remerciez-moi plus tard !

Un développeur fait tourner du code Arduino sur une puce de 1980

Par : Korben
24 mars 2026 à 09:24

Un développeur vietnamien a trouvé le moyen de faire fonctionner du code Arduino sur un microcontrôleur 8051, une architecture conçue par Intel en 1980.

L'astuce repose sur un émulateur RISC-V intégré directement dans la puce, et le tout est disponible en open source sur GitHub.

Une puce de 45 ans qui refuse de mourir

Le 8051, c'est un microcontrôleur 8 bits qu'Intel a conçu en 1980. L'anecdote veut que son architecture ait été dessinée en un week-end par l'ingénieur John Wharton.

Depuis, Intel a vendu plus de 100 millions d'unités rien que sur la première décennie, et des variantes compatibles sont encore produites et utilisées un peu partout, des souris d'ordinateur aux puces Bluetooth.

La version ciblée ici, c'est le STC8H8K64U, un dérivé moderne fabriqué par le chinois STC Micro. Il coûte moins d'un dollar et reste populaire en Asie, mais les outils de développement modernes ne le prennent pas en charge. D'où l'idée du projet.

Un émulateur RISC-V dans un 8051

Bùi Trịnh Thế Viên n'a pas cherché à porter le compilateur Arduino directement sur l'architecture 8051, ce qui aurait été un chantier monstre.

Il a opté pour une approche détournée : intégrer un émulateur RISC-V (appelé rv51, écrit en assembleur 8051 par un autre développeur, cyrozap) dans la puce STC8. Le code Arduino est compilé pour RISC-V, puis exécuté via cet émulateur.

Le projet est disponible sur GitHub sous le nom STC_Arduino_Core.

Des limites assumées

L'émulation a un coût. L'émulateur consomme 8 Ko de mémoire flash sur la puce, et la vitesse d'exécution est divisée par 100 à 1 000 par rapport au code natif. Pour le code qui demande du temps réel, comme la gestion des interruptions, il faut repasser sur de l'assembleur 8051 classique.

Et puis il faut le dire, des microcontrôleurs RISC-V natifs existent et coûtent à peine plus cher. Le projet reste donc un exercice technique et pédagogique, pas une solution de production.

C'est le genre de bidouille qui fait sourire. Faire tourner du code Arduino sur une architecture de 1980 via un émulateur RISC-V coincé dans 8 Ko, il fallait quand même y penser.

Bon par contre, on ne va pas se raconter d'histoires, en pratique ça n'a pas beaucoup d'intérêt face à un vrai microcontrôleur RISC-V à 2 euros. Mais l'exercice a le mérite de prouver que le 8051 a encore de la ressource, 45 ans après sa création.

Source : Hackaday

❌
❌