Hacker Newsnew | past | comments | ask | show | jobs | submit | jitl's commentslogin

You can install a different keyboard if you want. I used 3rd party swiping keyboards but ended up using the system one for the last few years because it doesn't bother me.

I tried SwiftKey but decided it was worse

My employer Notion offers an MCP that’s mentioned in a few posts here.

Notion’s monorepo has 16+ MCP configs with many in opt-in plugins developers choose to activate.

Very useful; i particularly like sending an agent to debug an alert across slack/honeycomb/incident.io/materialize db


> Submitted on 1 Apr 2025 (v1), last revised 1 Apr 2026 (this version, v2)

what was the Nix schism? Did something like systemd happen? or like, Determinate/commercial vs Not? Or more like USA culture wars / code-of-conduct flamers (i vaguely recall some drama around a conference sponsor)?

anyways, i hope there’s a path to some kind of redemption and reconciliation in the future for the community. it sounds like it’s been Bad for years at this point.


The creator of Nix soft-forked it and started a company, that sort of inevitably leads to bad vibes I think


Can’t say I blame him, given the tone of some of the convos on the discourse site.


The fork occured before most of the drama.


maybe wait until you have something to share before Show HN? overall your work seems like a cool thing that i’d like to look at in a few months once there’s more substantial education stuff to read about it.


Your README and docs don’t describe any of the interesting or unique things here. You cover `if` in README but not choreographic programming or perceus. Did i miss some big link?

Where’s the cool stuff?


you did read RESEARCH.md didn't you? :)


i poked around in there, under choreographic programming there’s one example of something not in the language as a discarded idea.

if you claim X and Y make us cool and different, then you should document X and Y in your readme. don’t tell me something is the star, and then hide it away. this is baffling to me.


its speaking of discarded syntax for choreo, not that the feature was discarded


Still there's not a single example.


Why would they? The only thing the readme says about RESEARCH.md is "if you want to contribute to the language please read RESEARCH.md". The OP doesn't want to contribute, they want to see an example of choreographic programming. This shouldn't be hard. What is hard is guessing which of the random markdown documents to click to find an example.


GitHub hides RESEARCH.md for my convenience. I have to click "Show All Files" to see that it even exists.


sure, but s3 is far easier to buy and also far more reliable than typical distributed systems coordinator stuff like etcd/zookeeper/consul. every major cloud offers it, and there’s several decent open source options.


I haven't deep-dived into celld. Does it requires s3's strong consistency to be correct? or is any s3 api compatible object storage sufficient even if they lack strong consistency guarantee?


it’s relying on consistency w conditional writes


> cloudflare

the stuff is great when it works but Durable Objects can be quite expensive. whenever i get too excited about em all it takes is a little time trying to price it out to calm me down.

> do i need to buy bare metal

my first idea would be to run celld on AWS Kubernetes deployed to local zones https://docs.aws.amazon.com/eks/latest/userguide/auto-local-...

it’s not “region: earth” like cloudflare but perhaps worth the trade off.


spinning up multiple eks clusters is ridiculously expensive by comparison to paying for durable objects on demand.


it’s all relative and it really depends on your scale. if your usage fits in the included compute and request count you get for $60/yr it’s absolutely gonna be cheaper. on the other hand, you can run EKS clusters in usw2, use2, apne1, apne2, euc1 for $8600/yr based on my napkin math. to me that does not sound expensive, i work at a company where $8600 is pocket change. but $8600 is much larger than $60/yr for region: earth.


what is the difference between celld and Cloudflare Workers open source version workerd?

https://github.com/cloudflare/workerd


workerd is missing the scheduler - the thing that allows it to operate across nodes. Durable Object storage are just local sqlite databases.

celld is the full distributed system (albeit single tenant). It distributes DOs (cells) across any number of VMs. The databases for each DO are in object storage with RPO=0 guarantee.


You beat us to it! Been meaning to land this but got distracted.

https://github.com/cloudflare/workerd/pull/6780

But honestly I love that there are multiple implementations now.


bummer this expects NFS; this is all a brand new implementation vs what Cloudflare runs internally in production for DOs? I can’t imagine all your workerds share a single global NFS… What would a more realistic workerd with DO support look like?

ah well, we have celld!


Honestly, you wouldn't want to run our internal implementation -- it's far too complicated. Unless you have 100+ datacenters around the world -- then maybe.

The goal of this new design is to scale to a cluster while being operationally very easy to set up. Ideal for self-hosting.

NFSv4 is an easy first step, convenient because it's broadly understood, has many implementations, and requires no client libraries. I could imagine a follow-up to support LiteFS instead of NFS could make a lot of sense, though it'll get more complicated.

But yes, celld is definitely ahead of us here. No doubt about that.


This just makes me curious, what does the internal implementation actually look like?

