Latest Posts (20 found)

The Devil Needs No Advocate

Unless you're wealthy enough to bribe a small country or have personally received an invitation to Epstein's island, you have no business advocating for billionaires. Surely there must be a thrill in an ethics of contrarianism, something to make docile subservience an exciting prospect. "Ohh look at me, I'm so naughty because I'm not like everyone else", thinks the contrarian while shooting a sideways glance towards the working class, hoping to one day share a meal with wealthy industrialists, completely oblivious to the fact that among the working class is where he will always be kept. Did anyone ever find a friend in the kid who played "devil's advocate" in school? I want to share with you an unbelievable paragraph I read today. It was written by an American professor of philosophy, in an essay arguing that there is no moral objection to AI art. I call it unbelievable because it's hard to believe how badly it mischaracterizes the artist's rejection of generative AI. Imagine an artist in a patriarchal society complaining when women are allowed into the art museum for the first time: “I never gave permission for women to view my art!” This artist has no legitimate moral complaint, I’d say, because he has no moral right to make his work accessible only to men. Likewise, artists have no moral right to make their work accessible only to humans. They have no legitimate complaint if an AI trains on the work they post online, any more than they can complain about a young human artist “training on” (or learning from) their work. Take a minute to read that one again. "Babe, I thought of a great way to advance an instrumentalist view of agency that attributes mental states and intentionality to generative AI systems. First you pretend women and computer software are equivalent and then..." To philosophers it must be exciting to think of Artificial Intelligence as its own ontological class, a sui generis marvel of modern engineering. The truth is that no such thing exists yet, and marketing in Silicon Valley is powerful. Women have agency. AI has no agency. That's why this is a silly comparison and not even at all what the rejection of generative AI is about. When an artist pushes back against the use of generative AI tools, what they are saying is something like this: I do not approve of technology corporations amassing wealth by exploiting my work as an artist without consent . There's no artist saying they don't want the literal software processing their data because it's software. It's about who owns the software and what they do with it. The rejection of generative AI is not about programming languages, package managers, libraries, large language models and application programming interfaces. It's about technocrats building programs, using marketing terms like "learning" to make you think they have agency, and then the working class pretending they do because the marketing got so good. The devil needs no advocate.

0 views

How I discover new (and old) blogs and websites

One of the great things about having a blog is that you get a space that is entirely yours, where you share whatever you want and you make it look exactly how you want it to look. It's a labor of creativity and self-expression. An encouraging aspect of having a blog is also being read by others. I love receiving emails from people who liked a post. It's just nice to know I'm not shouting into the void! But take for instance posts I wrote last year or many years ago. How do those get discovered? Perhaps you wrote an awesome essay on your favorite topic back in 2022. How can I or anyone else stumble upon your work? Making it easy to discover hidden gems from the indie web was my motivation for making powRSS . powRSS is a public RSS feed aggregator to help you find the side of the internet that seldom appears on corporate search engines. It surfaces posts and blogs going all the way back to 1995. You never know what you're going to find and I think it's really fun. Today I made a video showing how it works.

1 views

Down The Atomic Rabbit Hole

Over the years, I’ve been chewing on media related to nuclear weapons. This is my high-level, non-exhaustive documentation of my consumption — with links! This isn’t exhaustive, but if you’ve got recommendations I didn’t mention, send them my way. Reply via: Email · Mastodon · Bluesky 📖 The Making of the Atomic Bomb by Richard Rhodes. This is one of those definitive histories (it’s close to 1,000 pages and won a Pulitzer Prize). It starts with the early discoveries in physics, like the splitting of the atom, and goes up to the end of WWII. I really enjoyed this one. A definite recommendation. 📖 Dark Sun: The Making of the Hydrogen Bomb by Richard Rhodes is the sequel. If you want to know how we went from atomic weapons to thermonuclear ones, I think this one will do it. It was a harder read for me though. It got into a lot of the politics and espionage of the Cold War and I fizzled out on it (plus my library copy had to be returned, somebody else had it on hold). I’ll probably go pick it up again though and finish it — eventually. 📖 The Bomb: A Life by Gerard J. DeGroot This one piqued my interest because it covers more history of the bomb after its first use, including the testing that took place in Nevada not far from where I grew up. Having had a few different friends growing up whose parents died of cancer that was attributed to being “downwinders” this part of the book hit close to home. Which reminds me of: 🎥 Downwinders & The Radioactive West from PBS. Again, growing up amongst locals who saw some of the flashes of light from the tests and experienced the fallout come down in their towns, this doc hit close to home. I had two childhood friends who lost their Dads to cancer (and their families received financial compensation from the gov. for it). 📖 Command and Control: Nuclear Weapons, the Damascus Accident, and the Illusion of Safety by Eric Schlosser Read this one years ago when it first came out. It’s a fascinating look at humans bumbling around with terrible weapons. 🎥 Command and Control from PBS is the documentary version of the book. I suppose watch this first and if you want to know more, there’s a whole book for you. 📖 Nuclear War: A Scenario by Annie Jacobsen Terrifying. 🎥 House of Dynamite just came out on Netlify and is basically a dramatization of aspects of this book. 📖 The Button: The New Nuclear Arms Race and Presidential Power from Truman to Trump by William J. Perry and Tom Z. Collina How did we get to a place where a single individual has sole authority to destroy humanity at a moment’s notice? Interesting because it’s written by former people in Washington, like the Sec. of Defense under Clinton, so you get a taste of the bureaucracy that surrounds the bomb. 🎧 Hardcore History 59 – The Destroyer of Worlds by Dan Carlin First thing I’ve really listened to from Dan. It’s not exactly cutting-edge scholarship and doesn’t have academic-level historical rigor, but it’s a compelling story around how humans made something they’ve nearly destroyed themselves with various times. The part in here about the cuban missile crisis is wild. It led me to: 📖 Nuclear Folly: A History of the Cuban Missile Crisis by Serhii Plokhy is a deep look at the Cuban Missile crisis. This is a slow burning audiobook I’m still chewing through. You know how you get excited about a topic and you’re like “I’m gonna learn all about that thing!” And then you start and it’s way more than you wanted to know so you kinda back out? That’s where I am with this one. 🎥 The Bomb by PBS. A good, short primer on the bomb. It reminds me of: 🎥 Turning Point: The Bomb and the Cold War on Netflix which is a longer, multi-episode look at the bomb during the Cold War. 📝 Last, but not least, I gotta include at least one blog! Alex Wellerstein, a historian of science and creator of the nukemap , blogs at Doomsday Machines if you want something for your RSS reader.

0 views
devansh Today

Hitchhiker's Guide to Attack Surface Management

