Working at Nyxt / Atlas Engineer: Thanks and Sorry
By Artyom Bologov
And you will never see my side And I will always think I’m right But I always regret the night I told you I would hate you ’til forever
Nyxt was (is?) this idea of a power-user Web browser. Extensible, hackable, keyboard-driven, written in Lisp. And the company behind it was quite good: transparent communication, open source commitment, work that moved Internet forward. The company was Atlas Engineer, and I was part of it. I am thankful, worried, and sorry about Atlas Engineer. So let me tell you how it went with Nyxt and Atlas.
Note that the bulk of this post was written around October of 2025. Meaning two things:
- It was sitting in my digital desk for a long time, as I was hesitant to publish it. I’m still not sure I should’ve, actually.
- It was written well into two years of me leaving Atlas Engineer. Both time and emotions could’ve erased or fabricated events. Be wary.
Atlas Engineer Team #
First, I have to introduce you to the most amazing team I worked with (in alphabetical order):
- André A. Gomes (aadcg)
- A second CTO (2022–2025) and the person advocating for sound engineering practices. Like unit/regression/end-to-end tests, CI/CD, and documentation. Github. Countries undisclosed.
- Artyom Bologov (aartaka)
- Extensibility Engineer—yeah, I came up with it myself! (2020–2023) Lisp, Brainfuck, ed(1), and an endless desire for customizability and inspectability. Personal website/about. Russia 🇷🇺, Armenia 🇦🇲.
- John Mercouris (jmercouris)
- CEO (2017–present) and the main ideological force behind Nyxt. The one who started the project on his Mac and brought NeXT aspirations into Nyxt. DJ and traveler. Working two jobs just to keep the project alive and us hacking. Personal website. USA 🇺🇸, Greece 🇬🇷.
- Pierre Neidhardt (Ambrevar)
- The first CTO (2018–2023) and the main architecture and research person. Author of numerous libraries, both around Nyxt and outside it. FOSS and reproducibility person, and a convert farmer. Author of the legendary “A Lisp REPL as my main shell”. Nuked personal website. Countries undisclosed.
- Thomas Lansing
- Cofounder of the American branch (2022–2024.) Designer and UX person with a good eye for things and an earnest user researcher. A person I spent countless hours debating on semantic HTML and Accessibility with. LinkedIn. USA 🇺🇸.
- Numerous contributors and users!
- The stuff wouldn’t ever work without y’all, so thanks for the ride 🖤
Early Days: Not Much Is Known #
I’m only going to tell what I know and lived through. And 2017–2020 Atlas Engineer I have not lived through. So here’s an anecdotal story half erased from my brain by time and emotion:
It started with John working on toy compilers. That’s how he got into Lisp.
The time was ripe for browsers, including Lisp ones: LispKit was just going on a hiatus. Closure (not the Google one) was an inspiring web engine written in Lisp. And Mac Cocoa WebKit interface could be called from Lisp, through C.
John did that. Or so the story goes.
Then, at some point, three things happened:
- Nyxt (then Next) became more public.
- The project became more Linux-oriented (through a crowdfunding campaign still mentioned in Nyxt credits screen.)
- Pierre joined the team out of excitement for a Lisp-based browser.
Not sure if these facts were simultaneous/related, but they might as well have been. Now the team had two people, and occasional (unpaid yet enthusiastic) contributors, like Vincent Dardel.
Nyxt was slowly taking shape and even started being useable (😄) at some point in 2019. The first public-ish release was 1.3.1 in September 2019 and a long path to 2.0 started somewhere in 2020.
Dream Internship #
Did I warn you this is a deeply personal story? Well hi, I’m Artyom, and I’m into Kpop and Armenian Greek vanilla yogurt!
I studied in a “social-humanities” track in high school. But, just the moment before the final year, I decided I want to become a programmer. Out of the blue. So I signed up for programming exams (in addition to 6 other exams.)
I failed miserably, unable to complete even one of the real programming tasks. I wrote some semblance of Java code that you’d probably see from some low-end “AI” today. But I passed the exam nonetheless.
With these results of exams I got into an experimental School of Advanced Studies (that’s now suffering through power struggles and overall Russia happening around.) And studied a lot of seemingly unrelated things there.
I remember my girlfriend accusing me of lack of attention to her. I was reading r/lisp subreddit on the bus to university. We had really long commutes from Tyumen outskirts to the city center. And I was spending it all reading on obscure tech no one used. What a waste of time, right?
It’s then that I noticed Nyxt mentioned in some discussions. Wow, someone makes a real Web browser in Lisp!
And when the obligatory university internships started, I knew: I want to work on Nyxt (finally renamed with an ‘Y’.)
I still remember the tremor I had while writing an email to Atlas Engineer. Still hatching English, still uncertain prospects, still stuck with parents amid Covid lockdowns. So why not message Atlas folks suggesting I work on browser security? Hit “Send” (just kidding, it’s
C-c C-cin Emacs!)They responded. We had a nice chat/interview and they agreed to take me on an internship. (Mostly because my first email was masterfully crafted, as John later confessed.) Working on Force-HTTPS Mode as the first (and almost the last) security task. And then going crazy with huge refactorings and new features, like auto-mode, enabling functionality / modes per page / URL / scheme etc..
The internship was successful and I became the third team member. Running around and breaking backwards-compatibility.
2.0 and Pre-Releases #
When I joined Nyxt, 1.5.0 was the version to use. Imagine my horror at the thought that I have to adapt my config to an upcoming 2.0! And—oh god—the mere idea I should work on this 2.0 myself too!
Not wanting to commit to either date or feature set, we decided to do pre-releases. Alpha, beta, whatever. We just called it “pre-release-1”, “pre-release-2”, etc.
The story was repeating multiple times with every major release (v2, v3, and now v4.) We kept spawning pre-releases, unwilling to commit to an x-point-zero. Which resulted in many broken and version-less configs out there:
#+(and nyxt-3 (not (or nyxt-2 nyxt-3-pre-release-1)))
Typical pre-release poisoned feature flag in my config (used to be worse) But the whole version thing wasn’t really important. I worked in a real dream team! While still being an undergrad student. Rags to riches!
Working Environment #
We were a fully remote team. I mean, no two people on the team met until 2024, I think? So we communicated over email, Jitsi, and Github. We also made commitment to have most communication public. So that our contributors and general public sees. The reasoning. The solutions. The debate. The process. Perpetuated in commit history, forum posts, and Github review comments.
And it all was a blessing. I could focus on The Work and communicate with people only when I really need their input or help. And I was a fast learner back then, so I caught up on Lisp, Git, Magit, email conventions, Guix, Emacs, and many other things.
Atlas was perfect for an introverted self-learner (a frequent pattern in Lisp community?) No interruptions, no syncs—except for a weekly call with John, just to touch the base—no paperwork. Just you and real features users asked for!
We (John, mostly) started applying for grants. Like NGI Zero/Core funds. And the grant applications were… accepted and approved. We finally started getting money, after four years of project existence! So we decided to set an equal sum we all got as salary. Big enough to live on, but small enough to not deplete the grant money. I was finally going to this cool ramen place and eating my (vegetarian) noodles with mushrooms sometimes.
A Day in Nyxt #
Of course, the schedule was not set in stone. We were working in totally different timezones. And the working hours were not set either. Some day you might work four hours, some day—twelve. We trust each other.
It always starts the same:
- Open Emacs;
- Lauch Lisp REPL there;
- Load all libs we use (we used lots, as the biggest Lisp project out there;)
- Start Nyxt from the REPL, as yet another library, running in the background;
- Open Github in the running Nyxt, navigate it with keyboard, and pick some curious issue;
- All without using the mouse, by the way!
- Modify Nyxt code, redefine functions, recompile UI, change objects;
- Reload page in running Nyxt and observe the changes;
- Commit the modified code;
- Open a pull request and fill out formalities using custom Nyxt commands;
- Go to Atlas forum and nerd snipe self into writing some config (or even going and updating something in Nyxt) for a user;
- Maybe remember that filling Nyxt blog is the responsibility of every one of us, and start/continue a new post for the blog;
- And then lie awake at night (I have chronic insomnia) and think about what else Nyxt can benefit from.
Solid Ground and Team Growth #
The moment of bliss did last. Pierre worked on many necessary architectural revamps. John was working on grants, ethical monetization ideas, and was occasionally coming up with some projects and concepts. Like Demeter, our RSS app embedded in Nyxt. All of these projects revolved around how one can interact with the Web even more productively. We all wanted that, as Web users and engineers.
I (as an Extensibility Engineer) worked on customization features:
- REPLs,
- extensions protocol (or, rather, the absence of it—all of Nyxt was open to the user/programmer,)
- Interactive manual,
- Hooks (with the help from Pierre,)
- User scripts/styles,
- Object introspection,
- Color themes,
- WebExtensions support.
WebExtensions
WebExtensions were especially important/painful for us all. It’s a huge API that everyone needs—because Firefox and Chrome extensions are a human right. And yet, WebKit/GTK does not support WebExtensions.
So we had to fix it. Fix it twice, actually. First I tried to address it with a C+JavaScript hack-driven library. And long after I tried to do it in Guile. None of the efforts was successful enough, and neither worked (spoilers!) the moment I left the team.
And we also had the team growing! We had multiple interns over this 2020–2022 period. Pedro, Vasily, Luka, Jing, André. André passed the internship and joined Altas officially. So we got another person on the team, and a stupefying amount of features released. With 2.0 coming out in 2021 and supported through 2022, we were getting to v3 real fast!
Depressing Times #
And then… war in Ukraine started. We all had a lot on our plate. I escaped Russia for Armenia and almost abandoned burnout-inducing university. Other team members coincidentally were going through hardships too. With funds diminishing. And grants failing (in part due to my burnout from working on grant projects alone.)
I have to thank Atlas team for many thing. In part for not abandoning me, a Russian, in these times. They helped me leave for Armenia, allocated funds for my emigre survival, and always were there when I needed a counsel.
This moment was when Tom joined the team. And he kind of helped us to re-center on the user again. Together we shaped our visual language, branding, and priorities. Me and Tom did really argue a lot about things and their meaning, which was good. That’s when I understood I do care about design and accessibility. And that I do like the Web, despite it being non-Lisp.
Snap! #
Still, the toll accumulated. I was in a foreign (however welcoming) country, with no relatives to rely on, in failing relationships (TMI, Artyom,) and overall burned out. So some discussions and behaviors were gnawing at me. Someone was pushing things in avoidance of established conventions. Some things were happening against previously agreed-on decisions. Releases were rolled out incomplete. Bugs were introduced. Power dynamics shifted.
I mean, totally human stuff.
But I did snap nonetheless. In yet another email exchange, related to improper and rushed PR merges. I exploded at John, as the person ignoring conventions most. (For totally valid reasons—he had a lot on his plate.) My burnout got the best of me and I said a lot of things I shouldn’t’ve.
We had a regular weekly call with John after that. Awkwardness hung in the air. I also had a chat with Tom, as the person I was vibing with most at the time. We all agreed that I’d better work on my own part of Nyxt, with minimal interaction with the team. Say, modernizing WebExtensions.
Three months on, with WebExtensions not really going anywhere. I got an email suggesting we part ways. And I kinda agreed. (Writing an angry resignation post in the process.) The trust was never recovered. The team was no longer one.
Late Nyxt #
We talked with Pierre once after I left. He left Atlas too, saying that the environment was no longer what it used to be. He moved to another country to do farming. (Oh do we all want to move to a farm somewhere else!)
Tom left the team a year after that. We talked on LinkedIn once or twice. He’s working in green tech now.
André left just now due to company funds running out.
John seems to be the only one still working on Nyxt. Sporadically. Irregularly.
In Nyxt, there were (as of October 16th 2025) no commits since August 1st. atlas.engineer seems to be down. And issues are left unanswered.
I am scared for Nyxt. I am worried about the people we had on Atlas Engineer team. I am thankful for all the time and experience we had together. I am sorry for not being the best teammate.
Atlas Engineer was a perfect team. Let us have more of that in the world.
Leave feedback! (via email) #