I've always wondered what it is Cloudflare does to make DO's work but this specific thing doesn't seem explained anywhere


ZeroFS might help here to put the actual storage on an S3 compatible object store? https://github.com/Barre/zerofs


The ZeroFS readme says

     Dual-licensed under the GNU AGPL v3 (fully featured, for open source use)
     and a commercial license.
but the commercial license link https://www.zerofs.net/licensing is a 404 page


my interest in s3 is for how easy it is - just need HTTP. mounting a filesystem and worrying about filesystem level locks is more complicated.


yeah but they can just put the dropper, etc in index.js, so that it runs at import time rather than at install time, no? i guess first-install time is often a privileged developer machine, and will execute in a "server"-like runtime such as Node, Bun, Deno. but blocking preinstall scripts is basic first aid...


Nobody is claiming this is a complete solution to security. I would call this "necessary but not sufficient". You won't get far as an engineer if you refuse to implement "necessary but not sufficient" changes because the change doesn't in and of itself one-shot the entire problem.


These half-measures is why everything has gone to shits. Instead of properly auditing software, reducing the quantity and increasing the quality, we keep pushing more and more garbage where all you find is 2FA that, captcha this, not supported this, app not signed, etc..


Can't agree more. I'm working on OSS security tool that can protect you from Shai-hulud, no half measures.

The idea is to have a local proxy that injects real secrets into requests in-flight, so a compromised library has nothing to steal because it never had access to any of your secrets: https://github.com/inflightsec/agent-vault-proxy


Defense in depth is the “meat and potatoes” of security.

In other words: people should be auditing their software, but we should also design systems and schemes that provide varying degrees of defense and protection when people invariably fail to review the code they run.


Defence in depth is not just 'throw anything in that might improve security' though. The idea is to have multiple strong layers, not a hundred half-measures that are all easily bypassed. A stronger layer might be sandboxing, or separating your build and publishing steps as others have suggested (and also probably worth restricting the credentials the publishing step to just the relevant packages as well). These will at least robustly prevent a malicious dependency from spreading horizontally, but you'll still potentially ship malware to your customers.


>The idea is to have multiple strong layers, not a hundred half-measures that are all easily bypassed

Definitely. On the other hand, in my opinion, "not running arbitrary code during package install" is not a "half-measure", it's a basic sanity. This whole arbitrary code execution at install time is a convenience feature that was adapted by some package managers, but it was never a good idea.

Fortunately, nixos solves that for me in most cases.


doesn't nixos still have execution hooks when you actually activate a package to use it? Arguably it's just separating the download and install steps (which I do agree, every package manager should have a 'safely download this package so I can inspect it' function as well as a 'make this package ready to use' function, whatever you call those operations. I think 'pip download', for example, managed to violate that expectation which is not particularly sensible)


I would consider 2FA and signing to be strong layers, when applied well. I think everybody agrees we shouldn’t add layers just for the sake of it.


The fact that it's not sufficient also largely means it's not necessary either, because the real solution is auditing and trusting the codebase as a whole. All you do when disabling install hooks is make a lot of situations much more difficult to handle.


You will also not get very far in engineering if you have a production incident, someone proposes a thing that will mitigate it partially but significantly, and you insist that we can't deploy that mitigation because we need to do the multi-year project that will actually fix it instead. Even if we still need that project, we also need that mitigation.

Sure, solve the problem of "auditing and trusting codebases". Go for it. Shouldn't take you until, oh, let me be generous and give you until next Monday. No sweat.


Feel free to turn it off yourself, just don't be surprised when the attackers switch tactics. And don't make life harder for everyone else by pushing it as mandatory.

(if you want a better mitigation: don't automatically update dependencies in CI. At a minimum have a cooling-off period that you only bypass on manual review. This is not hard to implement and at least gives some time for alarm bells to be sounded before you're pwned. Probably while doing the updates you can also just do a quick sanity check on the changes, that'll also catch the ones using a blatant install hook)


> if you want a better mitigation: don't automatically update dependencies in CI. At a minimum have a cooling-off period that you only bypass on manual review. This is not hard to implement and at least gives some time for alarm bells to be sounded before you're pwned.

One of the problems a lot of companies are having right now is trying to determine a proper window size between CVE release and patching.

On one hand, you have LLM created 0days and attacks are happening almost as fast as CVEs can be posted, and CVEs are being posted at lightning speed. You maybe had a month or a few weeks to patch before, now the window may be down to days or even hours.

On the other hand, you want to prevent these repo bombing attacks.

There's a tension there but I think we're going to end up measuring that window in hours within the year, if we're not already there.


If you need quick responses to such things, you're gonna need some intelligence in the loop regardless, even if it's just deciding when it's worth pushing a new release to prod.


What if it needs to get patched and pushed while you and everyone else in the org are asleep?

I mean that's a big window of time now.


Always has been, arguably. Either way I don't think most people have their CI configured to automatically re-run when a dependency updates (imagine the thundering herd!), the compromises are more incidental to runs happening for other reasons, and that configuration neither guarantees a quick response nor protects against supply chain attacks.

(If you find you do need updates when you're sleeping, you probably need to delegate that process or at least the process of checking the update to someone you trust, and you're probably paying for the service. This blog post is in large part an ad for just such a service).


I mostly use languages where the feature doesn't even exist. We don't generally miss it.

I also blocked a proposed mandatory dependabot at work a few months back because I didn't like the way it created a pipeline for any hacker to push a hacked dependency straight into someone's codebase. I'm lifting my objection now that dependabot is defaulting to a 3-day cooldown, though the code bases I'm managing I'm setting to 7 days. (Not to be behind everyone else; I'd be fine if everyone joined me at 7 days. I don't really accept the freeloading objection, there's plenty of entities scanning things now no matter what cooldown you set. I just think 3 is a little tight to expect the full discovery and remediation to take place.)

