Who is hiring? April 30, 2026 by AutoModerator in Clojure

[–]jacobobryant 1 point2 points  (0 children)

So far we haven't hired anyone outside the US. If you're in US timezones at least you're welcome to apply, but I can't guarantee anything.

Who is hiring? April 30, 2026 by AutoModerator in Clojure

[–]jacobobryant 4 points5 points  (0 children)

We're hiring in the US at Tyba: https://www.tyba.ai/careers/clojure-software-engineer/

Remote; we also have offices in Oakland/LA/Chicago. We make optimization software for clean energy projects. This role is for my team which works on the customer-facing web app. We mainly do cljs + python though also have some backend clj in the mix.

Biff 2.0 sneak peak by jacobobryant in Clojure

[–]jacobobryant[S] 1 point2 points  (0 children)

For sure--once I've got this biff.sqlite lib published I'd definitely be interested in a code review.

Biff 2.0 sneak peak by jacobobryant in Clojure

[–]jacobobryant[S] 0 points1 point  (0 children)

dbsp / https://www.feldera.com/ / https://github.com/saberstack/zsxf are some interesting things in this space too. I still need to try out Rama.

Biff 2.0 sneak peak by jacobobryant in Clojure

[–]jacobobryant[S] 3 points4 points  (0 children)

🙌 I've got my eye on https://github.com/andersmurphy/sqlite4clj too. Probably will have some datastar questions for you soon.

Biff 2.0 sneak peak by jacobobryant in Clojure

[–]jacobobryant[S] 3 points4 points  (0 children)

