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


i came here to comment the same! could not be happier!

This may be the most important sentence in that announcement:

> expect to be able to bring Mythos-class models to all our customers in the coming weeks.


its one of the most complex htmx projects i have seen. super cool.


just wanted to share how much i loved this blog post :)


tangled is a really cool project; the most important feature it provides is that it is jujutsu first.


I don't really see it.

I used JJ for a bit, but I personally really, really dislike the anonymous branch approach it forces you into.

Branches are just useful conceptually, at least to me. For the same reason I like my documents grouped into folders.

Frankly - I think JJ just ended up taking up far more mental bandwidth than git. Simple operations need generated ids, commands require complicated input (ex - the entire revset thing), I have to be constantly thinking about the tool and its structure.

It feels really oversold to me. It's solving problems for people who live in source control, not problems for people who just want snapshots of code every now and then. Hell - just look at some of the example commands from the suggested tutorial:

jj new ym z r yx m -m "merge: steve's branch"

jj log -r 'ancestors(trunk, 2)'

jj new o

jj log -r '@ | ancestors(remote_bookmarks().., 2) | trunk()'

---

With all due respect, if the intro tutorial to your tool includes a command having to literally write function names in quoted commands, or run a command with fucking 8 (EIGHT!) arguments... You've jumped the shark.

Not trying to harsh anyone's buzz - if you like it... great, it's clearly quite powerful. But it misses the mark for me. I want "just powerful enough" with minimal mental overhead.


If you cherry pick complicated commands, and remove all context, sure, they look cryptic.

I wrote that tutorial, and literally only one of those is relevant to my day to day work: jj new o, which means “make a new change on top of the change named o”. Yes, if you remove the context that “o” is on your screen and highlighted, it looks complex.

It’s the same with the other “jj new” command: you’re producing a merge by giving it every branch you want to merge together. If you’re merging five branches into one, you need to provide five identifiers for those branches. It could not be simpler than this. And -m adds a message, same as git.

The other two are showing off the power of the revset language; you’re not typing this stuff in yourself more than once, and if you are, you use an alias so that it’s shorter and easier to use.


> If you cherry pick complicated commands, and remove all context, sure, they look cryptic.

Sure I'm definitely not playing fair, but I am cherry picking from the intro tutorial you put together, so I'm not going crazy either :P

I think my primary issue is that jj feels like it wants to control how I work more than git does.

Mentally - I just don't want to have to think about changes as often as jj seems to want to think about them. And maybe it's an intro phase, or a thing you eventually build past (I only played with it for a week or two) - but it felt like a lot of focus went intro structuring my work, instead of doing my work.

Basically - the vibe I got from it was: if you're a person who really likes making checklists, or complex tickets with subtasks and groupings and labels - jj is something you're going to like. If you're just interested in writing code and not so interested in source control outside of the ability to occasionally "snapshot this folder"... it's probably not going to be your thing.

> The other two are showing off the power of the revset language; you’re not typing this stuff in yourself more than once, and if you are, you use an alias so that it’s shorter and easier to use.

This is exactly my point. I use git every day on the command line. I have ZERO aliases for it (seriously). If my source control tool has reached the complexity where I feel like I need an alias for commands in it... it's gotten too powerful. And git is definitely not "off the hook" here, it's absolutely got the same deep end, and if you live in that space, sure - jj might be really nice. But I strive to avoid living in that space.

basically: I don't want to do jujitsu, I want to do the occasional somersault and call it a day.


So, as a long-time mercurial users, revsets in jujutsu were a major feature for me. And if you don't want to use them, don't. But if you are looking to treat your VCS DAG as a queryable database they are awesome. And, they are great for avoiding having to chain a bunch of commands together, inefficiently, to get the same effect. Although you still can do that if you really want to. Just like you don't have to use jq to query JSON - you can do terrible cursed things with grep and awk and sed and it'll even work for simple cases. But you might want to give jq a spin - and really there are strong parallels in how they work.


> Basically - the vibe I got from it was: if you're a person who really likes making checklists, or complex tickets with subtasks and groupings and labels - jj is something you're going to like. If you're just interested in writing code and not so interested in source control outside of the ability to occasionally "snapshot this folder"... it's probably not going to be your thing.

This is a bizarre take, as most jj users just take your paragraph above and do a s/jj/git.

The benefit most people find in jj is that you can do stuff easily without having to think much.

There is no separate concept for stash and index (and yet you still have them in jj, and use them without giving them special names).

In principle, there's no real distinction between merge and commit.

You don't need to know the difference with/without --hard for git reset. You just do a "jj undo" no matter what.

Merge conflicts are not stress inducing. And if you're in the middle of an ugly merge conflict, you can just say "Screw it all" and quickly get back to before you did the rebase/merge - just keep hitting "undo" until you get there.

jj literally has a much smaller cognitive overhead than git does.


I also have zero aliases for git, and for jj. (I used to have one joke alias.)

That said: you should use the tools you like to use.


First of all: you do you and as long as you are happy, I am happy.

`jj` is a tool trying to amplify the strengths of git and strengthen its weaknesses. `git rebase` being just one of the many quirky commands. Yes, `jj` requires some rewiring of your brain, but once you get over the initial bump its pretty slick.

Also, I use `jj` everyday exclusively. And I have written `revsets` like 4 times in total.