So, whatever sort of "but it's really hard! I bet you don't do it yourself" implications you may be trying to draw fall very flat. Or whatever you may have been trying to imply about trusting this step but not trusting others... no, I do defense in depth. Giving up on defense in depth because one step isn't enough... well, I think I've probably played the "you won't get very far in engineering" card enough, but hey, here's one last time.


Out of curiosity, which languages? The equivalent operations for C and C++ do generally involve a lot of arbitrary code execution to do the build, for example, they just don't have one central package manager and repository. I can't think of any package managers off the top of my head that don't have some similar feature, but I am obviously not familiar with all of them.

You can see my other responses in this thread about what I think of this in the context of defence in depth. I think disabling install hooks is a very weak defence with substantial downsides and defence in depth does not mean just taking every option that might foil some attack. There are much better means to get a robust extra layer of defence in this context, which is mainly about protecting your publishing pipelines from become a vector for a worm.


> You will also not get very far in engineering if

Man, I wish.


Missile defense systems are unnecessary because they could just use tanks

Anti-tank measures are unnecessary because they can just use missiles


What's your solution to using a library without executing the code in it?


This is moving the goalposts. The original problem was that installing a library should not execute code from that library.

In most sane environments, like for example native languages, this is already the case. Downloading a .dll file and putting it in an appropriate directory won't, by itself, execute code in that library.

You may argue that the code will get executed at some point anyway, but that's besides the point. Sandboxing the build environment is a different problem than sandboxing the test/staging/production environment.

I think we both agree that "adding random obstacles that don't actually protect anything" is not a valid approach to security, but my mental model of the build step is "transformation of input data into output data", and while this step may produce a malicious output from malicious inputs, it should not do anything malicious itself. For example, "gcc source.c" should not execute arbitrary code by itself.


>In most sane environments, like for example native languages, this is already the case.

Installing a node package is much more like compiling a dll, not downloading it. The same is true for most package managers that exist for C and C++ as languages as opposed to for an OS. These are two different tools for different use-cases. (though still pretty much all installation processes for all OSs involve an opportunity for arbitrary code execution, as well, apart from just downloading a zip file and extracting it, which is not the norm)


The term you are looking for is Defense in Depth/Layers


That makes sense if it's actually a layer. You can create a thousand minor obstacles and it still won't be a very secure system.


"make no mistakes" is not the "real solution"


Neither is 'close the gate with no fence on either side of it'. If you want to run code, you either need to run it in a sandbox or trust it. Choosing to run only part of the code is not really a solution.

(if you want to disable such hooks yourself, then you may get some security by diversity because you're not using the common configuration. But if it becomes the default then these worms will switch to a different vector)


Prod tends to have less privileges than CI/CD. CI/CD tends to be full admin, so it's far more sensitive. Prod tends to have tooling for detecting breaches, better logging, etc. People tend to use containers, which act as a sandbox.

Prod also won't be wormable the way that CI/CD is. With CI/CD I can own another dev, use their creds to push another malicious build script, etc. "Attacker is in my prod env" isn't wormable.

Yes, capabilities in prod would be hugely beneficial but removing CI/CD is massive as a win.


Wouldn't the dropper get executed once tests are run within CI though?


Yes, you should separate "tests execute" into their own unprivileged workflows that don't have "deploy" secrets.


You can also do the same for the build workflow, no?


Yep, I'd recommend it.


yeah, or when a dev starts the local development server (unless that server is containerized).


Dev laptops tend to have better monitoring than CI/CD so I still think this is a better option. You can also have devs use VMs or separate dev environments like an ec2 instance.

To be clear, just solving the CI/CD portion is insufficient, but it is a massive win.


well Deno has the necessary ingredients for defense: file-system permission by path


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: