Not sure, but my guess would be Component since it's the oldest (also has 1.8K stars on github vs. 1K for Mount and 700 for Integrant).

@paulg @ShaanVP I read Medieval Technology and Social Change after seeing it on pg's website. Great read. Horse stirrups, who knew?

I didn't quite grok the third section tbh, but I guess I'm in good company with the people discussed in the book.
1. Don't write any tasks down
2. Your brain will automagically forget the unimportant tasks

You're welcome.

(Works well for scheduling and issue tracking too)
Also: I wish substack was better for editing code samples.

Yes, I found that understanding functional programming helped a lot while in college (even though most of the projects required using OOP languages). Ditto for after college. Clojure will indeed give you a great foundation for programming. It helps keep your programs simple and easy to understand.

Don't know about competitive programming. The skills needed for competitive programming are much different than for most other programming domains--especially since competitive programming problems are relatively short, not ongoing projects. IMO Clojure really shines in helping you not lose your sanity as you grow a project. Can't hurt to try Clojure for competitive programming, but I'm not confident you'd have any advantage over someone using e.g. Python.

@metasoarous I sing while I code sometimes. (one of the many benefits of wfh)
@tobi @patio11 @patrickc E.g. user A posts lots of cat pictures because lots of people like cat pictures. But you always dislike cat pictures, so user A's SEO attempts make you less likely to see their tweets
@tobi @patio11 @patrickc I think this would only be a minor problem as long as the adjustments are personalized. imo SEO is a bigger problem for search since everyone gets more-or-less the same results.
Crux is good, and it has a file system storage option.

Thanks for catching that--I'll update the post soonish. I modified the code in the article a bit for clarity after testing it so it probably slipped in then...

The most learning-filled times of my life have been 1) before college, 2) the two years in between community college and BYU, while I was an LDS missionary, 3) after I graduated, worked for a year and then quit my job.

It's horrible that many people can't leave the system.
(I was homeschooled and my mom let me be autonomous. e.g. by high school, I was grading my own math tests. great for programming too--I would spend several weeks working on a project when I had a cool idea, and after it was done I'd catch up on my other subjects)
Each time I've filled out the YC application and get to the hacking question, I always think about that comic.

I mean, I'm like, a non-conformist and stuff too. But I just can never think of good stuff to put down. Maybe it's cause I had lots of freedom as a kid.
Now, if ESR's article had actually been about what I thought it was about, would I have become a leet teenage hax0r?

This pretty much sums it up:
I opened it out of morbid curiosity, and then of course discovered a completely knew meaning of the term "hacker". At the end of that document I found links to pg's essays, and I've been hooked ever since. The two main parts of my career (startups + clojure) are a direct result.
Of course there were lots of forum posts by people pretending to be leet hax0rs, but very little on what I was looking for.

One article stood out though: "How to become a hacker" by Eric Raymond. I was taken aback. It seemed so blatant.
So I bought a device that let you actually write the hacks yourself. At the time I had been coding in VB6 for a few years (my dad introduced it to me) but I had no idea what assembler was. I started googling stuff like "how to hack action replay DS"
At some point I had bought an Action Replay which lets you install and use cheat codes that people wrote in assembler. Unfortunately there wasn't a code that let me get past the deck limitations.
It's kinda funny how I found pg's essays in the first place actually. It started because I was playing Yugioh on my nintendo DS, but the game had overly restrictive rules about how many of which cards you could have in your deck.
Also, there were a ton of signups last week: up from 45 to 103!

After ~10 years of reading @paulg and 1.5 years since quitting my job, it feels surreal to finally have something growing--even though it's still in an early phase.

I like that idea. At one point I implemented something similar. The handful of papers I read that covered time with reference to music recommendation referred to it as "freshness" (e.g. the longer it's been since you heard a song, the higher the freshness is => the more likely you are to want to listen to it). Typically the papers used a forgetting curve to model it. For example the freshness of some song could be e^(-t/S) where t is the time since it was last played and S (memory Strength) is a constant parameter. That just involves the most recent time the song was played, however, I used previous time data to pick a different value of S for each song. e.g. take the past 10 like/dislike events, plot them against the forgetting curve with likes at 1 on the y axis and dislikes at 0, then fit the forgetting curve to the points.

It worked somewhat ok. I have a feeling that the forgetting curve is too restrictive of a model though (it was never really validated in any of the papers I read--basically one guy in the early 2000s thought it seemed reasonable, and everyone since has gone with it). I'd be interested to see if I could figure out a more general machine learning model that could work with time data and learn patterns like the one you've described.

Since I'm obviously a bit of a dunce: any way to edit titles on Reddit? :)

Also, a little extra background: this is the latest iteration of my startup. I posted here a while ago about the previous version when I was just working on music recommendation. I decided to switch to general-purpose/cross-domain recommendation since I thought it would be a lot easier to get started (and it could lead nicely into doing more music-specific stuff down the road).

Also just posted: A Recommender System In 30 Lines Of Clojure
Newsletter just went out. It introduces an exciting new (well, sorta) project I've been working on:
Great video. I watched it about a year ago and it really helped me start to grok Datomic. I've built several apps on Datomic since, and it's really nice. For anyone who wants to try it out, I'd also recommend taking a look at Crux[1]. It's a bit easier to get started with. I'm in the process of moving my startup over from Firebase to DigitalOcean + Crux right now.


What's the most popular thing on Findka? This video, with 8 likes and 0 dislikes:
Here's something Findka just recommended to me:

It appears to be a manual for building your brand as an individual creator, which I think is a pretty important topic. I've put it next on my reading list. recommendations just went out to 45 people. After six weeks since launch, it's exciting to see the recommendation algorithm adapt as it figures out which content is worth showing to people.

Take a look at This is an example project I released last week that uses a ClojureScript frontend + backend (running on firebase). It's a great way to build an app. It uses only a tiny bit of Clojure, just for generating the html files.

I'm planning in a while to add more documentation that explains how it works a piece at a time, but for right now it's at least a good reference example of a complete app.

here's a better gif. Besides being unexpected and forcing you to wait for the animation before typing in your search query, the button tricks you into thinking the search field is blank. So you start typing but then realize that in the drop down, your last search is still there
@nikitonsky do you take suggestions for This is one that irritates me to no end
A Brief History of Agile

Wrote this a couple years ago, but very relevant.
Ah, brings back memories. I still have my card collection somewhere... think it's at my parents' house.

I had a lot of fun playing Nightmare Troubadour (a DS Yugioh game). It was early enough to not be completely nerfed by the advanced format, so there were lots of really fun decks you could build. My favorite was a one-turn-kill deck that involved sending a bunch of cards from your deck to the graveyard and then playing Reversal of Graves. Usually it failed miserably, but once in a while it won spectacularly.

It almost makes me want to go see what's out there in terms of online TCGs.

For someone new to Clojure but used to vim, I see no reason not to start out this way and then try out other methods later. Worked great for me.

@Endless_WebDev I'm being 100% serious. I'm ordering an ethernet cable today because an update to my Mac broke the wifi. Quite frustrating. But my Arch Linux install never breaks.

+1 for tools.deps. It's pretty easy to roll your own build tasks also which makes it good for this kind of thing. I wrote a build task that takes a config file for a mono repo ( and splits the code into a bunch of library artifacts.

For me, zoom consistently has far better A/V quality than hangouts.

So we have two anecdotes now I guess.
Deployed at

I've recorded some commentary on the architecture of this project. The most interesting part is at 25:42, where I explain how you can specify declaratively which Firestore subscriptions the app needs based on its current state. The way it's set up, I think it would be straightforward to replace Firestore with Datomic or Crux as well, which I might experiment with soon.

I started developing this as an example project for my Solo Hacker's Guide To Clojure series of tutorials, but then last week I decided to just get all the code done first. Now that the code is done, I'm actually wondering whether it's all that necessary to continue writing tutorials--maybe the time would be better spent just writing more example code like this project. Thoughts appreciated, especially if you're learning Clojure right now.

That is in fact how it works. You can retrieve the spec registry with `(s/registry)`.

tortilla chips + "melt-in-your-mouth" => must be an A/B test

Mine does:
Super early stage; just launched it about 3 weeks ago, ~8 weekly active users.

I'm actively working on a series of Clojure(Script) tutorials that use the board game Clue as an example project:

It's not very far along yet, but I'm planning to put a lot of work into it throughout this week (and continuing steadily thereafter).

Actually instead of imagining, try it out. I did that and discovered @memrise. It was great since I had been wishing for a better way to learn Chinese (my wife's from China).

And if it works for you, try out --since that's the kind of thing Findka does :)
*Imagine, not image
Image taking a sample of 20 people from your friends on Twitter. Ask them each to select 3 things they like that not many people know about. What are the chances you'd find something awesome that you had never heard of before? Pretty high is my guess.
Now I've taken a simpler approach: users manually select content items they like using a search bar. That's the only source of recommendations for other users.

This turns out to be more effective, since--even though there's not much data--the data we do have is high quality.
The other surprising thing is the way Findka ingests data. Before the recent overhaul, I had all these integrations that e.g. imported all the videos you had liked on youtube--you'd connect it to all your other accounts so that Findka would have tons of data to work with.
2. usually narrowing your focus means that you do less work--but the marginal effort of supporting multiple content types in Findka is 0. The recommendation model currently doesn't even take into account content items; it's pure collaborative filtering.
Narrowing your focus is usually helpful because you can bring more value to the people you do reach. But 1. /the whole point/ of Findka is that you can get multiple types of content all in one place (convenient) and we can make cross-domain inferences (effective)
*but it doesn't always apply
When I tried out @pioneerdotapp for a few weeks, many peer reviewers said "don't do a general-purpose recommender system, pick one category--like podcasts--and then move into other categories later."

Narrowing your focus seems like good advice, it doesn't always apply.

Having to do nested SELECTs are the main thing that comes to mind--I find that datalog queries stay much flatter/cleaner.

I hadn't seen that until now (I assume you're talking about deg/re-frame-firebase). But yeah, you could partially describe it that way. Besides not being tied to re-frame, trident.firestore is also just for the database, whereas re-frame-firebase covers other features (looks like mainly authentication).

That repo links to crisptrutski/matchbox which I also hadn't seen. Similarly, I'd say the main difference is that trident.firestore is much more lightweight and focused (the whole thing is only a couple hundred lines of code).

Ah, I guess they just started out with some of the same people but are two separate projects.

"This work originated at ETH Zurich's Systems group, in collaboration with Frank McSherry and Prof. Gustavo Alonso." (

These are the same people who are/were working on reactive datalog. Presumably they went with SQL because it's more profitable. Hopefully datalog will come later. Frank McSherry had another Twitter thread about translating datalog to SQL, but apparently it's a hard/unsolved problem.

For implementation--haven't thought about it very deeply yet, but I was thinking that you'd write some config code that says "any entity with attributes A, B and C belongs to table X (which includes optional attributes D and C)." then whenever you get new datoms, you could query the entities they're part of and decide which tables to modify. I should take a look at the analytics/SQL query feature that Datomic has now and see how they translate things to tables.

I haven't played with it yet, but I'm hoping to next week. They're understandably marketing it mainly as an enhancement to OLAP right now. I'd love to try hooking up Datomic's transaction log to it.

RT @frankmcsherry: Big news! Like, REALLY big news.

We're popping the lid on @MaterializeInc today. You can check out our sweet new web pa…
@gavri_birnbaum @ycombinator I'd love an answer to this. I'm currently planning to apply in 1-2 weeks after I have some important features out.

Haven't tried it--but I'm glad you linked it. I had heard about EntityDB, part of Keechma, a while ago, I think on ClojureVerse. I hadn't been able to find it from searching though.

In looking through the rest of the docs, Keechma looks really interesting to me. I'll probably take a deeper look as I work on the guide.

I've also made some updates to the parent article (posted here last week).

You don't have to deal with record labels for one thing.

I had a conversation once with someone who was doing a music startup for a while. He said his startup pivoted to podcasts (specifically for executives/business people) because it was easier to make money.

It is a little subtle. For small things they're isn't much difference, but I like that Rum is decomplected from ratoms, and rum's mixins felt more straightforward to me than using form-2 and form-3 components in reagent. I felt like I had a complete understanding of rum after going through just the readme, whereas I remember having to search in lots of different places to find various documentation for reagent. Part of the reason for that is probably because the reagent documentation has to cover ratoms. As for Vue, I haven't used it myself, so I don't know if "mixin" means the same thing in that context or not.

I just used the official docs myself (lots of time staring at the query reference), but I've seen people recommend

That seems a little off to me--I acknowledge that crux and Datomic are quite different, but they have a lot more in common with each other then they do with rdbms etc

@DanTheMercer @KialoHQ Woah, Kialo looks super cool! Never heard of it before.

Yeah I like it a lot! It's funny; when I first saw it a while ago, I dismissed it without much thought because it used macros to define components and I thought mixins looked weird. ("In Reagent, components are just functions--so simple!"). I changed my mind after actually going through the readme.

I prefer rum over reagent as it's simpler and easier to grok IMO. Also for re-frame, I think the core concepts can be taught with less surface area--derivatives for derived values and probably a roll-your-own event-handler for effect isolation. (I'm planning to take a closer look at citrus also). Then re-frame can be mentioned for additional learning.

Ring: definitely. Compojure: planning to use reitit; I like the data-driven routes a bit more. Datomic: I am leaning more away from crux now that I think about it more (other thread).

Thanks for the offer! I think the most helpful thing would be code review. I'm planning to develop a full-featured app along with the guide; each section will start out with a link to a particular branch of the app on github, so readers can jump in to the source if they like and use the article for support. I can message you periodically when I push code if you don't mind.

It's possible that my thoughts on the importance of code/data locality are colored by my work on music recommendation. The algorithm I devised uses quite a few queries and needs to run fast since it runs during the user's listening session, and the locality did make a difference there. You make a good point; it probably doesn't matter for most applications. I'll test it out when I get to that section. Using plain datomic cloud would make things a lot easier for sure.

Although bitemporality isn't likely to be needed much in solo projects, Crux is still designed to be a general-purpose DB, no? In any case, even if I don't go with plain Datomic Cloud, I was thinking last night that I'd probably prefer Datomic On-Prem over Crux anyway as it's more featureful and the no-free-updates-after-12-months thing probably won't be an issue in most cases.

Got it. Yeah, I'm going for a large (broad, really) scope since I think that's the main thing that's missing - a roadmap of how all the pieces fit together. To compensate I'll be writing the whole thing breadth-first rather than depth-first.

Trying to understand your suggestion better--are you just saying you think the scope is too large? And better to focus on a slice of the outline I've given?

In general I'm intending for this to be fairly high-level. So I'll be giving direction on what things to learn and how to put them together, but for actually learning the individual things, I'll probably just give links to existing resources most of the time.

Ideally, by the end of the guide, readers are then familiar enough with the ecosystem that they can continue learning + mix and match libraries as they like without much guidance.

This is basically just an outline of a course I'm planning to write. I think one of the main downsides of Clojure is just the amount of time it takes to get up to speed with it. So I'm trying to help out with that.

Yeah, I'll throw a mention in. That part was mainly a joke, though I am fairly set on vim myself.

thanks for letting me know, I'll fix that.

@paulg My favorite one: embrace, extend, extinguish

Sorry about that. I did read the rules before posting, a few times--could you clarify how this is a violation? Are you worried that I'm shilling? Or is it a violation simply because it links to a service targeted at founders (so it is technically advertising, although I'm not affiliated)? If the latter, I'd recommend clarifying that in the rules.

I'm thinking about trying it out, but ~$500 up front feels a little to steep just for joining a club. On one hand maybe it helps as a weeder, but it also reminds me of honor societies in college (I.e. not much real value provided, just trying to make you feel prestigious so you give them money).

So if anyone has actually joined it, I'd love to hear what you thought about it (and some background info about you + your startup for context).

The only review piece I've been able to find on it so far is this article: is pretty good also.

I worked full-time on algorithmic music recommendation for about 5 months last year[1] (started working on it as a side project in 2016). I've always thought that, ultimately, an algorithm should be the best--after all, you can have it use human-curated data as an input. While my algorithm isn't amazing, it works far better for me than Spotify or Pandora ever did, so I've been using it myself regularly. I pivoted to a general-purpose recommender system idea[2] last november, but I'd love to go back and work more on music later on.

(Music was just too hard to get started in--I spent far more time trying to find a way to integrate my algorithm into playback sources than actually working on the algorithm)



Weeklyish update on Findka: 10 integrations down, 1 recommender system to go
Example of what the result of that looks like:
Integrations for Findka are finally done (for now). There are integrations for Pocket, Spotify, Youtube, Reddit,, Twitter, Hacker News, Github, Goodreads and RSS. Pocket is a catchall: you can use it for non-article items by setting a tag (e.g. "podcast")

yeah, it never hurts to just give it a try. I think it depends on how much you like to roll your own stuff too. e.g. before I tried fulcro, I didn't even like re-frame that much--I preferred plain reagent. I did like a lot of the ideas behind fulcro, I just didn't need all of it... and the parts I did need, I felt like I could re-implement them (while tailoring the implementation to my specific project) in much less time than it would've taken me to do it with fulcro.

little side note: all content imported with Findka is published in Atom/RSS (e.g. Fairly soon I'll start working on the recommendation/content discovery portion of Findka, which will also integrate with RSS. No need to wait around for @bluesky ;)
Just finished an integration for... twitter!

I haven't, mainly because of this:

"The whole point of Fulcro is to manage the complexity of large apps, not to make small apps simple/easy. So there's a threshold of app size/complexity below which it doesn't make sense to use Fulcro. At the very least, I simply misjudged where that threshold is."

So to reiterate, I'm not saying Fulcro is bad, rather that there's overhead, and the overhead turned out to not be worth it on my current project. My experiences don't give much insight about how fulcro fairs at keeping large projects sane, which is Tony's focus.

@AdriaanvRossum @tiktok_us It's all good! Thanks for building simpleanalytics, I'm looking forward to trying it out :)
@AdriaanvRossum @tiktok_us (I can't even sign up with gmail, so I'm guessing something else is wrong and it's just a bad error message)
@AdriaanvRossum @tiktok_us ;)
(This is from an incognito chrome window)
@beders s/you linked/you replied to/
@beders For now, the closest stable approach I can think of is what I described in the post you linked, and for experimentation, factUI I think is a better path than datascript. See halgari's comments on

If factui had pull expressions I'd be extremely interested
@beders Datsync is alpha/experimental. Interesting as a research project but I wouldn't use it in production. When I tried building an app with Web After Tomorrow architecture, I ended up rolling my own sync (
@beders Posh uses heuristics for refreshing queries, so it can be unreliable (I ran into that). AFAICT only good way now to drive a UI with datascript is to either refresh all the queries on every change (not scalable) or set up a tx listener and refresh queries by hand (a bit low level)
Have to wait for Youtube's stamp of approval though; for now, the integration is limited to the first 100 users (and there's a warning screen in the oauth flow).
It's actually kind of cool to see the chronology of my essays and videos together (though a few of the guitar covers do make me cringe a little :) )
Just finished a youtube integration for findka. so on you can now see videos I've uploaded on the left and videos I've liked on the right, mixed in with all the other content.

This started out as a generic blog post but (unsurprisingly) ended up with a lot about Clojure (the two middle sections), so here it is.

Thanks for the repost :)

I should rewrite the readme - when I first created this repo, I was abstracting a bunch of code from the framework thingy I described here. Since then I've launched two other apps, but not really using the same approach (from the trident.web ns).

I do still use trident all the time though; it's just a place to put any code I write that I might want to use in multiple projects. I've set it up so it's easy to split the code into separate artifacts based on dependencies--so even though trident has a lot of different stuff in it, you shouldn't have to take in unwanted dependencies to use any given ns.

The parts I use the most are:

Apparently it can result in problems with upgrades:

However I have been thinking about this, and I would like to try it at some point.

I'd be down to write a tutorial on this. Short answer is use % to jump between parens and = to re-indent an sexpr (E.g. After visually selecting it with v%). Combined with the rest of vim's (more common) editing features, that works great. It's very fast and (unlike paredit/parinfer) never gets in your way.

(also, learn how to use fireplace to execute code from within vim)

I thought seriously about learning emacs since so many people recommend it, but I decided not to after reading this: His comments on tabs and buffers/windows especially stuck out as that's a critical feature for me in vim.

If you're only mildly in to vim, sure give emacs a shot (and cursive!)... But otherwise, I don't buy the "just learn emacs" argument :)

In the past I had used Planck a few times for scripting, but lately I've been getting an error whenever I try to run it. So I tried Babashka this time and it really is 👌

The root of the issue is, I believe, that I'm using Datomic's solo topology for production which is unsupported. However, the production topology has a 10x price increase (for the EC2 instances) and I'm just a solo dev, so I'm making do.
You can always take the Benjamin Franklin approach:


The Bearer of this who is going to America, presses me to give him a Letter of Recommendation, tho’ I know nothing of him, not even his Name. This may seem extraordinary, but I assure you it is not uncommon here. Sometimes indeed one unknown Person brings me another equally unknown, to recommend him; and sometimes they recommend one another! As to this Gentleman, I must refer you to himself for his Character and Merits, with which he is certainly better acquainted than I can possibly be; I recommend him however to those Civilities which every Stranger, of whom one knows no Harm, has a Right to, and I request you will do him all the good Offices and show him all the Favour that on further Acquaintance you shall find him to deserve. I have the honour to be, &c."

@dustingetz @djwhitt With tmate you don't need to set up the shared server, just run tmate on your local machine, and it outputs an ssh command that others can use to connect to your machine.
@JohnFis87569576 @paulg I use Clojure full-time, and I think Lisp is as relevant as it's ever been.
Actually, this is where it would get really interesting--I may not have the energy to fully research a topic myself, but I could publish what I think so far and be open to pull requests.
I think which wrist you wear your watch on is not (directly) related to handedness. I'm right-handed and started out wearing my watch on my right wrist since I was fairly young and didn't know that was uncommon. Many years later I tried switching to my left wrist. It felt weird at first, but it didn't take long to adjust. Now it feels weird to have it on my right wrist.

(It's also nice to have it on my left wrist while I write etc).

Here's one I did recently: (aggregate all the content you like on your personal website).
I've recently started working on a general-purpose recommender system that uses Atom/RSS feeds as the main data source. So now I'm trying to make it easier for people to generate those feeds, hence this article.
Shameless plug: I've recently started working on a recommender system/search engine built on RSS/Atom feeds (
> Hackathons in and of themselves do generally have structure. But what I’m referring to here is a structure that integrates innovation into your day-to-day, versus one day a year. If you’re going to infuse a culture of innovation throughout your organization, you’ll need to keep at it. Otherwise, it’s like going all out at the gym once a year in pursuit of physical fitness. You won’t see nearly the same results you would if you make it a consistent, regular habit.

Perfectly sums up how I feel about hackathons. I'd rather have a little time every week to work on whatever I want rather than binge once a year.

I like it a lot. Simple, works great. Examples (these snippets are highlighted for bash and clojure):

Here's how I would do it, given the vector of parsed maps:

``` user=> (def cats [{:name "Toonces" :skill "driving" :age "7"} #_=> {:name "Garfield" :skill "sleeping" :age "10"}])


user=> (first (filter #(= "Garfield" (:name %)) cats)) {:name "Garfield", :skill "sleeping", :age "10"} user=> (defn coerce [x] (update x :age #(Integer/parseInt %)))


user=> (map coerce cats) ({:name "Toonces", :skill "driving", :age 7} {:name "Garfield", :skill "sleeping", :age 10}) user=> (defn coerce [x] #=> (-> x #=> (update :age #(Integer/parseInt %)) #_=> (update :skill keyword)))


user=> (map coerce cats) ({:name "Toonces", :skill :driving, :age 7} {:name "Garfield", :skill :sleeping, :age 10}) ```

EDIT: and the first part can be done like this (modifying your code slightly): ``` user=> (require '[clojure.string :as str]) nil user=> (require '[ :as io]) nil user=> (defn parse-cat [line] (zipmap [:name :skill :age] (str/split line #" ")))


user=> (def cats (with-open [rdr (io/reader "foo.txt")] (mapv parse-cat (next (line-seq rdr)))))


user=> cats [{:name "Toonces", :skill "driving", :age "7"} {:name "Garfield", :skill "sleeping", :age "10"}] ```

At least, that works if your file is space-separated, e.g.: name skill age Toonces driving 7 Garfield sleeping 10

Also, you could combine the parsing and coercing with comp: (def cats (with-open [rdr (io/reader "foo.txt")] (mapv (comp coerce parse-cat) (next (line-seq rdr)))))

This is the source for my personal website. I originally wrote it with Hugo. I'd been wanting to rewrite it in Clojure for a while and finally got around to it this week. I'm very happy with the result; it's much more minimalist (and easily extensible!) than the old setup.

Lucid probably spends more on sales ;)

(former employee)

My favorite instance of this was Mailgun, who html encoded the apostrophe, and then html encoded the resulting text.

O'Bryant -> O'Bryant -> O'Bryant (screenshot:

> I don't think that really impacts practical discussions of death.

Thanks! hm... my recommendation for both ions and the trident/flexbudget architecture is an extremely tentative "maybe."

Ions can be pretty finicky, at least until you figure out all the gotchas (I should write another post about this). I think they're good if either 1) you're building something serious/long-term (I'm doing this with my current startup), or 2) you want to use the project as an opportunity to learn more about Datomic (which is what I did with FlexBudget). If you're building a simple project and are thinking that ions will make it simpler, I wouldn't count on it. Firebase's document db would probably be better (as much as I'd hate to trade datomic for a document db). Or maybe simply datahike on a digitalocean instance.

I'm not using the datomic<->datascript sync for anything serious, just flexbudget. I'd only recommend it if experimenting with that kind of architecture is interesting to you as an end in itself. Lately I've actually been more interested in learning Fulcro myself.

On the other hand, if your app doesn't need to fetch any data past the initial page load, the flexbudget architecture might actually work out nicely. e.g. the entire backend for flexbudget, not including the generalized trident code, is <100 LOC:

If you decide you do want to experiment with ions/trident, feel free to email me! I might be able to give you a few pointers here and there.

Yeah, I and another guy worked on a startup together for a few months trying to do this as a backend-as-as-service (firebase but with Datomic instead of a document db basically). I ended up bailing after a few months, and I think my ex-cofounder moved on too, but I did take some of the ideas we worked on and made a budgeting application with it: (see the last couple sections especially).

Agreed, though I think it'd need to be more accessible for that to happen. e.g. I'd love to have a lite version of datomic that runs on firebase. Something like that would be a much better on-ramp for small projects than the current offerings.

I've been wondering lately if you could somehow layer datascript on top Firebase's DB while having reasonable performance. It'd just need to be good enough that you could use it until switching to Ions made sense.

Performance. With parens, if anything rendered in `MyComponent` changes, the parent component will also be re-rendered. With square brackets, `MyComponent` can be re-rendered individually.

"As a startup, process speed and transparency are your secret weapons when competing for candidates with large companies."

Amen. I've known people who got through Google's interview process, but even then the response is "Great job, we'll let you know within a few months if there's an opening on a team you can join."

Not a great response when you're graduating soon and you've got concrete offers from other companies that will expire.

From the article: "In retrospect, I think our test was a bit longer and more difficult than ideal. If I were to do this over again, I would design the test to take about 4 hours."

Seems reasonable to me.

Hi, a little shameless self-promotion/request for feedback. I've been working on a music recommendation algorithm for a while. Short demo: It's meant to be used in basically the same way as Pandora--i.e. mainly hands-off, you just listen (and skip songs you don't want to hear) while the algorithm picks which songs to play. Question: based on the demo, would you want to use something like this if the algorithm worked really well? (It is launched already, but it's not easy to install right now). If I can get a little traction with this, I'm hoping later to build a streaming service on top of it specifically for indie artists (i.e. with a business model that helps them make more money vs. other streaming services. Happy to chat more about that if anyone's interested).

I'm a big fan of Firebase (Firebase when I can, AWS when I have to). Right now I use it for auth and hosting, but I'll keep this article in mind. I'd be interested to try out cloud functions some time.

A lot of (most?) of the benefit of macros comes not from writing them yourself, but from using macros that others have written. Even if only 5% of the people are writing macros, that 5% likely includes many library authors. Making it harder for them impacts their downstream users too, even if those people aren't actually writing macros.

IMO the macros in Clojure make it easier for library authors to produce KISS, high-level interfaces for the rest of us.

For me, as an early stage startup founder, I'd prefer SaaS. At this stage I don't want to have to think about anything that could've been handled for me. At a later stage I might prefer self-hosted, but not sure.
I use firebase for authentication and have been quite happy with it, but if this provides better integration with mailing lists out of the box, that would be compelling to me. Although I use firebase for authenticated users, I also have a mailing list sign up form with just an email field. I ended up creating my own confirmation email flow because I needed it to work for both people who created an account and people who just used the email form. It would've been nice not to have to do that.

thanks :)

By the way, if you do brew install mpc, you can then do mpc toggle to play/pause and mpc next to skip (I added that to the docs after you went through the install process). Alternatively, you could do pip2 install Mopidy-Iris and then go to http://localhost:6680/iris to get a graphical UI

I'm using the cheapest topology, solo. I'm paying ~$35/month, though that includes a few things like domains I've got on route53. I'm also serving two different apps from the same datomic system fyi--it's quite easy to do so actually. So I think the price isn't bad, even if you're just planning to use it for hobby projects. $30/month/project would be a little much, but $30/month for all your projects is ok for me.

For learning datalog I just used the official getting started guide ( it might be simplest to start out with datomic free (i.e. the in-memory version) since you can mess around with it without having to install anything. (also at

Datomic ions have been so nice for building this--e.g. the turnaround time between writing a new feature and deploying it to production is the shortest I've ever experienced. And I don't even want to think about what it would've been like writing all the queries in SQL ;)

Yeah if I give the presentation again I'll be sure to record it! The content is basically a mix of Tonsky's The Web After Tomorrow + this blog post I wrote a little while ago:
though since writing that post, I had factored a lot of the code out into a separate repo (, so the presentation covered that a little bit too
Also just saw in your other post you mentioned you were thinking of moving to utah/switching to software engineering. I'm happy to chat if you've got any questions about the tech scene (or whatever) here, feel free to DM me if you want!

It's consistent. By convention, only functions that return either true or false end in ?, and as you've mentioned, some doesn't return a simple boolean.

There are uses for this, for example from the docstring: clojure.core/some ([pred coll]) Returns the first logical true value of (pred x) for any x in coll, else nil. One common idiom is to use a set as pred, for example this will return :fred if :fred is in the sequence, otherwise nil: (some #{:fred} coll)

Hey u/c_a_l_m! I went to BYU and am still living in Provo. I'm currently doing a startup using Clojure + Datomic. There's a Clojure meetup (was in Lehi, but they're moving it to Draper) every 4th Wednesday. It's pretty small--usually ~6 people--but I've gone the past three times and I've enjoyed it. I gave a presentation at the last one and it went well; I was thinking about re-giving it for the dev club once fall semester starts.

If you guys are interested, I'd be down to try starting a small meetup on campus for Clojure or perhaps functional programming in general.

I remember seeing a job posting from your team a while ago on the CS Slack's #jobs channel. It warmed my heart :)

yeah, really happy to see tuples. I've been taking a hash of multiple values and using that as a unique key on a project I'm working on right now

I posted several weeks ago about building an app with Datomic. I've been moving a lot of code I wrote for the app into a separate library, and Trident is the result. Ironically, none of the documentation I've written so far has anything to do with Datomic. As I started working on the library, I got sucked into building a little tools.deps-based build system for it, and that's mainly what I've documented so far. It's basically my attempt at bringing the convenience of leiningen to tools.deps without sacrificing power.

(If anyone's curious about the term "Trident": I named it after the gum, a pack of which was on my desk while I was thinking of a name. But it's also the logo of a college I went to, so I guess I could go with that explanation too.)


Pretty strong suspicion that for those who can take it there is a huge consumer internet land grab going on. Everyone is willing to try anything, the incumbents are swamped, expectations are reset and ad rates have collapsed.
TIl: ‘ethically sourced’ cocaine is a growing thing. Obviously, this is ‘woke coke’
@paulg @Austen Maybe it's churned users? Active users are obviously pleased.
@paulg @Austen Maybe it's churned users? Active users are obviously pleased.
A trouble-ticket came in and even git log couldn't help me answer the dreaded, "How was this EVER working?" And to think, I built the confounded thing.
For many-to-many relationships in SQL I previously made a table I'd call like "person_rel". Looks like the properly historic/academic name is 'associative table'. For succinctness should the table be called "person_ass"?

Rum release candidate with a bunch of fixes and new stuff

Give it a try on your projects and report any issues in the repo.


Was reading some history this weekend, and - it really was this clean cut.
Widespread cultural norms around respecting rationality, science etc only became popular in places where there was a lot of commercial activity
If I may add my own thesis to what Marc writes:

I believe we have created a society that's based primarily on critique. Some critique is always needed in any society, but we focus far too much of our energy and intelligence on critique.

We need to shift back toward creation.
I was going to build out a hilariously over-complicated & fiendishly expensive Wordpress architecture as a joke, but unfortunately @awscloud beat me to it.
@obryant666 Just saw it in my inbox and I love it! Taking notes on your article on my Roam workspace now.

I'm really excited on what Clojure could do and your newsletter just turned it up a few notches!
"You know, people think mathematics is complicated. Mathematics is the simple bit. It's the stuff we can understand. It's cats that are complicated". RIP John Conway
It’s interesting that YouTube is relatively good for recipes and Google is bad more or less because of the economics of content creation and discovery algorithms more than videos being a better way to teach cooking than text.
I don't routinely have this sort of problem in Japanese anymore but a long time ago:

Friend: Can you tone down the politeness a little? It's... weird.
Me: I am afraid that I cannot.
Friend: Creepy dude.
Me: Begging your pardon but I am linguistically incapable of it at present.
"Hey is today payday?"
"Yes honey."
"#%()#) where is my money?!"
"Not the contextually appropriate way to say that."
"It's cool yo."
Ruriko has been watching Breaking Bad to practice her English, which has been working a little too well, particularly since she does not realize when she is not channeling "native English speaker" and instead channeling "Jesse Pinkman."

Periodic plug for  , particularly if you're stressing on business bookkeeping prior to tax season. I never bought back so many hours so cheaply.

Lillian (5): Wait why is it morning in Chicago if it is night in Japan. *long explanation* Me: And that’s why it is 8 PM at night here but 5 AM in Chicago. Lillian: Wait the time is different too? Me: Yes. Lillian: Why not just have it be 8 PM everywhere and just be daytime there

@PetarLalovic I’d have to really think to come up with an ordinal ranking, but in terms of repeated salience:

Geeks underprice themselves. Cron jobs and SaaS apps are underdeployed. Automatic email is scandalously underdeployed. “School” is not near efficient frontier for learning. Coffee.
@visakanv Would love to hear what your list of implications is.

I'll give everyone one, which I don't think is contingent on self-identification as a celebrity or media worker: there is likely no asset you own or will soon own as valuable as an email list of people who like your stuff.
He’s got exceptionally poor client qualification, is actively hostile to better branding, refuses to focus on what he is good at, charges too little, and has poor collection practices which are downstream of working for an unending collection of muppets.
Plugged my MacBook in today and it started smelling like fire and now it won’t turn on anymore
Been heads down on simplifying and streamlining NPM library integration with ClojureScript. Stay tuned - some fun stuff coming!
Interesting to see Edison talking about making something people want in 1901. He had to learn the lesson through failure. cc @ycombinator @paulg
"Someone should write a program to do this crap."

— 11 yo, tiring of Basic's verbosity, proposes the IDE

(I told him there are programs that do it, but the real solution is just to use a better language.)
Think twice about building a business on a platform some other company controls. The more popular the platform is, the less compunction they'll feel about crushing you.
I’ve found an excellent use of my time at home.
@obryant666 Sweet, will definitely have to check out Biff!
I'm going back to school!
Utah’s @PodiumHQ (YC W16) raises $125M Series C led by YC after reaching $100M ARR:
YC Partner @harris on the importance of founders asking questions, acquiring new information, and acting quickly:
Huge thanks to @roman01la who is taking the lead! Excited to see new Rum releases in a while
Amazing auditory illusion: Does Grover say "Yes, yes, that's a f*cking excellent idea"? Sure sounds like it...

...IF that's what you listen for. But if you listen for "Yes, yes, that sounds like an excellent idea," then that's what you'll hear instead!
always pleased to see students using proper email etiquette
Wildlife is finally returning to Britain’s streets. Nature is healing 😍✌️
I feel like I am the only one that really dislikes doing `prelude::*`? I feel glob imports make the code much harder to read and find where types come from?
Hi. Is the Fundamental Theorem of Algebra actively maintained? There is no news for a long time. I am in doubt whether I should use it.
The google chrome "articles for you" feature is the best recommendation system I regularly interact with.

(best = I am consistently interested in a high % the recommendations)
One thing I noticed working at YC: if you can *just* manage to not blow yourself off-course on a consistent basis you are doing better than most.

Working at a normal job there are only so many ways you can get off-track. Being a founder opens up a lot more degrees of freedom :)
@obryant666 This look neat. Love the straightforward server-side realized as cloud function.
Perfect use of multi-methods.
It is quite amazing how concise you can get with #clojure and #clojurescript and do things whole game teams would spend weeks on. Congrats!
Not a fan of What was wrong with Visual Battle 6.0
the reality of how John Lennon lived - despite his “imagine no possessions” lyric

I have been trying to use Clojure for a big project for a while and always failed quickly. I think a big part of this is because most of the Clojure context I see online is for using Clojure to solve small problems or problems of a very limited scope.

I've just stumbled on Steve Losh's 5 year old Caves of Clojure tutorial and it's everything I've been looking for. It shows the steady development from initial ideas through to having a functional (hah!) application.

I was wondering if anyone knew of any more tutorials in the same vein. Ideally I'd be looking next for something that creates more of a button/clicky style GUI, but I'm up for anything that feels like it's doing more than demonstrating ideas.

I hope what I'm asking for makes sense.

I believe there is a place for unstructured videos of Clojure practice of varying levels. Not a course, not a tutorial, just practice. Motivation and teaching principles are explained in a presentation video which has links to the various episodes.

In the series, we query the TMDb API for movie titles, discussing possible approaches. In particular, we revisit explicit recursion, loop/recur and the sequence API.

I believe the value is for beginners up to intermediate practitioners, but I have no other way to know for sure unless you tell me. I am monitoring the subscription rate on the channel to gauge real interest or lack thereof before following up with more material.

In the spirit of constructionism where you learn by doing, as well as learn with what you already know, I say: to your REPLs!

Start here.

@ycombinator Is it smart to wait until you get a paying customer to apply (assuming this will happen before March 16th) or it doesn't matter and applying early just increases our chances?
@ycombinator @paulg I've heard the food is not good! ^-^

Pretty cool "naturally randomized" experiment: the right to buy a car in Beijing is determined by lottery. Win that lottery, and 5 years later you'll be ~22 lbs heavier if you're over 50. …

Nothing in life prepares you to navigate the AWS console. Nothing.
when starting a startup, it's important to make good decisions and not bad ones
(11/11) “I got to work. I wrote letters to the governor. I wrote letters to Obama..."
@paulg Very true. Unfortunately, since we’ve all been conditioned to passively receive content instead of seek it out, creators have lost the leverage of bringing people to where they are.
@CalligraphicCMS @kamranahmedse I agree. I think there may be a disconnect with the workload/responsibilities of current day students versus the nostalga. I distinctly remember when I finally finished college (and double part time jobs) and was so happy to now "only" have to work a 9 to 5.
@patrickc @patio11 @stripe I just realised both of your names are Patrick 😂 I usually identify you guys by your usernames.
When I was getting started it seemed very unclear how to go from “Python script” to “a real business”.

A few words that break down the seemingly impossible to something mathematically digestible:
Some words on our favorite topic, productivity:
Every recipe: sauté onions for 5 minutes until golden

Every time: takes 20+ minutes until any visible change has occurred
The more I work w/startups, the more I believe they should ignore traction metrics (ARR, growth rate, etc) until they're close to product/market fit.

Once you report that you grew 50%/mo & hit $3k MRR, your team & investors will focus on optimizing traction instead of learning.
My new Harvard course: General Education 1066, "Rationality."
We launched a new feature

Live visits showing up in your dashboard

Get your popcorn ready 🍿

Recently, I have given the following Clojure presentation for a group of C# programmers: . It is an interactive website build in our Czech startup Orgpad. The startup is entirely build in Clojure and Clojurescript and we are super happy with it, all the tools and libraries. It can be used to sort out hard problems, organize plans, work in teams, etc. For more info, see I believe that the weaknesses of Clojure are hard start for beginners and not enough good documentation, and hopefully our startup can be used to address this void. Any feedback is welcomed.

I work for BYU, a university in Utah. Specifically, I work on a small team of four developers that writes various apps for the Humanities Department.

Now, I am not a junior. I learned Clojure seven years ago, fell in love, and sold all I had for the pearl of great price. (I exaggerate. But not really).

But what has me making this post on reddit was my surprise and delight when, on recently coming back to school, I found there was a group using Clojure, and even training new developers in the Clojure arts!

My boss has said that he's found the most success with CS students not advanced very far in their curriculum, as they have fewer bad habits to unlearn.

I think this is totally neat! I thought the Clojure community should know about it.

Reasons I like Clojure:

  1. Extremely expressive. (dynamically typed, functional paradigms map/filter/reduce)

  2. Functional, reduce bugs, better to do point #3. (data first, immutable, HOF, etc)

  3. Easier to write concurrent and parallel code to reduce infrastructure costs while in bootstrap phase.

  4. "Cross-compatible" can be used for both the frontend and backend, can be run on any JVM etc, can use anything I want in the Java world.

  5. Potentially faster iteration cycles and reliable than competitors?

Reasons I might not use Clojure:

  1. Cognitive overhead of learning a new language and the difficulty of finding additional developers/training if the startup needs to scale.

  2. Hard to find examples of the language with large scale.

  3. Decent but not as vibrant of an ecosystem in regards to tooling and other packages as other communities (Python/Golang).

Academics: Missing deadlines since at least 670 BC.

(SAA 10, 255)
I'm very excited that "A History of Clojure" has been accepted at HOPL-IV. I hope to see some of you in London at the conference!
Wow, checked email while on vacation today and saw all the github sponsor notifications - thanks everyone!
Immutability as the default in #Clojure solves many of the same problems as microservice architecture without the complexity of orchestration and operational costs.
@patio11 @devonzuegel I support a conspiracy theory in which all specious science-themed claims are designed to sell breakfast cereal. Meyers-Briggs, 4 and 8 hand position on steering wheels, all of it. Breakfast cereal.
something I've thought about for 2020

I post only a small fraction of what I actually read

If I started a newsletter

-highlights, notes of books & papers I've read
-essays I've written
-article & video recommendations
-other stuff I find interesting

would you sign up for it?
My mom: "I printed out @jack's tweets and your @knightcolumbia article to read later."

Me: "Oh, great."

My mom: "How do you come up with this stuff?!?"
Second, the value of social media is shifting away from content hosting and removal, and towards recommendation algorithms directing one’s attention. Unfortunately, these algorithms are typically proprietary, and one can’t choose or build alternatives. Yet.
Twitter is funding a small independent team of up to five open source architects, engineers, and designers to develop an open and decentralized standard for social media. The goal is for Twitter to ultimately be a client of this standard. 🧵
@checkwarner Only $34? You run a lean machine! 😇