Why I'm Productive in Clojure (2013) - <AUTHOR> http://yogthos.net/posts/2013-08-18-Why-I-m-Productive-in-Clojure.html <comment><USER2> I've really taken a shine to Clojure. Parentheses and dynamic typing initially kept me away, but they're far from the thorns they've been made out to be.

Parentheses? You don't even see them after a short while--as a beginner, you use something like parinfer, you are good to go. That, and like all lisps, you begin to appreciate programming directly in the abstract syntax tree: the language you type and the way it is interpreted aren't disjoint things.

Dynamic typing? Being functional, immutable by default, and data orientated steal the _vast_ majority of the sting from that in my opinion--and leave you with often downplayed advantages. On the last point, "data oriented", to put it succinctly, data itself is first class or the prominent currency among Clojurists, rather than a zoo of abstractions that never quite fit and and all have to be reconciled and made to play with one another (and often the reason you _need_ types everywhere to keep it all straight).

But where types--or validation--are more crucial near the boundaries of the API, there are outside the box solutions like Spec that don't rely on a baked in type system.

The recent keynote by Rich Hickey covers a lot of these points (and far better than me):

[https://m.youtube.com/watch?v=2V1FtfBDsLU](https://m.youtube.com/watch?v=2V1FtfBDsLU)

<comment><USER3> If you have used a statically typed language in the ML family (OCaml, Haskell etc.), could you contrast the development experience between the two?

<comment><USER2> I spent a good year or so with Haskell. I guess at first blush, one thing that jumped out was that Clojure was made from the jump with a focus on productivity and pragmatism, whereas you never feel too far from the academic origins of Haskell. Clojure is a very shrewdly designed--it's not proud, it takes leverage where it can find it, and makes some very deliberate and sensible trade offs. A large aspect of that is the JVM it sits atop of. You will know that it's Java underneath the hood, but this is not a bad thing at all. You get to have your cake and eat it too. It's done really well in the sense that while it would be awkward and not Clojure-like to promiscuously call native Java--especially code with side-effects--it it is perfectly alright, and practical, to pull in any of the multitude of proven Java libraries where it can obviously save you time and effort. There is no snobbery in the core language itself or in the community about "ew, icky Java". Or put another way, there is no from-scratch ecosystem like in so many languages where a new language means starting over (so the language needs a crypto library, and a web server, and...) Not to mention, many of the utility libraries out there are largely functional in nature anyhow (you can use a massive chunk of the wealth that is Apache Commons as just an arsenal of pure functions).

In nitty gritty terms, programming in Clojure actually feels a lot like programming in Haskell to me, without the heavy type system. Lazy infinite lists, all your FP classics like map, reduce, filter, etc. work exactly like you would expect. But I don't miss having to create a stack of monad transformers in an area of code where I need to mix IO and state or something...and using type synonyms to mask the monstrous Turing-complete type signatures I had to make to describe it... In Clojure, you just put the "dirty" work in its own function, clearly separated from the pure functions (which are the de facto default), and you push them to the boundaries of the system while passing extracted data into pure functions (just like Haskell). If you did anything different, you'd get the stink eye from even the least principled Clojurists. It's just not done. A ball and chain type system is unnecessary.

The lack of (explicit) types has been at the very most a minor nuisance. Occasionally I mistype something or miss a parameter, you're going to see the error pretty quickly in the REPL. If you run or test your code at all, the pedestrian type errors (oh, that was a string not an int) will be wrung out immediately. That benefit of type systems (preventing typos, essentially) has been much, much overstated IMO. Given you're going to be in the REPL a lot with Clojure, you'll be iteratatively developing and running your code constantly, so it's really not an issue. As far as refactoring, I think that's where there is more meaningful benefit. I use Intellij/Cursive IDE, and the refactoring capabilities are good--much like if it were a Java project (and there are hints and such for the typos I mentioned earlier, autocomplete, etc). So, while it is more of a challenge for IDEs, there are some excellent ones that do a pretty bang up job of inferring types for you.

I haven't used Clojure on the job (Java dev by day), but I would have no problem using it for something "real", whereas I never felt anywhere near confident in using Haskell for something outside my own fiddling.

<comment><USER3> Thanks for the reply, it was very informative.

I've programmed in dynamic languages for most of my career (about a decade now), and have always missed types. I picked up OCaml (Reason flavoured) recently, and I've been able to enjoy the Hindley-Milner typesystem without worrying about side-effects with complex types, since OCaml is a fine mix of imperative and functional programming.

Language preferences are usually framed as an objective measurement, but I've always found it to be based on our personal experiences. Since you've been doing a lot of Java, I'd surmise that the clean, functional yet dynamic nature of Clojure with Java interop is appealing to you. Me on the other hand has been burnt enough times with dynamic systems that keep shifting from under your foot (Ruby metaprogramming), test suites that makes refactoring more difficult (it provides safety, but the manual labour is unforgiving), and a general sense of dread everytime I put systems into production. But more than anything else, the biggest pain has been the sheer difficulty to refactor growing codebases.

Large dynamic systems, if they manage to not crumble from the inside, usually gets hammered by a sweeping change in external reality (terminology changes, shifting of levels in domain hierarchy etc.). When there is a pressure to ship we add a new mapping without touching existing naming, and slowly the domain names in the system exhibits a tangled relation with the actual domain.

That's just been my experience, and so I'm here learning me some good old OCaml and being very happy with what I'm getting out of it.

<comment><USER4> Have a look at Spec and the design philosophy behind it if you are still interested in Clojure at all. Especially how Hickey feels about open specs, versioning, and names. It is a pretty opinionated stance to take on solving those issues, but it convinced me and I no longer have the worries you describe about the dynamic nature of a large Clojure system.

</comment></comment></comment></comment></comment><comment><USER5> I would love to use closure, i just stay away from dynamically typed languages - after having a bad experience trying to maintain projects written in a dynamically typed languages which was an awful experience. You see a parameter named user and you have no idea which type it is, which fields it has, does this user has a phone number? how can i know? You see functions and you don't have any idea what is the type they return. just to put things in perspective I maintained X100 larger projects in a statically typed languages, with even worse code but maintaining it was easier than these other projects. Simply because I knew what functions were getting in and what their return type was.

<comment><USER6> I generally agree with you, but Clojure is not at all like other dynamic languages (like, say, JS). For one, Clojure's dynamic dispatch is more like C++/Java's -- i.e., when you call a function, you can statically know either the precise target or an explicitly designated set of possible targets. Second, Clojure allows you to specify the types of arguments (and much more, in fact), not with a type system, but with a specification system. It's not exactly the same, but it can be more/less powerful than types, depending on usage.

<comment><USER7> How is the specification checked, statically or dynamically?

<comment><USER8> You can see my other comment to your same question. Also, even if you do not use Spec, you do get a lot of compile-time validation like making sure all arguments are passed to a function, not leaving them out, etc. Try that in Javascript!

<comment><USER7> Are you sure about _" you do get compile-time validation like making sure all arguments are passed to a function"_?

If I run this:

        (defn bar [x y]
            (println x y))

        (defn foo [v]
            (if v (bar 12 42 79)))

        (foo false)

The program prints nothing and Clojure reports no error.

But when I run this:

        (foo true)

Then Clojure reports an error:

        Exception in thread "main" clojure.lang.ArityException: Wrong number of args (3) passed to: user/bar, compiling:(.../test.clj:6:5)

<comment><USER8> I don't spend much time on the JVM, but in ClojureScript, this is what I get for a similar test (including multiple definitions of foo in my case, i've elided the whole source file here):

         (defn foo [a b] :hi)
         (defn bar [] (foo 1 2 3))

         WARNING: Wrong number of args (3) passed to prepost.core/foo at line 25 src/cljs/prepost/core.cljs
         WARNING: foo at line 24 is being replaced at line 48 src/cljs/prepost/core.cljs

It's a compile-time warning even when the app is not running, but ClojureScript goes through a different compilation step than JVM Clojure. Perhaps I was mistaken in the JVM case, or someone else can chime in.

<comment><USER7> Maybe ClojureScript is doing something Clojure doesn't at compilation time…

</comment></comment></comment></comment></comment></comment></comment><comment><USER9> I love Haskell for its type system, but I gotta say that I feel I accomplish about 10x as much with Clojure than I do with it. Being able to quickly beam over my code from Vim to the REPL, and seeing my changes happen in real-time is so incredibly valuable, and I personally feel that Clojure's concurrency is a lot easier to grok than Haskell's.

I also feel that Clojure's tooling is a lot nicer than most languages, and especially Haskell; Leiningen is very easy to use and Fireplace is a really simple and nice plugin for Vim.

</comment><comment><USER10> When I have to write something computationally complex in the language my employer wants me to write it in, I first write it in Clojure because it's easier to think about the problem in that language. Then I translate that.

I'm willing to bet that any dev who has learned Clojure does the same thing. If I'm right, that's a huge indictment of what we've been doing for the last 60 years in programming.

<comment> aaron-lebo You'd lose that bet. I think it's easier to reason about problems in languages you are familiar with and that fit how you think, which can change through continued use. A lot of the other stuff is just post hoc rationalization about why we like these languages and why they are better.

<comment><USER11> Surely the argument being made here is for the best prototyping language, not the most familiar. If familiarity was the only yardstick nothing beyond C would even exist.

<comment><USER12> The argument being made is if it's necessarily efficient to prototype in a different language than the one that will be actually used, especially if one is more familiar with the target language.

</comment></comment></comment></comment><comment><USER13> I've already seen large scale clojure projects being rewritten to something average devs can maintain. Don't expect much more growth out of this language in terms of new projects written in clojure.

<comment><USER8> Ten years ago (appoximately) I read an article about how PHP was dying, thanks in part to many new languages cropping up. But I see PHP mentioned all the time here on HN, and the PHP meetups in my area are frequent and popular, and major companies run on PHP.

For decades, there have been rumors about the death of dynamic languages in general. And yet the decades pass and not only do those languages continue to flourish, but others come along and get popular too.

Clojure just turned 10 years old and I see no signs of it slowing down. They did consolidate their 2 major conferences in the States into just one annual conference, so there's that (which may not mean anything). But I am in a large city and companies keep appearing and starting up with Clojure as their key language.

With Clojure, it's an oddball because it is very simple and very powerful. Oftentimes, simple languages are not so powerful, and powerful languages are not so simple. But with Clojure, you can very easily get yourself into the situation of having extremely dense logic in just a few lines, where another language might easily take 10x (or more) lines to accomplish the same. This leads to code that can indeed be difficult to read later, especially if you are on a team and others must help maintain it. The Clojure community has come up with some excellent solutions to this problem, most recently the Clojure.spec library which is gaining wide adoption, which not only makes such "cleverness" easier to understand when reading it, but also makes a codebase automatically testable with property generators, which is a major feature. But your point about readability is always going to exist with a language like Clojure if it isn't written with a team in mind. That doesn't take away from its power though, in my opinion.

However, there is one particularly indispensable tool that Clojure offers that I have not seen anything to meaningfully compete with for productivity, and that's ClojureScript. Writing a front end with Reagent or even the alternative libraries is such a major win over everything else I've tried. I've worked a bit with Elm, Typescript, Reason, Bucklescript -- I am so spoiled by the extremely fast turnaround and easy interaction with very powerful features like React in Clojurescript that I don't see anything on the horizon that will come close to replacing that workflow for now. Perhaps some day something will come along to shine an even brighter light on how front ends can be developed, but for now, ClojureScript remains one of the most significant contributions to the software industry in many, many years.

<comment><USER14> PHP has a massive following. It was basically the only language for the web 1-2 decades ago, everything had to be written in PHP. Of course, it cannot be extinguished since the existing sites will drag on forever.

Clojure never had much usage on real world projects. It cannot be extinguishes as it never took of.

<comment><USER8> > It cannot be extinguishes as it never took of.

I'm not sure what you mean by "never took off" but thousands of developers around the world, myself included, have made their living just writing Clojure code for many years. So, it has certainly taken off for them. And there are many, many companies using it all over the world. I live in a town of about half a million people, so not super big, and there are about 12 companies primarily operating on a Clojure codebase.

<comment><USER11> I'm genuinely intrigued. Which town is that?

<comment><USER8> A lovely place in Western Europe.

</comment></comment></comment></comment></comment></comment><comment><USER15> I've been debating whether or not to give a talk / write a blog post on this, but I think this might just be the kind of thing that people make their assumptions about, and thats it.

I do wish people would give clojure a real go, not just running a toy program, but taking the time to setup a REPL in clojure and clojurescript, learn about sending commands from the editor directly into the REPL, etc.

The reasons for choosing clojure are un-obvious at first glance. Moving from Java -> Ruby for example is something that you feel immediately. People understand in < 5 mins why ruby might be a better fit for a number of solutions then Java.

I don't dig clojure because it's a LISP, or it's homoiconic, or because of most of the academic ideas here in this thread. I picked clojure because with it, I get clojure and clojurescript.

With clojure I get to target all java libraries, great concurrency primitives, the ability to live code a running system, the ability to experiment extremely quickly due to the REPL based workflow, now with spec/generative testing, I get __better __testing then I had before, with writing fewer tests. I get systems are often easier to reason about or debug. There 's rarely a ton of libraries to do a single thing. Existing libraries don't change much. We launched our first service in clojure 1.6, we've never had to do anything but bump the version number. No breakage.

With clojurescript we get just as many benefits. CLJS gives us access to all javascript libraries that have been written, Re-Frame/Om Next are incredible frameworks on top of react, figwheel allows us to never (rarely actually) have to refresh a page when doing layout / css things. Because we have access to a running REPL we can change the state of the app via function, allowing for way rigamarole when trying to test out inputs, etc. devcards lets you look at all the state of your widgets on the page + figwheel means you can see how CSS changes will affect all the states of your widget at once.

Synchronicity between the two languages allows us to write .cljc files where share functions and schemas can exist, so your backend and front end are pointing to the same place for critical things that should be shared.

It's really really different, but it's really really great. If you're a professional in the field, you owe it to yourself to just try it out and see if it helps you save time and be more productive.

<comment><USER15> All that said, it's not perfect and there are annoying things about it, so I'm not painting it as a perfect language. And there are problems that it's probably not well suited to solve.

I discovered clojure about 25 years into my programming career, and while it introduced new "annoying things", it resolved most of the annoying things I had dealt with over the past 25 years in most other languages.

</comment></comment><comment><USER16> (2013)

Discussion from a couple of years ago (97 comments):

[https://news.ycombinator.com/item?id=8074186](https://news.ycombinator.com/item?id=8074186)

</comment><comment><USER17> > As the project matures bugs are inevitably found or new features are added, > these correspond the occasional spikes in the activity. However, if the > initial phase of the project can't be completed in a timely fashion then > nothing else can happen.

> In my experience, if you can't get something interesting working in a few > days the likelihood of actually finishing the project starts rapidly > approaching zero.

> With Clojure you can get things done fast, fast enough that you get > something working while the initial spark of excitement is still present. I > would hazard to guess that this is the reason why Clojure has so many great > libraries despite being a young language.

</comment><comment><USER18> Python dev here who chooses his own tools. I want to move to Clojure, but Clojure and the JVM just aren't that strong in machine learning and ML is my current "growth" area.

Even with JVM based solutions, such as Stanford CoreNLP Python has more support/interest than Clojure.

I am not here to pump up Python and knock Clojure, just to illustrate there are areas that Clojure has a ton more wood to chop. And I do understand there have been significant efforts made in this arena lately. e.g. Neanderthal

[http://neanderthal.uncomplicate.org/](http://neanderthal.uncomplicate.org/)

<comment><USER19> Having worked with both Lisp and Python, I feel relatively comfortable saying the only thing missing from Python is macros; and when it comes to readable code, it's not a debilitating loss. Much of a macro's capability to create DSLs can be replicated using the introspection and metaprogramming.

There are also some lisps that target the Python VM, so you could consider using one of those.

<comment><USER11> Yes, Hy ([http://hylang.org](http://hylang.org)) is similar to Clojure and very nice to work with. Sadly, they had to abandon their implementation of __let __recently.

</comment></comment></comment><comment><USER20> > Some languages are simple but they're also verbose. You've probably heard > people say that verbosity really doesn't matter. These people will go to > great length to point out that all languages are Turing complete and that in > certain languages you simply have to write a bit more code.

This argument I usually dismiss by suggesting moving to INTERCAL or Brainfuck. Even syntax matters a lot more than people care to admit. The best language is the one with which you can frictionlessly reason about and express a problem without impediment from syntax, paradigms, concepts and boilerplate. Computer languages just as much as natural ones are deeply tied to the way we think[0].

[0]: [https://en.wikipedia.org/wiki/Linguistic_relativity#Programm...](https://en.wikipedia.org/wiki/Linguistic_relativity#Programming_languages)

<comment><USER21> I agree, and that's one of many reasons I like Clojure so much. I find its syntax maps very cleanly to the way I think. It's one of the most readable languages I've worked with. It primarily has to do with Clojure syntax being simple and consistent.

</comment></comment><comment><USER22> Is this the same author as this book or is there plagiarism going on: [https://www.amazon.com/Web-Development-Clojure-Build- Bulletp...](https://www.amazon.com/Web-Development-Clojure-Build- Bulletproof/dp/1680500821)

Go down to the "From the Publisher" section and you'll see:

> _" But the practical question is how well the language maps to the problem > to be solved. Does the language let you think in terms of your problem > domain, or do you have to keep translating domain concepts in the constructs > of the language? The best case is when you can use the language without > thinking about it."_

<comment><USER23> Same author.

</comment></comment><comment><USER11> The sad fact of life is that large corporations often dictate the platform. If you're a mobile app developer, for example, you're only native options are Swift, Java and Kotlin unless you're prepared to settle for a less efficient end product (Xamarin, Scala/Android, Clojure/Android).

<comment><USER24> Job trends play a role too. I really like Clojure and would like to keep using it. But it's less likely to help get me a job than say learning Python.

<comment><USER25> I also feel this pain. The reward is high though (salary, remote, colleagues) so I remain motivated.

One also can help creating job market by

\- starting up

\- introducing Clojure at work

\- evangelizing it at local meetups (e.g. hijack a JS meetup, explaining cljs goodness)

I've been thinking about the latter, as a consultant creating a 'need' for your services would be quite an accomplishment.

</comment></comment></comment><comment><USER26> I have honestly tried many many times to read books/tutorials for getting started in LISP. I know there are many LISP inspired languages and Clojure is one of them. Where LISP throws me off is the excessive use of parenthesis, up- to the point my mind can't keep track of them anymore and IMHO language uses it's comprehension abilities. I am still struggling and pushing hard to learn it; hopefully I can get over it and experience the most powerful language. Any good starting projects/ideas I should try doing in LISP/Clojure etc. to help me out?

<comment><USER27> You just have to indent them the same way you'd indent curly braces.

The harder part about lisp is actually recursion. Surprisingly, there aren't a lot of programmers who can follow recursion naturally.

(loop exists in lisp but recursion seems to be the common idiom)

<comment><USER28> >"The harder part about lisp is actually recursion. Surprisingly, there aren't a lot of programmers who can follow recursion naturally."

All examples of recursion I've ever seen in Lisp follow a similar structure...

* First section checks if recursion is finished. If so, return final result (or final element of full result if returning a list).

* Second section performs an action or two on the inputs.

* Third section calls the function again with revised inputs.

In many ways it's just a do while loop with different syntax.

</comment></comment></comment><comment><USER29> I have no lisp experience, but I want to ask to who knows more: isn't the use of too many macros a potential hinder to maintainability? What happens to a project when it becomes a mini-language in itself, with its conventions, it's opinions, it's specific flavour? Does this help or discourage the onboarding of new developers?

I know C is not a good example, bit at least in C projects, I was always wary of "smart" developers inventing their own "smart" conventions and syntaxes

<comment><USER30> Macro use scenarios have to be weighed against the alternative: writing _by hand_ the logic that the machine would have generated from macro invocations.

</comment></comment><comment><USER31> I liked this quote.

"What matters to me in a language is whether I can use it without thinking about it."</comment>


Graying Out - <AUTHOR> https://www.tbray.org/ongoing/When/201x/2019/03/11/Lights-Going-Out <comment><USER4> I don't know exactly why, but reading this made me extremely sad and nostalgic. The very much social world of instant messenger and plain old web pages pre like-ified and follow-ified social media seems like a quaint anachronism, now. I suppose it really is, if it was 15 years ago.

Some of you will correctly point out that those communities are still there on IRC and in the forums right where I left off, ready to be picked up, and you're not wrong. I suppose it is me that has changed and gotten older as well, and the world doesn't feel as magical as it did at that time. My internet, its media, and the people I shared it just seemed to electrify me so much more. Now, everything feels so dull and grey. But, perhaps nothing has changed so much as what and how I consume. What would younger me think of the mindless, lazy way I consume content on social media, and my corporate job?

It would be really nice to see slow content and the digital village return again as cultural norms. Until then, I'll just have to make deliberate choices to choose them as I once did. I really wish I could make a time machine and talk to my younger self to knock some sense back into me. It's painful to look at how much fun I used to have with technology and how little I do now.

<comment><USER5> +1 - You've vocalized my thoughts much more beautifully than I ever could have. Aside from the general cultural aspect of it (better content, interesting forum discussions, Adium conversations with friends at 2AM), programming as a profession lost a bit of magic for me as well.

Life just became all about getting that next refresher, the next good rating / bonus, the next promo in an almost mindless push towards higher comps.

There isn't that sheer fascination / joy in discovering what you can do with technology anymore. Maybe it's because working in a generic big-co is intensely competitive and once you've given so much there, it's hard to come back home and engage in more deep thought. Maybe it's because we just got older, had families and do what normal adults do (reading some linux driver code at 2AM in the morning to get the wifi / trackpad working doesn't sound as fun anymore).

<comment><USER6> I'd urge you to find something to tinker with. I've lost that magic a few times in my career but this last year I've started tinkering with machine learning, a side web app for finding lost pets and in the last week the ESP8266 chip for a few home experiments.

Here's why. The apps are a nice distraction. You can forget about the work stresses and just play a bit. You loved this stuff for a reason, I think you can get that back. You also have more control in your own projects. No committee.

46 this month. Not super old but old enough to know what jaded feels like!

</comment></comment></comment><comment><USER7> The day AIM died, I logged in one last time.

A friend of mine was actually online! So i IM'd him. I got a frantic phone call about 30 seconds later.

      "how did you DO that?!"

      "do what?"

      "you made my PHONE play the AIM BING noise!"

      "..."

He'd long ago wired SMS notifications into AIM, forgotten that he had done it a decade or more ago, and was deeply confused until we walked through the possibilities.

<comment><USER8> I was on AIM the day it went offline. Ran into a person who was very important to me and my development. Reminisced for a couple hours.

They added me on Facebook. I was hopeful to keep in touch, but they've since disappeared off Facebook like a lot of my friends in the recent trend.

<comment><USER9> I've found that it's difficult to keep in touch with a lot of people that I'd like to because Facebook chat is really the only widely used chat service at this point, and many of the people I'd like to talk with have decided that they don't want anything to do with Facebook.

Lost touch with quite a few past friends from that

<comment><USER10> facebook is in the uncanny valley of achieving its goal of universally connecting people but disconnecting people even more because it was so close to universally connecting people.

<comment><USER11> its like they succeeded and then totally fucked it up. greed just gobbled that engine up.

</comment></comment></comment></comment></comment><comment><USER12> The internet was way more social before "social media" came along.

<comment><USER13> 100% agreed. I had much better real personal conversations on the "old" Internet. Facebook and smartphones killed it. Nowadays a lot of people are only available via SMS, and I don't have the patience to type out long messages there. Calling someone up and chatting is better.

I loved the IM era and it's a huge shame it's over. I don't have as many personal connections with people now as I did then. AIM, ICQ, and later Gtalk were all amazing.

<comment><USER14> My issue with modern "chat apps" is they usually fail to let you know if someone is up for a conversation. Presence is reduced from "I'm available, let's talk!" to "last online".

If I don't know if someone is up for chatting, I'm not going to start a conversation with them, in case I bother them.

<comment><USER15> Yeah. You just explained why I haven't talked to hardly anyone on Facebook chat anymore. I don't know that they're actively wanting to chat, just that they're on Facebook, possibly just passively browsing things. I still ping people on Facebook chat, but only if I need to ask them something or want to share something I discovered with them specifically. I used to chat with several people every night in my youth. I don't have quite as much time to do that anymore, but I do have _some_ time. I'd love to know who actively wants to talk with people.

</comment></comment></comment></comment><comment><USER16> Although most of my friends prefer Matrix these days, XMPP is still my favorite way of chatting. You can easily run your own Prosody instance [1] on a $5/month VPS and have a very modern chat experience - offline messages, syncing between devices, OMEMO end-to-end encryption, group chats, push notifications, HTTP file upload, etc. My wife and I use it for all our communications.

There are some great clients for Android [2], iOS [3] and Linux/Windows [4] that support all the modern XEPs. Sadly, there aren't any mature, actively developed clients for OS X that I've found. Adium is pretty much abandoned. Monal is in active development though and seems promising.

It's so nice to use an open protocol with native clients. Most other self- hosted chat solutions require electron apps, which can be painful to use unless you have top of the line hardware.

[1] [https://github.com/cullum/dank- selfhosted/blob/master/roles/...](https://github.com/cullum/dank- selfhosted/blob/master/roles/prosody/templates/prosody.cfg.lua.j2)

[2] [https://conversations.im/](https://conversations.im/)

[3] [https://chatsecure.org/](https://chatsecure.org/)

[4] [https://gajim.org](https://gajim.org)

<comment><USER17> "Easily" and "modern" chat experience with XMPP?

I used to run my own Prosody server for some years before switching out to Matrix and there was nothing "easy" and "modern" with XMPP. Sure, I could get the fancy features such as end-to-end encryption, push notifications and file sharing... with Conversation for Android. But I could never properly sync my messages and conversations with a PC client.

I'm glad I don't have to deal with XMPP anymore, I know that the HN crowd likes to dream with it but the reality is that it was a major pain.

<comment><USER18> > it was a major pain

It demonstrated that it can overcome major pain points though: Gajim (Desktop), Conversations (Android) and Monal (iOS) [edit to add: and conversejs on the web] cooperate quite well these days.

Matrix? Let's see how they overcome their first major paradigm shift (such as the introduction of mobile devices with spotty ever-changing network environments, or E2E encryption both of which took a while for XMPP to handle gracefully)

<comment><USER19> E2E hasn't come gracefully to _me_ yet, because my Pidgin still only has OTR support, and so does the one one of my primary Jabber contacts uses, except Conversations has now dropped it in favor of going all-OMEMO. My current answer is to ignore the mobile case like I did most of the time before, but that's not a _good_ answer.

I guess maybe I need to switch to Gajim, but this sure isn't frictionless, mostly due to the lag-induced fragmentation.

<comment><USER20> Pidgin has OMEMO support.

[https://github.com/gkdr/lurch](https://github.com/gkdr/lurch)

This works fairly well for me.

<comment><USER19> I know you mean well, and I'm glad this exists and that you reminded me of it (I now remember having seen it before), but this isn't enough to invalidate my point. The installation instructions are… barely okay. AUR… okay, I guess. What would people on Debian-based platforms, like the very popular Ubuntu, do? Compile from source?

Let's see what the README says: "I know this is a bit clunky, but using the command interface for interactions makes the plugin usable in clients that do not have a GUI."

So now I get to explain this to the _other_ people I was using Pidgin+OTR with too, right? (Also I get to have to remember what the commands are, because I won't be using them frequently.)

I mean, this can also be phrased as one of the disadvantages of being part of the earlier installed base, but on a wider scale, buildup of legacy resistance _is_ one of the things that you wind up having to overcome if you want to introduce new features that aren't strictly optional—which is kind of why we still don't really have secure email that doesn't take massive cognitive overhead in "remembering which things people are using" and massive social overhead in negotiating about it and being prepared for all sorts of responses.

(Added:) And to make sure I'm not accidentally taking this into the weeds, the _incompatibility_ was introduced AFAIK when Conversations dropped OTR. That means any Pidgin clusters suddenly take on a big UI and polish downgrade for their E2E if they want to stay interoperable. I'm not meaning to criticize this specific plugin so much as to point out that there wasn't enough overall coordination between seemingly-major clients to stop this from happening.

</comment></comment></comment></comment></comment></comment><comment><USER21> I feel this myself. I used to run an ejabberd server on the same domain as my email address; that, along with a multi-network client like Pidgin, let me chat seamlessly with just about anyone. The number of people I could contact through those two tools eventually became so small that I turned them both off.

Nowadays the first conversation I get to have upon meeting a new person is a long negotiation about what baroque, proprietary messaging app I will have to use to reach them. Sigh. At least we still have email...

<comment><USER22> I wish we still had email, but an increasing number of folks in my circles are refusing to use it too. And you can forget trying to call anybody - <USER2> answers because every phone call is a robocall or a scam.

The balkanization of communications is real. I've become some sort of middleman/organizer in one of my hobby circles because I'm the only one who uses all of these disparate services; many of which I only use to connect to two or three folks.

<comment><USER23> Who are you in contact with? Tech workers with enough autonomy to fall off the map without consequence? I can't think of anyone I know who doesn't get critical emails that require a reply. You'd fail college without checking emails. You won't get hired if you don't check your emails. You'd get fired from my job without checking emails. You'd fall out of touch with collaborators in the field without checking emails. Who are these people who refuse to check emails, and what do they possibly do that gives them this privilege of avoiding the most basic and fundamental electronic communication? It seems just absurd to me.

<comment><USER24> Many people get an overwhelming amount of email.

Also once you move from college into the working world you have a work email separate from home email typically. I check my work email daily of course since it's critical to my job, but I can go days without checking personal emails.

Most of the content of my personal email is hardly time sensitive and a lot of it is advertising or news I haven't opted out of (although I have gmail filters and tabs). It's not like IM where I would use to check and respond immediately because I only ever got messages from friends.

<comment><USER23> I will admit I have a burner gmail for account signups with like 18k unread messages, but I've resigned that email to the advertising spam dogs a decade ago.

</comment></comment></comment></comment></comment><comment><USER25> My social circle on IRC has been consistently growing for years. IRC is not trying to monetize you. It's just trying to connect people. That, more than anything else, is why my friends and I still use it. It's been around for 30 years and I'm confident that it isn't going away any time soon. What other technology has remained relevant for 30 years? IRC is older than HTTP, and only slightly younger than GNU. Only Unix has it beat by more than a year or two.

<comment><USER26> where do i go to make friends on irc

<comment><USER27> #yospos on synirc

<comment><USER26> that's my favorite

</comment></comment></comment></comment><comment><USER28> I hope that as people notice that the centralized data-gathering walled- gardens that track our every move are not all they are cracked up to be, we will head back to decentralized solutions which do more of what we actually want. This applies not only to messaging, but also to blog postings and RSS.

Pendulums swing back.

<comment><USER29> I agree. How do we start the movement back to a more decentralized software daily life. This is solely a feeling: I remember my youth being filled with an ever-changing and growing amount web portals, communication tools, and methods of of sharing data (music). Today, a few big entities control all of those experiences. I don't think my life is any better for having a Google controlled cloud service (gdrive) vs another open source or vendor solution. I found it enthralling to be online and discovering new experiences as a kid. Somehow that is gone today. Could just be my age.

<comment><USER30> A big thing here is a huge chunk of the internet is getting content discovery from just a couple places with ulterior motives. We used to seek out people who made good content and add it to a hand managed rss feed, I used to peruse 1000 articles and posts a week from friends, people that I trusted, people that I distrusted, scientific journals, and niche hobbies. I talked to someone this week that wasy saying they wouldn't even know how to find new music without youtube. 10 years younger than me and discovery is a lost art. I'm not sure what resets this, and I fear the very idea of it will be completely lost in the near future.

<comment><USER23> You can follow virtually anything on RSS still. Blogs, every biology journal that I know of, pubmed or google scholar search term RSS feeds (super useful, can be a topic, journal, even author), subreddits, HN, youtube channels, twitter, email newsletters (kill the newsletter), the list goes on and on and there are even services to turn things that don't have RSS feeds into an RSS feed (like kill the newsletter). My workflow is have things categorized in inoreader and push interesting articles to pocket (or just open the HN/reddit thread). No paywall, and no ads. There's never been a better time to follow RSS feeds.

Your discovery would be from either your own search engine cleverness derived from spotting a topic in your articles, or directly shared to you by what you follow, like good topics in HN. NYT and LA times are both really good at sharing content from other newspapers, magazines, blogs, and other sources in their newsletters (which I follow via an atom feed from kill the newsletter).

Facebook, twitter, youtube, and the ilk are all pretty poor at discovery, to be honest. Discovery to the decision makers at these platforms is more towards manipulating into more and more advertising engagement than any knowledge dissemination.

</comment></comment></comment></comment><comment><USER31> The first comment there:

> _now everybody needs to use a mix of iMessage, WhatsApp, and Slack_

It's funny whenever I see someone list the chat systems that "everybody needs to use" because they're always different.

The top chat systems that _I_ need to use to communicate with my friends/colleagues are Messenger, Hangouts, and Threema. I haven't used Slack in years, since I left tech. I've never seen anyone use WhatsApp in real life, or heard anyone ask that I install it. I occasionally use the Messages app but usually just for SMS.

There's probably 10 or 12 different incompatible chat systems in common use today, and which 3-4 you use on a daily basis depends on your geography and culture and industry. And that's kind of awful.

<comment><USER32> WhatsApp is a non-US thing. In Europe, it has de facto replaced SMS

<comment><USER33> Ditto in Asia. In Singapore, no one texts and hardly use fb messenger but whatsapp use is prevalent.

<comment><USER34> Same thing in neighbouring Malaysia. Everyone operates under the assumption that you are contactable via WhatsApp. Recently I even had doctor and car service appointments booked through WhatsApp.

</comment></comment></comment></comment><comment><USER35> I remember using Adium with Growl on Mac for MSN, IRC and AIM all in one - good ol' days :-) I think in the online gaming industry XMPP is still quite adopted - sadly it's not easy/straightforward to find out what server and port and auth to use, because game companies don't want to have another "bot" problem to deal with. AFAIK Twitch.tv uses a slightly customized IRC for their sidebar chat while Blizzard (WoW, Overwatch, Diablo etc) XMPP.

<comment><USER36> Twitch uses IRC (which you can connect to with a regular IRC client, but you have to authenticate with a code somewhere from their website), which is nice as a occasional small streamer as it's the only way to see chat and the user list active in chat at the same time.

<comment><USER37> Check out Chatty: [https://chatty.github.io](https://chatty.github.io)

</comment></comment></comment><comment><USER38> Adium was / is such a fantastic piece of software. Connect to every relevant chat service from one native app. Infinite ways of customization, plugins and themes to install and all accounts under one unified contact list.

The post made me feel sad—realizing what we had, and lost. Back when MSN (Was the de facto standard in Austria when the IM services got popular) a large chunk of my waking hours and nights were spend chatting with friends on Adium and later IRC.

I just started Adium that I keep migrating from computer to computer to keep my custom icon even though I don't use it (Nostalgia I guess) and the apart from nobody being online the only message that greeted me was the ICQ message that it was turned off.

</comment><comment><USER39> Reuben Hersh has written about something to one side of this in mathematics: if you drive your specialisation narrow enough, you wind up in a room where perhaps only 2-3 people can talk to you cogently. Maybe this is part of things?

I overlapped with you on at least two people on that list, because of IETF but I maintain functional overlap with them on the margins. The rest have absolutely no contextual reason to know I exist and vice-versa.

(Of course there are several everyone knows exist, but it is a highly a-symmetrical relationship because a time when I would have need to speak to TBL and he have need to reply has long since passed, back in the 1990s and it never happened at the time)

So the author raises three points. One, is the death of open bus methods like XMPP. iMessage, Google Hangouts, use the underlying protocol but in a way which excludes exterior binding easily (Apple is a closed garden looking out)

WhatsApp uses signal, but anchors in a keypair nobody else can use. Signal is about as open as it gets. These protocols improve on XMPP because they implement things like key exchange and Forward security in ways I believe work. I have no doubt XMPP encompasses this, but the client implementations seem a bit fuzzy. Adium's 'deniable chat' thing never really took off did it?

Secondly, Adium is functionally orphanware. I use it, but it doesn't seem to get love and attention.

Lastly, there is an age effect. I had a circle of 40-50 people I held close, I now hold very few people close and I don't feel a grumpy curmudgeon, its just hard to maintain tenuous links. S/W can only mediate so much. (I'm 57 btw and I used BSD 'talk' and UNIX 'write' for years in the eighties and nineties on ARPAnet and JANET to do this, before chat protocols emerged from the BBS world)

<comment><USER40> Signal is a closed network, and doesn't permit people to build clients that run on their network.

You can fork Signal, but your fork won't be able to talk with any Signal users. [https://lwn.net/Articles/687294/](https://lwn.net/Articles/687294/)

</comment></comment><comment><USER41> It's funny this post is being created now. Google Hangouts was the primary method that my wife and I used to chat. I could talk to my wife while she was at work, even if I had no idea where my phone was. Its shutdown prompted me to look for an alternative. We ended up switching to an XMPP client, and we plan on creating an XMPP server for ourselves on a cloud instance so we know the conversation won't be intercepted by non-state actors.

I don't know if it will ever reach the popularity it once had, but XMPP is useful to us at least.

<comment><USER42> For all of the despair that people are expressing I think quite a few people are going back to Gopher, XMPP and other open and efficient (e.g. not "blockchain") protocols.

<comment><USER30> I run a gopher site/hole. but like, the users for that would be a small percentage even on a site like HN. In the wild, I'm going to guess it hasn't cracked a point.

Not exactly a renascence.

</comment></comment></comment><comment><USER43> It's amazing to me how many online friends I've lost contact with due people moving on from ICQ and AIM.

Back in the early 2000s, due to online gaming and hobby software development, Trillian would regularly have around 50 people online. These were not people I "collected", they were people I actively talked to for a variety of reasons: gaming, side projects, etc.

But then I got a job. Got a girlfriend. Got married. I got busy. I stopped logging in for about 4-5 years.

Around 2010 I was reminiscing a bit about the old times, and I reinstalled everything. There were only 3 people on AIM. Zero on ICQ. Oh well.

</comment><comment><USER44> Most of my long-time friends are in a private Slack we are all logged onto 365 days a year. Of course, Tim's connections span a wider relationship gradient, and I just don't have any equivalent to it other than LinkedIn chat (which has its own share of problems, since not everyone I worked with actually uses it - or cares about it).

(I also used to work at a place which maintained its own XMPP client - <USER3> open-sourced it on GitHub, but apparently new management decided to retire the repo... here's a fork for posterity: [https://github.com/yaye729125/sapo- messenger-for-mac](https://github.com/yaye729125/sapo-messenger-for-mac))

However, he does raise an interesting point - the Internet is less social these days, either due to baloonning growth or lack of depth, and it diminishes us somewhat. I swapped some e-mails with Tim, and Aaron, and a few other greats (a couple on Tim's list, too), but those interactions were always fundamentally different from "open" chat.

<comment><USER45> Slack is so hard for me to follow. Some friends of mine use it and every time I open it there's 50+ new messages and I just don't know how to participate.

<comment><USER46> Just jump in, whenever. I have a private whatsapp chat with a set of friends from highschool/university and sometimes I come back to hundreds of unread messages. Just skip to the end. It's like a conversation at a party, you're not supposed to follow every single thread.

It's certainly better than seeing them every few months (kids, etc).

</comment></comment></comment><comment><USER47> This reminds me of my time at the university. Everyone there was using IRC, and not just somehow using it, everyone had an instance of irssi running inside screen on the university's unix servers. When you were done chatting, you'd simply detach from the screen and irssi would keep on running on the background making sure you were always up to date.

The first thing that freshmen learnt was how to do just that. Windows users would install PuTTy and others, like me, would learn how to install and run Linux. Every community had its own channel, private or public, and life was good.

During my exchange year I was shocked to discover that this wasn't a standard practice in every university. The people at the other (non-technical) university were using a mixture of Skype and Facebook to communicate, but non of the feeling of being one big community was there.

</comment><comment><USER48> I helped start a independent IRC network more than a decade ago, for a closed group of people/geeks.

It's still going, but we've been able to observe other services draw some of those original people away. Or maybe family or real life did.

Either way, few of the original servers are still are around, same with the oppers.

The _net_ is still there though, and so are many of our old users. Or should I say friends?

God knows how long I've known them now.

It's all pseudonyms or handles like the internet originally was, but it certainly feels more real than Facebook despite their "real name" policy and all that nonsense.

</comment><comment><USER49> IMO this is one of the key value propositions of Facebook. Almost everyone has it, it doesn't change or get lost when you lose your phone (like a phone number can), and it's likely to be around for a long time. It's excellent for remaining in touch with the long tail of friends that you might otherwise lose contact with.

<comment><USER48> That was true a few years ago, but definitely not anymore.

Especially the teens are gone, but increasingly so is the 20-40 segment.

<comment><USER50> Right, people hate it for a hundred other reasons. But I have a Facebook name that I can give to a stranger on the street and then negotiate which chat to use. That everyone has it and you see their rough location and such, is where it has some value even for a FOSS and self-host nut as I.

<comment><USER51> I'm still an FB "monthly active user", in that I use it about once a month. As people have dropped off in my circles, one-per-month has become more than enough to catch up.

<comment><USER23> I'm in the same boat. Hardly using the site really shows how poor it has become. I'll pop in once a month to 50+ 'notifications,' only to find 48 of them will be "Josh posted a photo" or "Jake liked a post" despite that setting to turn off friend activity notifications turned off. I don't even bother with scrolling through the feed. Why should I? It is in no particular sort, I frequently scroll over the same five posts, and somehow every third post is an advertisement now. It would take hours now to 'catch up' just from all the pollution you have to sift through to see actual original content posted by your friends directly.

I used to be able to run through the news feed in like 5-10 minutes back when it was chronological and sponsored content was not passed around the site like a venereal disease. Why even bother now?

</comment></comment></comment></comment></comment><comment><USER52> ICQ/AIM died when Microsoft made Window come with their own default IM. Then people somehow moved over to Skype, then Microsoft bought skype, but screwed up, so people moved elsewhere. And Facebook happened. And smartphones happened. I think you can still reach most people via Facebook. IRC is also going strong! Gaming communities use VoIp services so they can talk in real time while playing games, there are a bunch of services targeting gamers exclusively. Old people still use mailing lists. Young people no longer use e-mail. XMPP is too damn complicated. We need something more simple, that use mostly direct connections (P2P) so public servers only are needed for discovery and NAT punching. The ID could be a public key hash, you just give the public key hash an alias on the client. Then the public key could also be used to encrypt messages. If you lose your private key you just make a new one, and tell your friends to add your new one. Other services can then use the universal ID and peer discovery services to build functionality like sending files, sharing photo albums only accessible by a set of public keys that has to decrypt a challenge to gain access, etc.

<comment><USER53> That's true ... I remember now how I didn't want a hotmail account at first but gradually other chat systems became silent so I migrated.

</comment></comment><comment><USER54> I wonder if part of what caused this was poor mobile support for the existing standards. It makes sense that the companies would be incentivized to make chat applications that were not interoperable, but I think the really bad state of existing standards allowed this door to be more open than it would have been otherwise.

<comment><USER55> A lot of people didn't understand it then.

Text messaging, in the pre-iPhone era, is what killed IM... and then it "came back" so to speak as a contentious feature of mobile phones (iMessage, Hangouts).

Text messaging won because everyone had a phone number and smart-phones/data services were seen by the masses as unnecessary or a luxury. When most people send a "text" they're sending an IM be it over WhatsApp, iMessage, Signal, Hangouts (or whatever google's is these days), Slack, etc so it really does suck we've gone full circle ended up where we started.

From the sounds of it, looks like it's time for some work on making XMPP sexy.

<comment><USER56> That's true and certainly the "global protocol" for lack of a better term on iOS is iMessage. Either using a phone # or email it doesn't matter, and they managed to get 95% of the people all talking to each other.

<Insert speculation about the total # of iMessage users being more than possibly either Facebook, Twitter, or LinkedIn>

That said, although people might be wary of the dominant messaging platform coming from the OS vendor, I don't see how Google can really connect everyone unless they are the ones who do it.

If only their messaging strategy was consistent - and not half assed, they might get somewhere.

<comment><USER23> iMessage is only popular because it functions exactly the same as SMS on an iphone aside from the color of your chat bubble, and the software defaults to it over SMS. If Apple separated iMessage and SMS into two apps, it would have failed.

<comment><USER30> What's crazy, is google is still trying to figure out how to get sms/chat/video call into a single app like 7 years later. How can this be so hard to see as adding massive value? my iFriends have had iMessage for half a decade, and I've seen so many chat apps from google I've given up and gone with something else in the mean time.

<comment><USER54> The saddest part of this to me is that Google had a huge head start with Google Voice which they let languish for years. When I realized I was being silently dropped from group messages because they were MMS and voice couldn't support it (which lead to people thinking I was ignoring them) I moved everything to Apple.

Since then they've released and killed a bunch of chat applications that have all been pretty poor - as an outsider it seems like something is pretty wrong with how they're handling that strategy.

<comment><USER30> And what's crazy, is it's so obvious, and so easy that every other chat app out there has basically converged on exactly the same fucking thing.

</comment></comment></comment></comment></comment></comment></comment><comment><USER57> > There was a time when commercial chat services supported XMPP because it was > felt to be the right thing to do.

There was also a time when services supported RSS for similar reasons.

Sadly the web became dominated by a few big players who want to make everything their own walled gardens to keep competition out.

</comment><comment><USER58> The only reason my Adium still has anyone at all is because a lot of people sign into Google Talk automatically when they open Gmail and don't realize it. Otherwise my list would be mostly barren.

<comment><USER59> I thought Google had retired GTalk sometime in their move to Google+, Hangouts, etc.? Is it still working via XMPP?

</comment></comment><comment><USER60> > once you get past Global Warming and deranged chiefs of state, the > atomization of the social fabric is high, high on the list. I haven't fought > hard enough to stay connected (not alone in that). And time grows short.

Predicted in 'Atomised', by Michel Houellebecq

<comment><USER61> The increasing atomization of society has been discussed since at least _The Lonely Crowd_ (1950).

</comment></comment><comment><USER62> It's a generational thing; growing old and inflexible means that the enthusiasm that caused you to adopt tools 10-20 years ago is gone and you no longer jump onto new platforms and tools like you used to.

The number of programmers doubles every 5 years. So, people (mostly techies, lets be honest) using stuff like xmpp ten years ago are outnumbered by millenials dominating the scene today that never used that. They use other stuff and are chatting more than ever. Stubbornly hanging on to IRC, Adium, or other ancient shit simply means you are not part of the conversation anymore.

I uninstalled Adium half a decade ago.

<comment><USER63> > The number of programmers doubles every 5 years.

Source? This might have been true few years ago but there seems to be an opposite trend.

<comment><USER62> [http://blog.cleancoder.com/uncle- bob/2014/06/20/MyLawn.html](http://blog.cleancoder.com/uncle- bob/2014/06/20/MyLawn.html)

Uncle bob. This is five years ago, so if you have numbers that prove the opposite, now would be a good time to point that out.

</comment></comment></comment><comment><USER64> To me it feels like many of the relationships/groups you have and people you meet in life is temporary, and the amount of effort you make to keep in touch can sometimes never be enough to keep in touch with people that just naturally drift away.

I think with IM the issue is that you don't necessarily "cross paths" with people you know unless intentional. It requires some openness, sincerity and a bit of humility to make that contact, which I feel is more stigmatized, even though that kind of approach would mean people would _want_ to talk to each other.

It's the type of thing you don't get with modern internet walled gardens and I've put more appreciation and effort to the face-to-face interactions than the ones I do with a screen. But I do miss having interactions with people that had all the same interests as myself, perhaps that's the real difference, restrictions of the real world mean people with the same interests and world view are limited in number and availability by virtue of proximity. Comparing these experiences can warp your view of the world and make you question what you actually value.

</comment><comment><USER65> I find it weird that email started as an open protocol; various companies tried to make their own private communities but those eventually dwindled and transferred to SMTP.

Why did realtime chat fail to take the same path? I assumed it would.

<comment><USER66> Technically, it did: Internet Relay Chat (IRC) has been an RFC for over a quarter of a century. To me, at least, it's an interesting question why IRC never really broke out of "only nerds need apply" status.

<comment><USER67> Because:

* No clients support multimedia - animated GIFs, videos, audio, images, video/audio calls - only Quassel has web previews and that's about it

* E2E encryption doesn't exist properly

* Signing up to protect usernames is a pain in the ass, especially if people span networks and assuming networks even have something like NickServ

* Users are require to have a bouncer to have some chat persistence

* No clients offer convenience features such as search

* It's a pain in the ass to manage channels to __just chat __

* Clients can 't handle mobile connections well

I'm sure I've forgotten other problems the protocol has.

<comment><USER66> I'm not sure any of those are issues that couldn't have been addressed by now through a new version of the protocol, though; what I'm trying to get it is that it's sort of weird to me that IRC in 2019 isn't materially different than IRC in 1994. IRCv3 addresses a whole lot of those problems, for instance, and there's nothing that technically could have prevented it from addressing them 10 years ago.

<comment><USER67> IRCv3 brings a bunch of really nice features I'm so happy to have, but it's really the clients that need a lot of work in addition to just IRCv3 features. Image, video and audio inlining is still something that no client does and the standard can't help with and that's a huge con for most users.

What the standard could help with is standardizing markdown formatting, some method of E2E encryption, better SASL (with registration, key rollover/update and distribution between your clients).

</comment></comment></comment></comment></comment><comment><USER68> The reason this happened is very simple. Notifications on platforms like iOS are only possible with installed apps and a server somewhere that's capable of sending notifications.

XMPP was great, it even had polling options for people behind shitty firewalls, but at the end of the day it wasn't possible to drop in a XMPP client and have it receive notifications without server support. This inherently balkanized messaging to each individual app. Further, the browser made installing applications locally a lesser-done thing, and since browsers weren't complex enough when the transition was happening (they didn't have notifications or LocalStorage at the time) an XMPP client in the browser alone (ie, sans coordinating server) wasn't possible.

There will be a solution one day though. Some entity always figures out a way to aggregate the things people want aggregated. If I had to guess I'd put my money on the OS, since there is no way to hide from it. In a fight between Apple and FaceBook I know who wins. The future looks like Her (2014).

</comment><comment><USER69> I lost contact with many people since the death of ICQ, AIM, MSN and google chat. But I was able to find some of them on discord.

I like discord, but it saddens me greatly that it's not an open service. I wish matrix would have taken off earlier, now that everybody is on discord, I have a hard time getting them on matrix.

</comment><comment><USER70> I think my friend cohort has just grown up and stopped prioritizing online connections for starting a family. Even if AIM was still on today, I doubt I'd have an away message and be on like I was in highschool living under my parent's roof with no car or anything else to do besides homework.

<comment><USER71> I think this is the real source of nostalgia. Kids these days are presumably still chatting to each other all day on the AIM of the era. Snapchat perhaps?

<comment><USER70> Agreed. I've seen Snapchat, Instagram, Facebook messenger, and WhatsApp being used regularly by younger people.

I don't know how I would navigate having so many chat platform options if I was growing up today...

<comment><USER59> AIM, ICQ, MSN, Jabber, Skype. There were as many options when I grew up.

<comment><USER61> You forgot Yahoo! Messenger :)

</comment></comment></comment></comment></comment><comment><USER72> "...because if chatterers can just go ahead and talk to anyone anywhere, then your service probably won't go viral and how are you going to monetize?"

I've said it before and I'll say it again: I don't think the problem is engineers, but capitalists. Specifically, grow-at-all-costs venture- capitalists (and those at FAANG, of course). Engineers, for the most part, just want to improve things. Increasing openness is one way of doing that. But right now they're getting paid tons and tons of money to do the opposite.

<comment><USER31> "Engineer" and "capitalist" aren't mutually exclusive categories. You can wave money around all day but ultimately somebody with technical skills has to write these applications and maintain these servers.

I don't know what RMS or Knuth are up to these days but I'm positive they're not working at Slack.

<comment><USER72> The difference is in where someone's primary goal lies. I'd bet that the majority of engineers in The Valley wish the tech industry was less monopolized, more open, and had better privacy standards. Just look at the sentiment of your average HN comment section. But those engineers also want to have jobs doing what they like and to make a living, and while they could arguably do more to put their ideals into action, they aren't the driving force behind unbounded growth and corporate conquest; they just get paid by it. Engineers can certainly become capitalists when power goes to their head - just look at Mark Zuckerberg - but I don't think most of them are in it primarily for the amassing of wealth and power.

<comment><USER31> > But those engineers also want to have jobs doing what they like and to make > a living

In the US, the average software engineer's salary is more than double the average person's salary. Nobody who chooses to be a software engineer at any of these companies has any trouble making a living. They could literally work only half the year and still do just fine.

The fact that they're doing this all year tells me that either they are indeed capitalists and wish to maximize their income, or building these proprietary systems is in fact what they like to spend all their time doing.

> they aren't the driving force behind unbounded growth and corporate > conquest; they just get paid by it

There's plenty of people in this world who have the skills to get paid far more than they do, yet spend their time and energy doing something they find more worthwhile. "We just get paid" is a dangerous slope to stand on.

How do you reconcile them as idealists who want less monopolization and more openness and better privacy, yet at the same time aren't doing it for amassing wealth? What other reason could there be for doing a job one doesn't want to do?

> Just look at the sentiment of your average HN comment section.

People are notoriously bad at accurately explaining their own behavior.

<comment><USER72> > How do you reconcile them as idealists who want less monopolization and more > openness and better privacy, yet at the same time aren't doing it for > amassing wealth?

I never said they were all idealists. I'm saying being complacent to negative change is different from actively driving it.

> What other reason could there be for doing a job one doesn't want to do?

I never said they didn't want to do the job, just that if it were up to them they might do it differently. They're still building and improving systems, just not in all of the ways they may want to.

I'm not painting people as angels and demons. I'm just tracing this phenomenon down to its baseline driver.

</comment></comment></comment></comment></comment><comment><USER73> I'm surprised he could keep the list for so long. I remember every time I changed my computer or reinstalled the OS, only ICQ would diligently repopulate the contacts list. Everyone else would have to be re-added manually.

</comment><comment><USER74> A big difference I see between the IM days and today is that there are no more away/status messages. That's something that really prevents me from chatting with people over SMS/iMessage (the only universal 'chat' apps left in my life). I think even though we're all 'always online' these days, I would still set my status to 'available' if I was online and wanted to chat. Just leave it on 'away' or 'busy' for most of the day and then when you're online and wanting some real-time chat, open up your status and see who's online. _sigh_

</comment><comment><USER75> I completely forgot about Adium. If I remember, there was an iOS app too at one point? Or there was a way to have it push messages to you phone when you weren't at your computer?

Slack, Discord, Messenger, ... should have made Adium clients as alternative to a full blown Electron App. That would have been pretty rad.

I clicked on the source link and development tab only to be greeted by an expired security certificate error and broken Trac. I take that as it's not maintained any more. Sigh, so sad.

</comment><comment><USER76> "These days, more and more are always grayed out, because they were on some other service that's no longer connected."

More likely people just stopped using instant messaging. Ubiquitous mobile email, Facebook, and text messaging has not only replaced I stant messaging but have shoved our social circle into a much narrower geographic circle. Back in the day there might have been one person out of ten I talked to online that I knew in person. Now it's just the opposite.

<comment><USER50> But.. facebook and sms _are_ instant messaging? I'm not sure what one you're drawing.

<comment><USER76> Different usage profile. Instant messaging was typically used for real time conversations. Facebook messenger, Twitter DMs, etc are typically used for delayed messaging, where the messages are longer and the sender may not expect a reply for hours.

<comment><USER77> I grew up through AIM, MSN Messenger, ICQ, etc. and Facebook Messenger is used the same exact way except that it has "offline receiving" which expands its usefulness.

Maybe you are over-extrapolating from the fact that you stopped instant messaging as you got older.

</comment></comment></comment></comment><comment><USER78> I thought this was going to be another article about ageism in tech. It may still be, but in another way, I suppose.

Good article. I liked it.

<comment><USER79> I had the same fear myself... I thought if Tim Bray can't find a job as an older tech worker, what chance do the rest of us have?

</comment></comment><comment><USER80> So, anyone knows what happened to Mark Pilgrim after all these years?

<comment><USER81> Believe he works for Brave now

[https://github.com/pilgrim-brave](https://github.com/pilgrim-brave)

<comment><USER82> Interestingly, just yesterday I was wondering what happened to Jon Udell (whom I used to read for his thoughtful perspective back in the aughts, but haven't followed in a long time.)

Inspired by this post (he is listed among tbray's "grays") I checked him out. Turns out he works for Brave too.

Also, TIL about Brave.

<comment><USER66> I think he works for Hypothesis, not Brave:

[https://web.hypothes.is/team/](https://web.hypothes.is/team/)

Hypothesis recently made their plugin compatible with Brave and Udell wrote a blog post about that, as he appears to be a Brave user -- but I don't think he works for them.

<comment><USER82> Oh, you're right. I was misled by the Brave post -- sad to say I'm _mostly_ unfamiliar with either project.

</comment></comment></comment></comment></comment><comment><USER33> An aside to the discussion about open standards and all that: As someone who watch most of you from far away but was too young to join in, it always felt like tech was this small group of people who all knew each other. Nowadays, it seems rather crowded field, I'm surprised any of you keep track of each other.

</comment><comment><USER83> Haven't touched Pidgin or Adium for ages, although I've got them installed on Linux and/or macOS (really liked them). The way of IM has changed, so many social features added into IM making it more like a social chat profile presence... As we leap into the mobile age, also, over the last few years, services like Google Talk (XMPP).

IM services used on a daily basis: Slack, WhatsApp/WeChat, Keybase chat (for serious stuff). Sometimes I still use IRC, very rare though.

<comment><USER30> Wait a second, all of that social stuff can be in pidgin as well. It's been added to every proprietary client, usually as a repeat, but platforms all have the idea of sharing a photo, liking/loving/laughing at a comment, video chats. What am I missing that is creating lock in other than the creators themselves creating lock in?

</comment></comment><comment><USER84> I've made so many real-life friends on Usenet. I miss that. I meet them IRL from time to time, but we don't have any online community to match anymore.

<comment><USER30> I'm still in 3 IRC rooms, I meet up with a few of the people a couple times/year. It's nice, it's still out there, but it's not quite the same any longer.

</comment></comment><comment><USER85> I remember a friend of mine using Adium to send me Twitter DMs. Looks like they still have some type of support for it ([https://adium.im/help/pgs/ServiceInformation- TwitterSupport....](https://adium.im/help/pgs/ServiceInformation- TwitterSupport.html)). Maybe we'll see less "graying out" if we link up our twitter accounts to Adium.

</comment><comment><USER86> I learned to write code because of a very different internet, and I feel like if I'd grown up with the internet we have today I never would have bothered. Interoperability and disintermediation were such powerful, intoxicating concepts that I turned my entire life around and started writing software for a living. These days, except for the money, it feels like a mistake.

</comment><comment><USER87> ICQ recently disabled the OSCAR protocol, which means I am not able to use it with Pidgin anymore (well, at least until someone writes a working plugin).

I really have to completely switch back to IRC, which is sort of protected against this sort of thing because it is an RFC standard.

<comment><USER88> > ICQ recently disabled the OSCAR protocol, which means I am not able to use > it with Pidgin anymore

Which is a strange claim, as it seems to work for me. Got the message they were turning it off, and then it just continued to work. _shrug_

<comment><USER89> From what I heard, you can still log in, but now if you try to send a message, it'll tell you that it's no longer supported. I imagine this behavior will eventually change.

<comment><USER88> Message sending also works.

</comment></comment></comment></comment><comment><USER90> Matrix + bridges should help us technically oriented people connect with friends regardless of what they use. There are bridges for slack, IRC, facebook messenger, whatsapp, xmpp, gitter and many more.

</comment><comment><USER91> Makes me think about the stratification issues I have on my phone these days - some conversations in What'sApp, Telegram, Signal, Riot.im not to mention text messages, email etc.

Becomes exhausting.

</comment><comment><USER92> Wow - how did he ever get in touch with so many people, let alone stay in touch and then be able to remember who they are and their potted histories

That is why I am bad at networking ...

</comment><comment><USER93> Interesting. I haven't used any chat clients in my personal life for 7 years or so. I still have to use whatever my job prescribes, which is currently Skype.

</comment><comment><USER94> Not sure why, but this idea of reminiscing on the "old" internet reminds me of old Runescape. If you know, you know.

</comment><comment><USER95> The death of XMPP was what made me give up on chat applications entirely.

</comment><comment><USER96> This just seems self-aggrandizing. There's always been something a bit off about Tim Bray's self-presentation online. Not sure how self-aware the guy is.

</comment><comment><USER97> I felt sad...

<comment><USER98> they're like digital avatar tombstones with greyed-out names and touching pithy eulogies

</comment></comment><comment><USER99> Hey, there is twitter

(at least many of the ppl in the least have accounts there)

<comment><USER21> Oh good, just what I wanted, all my private conversations made public so that dumb things I say to my friends can come back to haunt me years later and hordes of howling idiots can shower me with death threats because I don't agree with their deeply held opinions about the latest McMarvel movie.

Progress!

<comment> 5874-4b22-a4e0 Just have everyone make a new account everyday. Help boost up the subscription count to help existing shareholders. Two birds with one stone.</comment></comment></comment>


I built an online RSS reader with Rust and WebAssembly - <AUTHOR> https://quickrss.now.sh/ <comment><AUTHOR> I built this as an experiment with Cloudflare's Worker Script.

Here's a bit behind this app.

\- Frontend: Just few lines of code using Svelte

\- Backend: a Worker Script using Rust, here's how I do the RSS to JSON stuff:

        #[wasm_bindgen]
        pub fn parse(content: &str) -> String {
            let feed: Option<rss::Channel> = match content.parse::<Feed>().unwrap() {
                Feed::RSS(rss_feed) => Some(rss_feed),
                _ => None
            };
            if feed.is_some() {
                let rss_feed = feed.unwrap();
                let items: Vec<serde_json::Value> = rss_feed.items.iter().map(|item: &rss::Item| {
                    return json!({
                        "title": item.title.as_ref(),
                        "link": item.link.as_ref(),
                        "date": item.pub_date.as_ref(),
                    });
                }).collect();
                return json!({ "feed": items }).to_string();
            }
            return "".to_string();
        }

The only overhead, I think, is the part that I have to actually write the code to fetch RSS content in JavaScript (worker.js), as fool as you can imagine:

        const url = request.url.match(/url=(.*)/);
        if (url && url.length > 1) {
          const feeds = url[1].split(',');
          let promises = feeds.map(async url => {
            const res = await fetch(url);
            const text = await res.text();
            const json = JSON.parse(parse(text));
            return json && json.feed || [];
          });
          let result = await Promise.all(promises);
          let combined = result.reduce((arr, feed) => {
            arr = arr.concat(feed);
            return arr;
          }, []);
          return new Response(JSON.stringify({ "items": combined }), {status: 200, headers: {
            'Content-Type': 'application/json'
          }});
        }

If network libraries such as `reqwest`, and some date parser libraries like `chrono` already supported WASM, I'd be able to skip this JS step for good.

Deployed on Cloudflare using Wrangler CLI, I'm still on my free plan, and I hope I won't hit a 100k requests/day limit anytime soon.

</comment><comment><USER2> It is cool, but it is not really an application in the expected sense. It is just a 2 stage RSS to HTML converter (e.g. RSS->JSON server, JSON->HTML client).

Not sure why not make just do RSS->HTML directly on the server.

Obviously, does not track read state or sync, or anything else basically.

</comment><comment><USER3> This is neat! I'm definitely going to be making use of this :)

<comment><USER4> Do you have a current rss reader you use? Will you be moving all your feeds to this reader?</comment></comment>


The Importance Of A Competitive Search Market - <AUTHOR> http://www.techcrunch.com/2008/05/25/the-importance-of-a-competitive-search-market/ <comment><USER2> I do not know what is technically possible, but I am absolutely sure that to say Google will remain the All Mighty of Search is similar to saying " Hey, I am short sighted". Search is painful and will ultimately die and give its place to something else. Think Ford's automobile vs "faster horses". In the short term, Input will change from text to voice. In the long term Search will give place to Suggestions and Decisions. Sort of like a game. Machines will have so much data about ourselves thru Facebook, Disqus (and the multiple other places where you exist) and become intelligent to the point where they will be able to predict our behavior and make suggestions. Example: Xobni will read that you want to go to Paris in June with your girlfriend and suggest deals on a daily basis. Google is already doing it with Gmail and it proves that Search is truly archaic and the innovators should focus on the power of suggestion.

<comment><USER3> Search is far from archaic. It's here to stay. Even if Xobni or Facebook figure out how to make useful suggestions by predicting my intentions (something I doubt would work very well, no matter how much they know about me), it would have a near insignificant impact on the utility I get from Google. People will always want to search for information and unless someone figures out how to build a better search engine than Google, Google will remain king.

With regards to new interfaces (voice/visual/whatever) that people sometimes say will be the "next big thing" in search -- these are just features that Google can easily implement if they prove to be so effective (which they probably won't -- I'd much rather type in my query than say it). Replicating the sophistication, performance and scale of Google is much harder.

<comment><USER4> Cuill ( <http://www.cuill.com/> ) and Powerset ( <http://www.powerset.com/> ) are both contenders to make a better search engine. Cuill assumes that you can make a comparable search system more efficiently. Powerset assumes that more pertinent results have higher value. Scalability isn't an issue for Cuill. Cuill's president is Anna Paterson, who is partly responsible for Google's scalability.

Anyhow, Cuill and Powerset both have scope to make systems which are more efficient and could therefore be supported by less intrusive advertising. The switch from AltaVista to Google was influenced by the intrusiveness of advertising. Perhaps this consideration would inflence a subsequent transistion.</comment></comment></comment>


"So, What Do You Do?" - <AUTHOR> http://thebaffler.com/latest/so-what-do-you-do <comment><USER2> Being in my 20s, I've learned that it's not a good idea to ask that among my peers at parties, since so many are in service industry jobs (if they have jobs at all) that they hate and don't want to talk about. Even if they do have salaried careers, it seems most people would rather talk about something besides work.

Tech parties are a different culture since many of us are fortunate to be employed in self-actualizing roles in high-growth companies, or at the very least enjoy their jobs better than most. However since I live in the Midwest, engineers aren't as plentiful as in the Bay area.

At any rate, I usually just ask "how do you spend your time?" instead if Im fishing for conversation material. It's a bit more open ended

<comment><USER3> Yeah I avoid the "what do you do (for a living)?" Question too. I prefer to ask, what do you like to do for fun. So many people dont have an answer, its sad.

<comment><USER4> There's a risk in that, too. Some people don't have the luxury of free time. E.g. Working multiple jobs to get by.

You just can't win...

<comment><USER3> if they're working multiple jobs i doubt they have time to be my friend anyways.

</comment></comment></comment></comment><comment><USER5> About 35 years ago, a guy in the group house was laid off. He remarked on how uncomfortable it made people at parties when they would as "So, what do you do?" and he would say "Nothing." I don't know that it especially bothered him.

<comment><USER6> Good point.

The problem isn't doing nothing, it is that many are insecure not having a 'story'.

We as a society need to get past work as a justification for our existence.

I say this as a complete hypocrite, who finds tremendous meaning in my work.

</comment></comment><comment><USER3> >The top one percent of the world population hoards over 110 trillion dollars

That provides ~630k a year perpetually (average). I wonder how much wealth is the cutoff line of top 1% (~70M ppl) ?</comment>


How earphone remotes (with play/skip buttons) work on a single wire - <AUTHOR> http://unix.stackexchange.com/a/41989/11724

<comment><USER2> The linked answer is close, but not entirely correct. There isn't a specialized wire for buttons; it uses the microphone line.

Play/pause will usually be connected directly to ground. The other functions connect to ground through different impedances. While each impedance level is roughly twice the last one (which makes the detection circuit simpler) having one level at 1 ohm and the next at 2 ohms is not practical due to noise. Also, due to the way that parallel impedances work, you do not get a binary encoding of the buttons pressed. (Do you ever really want to skip the track and increase the volume at the same time anyway?)

<comment><USER3> Would increasing the resistances to something more significant like 1k, 2k, 4k ohm make any difference wrt noise?

<comment><USER2> Not really. You only need to space out the levels by a few ohms.

Microphone impedances start around 500 ohms, so if you go higher than that, you can't distinguish between a button and a working mic.

</comment></comment></comment><comment><USER4> But what I want to know is then how the microphone signal is implemented with the 4-wire system, in addition to playback controls.

<comment><USER5> The microphone is in-operable when a button is pushed, at least for all intents and purposes. The resistance of an average headset microphone is relatively high, 100-500 ohms if i were to guess. When you put a small resistor in parallel with a resistance this high it has a negligible effect on the resistance of the combination. For example if the microphone were 500 ohms and your switch put a 5 ohm resistor in parallel with it you would expect to read ~4.95 ohms of resistance total.

</comment></comment><comment><USER6> Why does the title include "on a single wire"?

The current stackexchange question does not use the phrase "single wire" and more importantly nothing about your headphones will work with a single wire.

<comment><USER5> > The current stackexchange question does not use the phrase "single wire" and > more importantly nothing about your headphones will work with a single wire.

Its pretty common in the electronics world to not count the ground as a wire in a communication protocol, only wires carrying data are counted. For example the "1-Wire" inter-IC bus create by Maxim.

</comment></comment><comment><USER7> A little off topic, but this not standard additional features reminds me about fictitious features of the _Martian Headsets_ models in <http://www.joelonsoftware.com/items/2008/03/17.html>

<comment><USER2> His headset analogy is pretty accurate. It even goes one step further though: In China, some headsets have the mic and ground pin swapped. So before putting a signal on the mic line to see if it exists, you have to detect which pin is ground.

</comment></comment><comment><USER8> It's cool to know how this works, I've been trying to repair a couple of senhaisher plug headPhones+mic for the Iphone (they broke at the jack) and I couldn't make them work. I am courrently able to use them to listenimg only. The mic and the controls are not working. And I tried all the combinations at the jack...(well maybe not all or it would be working perfectly).

I tried to find some diagrams but was unable. Maybe this will help me.

<comment><USER9> Same issues here. I had three pairs of amazing Rocksford inear headset with huge bass chamber 14mm drive I believe. Anything after that plugged into the ear sounded dead flat. Anyways, of course the problem is jack and wearing it with ipod it died withn month. What a frustration. $120 headset that are junk only because of broken jack.

We need a robust 3.5mm jack short cord extention. Something that would be robust in built but protect oryginal jack the same time. I think plenty of people that appreciate quality music on the go would chip in for such a cord. I would definitely give $15 to protect jack of my high quality headsets. If someone starts a kickstarter on this, I will pledge.

</comment></comment><comment><USER10> "modern" headset remotes that work with devices from a major vendor have long since abandoned the analog resistor approach in favor of a digital system.

The details of the implementation aren't disclosed, but people have seen a whiff of it, e.g. here:

[http://superuser.com/questions/107378/what-is-the-apple- mike...](http://superuser.com/questions/107378/what-is-the-apple-mikey-hid- driver-for)

</comment><comment><USER11> <http://en.wikipedia.org/wiki/1-Wire>

Probably not used in headphones, but it could be.

</comment><comment><USER12> This is kind of lacking.</comment>


Ask HN: What do you use Celery / RabbitMQ for? - <AUTHOR> <comment><USER2> To easily distribute jobs over a cluster.

Running right now:

I have a database of 100,000,000 molecules, and I need to compute the force field on all of them. So I put all of the IDs in the celery queue, and then start a worker across 6 nodes,

The job pulls the row from the database, computes the force field, and then stores the result.

Lots of jobs like this: \- I used to use it to tune hyperparameters of shallow models \- Used it to batch convert a bunch of compressed files from one format to another \- Use it with celery beat to schedule scraping of URLs

</comment><comment><USER3> We have written distributed crawler using celery/Rabbitmq.

Analyzing social signals real time and it is processing more than 10 million requests everyday. On the way to scale it to process more than 50-100 million requests per day.

Other than that doing nlp tasks along with machine learning using topic modeling, ner etc.</comment>


Former Lyft Exec Denies Taking Confidential Data with Him to Uber - <AUTHOR> http://techcrunch.com/2014/11/06/vanderzanden-strikes-back/

<comment><AUTHOR> I'm curious as to how this will play out. The complaint seems pretty specific. I imagine that Dropbox will have excellent records of when any files were added, accessed, or deleted.</comment>


Show HN: I made a command-line Slack chat client - <AUTHOR> https://github.com/TidalLabs/Slacker <comment><USER2> Slack has an IRC backend and IRC has CLI and Curses interfaces you can use (even Emacs interfaces).

<comment><AUTHOR> That's true! But there are two reasons I didn't go that route:

1) I wanted to build this ;)

2) Slack's IRC integration does not mark messages as read until you exit the IRC client. (Granted, mine doesn't mark them as read at all, but -- it _can_!)

<comment><USER3> I upvoted this comment because I really like the idea of "I built this because I wanted to". I like the idea of Show HNs as an "I made this thing for me, and not for any other reason". Thanks for posting your project!

<comment><USER4> Reminds me of this comic, which I've always thought had something positive to say to engineers: [http://wondermark.com/666/](http://wondermark.com/666/)

<comment><USER5> I love that thank you

</comment></comment></comment></comment></comment><comment><USER6> I was building something similar in Go for the exact same reason so looks like there is validation for the product at least! Great work on shipping, incredibly well commented and clean.

<comment><AUTHOR> Thanks, appreciate it! I considered Go for this too, but wanted to use PHP because you don't see too many curses PHP apps around, and I wanted to observe one for myself ;)

</comment></comment><comment><USER7> How did you like working with PHP for the project? Pros/cons?

<comment><AUTHOR> Honestly PHP was a breeze!

There's only a couple of things that stood out to me as suboptimal:

\- PHP ncurses is not well documented beyond just function signatures. Of course, curses itself is well documented, and ncurses functions map one to one with the PHP extension, so that wasn't really that bad.

\- I should have separated my classes and built a PHAR (PHP archive), but I got lazy.

\- There's the portability comment I've made a few times already

But other than all that, PHP did its job perfectly. Easy to write, read, and organize.

<comment><USER8> Did you know that Slack itself is also written in PHP?

[https://twitter.com/SlackHQ/status/426469205005705217](https://twitter.com/SlackHQ/status/426469205005705217)

<comment><USER9> Note that this tweet clarifies that P stands for PHP and not Python or Perl: [https://twitter.com/SlackHQ/status/499432194398756864](https://twitter.com/SlackHQ/status/499432194398756864)

</comment></comment></comment></comment><comment><USER10> i was all interested until i saw PHP. That's not a dis on PHP. It's just that PHP is _so_ not the right tool for the job for a command line client. Sure, it appears you can coerce it to do that but... it's designed for embedding in web pages. that's what it's good at. if you want to write command line tools, write them in a language that's actually designed with stuff like that in mind.

<comment><AUTHOR> I actually intended to write a comment in the README about my choice of language, but as things go, I forgot.

This was, first and foremost, an educational pet project for me. I /like/ building things in the wrong language. Hell, I run a blog called "Machine Learning in JavaScript", and I can't tell you the amount of criticism I've gotten over the years along the lines of "wrong tool for the job!".

I was actually surprised how well this worked in PHP. The only issue is that the ncurses PHP extension, not being compiled by default in most package managers' PHP distribution, does force you, the user, to take an extra step in installing it. That is unfortunate.

That would be a grave issue if I saw this as a product, but since it's a pet project, I see that as totally acceptable :) I actually never even intended to release this publicly!

<comment><USER11> > I /like/ building things in the wrong language.

That's not the issue here. You could have written that in shell script it wouldn't matter. Just that PHP(+ all the extensions required) makes it more difficult to deploy for someone who just want to try out your project.

<comment><AUTHOR> I disagree. When I build a project for fun, or for education, as in this case, the last thing I want to be thinking about is you!</comment></comment></comment></comment>