I first heard about the word "ASM" (i.e., Attack Surface Management) probably in late 2018, and I thought it must be some complex infrastructure for tracking assets of an organization. Looking back, I realize I almost had a similar stack for discovering, tracking, and detecting obscure assets of organizations, and I was using it for my bug hunting adventures. I feel my stack was kinda goated, as I was able to find obscure assets of Apple, Facebook, Shopify, Twitter, and many other Fortune 100 companies, and reported hundreds of bugs, all through automation. Back in the day, projects like ProjectDiscovery were not present, so if I had to write an effective port scanner, I had to do it from scratch. (Masscan and nmap were present, but I had my fair share of issues using them, this is a story for another time). I used to write DNS resolvers (massdns had a high error rate), port scanners, web scrapers, directory brute-force utilities, wordlists, lots of JavaScript parsing logic using regex, and a hell of a lot of other things. I used to have up to 50+ self-developed tools for bug-bounty recon stuff and another 60-something helper scripts written in bash. I used to orchestrate (gluing together with duct tape is a better word) and slap together scripts like a workflow, and save the output in text files. Whenever I dealt with a large number of domains, I used to distribute the load over multiple servers (server spin-up + SSH into it + SCP for pushing and pulling files from it). The setup was very fragile and error-prone, and I spent countless nights trying to debug errors in the workflows. But it was all worth it. I learned the art of Attack Surface Management without even trying to learn about it. I was just a teenager trying to make quick bucks through bug hunting, and this fragile, duct-taped system was my edge. Fast forward to today, I have now spent almost a decade in the bug bounty scene. I joined HackerOne in 2020 (to present) as a vulnerability triager, where I have triaged and reviewed tens of thousands of vulnerability submissions. Fair to say, I have seen a lot of things, from doomsday level 0-days, to reports related to leaked credentials which could have led to entire infrastructure compromise, just because some dev pushed an AWS secret key in git logs, to things where some organizations were not even aware they were running Jenkins servers on some obscure subdomain which could have allowed RCE and then lateral movement to other layers of infrastructure. A lot of these issues I have seen were totally avoidable, only if organizations followed some basic attack surface management techniques. If I search "Guide to ASM" on Internet, almost none of the supposed guides are real resources. They funnel you to their own ASM solution, and the guide is just present there to provide you with some surface-level information, and is mostly a marketing gimmick. This is precisely why I decided to write something where I try to cover everything I learned and know about ASM, and how to protect your organization's assets before bad actors could get to them. This is going to be a rough and raw guide, and will not lead you to a funnel where I am trying to sell my own ASM SaaS to you. I have nothing to sell, other than offering what I know. But in case you are an organization who needs help implementing the things I am mentioning below, you can reach out to me via X or email (both available on the homepage of this blog). This guide will provide you with insights into exactly how big your attack surface really is. CISOs can look at it and see if their organizations have all of these covered, security researchers and bug hunters can look at this and maybe find new ideas related to where to look during recon. Devs can look at it and see if they are unintentionally leaving any door open for hackers. If you are into security, it has something to offer you. Attack surface is one of those terms getting thrown around in security circles so much that it's become almost meaningless noise. In theory, it sounds simple enough, right. Attack surface is every single potential entry point, interaction vector, or exploitable interface an attacker could use to compromise your systems, steal your data, or generally wreck your day. But here's the thing, it's the sum total of everything you've exposed to the internet. Every API endpoint you forgot about, every subdomain some dev spun up for "testing purposes" five years ago and then abandoned, every IoT device plugged into your network, every employee laptop connecting from a coffee shop, every third-party vendor with a backdoor into your environment, every cloud storage bucket with permissions that make no sense, every Slack channel, every git commit leaking credentials, every paste on Pastebin containing your database passwords. Most organizations think about attack surface in incredibly narrow terms. They think if they have a website, an email server, and maybe some VPN endpoints, they've got "good visibility" into their assets. That's just plain wrong. Straight up wrong. Your actual attack surface would terrify you if you actually understood it. You run , and is your main domain. You probably know about , , maybe . But what about that your intern from 2015 spun up and just never bothered to delete. It's not documented anywhere. Nobody remembers it exists. Domain attack surface goes way beyond what's sitting in your asset management system. Every subdomain is a potential entry point. Most of these subdomains are completely forgotten. Subdomain enumeration is reconnaissance 101 for attackers and bug hunters. It's not rocket science. Setting up a tool that actively monitors through active and passive sources for new subdomains and generates alerts is honestly an hour's worth of work. You can use tools like Subfinder, Amass, or just mine Certificate Transparency logs to discover every single subdomain connected to your domain. Certificate Transparency logs were designed to increase security by making certificate issuance public, and they've become an absolute reconnaissance goldmine. Every time you get an SSL certificate for , that information is sitting in public logs for anyone to find. Attackers systematically enumerate these subdomains using Certificate Transparency log searches, DNS brute-forcing with massive wordlists, reverse DNS lookups to map IP ranges back to domains, historical DNS data from services like SecurityTrails, and zone transfer exploitation if your DNS is misconfigured. Attackers are looking for old development environments still running vulnerable software, staging servers with production data sitting on them, forgotten admin panels, API endpoints without authentication, internal tools accidentally exposed, and test environments with default credentials nobody changed. Every subdomain is an asset. Every asset is a potential vulnerability. Every vulnerability is an entry point. Domains and subdomains are just the starting point though. Once you've figured out all the subdomains belonging to your organization, the next step is to take a hard look at IP address space, which is another absolutely massive component of your attack surface. Organizations own, sometimes lease, IP ranges, sometimes small /24 blocks, sometimes massive /16 ranges, and every single IP address in those blocks and ranges that responds to external traffic is part of your attack surface. And attackers enumerate them all if you won't. They use WHOIS lookups to identify your IP ranges, port scanning to find what services are running where, service fingerprinting to identify exact software versions, and banner grabbing to extract configuration information. If you have a /24 network with 256 IP addresses and even 10% of those IPs are running services, you've got 25 potential attack vectors. Scale that to a /20 or /16 and you're looking at thousands of potential entry points. And attackers aren't just looking at the IPs you know about. They're looking at adjacent IP ranges you might have acquired through mergers, historical IP allocations that haven't been properly decommissioned, and shared IP ranges where your servers coexist with others. Traditional infrastructure was complicated enough, and now we have cloud. It's literally exploded organizations' attack surfaces in ways that are genuinely difficult to even comprehend. Every cloud service you spin up, be it an EC2 instance, S3 bucket, Lambda function, or API Gateway endpoint, all of this is a new attack vector. In my opinion and experience so far, I think the main issue with cloud infrastructure is that it's ephemeral and distributed. Resources get spun up and torn down constantly. Developers create instances for testing and forget about them. Auto-scaling groups generate new resources dynamically. Containerized workloads spin up massive Kubernetes clusters you have minimal visibility into. Your cloud attack surface could be literally anything. Examples are countless, but I'd categorize them into 8 different categories. Compute instances like EC2, Azure VMs, GCP Compute Engine instances exposed to the internet. Storage buckets like S3, Azure Blob Storage, GCP Cloud Storage with misconfigured permissions. Serverless stuff like Lambda functions with public URLs or overly permissive IAM roles. API endpoints like API Gateway, Azure API Management endpoints without proper authentication. Container registries like Docker images with embedded secrets or vulnerabilities. Kubernetes clusters with exposed API servers, misconfigured network policies, vulnerable ingress controllers. Managed databases like RDS, CosmosDB, Cloud SQL instances with weak access controls. IAM roles and service accounts with overly permissive identities that enable privilege escalation. I've seen instances in the past where a single misconfigured S3 bucket policy exposed terabytes of data. An overly permissive Lambda IAM role enabled lateral movement across an entire AWS account. A publicly accessible Kubernetes API server gave an attacker full cluster control. Honestly, cloud kinda scares me as well. And to top it off, multi-cloud infrastructure makes everything worse. If you're running AWS, Azure, and GCP together, you've just tripled your attack surface management complexity. Each cloud provider has different security models, different configuration profiles, and different attack vectors. Every application now uses APIs, and all applications nowadays are like a constellation of APIs talking to each other. Every API you use in your organization is your attack surface. The problem with APIs is that they're often deployed without the same security scrutiny as traditional web applications. Developers spin up API endpoints for specific features and those endpoints accumulate over time. Some of them are shadow APIs, meaning API endpoints which aren't documented anywhere. These endpoints are the equivalent of forgotten subdomains, and attackers can find them through analyzing JavaScript files for API endpoint references, fuzzing common API path patterns, examining mobile app traffic to discover backend APIs, and mining old documentation or code repositories for deprecated endpoints. Your API attack surface includes REST APIs exposed to the internet, GraphQL endpoints with overly broad query capabilities, WebSocket connections for real-time functionality, gRPC services for inter-service communication, and legacy SOAP APIs that never got decommissioned. If your organization has mobile apps, be it iOS, Android, or both, this is a direct window to your infrastructure and should be part of your attack surface management strategy. Mobile apps communicate with backend APIs and those API endpoints are discoverable by reversing the app. The reversed source of the app could reveal hard-coded API keys, tokens, and credentials. Using JADX plus APKTool plus Dex2jar is all a motivated attacker needs. Web servers often expose directories and files that weren't meant to be publicly accessible. Attackers systematically enumerate these using automated tools like ffuf, dirbuster, gobuster, and wfuzz with massive wordlists to discover hidden endpoints, configuration files, backup files, and administrative interfaces. Common exposed directories include admin panels, backup directories containing database dumps or source code, configuration files with database credentials and API keys, development directories with debug information, documentation directories revealing internal systems, upload directories for file storage, and old or forgotten directories from previous deployments. Your attack surface must include directories which are accidentally left accessible during deployments, staging servers with production data, backup directories with old source code versions, administrative interfaces without authentication, API documentation exposing endpoint details, and test directories with debug output enabled. Even if you've removed a directory from production, old cached versions may still be accessible through web caches or CDNs. Search engines also index these directories, making them discoverable through dorking techniques. If your organization is using IoT devices, and everyone uses these days, this should be part of your attack surface management strategy. They're invisible to traditional security tools. Your EDR solution doesn't protect IoT devices. Your vulnerability scanner can't inventory them. Your patch management system can't update them. Your IoT attack surface could include smart building systems like HVAC, lighting, access control. Security cameras and surveillance systems. Printers and copiers, which are computers with network access. Badge readers and physical access systems. Industrial control systems and SCADA devices. Medical devices in healthcare environments. Employee wearables and fitness trackers. Voice assistants and smart speakers. The problem with IoT devices is that they're often deployed without any security consideration. They have default credentials that never get changed, unpatched firmware with known vulnerabilities, no encryption for data in transit, weak authentication mechanisms, and insecure network configurations. Social media presence is an attack surface component that most organizations completely ignore. Attackers can use social media for reconnaissance by looking at employee profiles on LinkedIn to reveal organizational structure, technologies in use, and current projects. Twitter/X accounts can leak information about deployments, outages, and technology stack. Employee GitHub profiles expose email patterns and development practices. Company blogs can announce new features before security review. It could also be a direct attack vector. Attackers can use information from social media to craft convincing phishing attacks. Hijacked social media accounts can be used to spread malware or phishing links. Employees can accidentally share sensitive information. Fake accounts can impersonate your brand to defraud customers. Your employees' social media presence is part of your attack surface whether you like it or not. Third-party vendors, suppliers, contractors, or partners with access to your systems should be part of your attack surface. Supply chain attacks are becoming more and more common these days. Attackers can compromise a vendor with weaker security and then use that vendor's access to reach your environment. From there, they pivot from the vendor network to your systems. This isn't a hypothetical scenario, it has happened multiple times in the past. You might have heard about the SolarWinds attack, where attackers compromised SolarWinds' build system and distributed malware through software updates to thousands of customers. Another famous case study is the MOVEit vulnerability in MOVEit Transfer software, exploited by the Cl0p ransomware group, which affected over 2,700 organizations. These are examples of some high-profile supply chain security attacks. Your third-party attack surface could include things like VPNs, remote desktop connections, privileged access systems, third-party services with API keys to your systems, login credentials shared with vendors, SaaS applications storing your data, and external IT support with administrative access. It's obvious you can't directly control third-party security. You can audit them, have them pen-test their assets as part of your vendor compliance plan, and include security requirements in contracts, but ultimately their security posture is outside your control. And attackers know this. GitHub, GitLab, Bitbucket, they all are a massive attack surface. Attackers search through code repositories in hopes of finding hard-coded credentials like API keys, database passwords, and tokens. Private keys, SSH keys, TLS certificates, and encryption keys. Internal architecture documentation revealing infrastructure details in code comments. Configuration files with database connection strings and internal URLs. Deprecated code with vulnerabilities that's still in production. Even private repositories aren't safe. Attackers can compromise developer accounts to access private repositories, former employees retain access after leaving, and overly broad repository permissions grant access to too many people. Automated scanners continuously monitor public repositories for secrets. The moment a developer accidentally pushes credentials to a public repository, automated systems detect it within minutes. Attackers have already extracted and weaponized those credentials before the developer realizes the mistake. CI/CD pipelines are massive another attack vector. Especially in recent times, and not many organizations are giving attention to this attack vector. This should totally be part of your attack surface management. Attackers compromise GitHub Actions workflows with malicious code injection, Jenkins servers with weak authentication, GitLab CI/CD variables containing secrets, and build artifacts with embedded malware. The GitHub Actions supply chain attack, CVE-2025-30066, demonstrated this perfectly. Attackers compromised the Action used in over 23,000 repositories, injecting malicious code that leaked secrets from build logs. Jenkins specifically is a goldmine for attackers. An exposed Jenkins instance provides complete control over multiple critical servers, access to hardcoded AWS keys, Redis credentials, and BitBucket tokens, ability to manipulate builds and inject malicious code, and exfiltration of production database credentials containing PII. Modern collaboration tools are massive attack surface components that most organizations underestimate. Slack has hidden security risks despite being invite-only. Slack attack surface could include indefinite data retention where every message, channel, and file is stored forever unless admins configure retention periods. Public channels accessible to all users so one breached account opens the floodgates. Third-party integrations with excessive permissions accessing messages and user data. Former contractor access where individuals retain access long after projects end. Phishing and impersonation where it's easy to change names and pictures to impersonate senior personnel. In 2022, Slack leaked hashed passwords for five years affecting 0.5% of users. Slack channels commonly contain API keys, authentication tokens, database credentials, customer PII, financial data, internal system passwords, and confidential project information. The average cost of a breached record was $164 in 2022. When 1 in 166 messages in Slack contains confidential information, every new message adds another dollar to total risk exposure. With 5,000 employees sending 30 million Slack messages per year, that's substantial exposure. Trello board exposure is a significant attack surface. Trello attack vectors include public boards with sensitive information accidentally shared publicly, default public visibility where boards are created as public by default in some configurations, unsecured REST API allowing unauthenticated access to user data, and scraping attacks where attackers use email lists to enumerate Trello accounts. The 2024 Trello data breach exposed 15 million users' personal information when a threat actor named "emo" exploited an unsecured REST API using 500 million email addresses to compile detailed user profiles. Security researcher David Shear documented hundreds of public Trello boards exposing passwords, credentials, IT support customer access details, website admin logins, and client server management credentials. IT companies were using Trello to troubleshoot client requests and manage infrastructure, storing all credentials on public Trello boards. Jira misconfiguration is a widespread attack surface issue. Common misconfigurations include public dashboards and filters with "Everyone" access actually meaning public internet access, anonymous access enabled allowing unauthenticated users to browse, user picker functionality providing complete lists of usernames and email addresses, and project visibility allowing sensitive projects to be accessible without authentication. Confluence misconfiguration exposes internal documentation. Confluence attack surface components include anonymous access at site level allowing public access, public spaces where space admins grant anonymous permissions, inherited permissions where all content within a space inherits space-level access, and user profile visibility allowing anonymous users to view profiles of logged-in users. When anonymous access is enabled globally and space admins allow anonymous users to access their spaces, anyone on the internet can access that content. Confluence spaces often contain internal documentation with hardcoded credentials, financial information, project details, employee information, and API documentation with authentication details. Cloud storage misconfiguration is epidemic. Google Drive misconfiguration attack surface includes "Anyone with the link" sharing making files accessible without authentication, overly permissive sharing defaults making it easy to accidentally share publicly, inherited folder permissions exposing everything beneath, unmanaged third-party apps with excessive read/write/delete permissions, inactive user accounts where former employees retain access, and external ownership blind spots where externally-owned content is shared into the environment. Metomic's 2023 Google Scanner Report found that of 6.5 million Google Drive files analyzed, 40.2% contained sensitive information, 34.2% were shared externally, and 0.5% were publicly accessible, mostly unintentionally. In December 2023, Japanese game developer Ateam suffered a catastrophic Google Drive misconfiguration that exposed personal data of nearly 1 million people for over six years due to "Anyone with the link" settings. Based on Valence research, 22% of external data shares utilize open links, and 94% of these open link shares are inactive, forgotten files with public URLs floating around the internet. Dropbox, OneDrive, and Box share similar attack surface components including misconfigured sharing permissions, weak or missing password protection, overly broad access grants, third-party app integrations with excessive permissions, and lack of visibility into external sharing. Features that make file sharing convenient create data leakage risks when misconfigured. Pastebin and similar paste sites are both reconnaissance sources and attack vectors. Paste site attack surface includes public data dumps of stolen credentials, API keys, and database dumps posted publicly, malware hosting of obfuscated payloads, C2 communications where malware uses Pastebin for command and control, credential leakage from developers accidentally posting secrets, and bypassing security filters since Pastebin is legitimate so security tools don't block it. For organizations, leaked API keys or database credentials on Pastebin lead to unauthorized access, data exfiltration, and service disruption. Attackers continuously scan Pastebin for mentions of target organizations using automated tools. Security teams must actively monitor Pastebin and similar paste sites for company name mentions, email domain references, and specific keywords related to the organization. Because paste sites don't require registration or authentication and content is rarely removed, they've become permanent archives of leaked secrets. Container registries expose significant attack surface. Container registry attack surface includes secrets embedded in image layers where 30,000 unique secrets were found in 19,000 images, with 10% of scanned Docker images containing secrets, and 1,200 secrets, 4%, being active and valid. Immutable cached layers contain 85% of embedded secrets that can't be removed, exposed registries with 117 Docker registries accessible without authentication, unsecured registries allowing pull, push, and delete operations, and source code exposure where full application code is accessible by pulling images. GitGuardian's analysis of 200,000 publicly available Docker images revealed a staggering secret exposure problem. Even more alarming, 99% of images containing active secrets were pulled in 2024, demonstrating real-world exploitation. Unit 42's research identified 941 Docker registries exposed to the internet, with 117 accessible without authentication containing 2,956 repositories, 15,887 tags, and full source code and historical versions. Out of 117 unsecured registries, 80 allow pull operations to download images, 92 allow push operations to upload malicious images, and 7 allow delete operations for ransomware potential. Sysdig's analysis of over 250,000 Linux images on Docker Hub found 1,652 malicious images including cryptominers, most common, embedded secrets, second most prevalent, SSH keys and public keys for backdoor implants, API keys and authentication tokens, and database credentials. The secrets found in container images included AWS access keys, database passwords, SSH private keys, API tokens for cloud services, GitHub personal access tokens, and TLS certificates. Shadow IT includes unapproved SaaS applications like Dropbox, Google Drive, and personal cloud storage used for work. Personal devices like BYOD laptops, tablets, and smartphones accessing corporate data. Rogue cloud deployments where developers spin up AWS instances without approval. Unauthorized messaging apps like WhatsApp, Telegram, and Signal used for business communication. Unapproved IoT devices like smart speakers, wireless cameras, and fitness trackers on the corporate network. Gartner estimates that shadow IT makes up 30-40% of IT spending in large companies, and 76% of organizations surveyed experienced cyberattacks due to exploitation of unknown, unmanaged, or poorly managed assets. Shadow IT expands your attack surface because it's not protected by your security controls, it's not monitored by your security team, it's not included in your vulnerability scans, it's not patched by your IT department, and it often has weak or default credentials. And you can't secure what you don't know exists. Bring Your Own Device, BYOD, policies sound great for employee flexibility and cost savings. For security teams, they're a nightmare. BYOD expands your attack surface by introducing unmanaged endpoints like personal devices without EDR, antivirus, or encryption. Mixing personal and business use where work data is stored alongside personal apps with unknown security. Connecting from untrusted networks like public Wi-Fi and home networks with compromised routers. Installing unapproved applications with malware or excessive permissions. Lacking consistent security updates with devices running outdated operating systems. Common BYOD security issues include data leakage through personal cloud backup services, malware infections from personal app downloads, lost or stolen devices containing corporate data, family members using devices that access work systems, and lack of IT visibility and control. The 60% of small and mid-sized businesses that close within six months of a major cyberattack often have BYOD-related security gaps as contributing factors. Remote access infrastructure like VPNs and Remote Desktop Protocol, RDP, are among the most exploited attack vectors. SSL VPN appliances from vendors like Fortinet, SonicWall, Check Point, and Palo Alto are under constant attack. VPN attack vectors include authentication bypass vulnerabilities with CVEs allowing attackers to hijack active sessions, credential stuffing through brute-forcing VPN logins with leaked credentials, exploitation of unpatched vulnerabilities with critical CVEs in VPN appliances, and configuration weaknesses like default credentials, weak passwords, and lack of MFA. Real-world attacks demonstrate the risk. Check Point SSL VPN CVE-2024-24919 allowed authentication bypass for session hijacking. Fortinet SSL-VPN vulnerabilities were leveraged for lateral movement and privilege escalation. SonicWall CVE-2024-53704 allowed remote authentication bypass for SSL VPN. Once inside via VPN, attackers conduct network reconnaissance, lateral movement, and privilege escalation. RDP is worse. Sophos found that cybercriminals abused RDP in 90% of attacks they investigated. External remote services like RDP were the initial access vector in 65% of incident response cases. RDP attack vectors include exposed RDP ports with port 3389 open to the internet, weak authentication with simple passwords vulnerable to brute force, lack of MFA with no second factor for authentication, and credential reuse from compromised passwords in data breaches. In one Darktrace case, attackers compromised an organization four times in six months, each time through exposed RDP ports. The attack chain went successful RDP login, internal reconnaissance via WMI, lateral movement via PsExec, and objective achievement. The Palo Alto Unit 42 Incident Response report found RDP was the initial attack vector in 50% of ransomware deployment cases. Email infrastructure remains a primary attack vector. Your email attack surface includes mail servers like Exchange, Office 365, and Gmail with configuration weaknesses, email authentication with misconfigured SPF, DKIM, and DMARC records, phishing-susceptible users targeted through social engineering, email attachments and links as malware delivery mechanisms, and compromised accounts through credential stuffing or password reuse. Email authentication misconfiguration is particularly insidious. If your SPF, DKIM, and DMARC records are wrong or missing, attackers can spoof emails from your domain, your legitimate emails get marked as spam, and phishing emails impersonating your organization succeed. Email servers themselves are also targets. The NSA released guidance on Microsoft Exchange Server security specifically because Exchange servers are so frequently compromised. Container orchestration platforms like Kubernetes introduce massive attack surface complexity. The Kubernetes attack surface includes the Kubernetes API server with exposed or misconfigured API endpoints, container images with vulnerabilities in base images or application layers, container registries like Docker Hub, ECR, and GCR with weak access controls, pod security policies with overly permissive container configurations, network policies with insufficient micro-segmentation between pods, secrets management with hardcoded secrets or weak secret storage, and RBAC misconfigurations with overly broad service account permissions. Container security issues include containers running as root with excessive privileges, exposed Docker daemon sockets allowing container escape, vulnerable dependencies in container images, and lack of runtime security monitoring. The Docker daemon attack surface is particularly concerning. Running containers with privileged access or allowing docker.sock access can enable container escape and host compromise. Serverless computing like AWS Lambda, Azure Functions, and Google Cloud Functions promised to eliminate infrastructure management. Instead, it just created new attack surfaces. Serverless attack surface components include function code vulnerabilities like injection flaws and insecure dependencies, IAM misconfigurations with overly permissive Lambda execution roles, environment variables storing secrets as plain text, function URLs with publicly accessible endpoints without authentication, and event source mappings with untrusted input from various cloud services. The overabundance of event sources expands the attack surface. Lambda functions can be triggered by S3 events, API Gateway requests, DynamoDB streams, SNS topics, EventBridge schedules, IoT events, and dozens more. Each event source is a potential injection point. If function input validation is insufficient, attackers can manipulate event data to exploit the function. Real-world Lambda attacks include credential theft by exfiltrating IAM credentials from environment variables, lateral movement using over-permissioned roles to access other AWS resources, and data exfiltration by invoking functions to query and extract database contents. The Scarlet Eel adversary specifically targeted AWS Lambda for credential theft and lateral movement. Microservices architecture multiplies attack surface by decomposing monolithic applications into dozens or hundreds of independent services. Each microservice has its own attack surface including authentication mechanisms where each service needs to verify requests, authorization rules where each service enforces access controls, API endpoints for service-to-service communication channels, data stores where each service may have its own database, and network interfaces where each service exposes network ports. Microservices security challenges include east-west traffic vulnerabilities with service-to-service communication without encryption or authentication, authentication and authorization complexity from managing auth across 40 plus services multiplied by 3 environments equaling 240 configurations, service-to-service trust where services blindly trust internal traffic, network segmentation failures with flat networks allowing unrestricted pod-to-pod communication, and inconsistent security policies with different services having different security standards. One compromised microservice can enable lateral movement across the entire application. Without proper network segmentation and zero trust architecture, attackers pivot from service to service. How do you measure something this large, right. Attack surface measurement is complex. Attack surface metrics include the total number of assets with all discovered systems, applications, and devices, newly discovered assets found through continuous discovery, the number of exposed assets accessible from the internet, open ports and services with network services listening for connections, vulnerabilities by severity including critical, high, medium, and low CVEs, mean time to detect, MTTD, measuring how quickly new assets are discovered, mean time to remediate, MTTR, measuring how quickly vulnerabilities are fixed, shadow IT assets that are unknown or unmanaged, third-party exposure from vendor and partner access points, and attack surface change rate showing how rapidly the attack surface evolves. Academic research has produced formal attack surface measurement methods. Pratyusa Manadhata's foundational work defines attack surface as a three-tuple, System Attackability, Channel Attackability, Data Attackability. But in practice, most organizations struggle with basic attack surface visibility, let alone quantitative measurement. Your attack surface isn't static. It changes constantly. Changes happen because developers deploy new services and APIs, cloud auto-scaling spins up new instances, shadow IT appears as employees adopt unapproved tools, acquisitions bring new infrastructure into your environment, IoT devices get plugged into your network, and subdomains get created for new projects. Static, point-in-time assessments are obsolete. You need continuous asset discovery and monitoring. Continuous discovery methods include automated network scanning for regular scans to detect new devices, cloud API polling to query cloud provider APIs for resource changes, DNS monitoring to track new subdomains via Certificate Transparency logs, passive traffic analysis to observe network traffic and identify assets, integration with CMDB or ITSM to sync with configuration management databases, and cloud inventory automation using Infrastructure as Code to track deployments. Understanding your attack surface is step one. Reducing it is the goal. Attack surface reduction begins with asset elimination by removing unnecessary assets entirely. This includes decommissioning unused servers and applications, deleting abandoned subdomains and DNS records, shutting down forgotten development environments, disabling unused network services and ports, and removing unused user accounts and service identities. Access control hardening implements least privilege everywhere by enforcing multi-factor authentication, MFA, for all remote access, using role-based access control, RBAC, for cloud resources, implementing zero trust network architecture, restricting network access with micro-segmentation, and applying the principle of least privilege to IAM roles. Exposure minimization reduces what's visible to attackers by moving services behind VPNs or bastion hosts, using private IP ranges for internal services, implementing network address translation, NAT, for outbound access, restricting API endpoints to authorized sources only, and disabling unnecessary features and functionalities. Security hardening strengthens what remains by applying security patches promptly, using security configuration baselines, enabling encryption for data in transit and at rest, implementing Web Application Firewalls, WAF, for web apps, and deploying endpoint detection and response, EDR, on all devices. Monitoring and detection watch for attacks in progress by implementing real-time threat detection, enabling comprehensive logging and SIEM integration, deploying intrusion detection and prevention systems, IDS/IPS, monitoring for anomalous behavior patterns, and using threat intelligence feeds to identify known bad actors. Your attack surface is exponentially larger than you think it is. Every asset you know about probably has three you don't. Every known vulnerability probably has ten undiscovered ones. Every third-party integration probably grants more access than you realize. Every collaboration tool is leaking more data than you imagine. Every paste site contains more of your secrets than you want to admit. And attackers know this. They're not just looking at what you think you've secured. They're systematically enumerating every possible entry point. They're mining Certificate Transparency logs for forgotten subdomains. They're scanning every IP in your address space. They're reverse-engineering your mobile apps. They're buying employee credentials from data breach databases. They're compromising your vendors to reach you. They're scraping Pastebin for your leaked secrets. They're pulling your public Docker images and extracting the embedded credentials. They're accessing your misconfigured S3 buckets and exfiltrating terabytes of data. They're exploiting your exposed Jenkins instances to compromise your entire infrastructure. They're manipulating your AI agents to exfiltrate private Notion data. The asymmetry is brutal. You have to defend every single attack vector. They only need to find one that works. So what do you do. Start by accepting that you don't have complete visibility. Nobody does. But you can work toward better visibility through continuous discovery, automated asset management, and integration of security tools that help map your actual attack surface. Implement attack surface reduction aggressively. Every asset you eliminate is one less thing to defend. Every service you shut down is one less potential vulnerability. Every piece of shadow IT you discover and bring under management is one less blind spot. Every misconfigured cloud storage bucket you fix is terabytes of data no longer exposed. Every leaked secret you rotate is one less credential floating around the internet. Adopt zero trust architecture. Stop assuming that anything, internal services, microservices, authenticated users, collaboration tools, is inherently trustworthy. Verify everything. Monitor paste sites and code repositories. Your secrets are out there. Find them before attackers weaponize them. Secure your collaboration tools. Slack, Trello, Jira, Confluence, Notion, Google Drive, and Airtable are all leaking data. Lock them down. Fix your container security. Scan images for secrets. Use secret managers instead of environment variables. Secure your registries. Harden your CI/CD pipelines. Jenkins, GitHub Actions, and GitLab CI are high-value targets. Protect them. And test your assumptions with red team exercises and continuous security testing. Your attack surface is what an attacker can reach, not what you think you've secured. The attack surface problem isn't getting better. Cloud adoption, DevOps practices, remote work, IoT proliferation, supply chain complexity, collaboration tool sprawl, and container adoption are all expanding organizational attack surfaces faster than security teams can keep up. But understanding the problem is the first step toward managing it. And now you understand exactly how catastrophically large your attack surface actually is.

0 views

Premium: OpenAI Burned $4.1 Billion More Than We Knew - Where Is Its Money Going?

Soundtrack: Queens of the Stone Age - Song For The Dead Editor's Note: The original piece had a mathematical error around burnrate, it's been fixed. Also, welcome to another premium issue! Please do subscribe, this is a massive, 7000-or-so word piece, and that's the kind of depth you get every single week for your subscription. A few days ago, Sam Altman said that OpenAI’s revenues were “well more” than $13bn in 2025 , a statement I question based on the fact, based on other outlets’ reporting , OpenAI only made $4.3bn through the first half of 2025, and likely around a billion a month, which I estimate means the company made around $8bn by the end of September. This is an estimate. If I receive information to the contrary, I’ll report it. Nevertheless, OpenAI is also burning a lot of money. In recent public disclosures ( as reported by The Register ), Microsoft noted that it had funding commitments to OpenAI of $13bn, of which $11.6bn had been funded by September 30 2025.  These disclosures also revealed that OpenAI lost $12bn in the last quarter — Microsoft’s Fiscal Year Q1 2026, representing July through September 2025. To be clear, this is actual, real accounting, rather than the figures leaked to reporters. It’s not that leaks are necessarily a problem — it’s just that anything appearing on any kind of SEC filing generally has to pass a very, very high bar. There is absolutely nothing about these numbers that suggests that OpenAI is “profitable on inference” as Sam Altman told a group of reporters at a dinner in the middle of August . Let me get specific.  The Information reported that through the first half of 2025, OpenAI spent $6.7bn on research and development, “which likely include[s] servers to develop new artificial intelligence.” The common refrain here is that OpenAI “is spending so much on training that it’s eating the rest of its margins,” but if that were the case here, it would mean that OpenAI spent the equivalent of six months’ training in the space of three. I think the more likely answer is that OpenAI is spending massive amounts of money on staff, sales and marketing ($2bn alone in the first half of the year), real estate, lobbying , data, and, of course, inference.  According to The Information , OpenAI had $9.6bn in cash at the end of June 2025. Assuming that OpenAI lost $12bn at the end of calendar year Q3 2025, and made — I’m being generous — around $3.3bn (or $1.1bn a month) within that quarter, this would suggest OpenAI’s operations cost them over $15bn in the space of three months. Where, exactly, is this money going? And how do the numbers published actually make sense when you reconcile them with Microsoft’s disclosures?  In the space of three months, OpenAI’s costs — if we are to believe what was leaked to The Information (and, to be clear, I respect their reporting) — went from a net loss of $13.5bn in six months to, I assume, a net loss of $ 12bn in three months.   Though there are likely losses related to stock-based compensation, this only represented a cost of $2.5bn in the first half of 2025. The Information also reported that OpenAI “spent more than $2.5 billion on its cost of revenue,” suggesting inference costs of…around that?  I don’t know. I really don’t know. But something isn't right, and today I'm going to dig into it. In this newsletter I'm going to reveal how OpenAI's reported revenues and costs don't line up - and that there's $4.1 billion of cash burn that has yet to be reported elsewhere.

0 views

Converting hot dog plasma video to sound with OpenCV

When you ground a hot dog to an AM radio tower, it generates plasma. While the hot dog's flesh is getting vaporized, a tiny plasma arc moves the air around it back and forth. And because this tower is an AM tower, it uses Amplitude Modulation , where a transmitter changes the amplitude of a carrier wave up and down. Just like a speaker cone moving up and down, the plasma arc from the hot dog turns that modulation into audible sound.

0 views

Robb Knight

This week on the People and Blogs series we have an interview with Robb Knight, whose blog can be found at rknight.me . Tired of RSS? Read this in your browser or sign up for the newsletter . The People and Blogs series is supported by Hans and the other 124 members of my "One a Month" club. If you enjoy P&B, consider becoming one for as little as 1 dollar a month. I'm a developer and dad to two girls living in Portsmouth on the south coast of the UK. By day I work for a SaaS company and in my own time I work on my many side projects . In a previous life I worked at a certain clown's restaurant which is where I met my wife some 15 years ago. Although developer is what I get paid to do I'm trying to move towards more making ; websites, stickers , shirts, art, whatever. I have no idea what that looks like yet or how it's going to pay my bills. I have a whole host of side projects I've worked on over the years; they're not all winners but they all serve, or served, a purpose. If I get lucky, they resonate with other people which is always nice. I've had a lot of blogs over the years, most of which would get a handful of posts before being abandoned. There was a version that ran on Tumblr which I did do for at least a year or two — any interesting posts from that have been saved. The current iteration is by far the longest serving and will be the final version. There's no chance of me wiping it all and starting again. This current version is part of my main website which is where I put everything . My toots on Mastodon start life as a note post , I post interesting links I find , and I log all the media I watch/play/whatever (I don't want to say consume, that's gross) in Almanac , which itself is on the third or fourth iteration. As I said above, I had done a few posts on the Tumblr-powered blog but if I look at my stats for posts, it was around 2022 when Twitter started to fall apart that I started to blog more. I was moving away from posting things directly onto social media sites and getting it onto my own site. I started writing more posts that just had a short idea or helpful tip because I realised not every post has to be some incredible think piece. My analytics show that these posts also tend to be the most popular which probably says more about the state of large, ad-riddled websites than it does about my writing. For example this post about disconnecting Facebook from Spotify is consistently in the top five posts on my site but you're never going to read that post unless you specifically need it. It's not a "good" post, it just exists. To call what I have a process would be a very liberal use of the word "process". If I have nothing to write about I just won't write anything, I have no desire to keep to a schedule and write just for the sake of it. Usually, I'll get prompted by something someone asks like "How did you do X on your website?" or I feel like I have something to say that would be interesting other people. I write my posts in Obsidian, then when they're ready to go I'll add them to my site. If I'm on my proper computer laptop I use my CLI tool to add a new post. If I'm on mobile, I use the very haphazard CMS I built. I'll proof read most things myself before posting and I rarely ask for anyone else's input but if I do want a second opinion it's going to be previous P&B interviewee , Keenan . Usually I'm able to get out what I want to say fairly succinctly without too much editing. A proper keyboard and ideally a desk to sit at is what I prefer when I'm writing (or coding) but I can live with just the keyboard. My desk setup makes some people's skin crawl because there's so much going on but I like having all the trinkets and knick knacks around me. I deeply dislike using my phone for most things outside of scrolling lists, like social media so I rarely write long posts on it. The small form factor just doesn't work for me at all but I also kind of need it to exist in the world. All my domains are registered with Porkbun and I manage the DNS with DNSControl - my main domain, rknight.me, has nearly 50 records for subdomains so managing those without DNSControl would not be a fun activity. Speaking of DNS I use Bunny for my DNS management and also use their CDN for images and other files I need to host. The website itself is, as are many of my side projects, built with Eleventy . Eleventy gives me the flexibility to do some interesting things with the posts and other content on my site which would be much harder with some other systems. The site gets built on Forge to a Hetzner server whenever I push an update to GitHub either via command line, or through the aforementioned CMS, and is also triggered at various points in the day to pull in my Mastodon posts. Assuming I actually had to the time to do it, I think I would start with the CMS first, before building anything of the actual site. It is a pain to update things when I'm not at my laptop but jamming features into my CMS is equally frustrating. If I wanted something off the shelf and easier to maintain I suspect I would choose Ghost or Pika . Many of these costs are part of my freelancing so are bundled with other sites I run and somewhat hidden but I'll do my best to outline what I do use. I have a single server on Hetzner that serves my main site as well as another 30 or so side projects so the cost is negligible per-site but it costs about $5 a month. Forge costs $12 a month to deploy my site along with other sites. The domain is $20 a year I think but that's it. I have a One a Month Club here and I have a handful of people supporting that way. I also use affiliate links for services I use and like which occasionally pays me a little bit. I think monetising blogs is fine, if it's done in a tasteful way. Dumping Google ads all over your site is terrible for everyone but hand-picked sponsors or referrals is a good way to find new services. Just keep it classy. I want to read sites that are about the person writing them. Photos of things people have done, blog posts about notebooks, wallpaper, food, everything. Things people enjoy. This is the second time I'm going to mention Keenan here because they write so wonderfully. They also have a podcast with Halsted called Friendship Material which is all kinds of lovely and joyful and everyone should listen. Alex writes some really interesting computing-related posts, like this one about using static websites as tiny archives . Annie is so smart and honest in her writing it brings me joy every time I see a new post from her. This post is a masterpiece . I'd be a terrible business boy if I didn't at least mention EchoFeed , an RSS cross posting service I run. I also have a podcast that used to be about tech but is now about snacks. Now that you're done reading the interview, go check the blog and subscribe to the RSS feed . If you're looking for more content, go read one of the previous 114 interviews . Make sure to also say thank you to James Reeves and the other 124 supporters for making this series possible.

0 views
iDiallo Yesterday

The NEO Robot

You've probably seen the NEO home robot by now, from the company 1X. It's a friendly humanoid with a plush-toy face that can work around your house. Cleaning, making beds, folding laundry, even picking up after meals. Most importantly, there's the way it looks. Unlike Tesla's "Optimus," which resembles an industrial robot, NEO looks friendly. It has a cute, plush face with round eyes. Something you could let your children play with. But after watching their launch video, I only had one thing on my mind: battery life. And that's how you know I was tricked. Battery life is four hours after a full charge according to the company, but that's the wrong thing to focus on. Remember when Tesla first announced Optimus? Elon Musk made sure to emphasize one statement, they purposely capped the robot's speed to 5 miles per hour. Then he joked that "you can just outrun it and most likely overpower it." This steered the conversation toward safety in AI and robots. a masterful bit of misdirection from the fact that there was no robot whatsoever at the time. Not even a prototype. Just a person in a suit doing a silly dance. With NEO, we saw a lot more. The robot loaded laundry into the machine, tidied up the home, did the dishes. Real demonstrations with real hardware. But what they failed to emphasize was just as important. All actions in the video were entirely remote controlled. Here are the assumptions I was making while watching their video. Once you turn on this robot, it would first need to understand your home. Since it operates as a housekeeper, it would map your space using the dual cameras on its head, saving this information to some internal drive. It would need to recognize you both visually and through your voice. You'd register your face and voice like Face ID. They stated it can charge itself, so the dexterity of its hands must be precise enough to plug itself in autonomously. All reasonable assumptions for a $20,000 "AI home robot," right? But these are just assumptions. Then the founder mentions you can "teach it new tasks," overseen by one of their experts that you can book at specific times. Since we're not seeing the robot do anything autonomously, I'm left wondering. What does "teaching the robot a skill" even mean? The NEO is indeed a humanoid robot. But it's not an autonomous AI robot. It's a teleoperated robot that lives in your home. A remote operator from 1X views through its cameras and controls its movements when it needs to perform a tasks. If that's what they're building, it should be crystal clear. People need to understand what they're buying and the implications that come with it. You're allowing someone from a company to work in your home remotely, using a humanoid robot as their avatar, seeing everything the robot sees. Looking at the videos published by outlets like the Wall Street Journal , even the teleoperated functionality appears limited. MKBHD also offers an excellent analysis that's worth watching. 1X positions this teleoperation as a training mechanism. The "Expert Mode" that generates data to eventually make the robot autonomous. It's a reasonable approach, similar to how Tesla gathered data for Full Self-Driving. But the difference is your car camera feeds helped train a system; NEO's cameras invite a stranger into your most private spaces. The company says it has implemented privacy controls, scheduled sessions, no-go zones, visual indicators when someone's watching, face-blurring technology, etc. These are necessary safeguards, but they don't change the fundamental problem. This is not an autonomous robot. Also, you are acting as a data provider for the company while paying $20,000 for the hardware. 2026 is just around the corner. I expect the autonomous capabilities to be quietly de-emphasized in marketing as we approach the release date. I also expect delays attributed to "high demand" and "ensuring safety standards." I don't expect this robot to deliver in 2026. If it does, it will be a teleoperated humanoid. With my privacy concerns, I will probably not be an early or late adopter. But I'll happily seat on the sidelines and watch the chaos unfold. A teleoperated humanoid sounds like the next logical step for an Uber or DoorDash. The company should just be clear about what they are building.

0 views
Evan Schwartz Yesterday

Scour - October Update

Hi friends, In October, Scour ingested 1,042,894 new posts from 14,140 sources . I was also training for the NYC Marathon (which is why this email comes a few days into November)! Last month was all about Interests: Your weekly email digest now includes a couple of topic recommendations at the end. And, if you use an RSS reader to consume your Scour feed, you’ll also find interest recommendations in that feed as well. When you add a new interest on the Interests page, you’ll now see a menu of similar topics that you can click to quickly add. You can browse the new Popular Interests page to find other topics you might want to add. Infinite scrolling is now optional. You can disable it and switch back to explicit pages on your Settings page. Thanks Tomáš Burkert for this suggestion! Earlier, Scour’s topic recommendations were a little too broad. I tried to fix that and now, as you might have noticed, they’re often too specific. I’m still working on solving this “Goldilocks problem”, so more on this to come! Finally, here were a couple of my favorite posts that I found on Scour in October: Happy Scouring! - Evan Introducing RTEB: A New Standard for Retrieval Evaluation Everything About Transformers Turn off Cursor, turn on your mind

1 views

The Trust Triangle

A theme I find myself coming back to over and over again is the three-way relationship between Autonomy , Accountability , and Alignment and how those interact to produce high-performing teams. In case I need to define the terms: These three aspects form a Triangle of success, and the thing that provides it structural integrity; its load bearing element; is: trust . Before getting into each leg of the triangle, it's worth looking into what happens when one or more sides weaken. When teams don't have healthy levels of all three aspects of this Triangle, they stop thinking for themselves and wait to be told what to do because that's the safest course of action. This presents as rigidity and unresponsiveness. They become unwilling or unable to adapt or compromise because there is too much inherent risk. They will seek permission before taking any steps and will resist beneficial changes that have any aspect of uncertainty in them for fear of being punished if things don't work out. If people don't believe they'll be supported, even in failure, they'll stop trying. They'll outsource the risk to the higher-ups by letting them make all the decisions and hand them out in the form of dictums. This is a mode that doesn't scale up well and one that is all but guaranteed to result in a slower team producing suboptimal results. Once a team is in this state, it's hard to get them out. This is learned behaviour that came from many interactions over time. The way to turn it around is to reverse the process. Give the team some agency over something that should be in their control, celebrate wins, learn from failures, and repeat this as many times as you can while trying to increase the impact potential of each iteration. When you have good outcomes, share them with other leaders in the org. Removing nitpicky oversight and second-guessing reduces escalations and creates focus and efficiency. An individual or team empowered to make decisions that further their goals without having to constantly convince the bosses that they're making the right decisions is going to be faster than one who is constantly being second-guessed or overruled. Additionally, people will work harder on a solution of their own devising than one that was imposed upon them that they don't necessarily agree with or believe in, so you typically will get better results as well as faster results if you give people freedom to run. To put it another way, if the job is cleaning the dishes, I don't care if you use a sponge, a brush, or a cloth as long as the dishes are clean. Use whatever works. In software terms, I've worked with people who like a fully-tricked-out IDE with all kinds of autocomplete and magic refactoring tools (and now AI code generation) and people who use minimal Vim setups. This is something where I would never dictate a choice, even though I might have a strong opinion about what I would use. Whatever gets the job done! When trust is low, people stop using the autonomy they have for the good of the project and instead use it to make sure they're not the ones who will get the blame if things go wrong. In low-trust, highly regimented environments people will use their agency and initiative not for the good of the project, but to manipulate the system in their favour. When trust is high, people don't have to dedicate brain cycles to staying out of trouble or appeasing the bosses and can devote their energies to the team's goals instead. Your job is to give them the room to innovate on the work the business expects from them, not to innovate on ways to work around you. I used to dislike the term 'alignment', thinking it was an unnecessary business-speak substitute for 'agreement'. Now I think there's a subtle but important difference that becomes clear when you realize that alignment is what supports and enables autonomy. It really is about direction; everyone pointing their efforts at a common target. It's the shared understanding of why you're doing what you're doing. Too little of it and you get entropy. People can be working hard and doing great work but if it's not directed it quickly becomes chaotic. It's broader and less specific than simple agreement and takes more effort to create and sustain. Alignment is more of a process than an event . You have to treat it as a living conversation and make tweaks and corrections as you go. At the same time, focusing on it too much as a manager can make it indistinguishable from 'control'. I like to think of myself as a participant in the alignment process first and foremost. Yes, you do have a responsibility to create and maintain that alignment, but don't force it. When done right there should be push and pull from all participants with the general feeling that everyone is seeking both to be understood and to understand. Alignment is what turns autonomy into progress and ensures it aimed at the right target. Without accountability, things can drift. The 'mass' of accountability provides stability to the team and keeps them focused on the results. If they know they will have to stand up in front of their stakeholders and peers and report out the results of their efforts, they're going to do their best to achieve those results in a way they can be proud of. Of the three aspects of the Triangle, this one is the hardest for people who tend to default to low-trust to get right. It does not mean that "successes are rewarded and failures are punished". Good, healthy accountability is self-imposed. People want to uphold the standards, they want to achieve the objectives, and when they miss the mark they are forthcoming about that fact and take steps to learn from their mistakes. They are not sent to the Gulag or ordered to " commit seppuku by sunset tomorrow " but neither should they simply shrug their shoulders and move on after something goes wrong. If one of your SaaS vendors has a production incident that impacts you, think about the kind of accountability you'd want to see in from them in a post-incident report. A good one probably has: What you would probably not want to see is something like "Ricky the intern pushed the wrong button so we fired him. Problem solved." That's blame, not accountability and it would harm rather than increase my trust of that vendor. Even a less extreme example that feels evasive or tries to deflect responsibility onto the vendor's vendors or something can erode trust. It should be the same for teams. Nothing goes right 100% of the time and no strictures or processes you put in place can guarantee good outcomes. With that in mind it becomes super important to have a clear understanding of how you'll behave when things miss the mark. Admittedly, this is tricky if you aren't wired to be trusting by default. Not everyone is and our human cognitive biases tend to steer us towards wanting to place blame. But, it's worth trying to build that muscle because the payoffs can be enormous. Plenty has been written on how to build a blameless culture and modern adaptations of the idea do take into account our natural tendencies and reframe the idea of blameless culture as 'blame-aware'. A few practical ideas for building your team's Triangle of Trust. I try to go into every new team situation with the following axioms: Occasionally I'm wrong about some aspect of that and I need to make adjustments, but as a starting point it's worked really well for me. When I do need to make adjustments I also try to work back to a state where those things are true again. If someone needs upskilling or they're maybe in the wrong role, make the necessary moves and revisit your assessment after a little while. Be careful about over-correcting so that you don't get into learned helplessness territory. If your team does a retrospective process, this is a good opportunity to work some of these assessments into your schedule and have the team participate. You don't have to keep this your secret rubric, you can be straight up with your team and tell them you're trying to build this Triangle and get them involved in helping. If you don't have a retrospective process, this is a good reason to introduce one! If you don't invest in building it in both directions, your team will become an inefficient sclerotic mass that requires constant input and energy from you to move. Projects run on plans, and teams run on trust. " Old railway bridges " by radkuch.13 is licensed under CC BY 2.0 . Like this? Please feel free to share it on your favourite social media or link site! Share it with friends! Hit subscribe to get new posts delivered to your inbox automatically. Feedback? Want help with your organization? Get in touch ! Autonomy: The team or individual has some agency over how they accomplish their goals. They are not micro-managed and are given some decision-making authority. Accountability: The team or individual takes responsibility for the outcomes. They celebrate their wins and learn from their mistakes when they miss the mark without pointing fingers or scapegoating their own team members or other people in the organization. Alignment: The team or individual understands the goals clearly and shares this understanding with their peers and stakeholders. A reasonably detailed description of what went wrong. What the contributing factors were. What the remediation steps were. What is being done to prevent it happening again. The people I'm working with are skilled adults. They are intrinsically motivated to do their best work. When we don't get the outcomes we want, look at the system first, individuals second. Are people getting aligned and staying aligned? Are they accepting the autonomy you're trying to give them or do you need to give it in smaller doses? Are they holding each other accountable in healthy ways or pointing fingers? And most importantly: Are we getting the outcomes we want?

0 views

Video + notes on upgrading a Datasette plugin for the latest 1.0 alpha, with help from uv and OpenAI Codex CLI

I'm upgrading various plugins for compatibility with the new Datasette 1.0a20 alpha release and I decided to record a video of the process. This post accompanies that video with detailed additional notes. I picked a very simple plugin to illustrate the upgrade process (possibly too simple). datasette-checkbox adds just one feature to Datasette: if you are viewing a table with boolean columns (detected as integer columns with names like or or ) and your current user has permission to update rows in that table it adds an inline checkbox UI that looks like this: I built the first version with the help of Claude back in August 2024 - details in this issue comment . Most of the implementation is JavaScript that makes calls to Datasette 1.0's JSON write API . The Python code just checks that the user has the necessary permissions before including the extra JavaScript. The first step in upgrading any plugin is to run its tests against the latest Datasette version. Thankfully makes it easy to run code in scratch virtual environments that include the different code versions you want to test against. I have a test utility called (for "test against development Datasette") which I use for that purpose. I can run it in any plugin directory like this: And it will run the existing plugin tests against whatever version of Datasette I have checked out in my directory. You can see the full implementation of (and its friend described below) in this TIL - the basic version looks like this: I started by running in the directory, and got my first failure... but it wasn't due to permissions, it was because the for the plugin was pinned to a specific mismatched version of Datasette: I fixed this problem by swapping to and ran the tests again... and they passed! Which was a problem because I was expecting permission-related failures. It turns out when I first wrote the plugin I was lazy with the tests - they weren't actually confirming that the table page loaded without errors. I needed to actually run the code myself to see the expected bug. First I created myself a demo database using sqlite-utils create-table : Then I ran it with Datasette against the plugin's code like so: Sure enough, visiting produced a 500 error about the missing method. The next step was to update the test to also trigger this error: And now fails as expected. It this point I could have manually fixed the plugin itself - which would likely have been faster given the small size of the fix - but instead I demonstrated a bash one-liner I've been using to apply these kinds of changes automatically: runs OpenAI Codex in non-interactive mode - it will loop until it has finished the prompt you give it. I tell it to consult the subset of the Datasette upgrade documentation that talks about Datasette permissions and then get the command to pass its tests. This is an example of what I call designing agentic loops - I gave Codex the tools it needed ( ) and a clear goal and let it get to work on my behalf. The remainder of the video covers finishing up the work - testing the fix manually, commiting my work using: Then shipping a 0.1a4 release to PyPI using the pattern described in this TIL . Finally, I demonstrated that the shipped plugin worked in a fresh environment using like this: Executing this command installs and runs a fresh Datasette instance with a fresh copy of the new alpha plugin ( ). It's a neat way of confirming that freshly released software works as expected. This video was shot in a single take using Descript , with no rehearsal and perilously little preparation in advance. I recorded through my AirPods and applied the "Studio Sound" filter to clean up the audio. I pasted in a closing slide from my previous video and exported it locally at 1080p, then uploaded it to YouTube. Something I learned from the Software Carpentry instructor training course is that making mistakes in front of an audience is actively helpful - it helps them see a realistic version of how software development works and they can learn from watching you recover. I see this as a great excuse for not editing out all of my mistakes! I'm trying to build new habits around video content that let me produce useful videos while minimizing the amount of time I spend on production. I plan to iterate more on the format as I get more comfortable with the process. I'm hoping I can find the right balance between production time and value to viewers. You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options .

0 views

Code research projects with async coding agents like Claude Code and Codex

I've been experimenting with a pattern for LLM usage recently that's working out really well: asynchronous code research tasks . Pick a research question, spin up an asynchronous coding agent and let it go and run some experiments and report back when it's done. Software development benefits enormously from something I call code research . The great thing about questions about code is that they can often be definitively answered by writing and executing code. I often see questions on forums which hint at a lack of understanding of this skill. "Could Redis work for powering the notifications feed for my app?" is a great example. The answer is always "it depends", but a better answer is that a good programmer already has everything they need to answer that question for themselves. Build a proof-of-concept, simulate the patterns you expect to see in production, then run experiments to see if it's going to work. I've been a keen practitioner of code research for a long time. Many of my most interesting projects started out as a few dozen lines of experimental code to prove to myself that something was possible. It turns out coding agents like Claude Code and Codex are a fantastic fit for this kind of work as well. Give them the right goal and a useful environment and they'll churn through a basic research project without any further supervision. LLMs hallucinate and make mistakes. This is far less important for code research tasks because the code itself doesn't lie: if they write code and execute it and it does the right things then they've demonstrated to both themselves and to you that something really does work. They can't prove something is impossible - just because the coding agent couldn't find a way to do something doesn't mean it can't be done - but they can often demonstrate that something is possible in just a few minutes of crunching. I've used interactive coding agents like Claude Code and Codex CLI for a bunch of these, but today I'm increasingly turning to their asynchronous coding agent family members instead. An asynchronous coding agent is a coding agent that operates on a fire-and-forget basis. You pose it a task, it churns away on a server somewhere and when it's done it files a pull request against your chosen GitHub repository. OpenAI's Codex Cloud , Anthropic's Claude Code for web , Google Gemini's Jules , and GitHub's Copilot coding agent are four prominent examples of this pattern. These are fantastic tools for code research projects. Come up with a clear goal, turn it into a few paragraphs of prompt, set them loose and check back ten minutes later to see what they've come up with. I'm firing off 2-3 code research projects a day right now. My own time commitment is minimal and they frequently come back with useful or interesting results. You can run a code research task against an existing GitHub repository, but I find it's much more liberating to have a separate, dedicated repository for your coding agents to run their projects in. This frees you from being limited to research against just code you've already written, and also means you can be much less cautious about what you let the agents do. I have two repositories that I use for this - one public, one private. I use the public one for research tasks that have no need to be private, and the private one for anything that I'm not yet ready to share with the world. The biggest benefit of a dedicated repository is that you don't need to be cautious about what the agents operating in that repository can do. Both Codex Cloud and Claude Code for web default to running agents in a locked-down environment, with strict restrictions on how they can access the network. This makes total sense if they are running against sensitive repositories - a prompt injection attack of the lethal trifecta variety could easily be used to steal sensitive code or environment variables. If you're running in a fresh, non-sensitive repository you don't need to worry about this at all! I've configured my research repositories for full network access, which means my coding agents can install any dependencies they need, fetch data from the web and generally do anything I'd be able to do on my own computer. Let's dive into some examples. My public research repository is at simonw/research on GitHub. It currently contains 13 folders, each of which is a separate research project. I only created it two weeks ago so I'm already averaging nearly one a day! It also includes a GitHub Workflow which uses GitHub Models to automatically update the README file with a summary of every new project, using Cog , LLM , llm-github-models and this snippet of Python . Here are a some example research projects from the repo. node-pyodide shows an example of a Node.js script that runs the Pyodide WebAssembly distribution of Python inside it - yet another of my ongoing attempts to find a great way of running Python in a WebAssembly sandbox on a server. python-markdown-comparison ( transcript ) provides a detailed performance benchmark of seven different Python Markdown libraries. I fired this one off because I stumbled across cmarkgfm , a Python binding around GitHub's Markdown implementation in C, and wanted to see how it compared to the other options. This one produced some charts! came out on top by a significant margin: Here's the entire prompt I used for that project: Create a performance benchmark and feature comparison report on PyPI cmarkgfm compared to other popular Python markdown libraries - check all of them out from github and read the source to get an idea for features, then design and run a benchmark including generating some charts, then create a report in a new python-markdown-comparison folder (do not create a _summary.md file or edit anywhere outside of that folder). Make sure the performance chart images are directly displayed in the README.md in the folder. Note that I didn't specify any Markdown libraries other than - Claude Code ran a search and found the other six by itself. cmarkgfm-in-pyodide is a lot more fun. A neat thing about having all of my research projects in the same repository is that new projects can build on previous ones. Here I decided to see how hard it would be to get - which has a C extension - working inside Pyodide inside Node.js. Claude successfully compiled a 88.4KB file with the necessary C extension and proved it could be loaded into Pyodide in WebAssembly inside of Node.js. I ran this one using Claude Code on my laptop after an initial attempt failed. The starting prompt was: Figure out how to get the cmarkgfm markdown lover [typo in prompt, this should have been "library" but it figured it out anyway] for Python working in pyodide. This will be hard because it uses C so you will need to compile it to pyodide compatible webassembly somehow. Write a report on your results plus code to a new cmarkgfm-in-pyodide directory. Test it using pytest to exercise a node.js test script that calls pyodide as seen in the existing node.js and pyodide directory There is an existing branch that was an initial attempt at this research, but which failed because it did not have Internet access. You do have Internet access. Use that existing branch to accelerate your work, but do not commit any code unless you are certain that you have successfully executed tests that prove that the pyodide module you created works correctly. This one gave up half way through, complaining that emscripten would take too long. I told it: Complete this project, actually run emscripten, I do not care how long it takes, update the report if it works It churned away for a bit longer and complained that the existing Python library used CFFI which isn't available in Pyodide. I asked it: Can you figure out how to rewrite cmarkgfm to not use FFI and to use a pyodide-friendly way of integrating that C code instead? ... and it did. You can see the full transcript here . blog-tags-scikit-learn . Taking a short break from WebAssembly, I thought it would be fun to put scikit-learn through its paces on a text classification task against my blog: Work in a new folder called blog-tags-scikit-learn Download - a SQLite database. Take a look at the blog_entry table and the associated tags - a lot of the earlier entries do not have tags associated with them, where the later entries do. Design, implement and execute models to suggests tags for those earlier entries based on textual analysis against later ones Use Python scikit learn and try several different strategies Produce JSON of the results for each one, plus scripts for running them and a detailed markdown description Also include an HTML page with a nice visualization of the results that works by loading those JSON files. This resulted in seven files, four results files and a detailed report . (It ignored the bit about an HTML page with a nice visualization for some reason.) Not bad for a few moments of idle curiosity typed into my phone! That's just three of the thirteen projects in the repository so far. The commit history for each one usually links to the prompt and sometimes the transcript if you want to see how they unfolded. More recently I added a short file to the repo with a few extra tips for my research agents. You can read that here . My preferred definition of AI slop is AI-generated content that is published without human review. I've not been reviewing these reports in great detail myself, and I wouldn't usually publish them online without some serious editing and verification. I want to share the pattern I'm using though, so I decided to keep them quarantined in this one public repository. A tiny feature request for GitHub: I'd love to be able to mark a repository as "exclude from search indexes" such that it gets labelled with tags. I still like to keep AI-generated content out of search, to avoid contributing more to the dead internet . It's pretty easy to get started trying out this coding agent research pattern. Create a free GitHub repository (public or private) and let some agents loose on it and see what happens. You can run agents locally but I find the asynchronous agents to be more convenient - especially as I can run them (or trigger them from my phone) without any fear of them damaging my own machine or leaking any of my private data. Claude Code for web offers a free $250 of credits for their $20/month users for a limited time (until November 18, 2025). Gemini Jules has a free tier . There are plenty of other coding agents you can try out as well. Let me know if your research agents come back with anything interesting! You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options . Code research Coding agents Asynchronous coding agents Give them a dedicated GitHub repository Let them rip with unlimited network access My simonw/research collection This is total slop, of course Try it yourself

0 views
James O'Claire 2 days ago

How creepy is the personalization in ChatGPT?

I’ve been pretty cavalier with using AI. I think once I got used to not fully trusting it’s truthfulness, and instead using it like a teacher that I question and verify. But this past month I’ve been getting more uncomfortable with the answers. Especially ones that I can see are digging up little nuggets of personal information I dropped in over the past year: This is something I’ve looked up half a dozen times. I’ve never used it, debated with friends multiple times it’s usefulness vs SSH. So when I put in the short prompt, I was more just wanting to revist the main talking points in the Tailscale vs SSH debate I’ve had in my head. After the main response, it provides this personalized summary and drops this little nugget of my personal life in, that I do work on my parent’s solar powered off-grid home where I visit a couple times a year. I can’t put my finger on why this bothered me so much. I’m proud of my parents house, I’ll tell anyone about it. I’ve certainly mentioned this to ChatGPT, I definitely used it last year when I built a new solar array for my parents. You can see the picture below building the new one with the older panels I built 12 years ago in the back. So why would it bother me so much? Was it the cognitive dissonance? I’m thinking about tailscale, and it is talking incorrectly about my parents who I miss? Is it that it dug up information about me from a year ago that I forgot, or never really thought about, that it would remember? I mean obviously, I’m on their website, they have my IP. But ChatGPT brings up my location like this fairly often, I think any time I mention a prompt about a product, which I do oftenish as I’ve been curious about how they’ll handle the advertising / product placements. That being said, something about the way it brings up the location, again feels off putting. DuckDuckGo and Google will use IP based location all the time and I’ve never been too bothered by it. But there’s something about the way ChatGPT brings it up, oddly mixing “look up pricing in” with the later “here” as if it’s here with me. Just definitely getting bad vibes. Chunks of code I copy paste into a git repo is like a little fingerprint that can always tie that code back to a moment in time I talked to that instance of OpenAI’s ChatGPT. Little chunks of me that I type into the background of my prompts tie more of my life to ChatGPT, and in ways that it will never forget. I’m not sure what the answer is yet. Maybe OpenAI will smooth out the awkwardness of how it will always remember, if it wants, everything you’ve ever typed to it. My hope is that open local models will become efficient enough to run locally on laptops or small home PCs and deliver private AI chats, but that seems like it’s far off for small budgets.

0 views

A Computing Procedure for Quantification Theory

A Computing Procedure for Quantification Theory Martin Davis and Hilary Putnam JACM Volume 7, Issue 3 This is the oldest paper I’ve summarized. I think SAT solvers are magic and wanted to peek inside the black box. This paper describes a precursor to the full DPLL algorithm. About half of the paper is about dealing with existential and universal quantifiers, which I’m not describing here. The input to the algorithm described here is a logic formula in conjunctive normal form (CNF). Conjunctive normal form comprises a set of clauses. A clause is the logical OR of a set of literals. A literal is either a variable, or the negation of a variable. Logical AND is used to combine all clauses. For example: There are straightforward algorithms to convert any logic formula into CNF (and more complicated ones like the Tseytin transformation ). The goal of this algorithm is to determine if the input logic formula is satisfiable. If it is satisfiable, then the algorithm produces a list, assigning each variable to a specific value ( or ). An alternative normal form would be disjunctive normal form (DNF), but that isn’t practical. If you think about it, any algorithm that outputs DNF effectively outputs a list of all possible solutions to the SAT problem (each clause is a possible solution). So, either the list is small and SAT solving really is easy, or most interesting problems would be prohibitively large in DNF form. This paper even cites a textbook which says that the act of putting a formula into DNF “automatically reveals whether or not the formula is inconsistent”. The search for a satisfying assignment (i.e., mapping of variable names to values) is described as the iterative application of three rules. The third rule contains the magic necessary to keep the search going. If a variable appears in a clause that only contains a single literal, then the variable can be assigned a value consistent with the polarity of the literal. For example, in the following formula, must be . If all appearances of a variable have the same polarity, then that variable can be assigned to a value consistent with that polarity. For example, in the following formula, can safely be assigned to false. Again, the algorithm notes the value of and then simplifies the formula by substituting that value for . This one is interesting in that subsequent work found an equivalent rule which is more efficient. The first step in applying rule III is to pick a variable (the choice can affect performance, but this paper doesn’t offer much guidance on how to choose), and refactor the formula such that it has the following form: Where , , and are expressions that do not contain . The paper doesn’t explicitly say this, but it seems this must cause the formula to temporarily leave CNF. Here is an example conversion. Now that the formula has been refactored, recursively solve the simpler formula: In the example above, the simpler formula is: The intuition here is that must either be or . If is , then must be . If is , then must be . This paper introduces an equivalent Rule III*, which says to simply assume and check if the formula is satisfiable with that assumption. If not, then assume and check if the formula is satisfiable with that assumption. This avoids having to transform the formula into [ form, which “can easily increase the number and the lengths of the clauses in the expression rather quickly after several applications”. This paper has the greatest statement of an improvement in runtime: The superiority of the present procedure over those previously available is indicated in part by the fact that a formula on which Gilmore’s routine for the IBM 704 causes the machine to compute for 21 minutes without obtaining a result was worked successfully by hand computation using the present method in 30 minutes. Computers were slower in the 1960s. Imagine someone today coming up with an alternative way of training LLMs which can be done faster by hand than a GPU. This follow-on paper has an interesting observation about the choice of which variable to select in rule III: By rearranging the clauses of a formula a different order would in general be created. In some cases, whether or not the program could actually prove the validity of a given formula (without running out of fast access storage) depended on how one shuffled the punched-data deck before reading it into the assembler! Thus, the variation in ordering of constants did affect by a factor of 10 (from 500 to 5000) … In modern lingo, the branching heuristic matters a lot. Subscribe now

0 views
fLaMEd fury 2 days ago

Anitya Live At The Civic

What’s going on, Internet? This past Saturday my wife and I got to see Tom Scott perform his new album Anitya in full at the Auckland Civic Theatre. Anitya is the first project Tom has released under his full name. Everything else before this — Home Brew , Average Rap Band , @Peace , Avantdale Bowling Club — sat under a group or alias. This album is a deeply personal one. The first half is about breaking up with his ex-wife, the second about falling in love with his new partner, with a track in between dedicated to his son. I pre-ordered the album during October’s Bandcamp Friday and listened to it the following week when it dropped, then again a few days later. Because of how personal the project is, I probably won’t return to it often. That said, seeing and hearing Tom perform it live (technically my third listen) gave me a new appreciation for it. It’s far removed from his previous releases, and that’s okay. The show itself was incredible — entertaining, emotional, and raw. It opened with a clever setup: a fictional pub in Avondale where local personality Dai Henwood played the karaoke host. Tom and a few mates, beers in hand, sat around a bar leaner waiting for the night’s entertainment. Over the next hour we were treated to local talent performing covers, including Tom’s partner Sarvi and one of my own favourites, Great South . Once the karaoke wrapped up, we had a short break while the stage was reset. When we came back, the theatre was packed. The next hour and a bit was the full Anitya album performed live, split into two halves with some Home Brew sing - alongs in between. I’ll always cherish the moment of belting out the chorus “Drinking in the Morning” with the crowd during this performance. Tom had a full band behind him — no backing tracks. This is what live shows should be when the venue allows. Some of the karaoke performers even returned to play parts during the main set. It was a fantastic show. When the album ended, Tom joked that everyone on stage could leave (they did). Then he launched into the Fuck the System Freestyle , a reworking of his verse from “Listen to Us” on the Home Brew album. This updated version called out the current government and even took a shot at Luxon, describing him as a “peeled cucumber-looking motherfucker.” The crowd went wild cheering, clapping, fully on board. A powerful way to close the night. I’m so glad we got to experience this once-in-a-lifetime performance. As for the album, it won’t be in regular rotation, but I’ll definitely set aside some time in the future to sit down with a drink and spin it on vinyl . Hey, thanks for reading this post in your feed reader! Want to chat? Reply by email or add me on XMPP , or send a webmention . Check out the posts archive on the website.

0 views
neilzone 2 days ago

Using vimwiki as a personal, portable, knowledge base

A while back, I was looking for a tool to act as basically a semi-organised dumping ground for all sorts of notes and thoughts. I wanted it to be Free software, easy to keep in sync / use across multiple devices, I can use it offline / without a LAN connection, and it should render Markdown nicely. I looked at logseq, which looked interesting, but decided to give vimwiki a go. I spend a lot of my time in vim already, so this seemed like it would fit into the way I work very easily. And I was right. Since it is “just” a collection of .md files, it appeals to me from a simplicity point of view, and also makes synchronisation and backing up very easy. There are [multiple ways to install vimwiki]. I went for: and then adding the following to my (although I already had one of them): To add a new wiki with support for Markdown (rather than the default vimwiki syntax), I put the details into Then, I opened vim, and used to open the wiki. On the first use, there was a prompt to create the first page. The basic vimwiki-specific keybindings are indeed the ones I use the most to manage the wiki itself. For me, “ ” is “". Otherwise, I just use vim normally, which is a significant part of the appeal for me. The wiki is just a collection of markdown files, in the directory specified in the “path” field in the configuration. This makes synchronisation easy. I sync my vimwiki directory with Nextcloud, so that it propogates automatically onto my machines, and I can also push it to git, so that I can grab it on my phone. This works for me, and means that I don’t need to configure, secure etc. another sync tool or a dedicated sync system. There is support for multiple wikis, although I have not experimented much with this. Each wiki gets its own line in . You can use in vim to select which wiki you want to use. I really like vimwiki. It is simple but effective, and because it runs in vim, it does not require me to learn a different tool, or adjust my workflow. I just open vim and open my wiki. Prior to vimwiki, I was just dropping .md or .txt files into a directory which got synchronised, so this is not massively different, other than more convenient. Everything is still file-based, but with an increased ease of organisation. For someone who didn’t already use vim, it is probably a more challenging choice.

1 views
マリウス 2 days ago

Cameras, Cameras Everywhere!

We live in an age when a single walk down the street can put you inside at least a dozen different recording ecosystems at once: Fixed municipal CCTV, a bypassing police cruiser’s cameras or body-cam feeds, the license-plate cameras on light poles, the dash-, cabin-, and exterior cameras of nearby cloud-connected vehicles, Ring and Nest doorbells of residences that you might pass by, and the phones and wearables of other pedestrians passing you, that are quietly recording audio and/or video. Each of those systems was justified as a modest safety, convenience, or product feature, yet when stitched together they form a surveillance fabric that reaches far beyond its original intent. Instead of only looking at the big picture all these individual systems paint, let’s instead focus on each individual area and uncover some of the actors complicit in the making of this very surveillance machinery that they profit immensely from. Note: The lists below only mention a few of the most prominent enablers and profiteurs. CCTV is not new, but it’s booming. Market reports show the global video-surveillance/CCTV market measured in tens of billions of dollars and growing rapidly as governments and businesses deploy these solutions. A continued double-digit market growth over the next several years is expected. Cameras haven’t been reliably proven to reduce crime at scale, and the combination of live feeds, long-term storage and automated analytics (including behavior detection and face matching) enable discriminatory policing and concentrate a huge trove of intimate data without adequate oversight. Civil liberties groups and scholars argue CCTV expansion is often implemented with weak limits on access, retention, and third-party sharing. In addition, whenever tragedy strikes it seems like “more video surveillance, now powered by AI” is always the first response: More CCTV to be installed in train stations after knife attack Heidi Alexander has announced that the Government will invest in “improved” CCTV systems across the network, and that facial recognition could be introduced in stations following Saturday’s attack. “We are investing in improved CCTV in stations and the Home Office will soon be launching a consultation on more facial recognition technology which could be deployed in stations as well. So we take the safety of the travelling public incredibly seriously.” Automatic license-plate readers (ALPRs) used to be a tool for parking enforcement and specific investigations, but firms like Flock Safety have taken ALPRs into a new phase by offering cloud-hosted, networked plate-reading systems to neighborhoods, municipalities and private groups. The result is a searchable movement history for any car observed by the network. Supporters point to solved car thefts and missing-person leads. However, clearly these systems amount to distributed mass surveillance, with weak governance and potential for mission creep (including law-enforcement or immigration enforcement access). The ACLU and other groups have documented this tension and pressed for limits. Additionally there has been a plethora of media frenzy on specifically Flock Safety’s products and their reliability : A retired veteran named Lee Schmidt wanted to know how often Norfolk, Virginia’s 176 Flock Safety automated license-plate-reader cameras were tracking him. The answer, according to a U.S. District Court lawsuit filed in September, was more than four times a day, or 526 times from mid-February to early July. No, there’s no warrant out for Schmidt’s arrest, nor is there a warrant for Schmidt’s co-plaintiff, Crystal Arrington, whom the system tagged 849 times in roughly the same period. ( via Jalopnik ) Police departments now carry many more mobile recording tools than a decade ago, that allow the city’s static CCTV to be extended dynamically: Vehicle dash cameras, body-worn cameras (BWCs), and in some places live-streaming CCTV or automated alerts pushed to officers’ phones. Bodycams were originally promoted as accountability tools, and they have provided useful evidence, but they also create new data flows that can be fused with other systems (license-plate databases, facial-recognition engines, location logs), multiplying privacy and misuse risks. Many researchers, advocacy groups and watchdogs warn that pairing BWCs with facial recognition or AI analytics can make ubiquitous identification possible, and that policies and safeguards are lagging . Recent reporting has uncovered operations where real-time facial-recognition systems were used in ways not disclosed to local legislatures or the public, demonstrating how rapidly policy gets outpaced by deployment. One of many recent examples consists of an extended secret live-face-matching program in New Orleans that led to arrests and subsequent controversy about legality and oversight. Drones and aerial systems add another layer. Airborne or rooftop cameras can rapidly expand coverage areas and make “seeing everything” more practical, with similar debates about oversight, warranting, and civil-liberties protections. Modern cars increasingly ship with external and internal cameras, radar, microphones and cloud connections. Tesla specifically has been a headline example where in-car and exterior cameras record for features like Sentry Mode, Autopilot/FSD development, and safety investigations. Reporting has shown that internal videos captured by cars have, on multiple occasions, been accessed by company personnel and shared outside expected channels, sparking alarm about how that sensitive footage is handled. Videos of private interiors, garages and accidents have leaked, and workers have admitted to circulating clips . Regulators, privacy groups and media have flagged the risks of always-on vehicle cameras whose footage can be used beyond owners’ expectations. Automakers and suppliers are rapidly adding cameras for driver monitoring, ADAS (advanced driver-assistance systems), and event recording, which raises questions about consent when cars record passengers, passers-by, or are subject to remote access by manufacturers, insurers or law enforcement, especially with cloud-connected vehicles. Ring doorbells and other cloud-connected home security cameras have created an informal, semi-public surveillance layer. Millions of privately owned cameras facing streets and porches that can be searched, shared, and, in many jurisdictions, accessed by police via relationships or tools. Amazon’s Ring drew intense scrutiny for police partnerships and for security practices that at times exposed footage to unauthorized access. A private company mediates a vast public-facing camera network, and incentives push toward more sharing, not less. Another recent example of creeping features, Ring’s “Search Party” AI pet-finder feature (enabled by default), also raised fresh concerns about consent and the expansion of automated scanning on users’ cloud footage. While smartphones don’t (yet) record video all by themselves, the idea that our phones and earbuds “listen” only when we ask them has been punctured repeatedly. Investigations disclosed that contractors for Apple, Google and Amazon listened to small samples of voice-assistant recordings, often including accidentally captured private conversations, to train and improve models. There have also been appalling edge cases, like smart speakers accidentally sending recordings to contacts, or assistants waking and recording without clear triggers. These incidents underline how easily ambient audio can become recorded, labeled and routed into human or machine review. With AI assistants (Siri, Gemini, etc.) integrated on phones and wearables, for which processing often requires sending audio or text to the cloud, new features make it even harder for users to keep control of what’s retained, analyzed, or used to personalize models. A recent crop of AI wearables, like Humane ’s AI Pin , the Friend AI pendants and similar always-listening companions, aim to deliver an AI interface that’s untethered from a phone. They typically depend on continuous audio capture and sometimes even outward-facing cameras for vision features. The devices sparked two predictable controversies: Humane ’s AI Pin drew mixed reviews, questions about “trust lights” and bystander notice, and eventually a shutdown/asset sale that stranded some buyers, which is yet another example of how the technology and business models create risks for both privacy and consumers. Independent wearables like Friend have also raised alarm among reviewers about always-listening behavior without clear opt-out tools. Even though these devices might not necessarily have cameras (yet) to record video footage, they usually come with always-on microphones and can, at the very least, scan for nearby Bluetooth and WiFi devices to collect valuable insights on the user’s surroundings and, more precisely, other users in close proximity. A device category that banks primarily on its video recording capabilities are smart glasses. Unlike the glassholes from a decade ago, this time it seems fashionable and socially accepted to wear the latest cloud-connected glasses. Faced with the very same issues mentioned previously for different device types, smart glasses, too, create immense risks for privacy, with little to no policy in place to protect bystanders . There are several satellite constellations in orbit that house advanced imaging satellites capable of capturing high-resolution, close-up images of Earth’s surface, sometimes referred to as “spy satellites” . These satellites provide a range of services, from military reconnaissance to commercial imagery. Notable constellations by private companies include GeoEye ’s GeoEye-1 , Maxar ’s WorldView , Airbus ’ Pléiades , Spot Image ’s SPOT , and Planet Labs ’ RapidEye , Dove and SkySat . Surveillance tech frequently arrives with a compelling use case, like detering car theft, finding a missing child, automating a customer queue, or making life easier with audio and visual interactions. But it also tends to become infrastructural and persistent. When private corporations, local governments and individual citizens all accumulate recordings, we end up with a mosaic of surveillance that’s hard to govern because it’s distributed across actors with different incentives. In addition, surveillance technologies rarely affect everyone equally. Studies and analyses show disproportionate impacts on already-targeted communities, with increased policing, mistaken identifications from biased models, and chilling effects on protest, religion or free association. These systems entrench existing power imbalances and are primarily benefitial to the people in charge of watching rather than the majority that’s being watched . Ultimately, surveillance not only makes us more visible, but we’re also more persistently recorded, indexed and analyzable than ever before. Each camera, microphone and AI assistant may be framed as a single, sensible feature. Taken together, however, they form a dense information layer about who we are, where we go and how we behave. The public debate now needs to shift from “Can we build this?” to “Do we really want this?” . For that, we need an informed public that understands the impact of all these individual technologies and what it’s being asked to give up in exchange for the perceived sense of safety these systems offer. Avigilon (Motorola Solutions) Axis Communications Bosch Security Systems Sony Professional Axis Communications Bosch Security Systems Flock Safety Kapsch TrafficCom Motorola Solutions (WatchGuard) PlateSmart Technologies Digital Ally Kustom Signals Motorola Solutions (WatchGuard) Transcend Information Flock Safety Lockheed Martin (Procerus Technologies) Quantum Systems Mercedes-Benz Eufy Security Nest Hello (Google) Ring (Amazon) SkyBell (Honeywell) Bystander privacy (how do you notify people they’re being recorded?) Vendor and lifecycle risk (cloud dependence, subscription models, and what happens to device functionality or stored data if a startup folds) Gentle Monster Gucci (+ Snap) Oakley (+ Meta) Ray-Ban (+ Meta) Spectacles (Snap) BAE Systems General Dynamics (SATCOM) Thales Alenia Space

0 views
Brain Baking 2 days ago

The 1994 IBM PC Invoice

In 1994, my late father-in-law bought a new computer. That then brand new sparkling piece of hardware now is my 31 year old 80486 retro PC . When he gifted it to me in 2020, he also handed over the original invoice, as if the warranty was still valid. Also, who saves a twenty something year old piece of paper that becomes obsolete after two years? I’m glad that he did, otherwise I wouldn’t be able to write this. Below is the scanned version of the invoice printed out by Veldeman Office Supplies in Hasselt: According to the KBO public search , The company went bankrupt in 2013 after 28 years of faithful service, even though their head offices moved a couple of times. My father got his original 486 somewhere in Brussels, and after that, I remember we always went to Bells Computercenter in Diest, a specialized hardware store that still exists today! When the first Voodoo cards dropped, Bells is the place we ran to. It was that kind of place with the cool looking Creative sound card big boxes in the front windows to attract attention. It seems like a strange choice to buy a PC at Veldeman , a store that mostly sells general office supplies. The invoice details the exact purchase: amount of the following: I received the computer with of RAM installed, not , but perhaps my father-in-law upgraded it later in the nineties. See my Reviving a 80486 post for photos: the CPU was stamped with an early version of the Microsoft Windows logo, and below it, it proudly states “MICROSOFT WINDOWS COMPATIBLE”. That must have been the main reason for the purchase, as my father-in-law mainly used it in conjunction with Windows 3.x spreadsheet tooling for keeping track of expenses and general calculations as part of his job as an mechanical engineer. Buying a new PC in 1994—on the 16th of May, to be more precise—turned out to be a very risky business. In the nineties, technology moved at a dizzying speed. Windows 95 was just about the corner, Intel’s Pentium became more and more affordable, the AT system got replaced by ATX, the motherboard layout changed, AGP got introduced pushing VLB into obscurity, … In less than a year, the above purchase would become obsolete. That’s quite painful for such a hefty price. The invoice totalled to an amount of 1 or . Taking inflation into account , that amounts to in 2025, which is more expensive than the most beefed out 15" MacBook Air you can get right now boasting the M4 CPU technology with 10 cores, 24 GB of RAM, and 512 GB SSD storage. That MacBook will stay relevant for more than six years—my last one managed to keep it together for eight, and the one I’m typing this on is almost six years old. The 486DX Mini Tower sold by Veldeman lasted less than a year. To be fair, it wasn’t exactly the most performant machine you could get your hands on in 1994. It didn’t even properly run 1993’s DOOM : you’ll need more raw CPU power (and preferably more RAM) to push beyond ten to fifteen frames per second. But if that PC already was more than in current EURs, you can imagine that a true high-end machine was only reserved for the wealthy. According to DOS Days UK , in 1994, a mid-range PC typically came with a DX2-66 with more RAM, so technically speaking, this invoice here is for a low-end PC… As a result, my father-in-law faithfully clung on to Windows 3.1(1) while others moved on to Windows 95. My wife recalls they didn’t buy a new one (or upgraded the existing one besides the RAM slots) in quite a few years, while my father bought a new machine early 1996 that was capable of rendering Quake . Keen observers will notice that the Veldeman PC Mini Tower did not come with a sound card. Popular Creative Sound Blaster cards were sold in big bright boxes for more than without adjusting for inflation: needless to say, the good ones were crazy expensive. Nowadays, people don’t even care any more, and the built-in sound chip that comes with the motherboard is usually good enough. It’s remarkably difficult to get hold of historical price data on 1994 PC hardware. The Computer Paper Vol. 7 No. 7 , an archive from , contains an interesting “Grand Opening” advertisement from 3A COMPUTER WAREHOUSE in Markham, Ontario, Canada, listing similar hardware: An excerpt from computer hardware ads. Copyright The Computer Paper magazine publisher. A “basic” OEM Sound Blaster would have set you back for —that’s in 2025 or . Note that only the PCS 486DX Multimedia CD on the bottom left comes with what seems to be a generic “sound card”. IBM PCs simply didn’t come equipped with decent sound capabilities: many of us Apogee game fans have the iconic speaker sounds permanently burned into our brains. The IBM PC advertised at the top left most closely matches the hardware from my invoice and came at — in 2025 or . That’s quite a bit less but hardware was/is more expensive in Europe but I’m probably comparing apples with oranges here. Besides, the Canadian ad didn’t state it comes with a free mouse mat! Other magazines closer to home are MSX Computer Magazine (no ads containing prices), Computer! Totaal (vol. 3 is from 1994 but I can’t find a scanned version), and the one I remember my grandfather buying, PC-Active . Unfortunately, my parents threw out all copies after cleaning up their elderly house years ago. I’ll try to be on the lookout for copies or might pay the Dutch Home Computer Museum a visit that also collects old computer magazines. Luckily, my Dutch retro blogging liaison Diederick de Vries managed to procure the following scan of PC-Active issue 49 from May 1993 containing ads of 486 PCs: AMBRA PERSONAL COMPUTERS: gun je verstand de vrijheid (give your mind freedom). Copyright the PC-Active magazine publisher. The mid-range PC advertised is a 486 SX (25 Mhz, 100 Mb disk space, 4 Mb RAM) for , while the high-end one decked out with a 486 DX2 (66 Mhz, 200 Mb disk space, 4 Mb RAM) was for sale for the staggering amount of . That’s in today’s money—wowza. Can you imagine spending that much on a computer? Of course, in 1993, the DX2 was brand new and within a year it became much more affordable. And in another year it was rendered irrelevant by the Pentium… In a way, I consider myself lucky to have grown up in that golden age of molten silicon. Hopefully today’s Ryzen CPUs will be remembered as fondly by my kids as I remember the 486 and early Pentium/Celeron/Athlon era. I highly doubt it. In case you hadn’t noticed, we sensible Belgians use as the thousand separator and as a, well, comma?  ↩︎ Related topics: / am486 / Hasselt / By Wouter Groeneveld on 6 November 2025.  Reply via email . In case you hadn’t noticed, we sensible Belgians use as the thousand separator and as a, well, comma?  ↩︎

0 views
./techtipsy 2 days ago

The day IPv6 went away

I take pride in hosting my blog on a 13-year old ThinkPad acting as a home server , but sometimes it’s kind of a pain. It’s only fair that I cover the downsides of this setup in contrast to all the positives. Yesterday, I happened to notice that a connection to a backup endpoint was gone. Okay, happens sometimes. Then I went into the router and noticed that hey, that’s odd, there’s no WAN6 connection showing up. All gone. Just as if I had gone back to a crappy ISP that only provides IPv4 ! Restarting the interface did not work, but a full router restart worked. Since the IPv4 address and IPv6 prefix are all dynamic, that meant that my DNS entries had just gone stale. I do have a custom DNS auto-updater script for my DNS provider, but DNS propagation takes time. Luckily not a lot of time, my uptime checker only reported downtime of 5-15 minutes, depending on the domain. Here’s what it looked like on OpenWRT. Impact to my blog? Not really noticeable, since IPv4 kept trucking along. Perhaps a few IPv6-only readers may have noticed this. 1 I can always move to a cheap VPS or the cloud at a moments’ notice, but where’s the fun in that? I can produce AWS levels of uptime at home, thankyouverymuch ! I think I’ll now need to figure out some safeguards, even if it means scheduling a weekly router reboot if the WAN6 interface is not up for X amount of time. That, and better monitoring. if you are that person, say hi!  ↩︎ if you are that person, say hi!  ↩︎

0 views
codedge 2 days ago

Managing secrets with SOPS in your homelab

Sealed Secrets, Ansible Vault, 1Password or SOPS - there are multiple ways how and where to store your secrets. I went with SOPS and age with my ArgoCD GitOps environment. Managing secrets in your homelab, be it within a Kubernetes cluster or while deploying systems and tooling with Ansible, is a topic that arises with almost 100% certainty. In general you need to decide, whether you want secrets to be held and managed externally or internally. One important advantage I see with internally managed solutions is, that I do not need an extra service. No extra costs and connections, no chicken-egg-problem when hosting your passwords inside your own Kubernetes cluster, but cannot reach it when the cluster is down. Therefore I went with SOPS for both, secrets for my Ansible scripts and secrets I need to set for my K8s cluster. While SOPS can be used with PGP, GnuPG and more, I settled with age as encryption. With SOPS your secrets live, encrypted, inside your repository and can be en-/decrypted on-the-fly whenever needed. The private key for encryption should, of course, never be committed into your git repository or made available to untrusted sources. First, we need to install SOPS, age and generate an age key. SOPS is available for all common operating systems via the package manager. I either use Mac or Arch: Now we need to generate an age key and link it to SOPS as the default key to encrypt with. Generate an age key Our age key will live in . Now we tell SOPS where to find our age key. I put the next line in my . The last thing to do is to put a in your folder from where you want to encrypt your files. This file acts as a configuration regarding the age recipient (key) and how the data should be encrypted. My config file looks like this: You might wonder yourself about the first rule with . I will just quote the [KSOPS docs](To make encrypted secrets more readable, we suggest using the following encryption regex to only encrypt data and stringData values. This leaves non-sensitive fields, like the secret’s name, unencrypted and human readable.) here: To make encrypted secrets more readable, we suggest using the following encryption regex to only encrypt data and stringData values. This leaves non-sensitive fields, like the secret’s name, unencrypted and human readable. All the configuration can be found in the SOPS docs . Let’s now look into the specifics using our new setup with either Ansible or Kubernetes. Ansible can automatically process (decrypt) SOPS-encrypted files with the [Community SOPS Collection](Community SOPS Collection). Additionally in my I enabled this plugin ( see docs ) via Now, taken from the official Ansible docs: After the plugin is enabled, correctly named group and host vars files will be transparently decrypted with SOPS. The files must end with one of these extensions: .sops.yaml .sops.yml .sops.json That’s it. You can now encrypt your group or host vars files and Ansible can automatically decrypt them. SOPS can be used with Kubernetes with the KSOPS Kustomize Plugin . The configuration we already prepared, we only need to apply KSOPS to our cluster. I use the following manifest - see more examples in my homelab repository : Externally managed: this includes either a self-hosted and externally hosted secrets solution like AWS KMS, password manager like 1Password or similar Internally managed: solutions where your secrets live next to your code, no external service is need Arch Linux: Two separate rules depending on the folder, where the encrypted files are located Files ending with are targeted The age key, that should be used for en-/decryption is specified

0 views