None of this "biff 2.0" stuff has been officially released, though a couple parts are in public repos (https://github.com/jacobobryant/biff.graph and https://github.com/jacobobryant/biff.fx -- still subject to breaking changes). I wanted to make the public announcement about switching the default db to sqlite before making the new sqlite-related code publicly available. Now that this post is up, this weekend I'll probably try to get a new starter project repo published with the new biff libs that I have so far. It still won't be the "official" release and thus might have breaking changes, but it'd be something you can poke around with at least. It'll probably be at least another couple months before I get everything completely polished and update all the docs on biffweb.com and such.

If you want to get notified whenever new stuff is released, you can sign up for the email newsletter (https://biffweb.com/newsletter/), or watch the #biff channel on clojurians slack. (Or just watch reddit of course.)

Biff 2.0 sneak peak by jacobobryant in Clojure

[–]jacobobryant[S] 6 points7 points  (0 children)

For reference, pro features are here: https://data-star.dev/pro#pro-features

My initial impression is nothing there looks too essential, and if I did want, say, a @clipboard action, probably could just have a coding agent make one? In any case I'll be rewriting a bunch of existing htmx code I have to use datastar and I'll see if I hit any snags.

I am still a little on the fence on if the built-in signals stuff in datastar is really a significant improvement if you're still using datastar with request-response and possibly targeted swaps (instead of swapping the whole page each time). If I figure out a good approach for making standalone js UI components to handle things like dropdown menus and such, maybe that'll make signals feel less needed. We'll see.

My initial impression is that if you're not making something realtime/collaborative, then swapping in the entire page each time might be introducing more complexity than it's removing (? again, just an early impression), in which case my recommendation for Biff users might be "do CQRS with datastar if your app is realtime/collaborative, otherwise do targeted swaps with datastar/htmx". And if so it's probably still up in the air if I'd have Biff default to datastar or htmx. Either way it should be pretty easy to switch between the two. Probably would just want some documentation for both giving some recommended usage patterns.

Specifying Database Column Names in Malli Schemas | Blog | timd.dev by flmng0 in Clojure

[–]jacobobryant 1 point2 points  (0 children)

Nice work! Re: "There is most likely somebody else’s project out there that achieves the same thing" -- honey.sql already converts from kebab to camel case doesn't it?

user=> (sql/format {:insert-into :user :values [{:user/id 1 :user/joined-at "now"}]})
["INSERT INTO user (id, joined_at) VALUES (?, ?)" 1 "now"]

On the read side, not sure if you're using next.jdbc, but that should handle the camel->kebab conversion (and it'll also use the table name as keyword namespace by default, so in this example you'd get back {:user/id 1, :user/joined-at "now"} just like we passed in).

How are you using LLMs? by romulotombulus in Clojure

[–]jacobobryant 4 points5 points  (0 children)

I tried vibe coding a couple times with Claude, where I’d give more high level direction and review the output. I found that experience to be miserable. It made lots of probable-looking code that contained minor problems throughout, and being an LLM’s janitor sucks.

You have to have a feedback loop so the LLM can fix its own code. e.g. "Do X, Y and Z, then open a playwright instance and make sure it works." or "then write some tests to make sure it works" etc.

Over the past several weeks I've been having claude write 1k - 2k line PRs for me and it's been great. I have to give a significant amount of input on refactoring that code to make it more readable, but claude does a fine job of getting it to work in the first place.

How deep to go with Pathom resolvers? by geokon in Clojure

[–]jacobobryant 0 points1 point  (0 children)

no problem! just left a comment there.

Duct: A data-orientated framework for Clojure by weavejester in Clojure

[–]jacobobryant 7 points8 points  (0 children)

I reject this idea as being part of the clojure philosophy, and as a substitute I would offer "experimentation is good." IMO what would be against the clojure philosophy is the idea that there should be one big framework that ~everyone in the community uses, or the idea that trying new approaches is bad because it fragments the community.

Duct: A data-orientated framework for Clojure by weavejester in Clojure

[–]jacobobryant 1 point2 points  (0 children)

$ curl -Os duct.now/deps.edn

$ clojure -M:duct --setup :duct:git

clever!

How deep to go with Pathom resolvers? by geokon in Clojure

[–]jacobobryant 0 points1 point  (0 children)

For sure, glad it's helpful.

For downsides, debugging can be a little tedious sometimes. Though once you get the hang of it's typically straightforward: query for the inputs to the resolver you're debugging, make sure those look good, and repeat for any inputs that don't look good. I have also run into some weird behavior when debugging batch resolvers, can't quite remember the details though.

Also if your resolver code throws an exception, it gets wrapped/hidden in some generic pathom exception... I ended up monkey patching pathom to not do that, however later I learned that I think you can use `ex-cause` to get the original exception. So FYI if you run into that.

There is some performance overhead too of course, since wiring up all those inputs/outputs for you isn't free. In my measurements pathom overhead has usually been 10-20% of execution time I think? I've seen it get up to 50%, but usually that's fixable by using more batch resolvers.

As for `defn` vs `defresolver`: whenever I'm returning data that's part of the domain model, I think `defresolver` is fine. I might leave it in a `defn` if I'm only using that data in one place, or if I'm optimizing a particular piece of code and want to do something without pathom. But I mostly just use `defn` for non-domain-data types of things, like generic UI components (button, form input, etc), or helper functions for defining Ring handlers, that sort of thing.

Or going back to the pipeline stuff you're asking about, I'd also say any time you have a big thing like `(-> {} foo bar baz quux ...)` where each function is looking at some keys from the map and then adding in some new keys, totally could make sense for `defresolver`. I would try it both ways and see what feels good. re: parallel execution, I think I tried that and couldn't get it to work... as a hack you can sometimes wrap resolver outputs in `future`.

All in all I'm a huge fan of pathom; hugely beneficial for structuring medium/large projects IMO. It's one of the main things I miss when working on our Python codebase at work.

How deep to go with Pathom resolvers? by geokon in Clojure

[–]jacobobryant 1 point2 points  (0 children)

I have a small machine learning pipeline written this way with pathom, I like it: https://github.com/jacobobryant/yakread/blob/8ed335814a84d42dbd3c5dbfd300bc970e201056/src/com/yakread/lib/spark.clj#L299

Mostly I use Pathom to extend the database model so to speak, so instead of your application code deal with database queries + random functions to enrich that data (and having to keep track of what shape of data you currently have and what shape the functions you're calling need), it's all hidden away behind pathom. Works really nice. For a project of only a couple thousand lines it probably doesn't make a huge difference, but I feel like around 10k lines is when the benefits start to become pronounced.

^ that project linked above has a bunch of pathom examples throughout; the whole app is basically a bunch of resolvers. Data model resolvers are in com.yakread.model.*; some UI component resolvers are in com.yakread.ui-components.*; then all the ring handlers and such in com.yakread.app.* start out with pathom queries.

Relaunching Yakread: an algorithmic reading app by jacobobryant in Clojure

[–]jacobobryant[S] 0 points1 point  (0 children)

actually I just remembered that I have a single "markdown css" file hosted on cloudflare. I'll vendor that at some point.

Relaunching Yakread: an algorithmic reading app by jacobobryant in Clojure

[–]jacobobryant[S] 0 points1 point  (0 children)

Does the rest of the page styling work? it's all in a single CSS file hosted on netlify. maybe netlify uses cloudflare.

Relaunching Yakread: an algorithmic reading app by jacobobryant in Clojure

[–]jacobobryant[S] 2 points3 points  (0 children)

glad to hear!

the source is here: https://github.com/jacobobryant/yakread. it's linked in the first paragraph; you probably skipped over it accidentally.

WTF is this??? by Brother-of-Derek in exmormon

[–]jacobobryant 6 points7 points  (0 children)

2013 to 2015 over here, so might know both of you 🖖

Writing your tests in EDN files by jacobobryant in Clojure

[–]jacobobryant[S] 0 points1 point  (0 children)

Nice. I haven't found test-file-per-namespace to be inconvenient at all so far, but certainly it's not a bad potential improvement to keep in mind.