i mean i can throw a million cryptic git commands at you, too (jj revsets can be arcane, but they're also fairly well-documented and the names are fairly descriptive). git's gotten a lot of usability features over the years, but there's still a ton of stuff that's just confusing. jj ends up being a lot more intuitive in practice IMO, though the anon branch thing does take some getting used to. there's a lot more i'm comfortable doing in jj, without that 'defusing a bomb' feeling complex git operations often had for me.


I assume you don't mean Tangled is an expert martial artist. Can you translate this to not-a-dev-but-uses-git?


They’re referring to the Jujutsu VCS https://docs.jj-vcs.dev/latest/


Jujutsu is a git-compatible version control system


oopsie; should have added links.

`jj` is a wrapper around git and offers a much better dev-ex for managing changes.

it has features like:

- conflicts are first class citizens

- `rebase` is the default mode; there is no need for an interactive rebase mode.

- all descendant changes automatically rebase

- a much more intuitive version of `git reflog`. in `jj`, we have `jj op log`

- cheap branching: branches in `jj` are just tags (or bookmarks) that can be moved around


> `jj` is a wrapper around git and offers a much better dev-ex for managing changes.

You are mistaken there: Git is just one (of currently two) backend of the jj version control system. It’s far from being a wrapper.


Just because `jj` wraps around git doesn't mean it cannot have another backend. My comment doesn't imply that it only wraps around `git`. More importantly, the other backend which `jj` offers is (afaik) exclusively used at Google. Unless you are a Googler you will be using `jj` with `git`.

Also, the comment was aimed at a person who is obviously very invested in `git`. I was doing my best to offer them a description of `jj` they could swallow.

PS: pedantic people are annoying.


jujutsu is a different version control system: https://www.jj-vcs.dev/


This actually looks very useful. Cloudflare seems to be brining together a great set of tools. Not to mention, D2 is literally the only sqlite-as-a-service solution out there whose reliability is great and free tier limits are generous.


D1 reliability has been bad in our experience. We've had queries hanging on their internal network layer for several seconds, sometimes double digits over extended periods (on the order of weeks). Recently I've seen a few times plain network exceptions - again, these are internal between their worker and the D1 hosts. And many of the hung queries wouldn't even show up under traces in their observability dashboard so unless you have your own timeout detection you wouldn't even know things are not working. It was hard to get someone on their side to take a look and actually acknowledge and understand the problem.

But even without network issues that have plagued it I would hesitate to build anything for production on it because it can't even do transactions and the product manager for D1 openly stated they wont implement them [0]. Your only way to ensure data consistency is to use a Durable Object which comes with its own costs and tradeoffs.

https://github.com/cloudflare/workers-sdk/issues/2733#issuec...

The basic idea of D1 is great. I just don't trust the implementation.

For a hobby project it's a neat product for sure.


> And many of the hung queries wouldn't even show up under traces in their observability dashboard

How did you work around this problem? As in, how do you monitor for hung queries and cancel them?

> D1 reliability has been bad in our experience.

What about reads? We use D1 in prod & our traffic pattern may not be similar to yours (our workload is async queue-driven & so retries last in order of weeks), nor have we really observed D1 erroring out for extended periods or frequently.


> How did you work around this problem? As in, how do you monitor for hung queries and cancel them?

You just wrap your DB queries in your own timeout logic. You can then continue your business logic but you can't truly cancel the query because well, the communication layer for it is stuck and you can't kill it via a new connection. Your only choice is to abandon that query. Sometimes we could retry and it would immediately succeed suggesting that the original query probably had something like packetloss that wasn't handled properly by CF. Easy when it's a read but when you have writes then it gets complicated fast and you have to ensure your writes are idempotent. And since they don't support transactions it's even more complex.

Aphyr would have a field day with D1 I'd imagine.

> What about reads? We use D1 in prod & our traffic pattern may not be similar to yours (our workload is async queue-driven & so retries last in order of weeks), nor have we really observed D1 erroring out for extended periods or frequently.

We have reads and writes which most of the time are latency sensitive (direct user feedback). A user interaction can usually involve 3-5 queries and they might need to run in sequence. When queries take 500ms+ the system starts to feel sluggish. When they take 2-3s it's very frustrating. The high latencies happened for both reads and writes, you can do a simple "SELECT 123" and it would hang. You could even reproduce that from the Cloudflare dashboard when it's in this degradated state.

From the comments of others who had similar issues I think it heavily depends on the CF locations or D1 hosts. Most people probably are lucky and don't get one of the faulty D1 servers. But there are a few dozen people who were not so lucky, you can find them complaining on Github, on the CF forum etc. but simply not heard. And you can find these complaints going back years.

This long timeframe without fixes to their network stack (networking is CF's bread and butter!), the refusal to implement transactions, the silence in their forum to cries for help, the absurdly low 10GB limit for databases... it just all adds up. We made the decision to not implement any new product on D1 and just continue using proper databases. It's a shame because workers + a close-by read replica could be absolutely great for latency. Paradoxically it was the opposite outcome.


There is always one thing that bites you because Cloudflare is different. I just built an AI game (sleuththetruth.com) and the primary reason it's so slow to prompt a new board is actually not because of AI latency. It's because CF workers have a limit of 6 connections (including spawned workers). There is no way to gulp down all the wiki images I want all at once. If I had put the backend on Railway I don't think I'd have this issue.


You can farm out the requests to a bunch of Durable Objects. Each DO will have a separate six-concurrent limit. And you can send unlimited concurrent requests to Durable Objects. (This is not an exploit, this is working as intended. The concurrency limit exists to prevent creating excessive connections from a single machine; farming to DOs means the requests are spread out.)

Also note that as of recently, the concurrent limit applies only up to the point that response headers are received, not during body streaming.


Great tip. I knew about #2 which still doesn't help me but #1 is nowhere in their docs!


just keep-alive it with pipelining, depending on the server, 100k+ RPS.


* D1, but agreed. I wish Cloudflare would offer a built-in D1-R2 backups system though! (Can be done with custom code in a worker, but wish it was first-party)


yeah this really sucks.

No downtime snapshots would be the best but I'd be quite happy with a blocking backup on a set schedule that can be set from the GUI / from the cli / from a config file. Its a huge PITA having to play 'trust me bro' to clients and their admins with custom workers and backups.

I currently stream it D1 dump -> worker(encrypt w/ key wrapping) -> R2 on a schedule, then have a container spin up once a day and create changesets from the dumps. An external tool pulls the dumps and changesets.


would https://litestream.io/ be a good solution here?


> For those who don’t use Workers, we’ll be releasing REST API support in the coming weeks, so you can access the full model catalog from any environment.

Cloudflare seems to be building for lock-in and I don't love it. I especially don't understand how you build an OpenRouter and only have bindings for your custom runtime at launch.


Workers runtime is open source and permissively licensed fwiw

https://github.com/cloudflare/workerd


Yes but that is just a tiny part of the whole CF worker ecosystem. The other services are not open source and so the lock-in is very very real. There are no API compatible alternatives that cover a good chunk of the services. If you build your application around workers and make use of the integrated services and APIs there is no way for you to switch to another provider because well, there is none.


Agreed -- except that all of their docs and marketing pitches it for use cases like "per-user, per-tenant or per-entity databases" -- which would be SO great.

But in practice, it's basically impossible to use that way in conjunctions with workers, since you have to bind every database you want to use to the worker and binding a new database requires redeploying the worker.


If you want to dynamically create sqlite databases, then moving to durable objects which are each backed by an sqlite database seems to be the way to go currently.


And now you've put everything on the equivalent of a single NodeJS process running on a tiny VM. Next step: spread out over multiple durable objects but that means implementing a sharding logic. Complexity escalates very fast once you leave toy project territory.


Yeah but the 10GB limit for D1 is crazy, can you really start building on that? Other than toy projects?


Most website content management systems would never get close to that size. If you need a bigger database, D1 is probably the wrong solution to begin with. 10GB can be millions of records depending on your table structure. But if you are gathering some survey data, running a CMS, etc. you probably should be fine with even just a few MB of data; which is probably the sweet spot for D1.


Really depends on what you’re putting in the DB. Cloudflare is clear that these are supposed to be very localized DBs. Per user or tenant.


Per their own docs, D1 is primarily meant for things like Auth DBs that you have frequent read/write access to but that store limited amounts of data. If you need more storage, running Postgres somewhere else and querying via Hyperdrive is probably what you want to do instead.


Turso/libsql has been great for poc project so far


Each of your stacked PRs only has one commit. Do you have any examples with multiple commits per PR in a stack?

PS: I love the concept of tangled. I currently use `sourcehut` but may soon move to tangled.


nevermind, I see what's happening in the UI. Each `jj` change is preserved in the UI and we can see multiple versions of the same change. The stack then is not really a stack of PRs but a stack of changes (where each change has its own history, i.e., the interdiff view). Did I get it mostly right?


yes, thats right! when you submit a branch, you can choose to "stack" it, so the individual commits in the branch turn into separate PRs. these PRs evolve individually, can be merged individually, and be reviewed individually. you can also set different reviewers/labels for different PRs in the stack.


Nothing is insurmountable; however each one of us must play within the practical constraints of our local geographies (political, social, financial and physical). The parent comment probably means that Switzerland is in a positive on all axes unlike the rest of the world.


It’s politics. Boil most things down and the technical is inconsequential when compared to the politics.

Look at the political system of Switzerland and you will see a radically different setup.

And I think that’s the horse. The rest is cart. Yes they are rich but why? Yes they are relatively stable socially but why? Decentralised Canton government structure + direct democracy (referendums all the time for things that matter). That, I think, is why all the rest.


I think there's more to it than that.

From a philosophical perspective, I love the cantonal/direct democracy model. But it's supported by a strong culture of awareness of current affairs, and involvement in the political process. (Of course, these two aspects are likely strongly synergistic.)

However, I'm not sure this unique political structure explains the trains running on time, the sensible choices made about the internet structure (per the article), the top-of-the-world healthcare system, the Swiss cheese science institute, or many other aspects of the broader country. It may partly explain the routinely excellent government bureaucracy (say that with a straight face anywhere else!), the convenient and reliable local public transport options, and the local police being well-resourced to the point of apparent boredom.


Awareness doesn't happen automatically either. During referendums ppl also get flyers explaining the subject, positive and negative things about it

Ppl also recently voted for eid which should reduce bureaucratic hurdles

Imo in many cases public transport problems in other areas are heavily related to corruption


Heh, you were walking right up to my viewpoint and then turned away. A parliamentary democracy with proportional representation has way more influence IMO, and you'll find another couple of relatively well-run countries that work like that.


Yes, I basically gave my vim config along with this blog to Claude and it figured out 95% stuff on its own.


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

Search: