2025-05-03 · Ryan X. Charles
I want to spend a moment to highlight some of the open-source projects and cloud
services I use that make all of my apps possible in 2025.
Currently I operate three apps in production:
Hallucipedia, a collaborative AI-generated
encyclopedia, Identellica, a pseudonymous identity
verification system, and EarthBucks, a blockchain for
small casual transactions. All three apps are webapps that work well on mobile
web and desktop.
Current Tech Stack
- Node.js: Although I am excited about bun.sh and
Deno, I still use Node.js for all of my apps because it
is so proven and reliable and the benefits of the alternatives are not yet
compelling enough for me to switch.
- TypeScript: Ever since I switched to TypeScript, it instantly improved my
productivity, and I would never want to go back to plain JavaScript. Being
able to specify types reduces almost all of the standard bugs with JavaScript
that I used to experience all the time. I no longer need to create 99% test
coverage for my code because the type system catches the bugs that I used to
have to write tests for. This saves enormous amounts of time.
- Docker: I always build my apps into a container to deploy them.
- fly.io: Fly.io is an outstanding data center provider
that makes it very easy to deploy horizontally scalable webapps. I have had a
great experience with it and heartily recommend it for all small apps.
However, it has an issue, which is that their managed database solutions are
not mature, and for this reason I intend to
move to AWS Fargate.
- PlanetScale: PlanetScale is an incredibly
thoughtful, mature and proven managed MySQL database solution. They solve both
the developer-experience issue of managing a database as well as the sharding
problem so that your database will not need to be changed at scale. I heartily
recommend PlanetScale for anybody using AWS or Google Cloud.
- React 19: This is the standard for webapps, for better or worse. The
advantages of using such a popular tool outweigh any hypothetical benefits of
alternatives like Svelte and Vue in my opinion. All of my apps have been
migrated to React 19, even though I don’t use some of the latest features,
like RSC, or “use”.
- React Router 7: This is the latest iteration of React Router which is
heavily informed by Remix versions 1 and 2. It is
essentially an entire framework that does most of the things you need to do to
build a webapp. I’m a big fan of the routing model and their extreme care
about providing an upgrade path for new versions.
- tRPC 11: tRPC is an outstanding RPC framework for
TypeScript that I have found to complement React Router very well. Although it
is technically possible to build an API with React Router, tRPC is
specifically designed for type-safe APIs and has made it easy to solve every
problem I’ve faced, including the streaming AI output of
Hallucipedia.
- Tailwind 4: Once you go Tailwind, you never go
back. Almost every problem I’ve had with CSS has been solved by using
Tailwind. I no longer write any CSS by hand, instead I just use Tailwind
classes.
- Drizzle ORM: Drizzle is a new “ORM” (is it
really an ORM?) that works well with TypeScript. It is by far the best ORM
I’ve ever used and solves every problem in a developer-friendly way. I can’t
really give any criticism at all and I’m excited to continue to use it,
although their relational database support is not 100% and every once in a
while I desire to use a feature of MySQL that doesn’t exist in Drizzle, and I
have to work around it. However, they are adding new features all the time.
- Rust/WASM: I’ve discovered that Rust is a great pairing for web
technologies any time you need some high performance CPU code. Using
wasm-pack makes it almost trivial to
build rust code to WASM and then use it inside your webapp. In some cases
where I need high performance CPU code, such as cryptography, and where the
libraries I need are either not available or not ideal in TypeScript/node.js,
I write the libraries I need myself in Rust and build it to WASM for use
inside my webapps. This architecture allows me to do almost anything on the
web because it removes the CPU bottleneck from webapps.
- WebGPU: Although this is built into the web and I have assumed the web as
the platform, WebGPU deserves a special mention as the final piece of the
puzzle of web technologies, which makes it possible to do almost anything,
including video games, in a browser. I currently use WebGPU for
mining EarthBucks.
- All the AI: I currently use OpenAI and
xAI for my AI needs, particularly in
Hallucipedia. However, I plan to add support for
all major AI models, including Google, Anthropic, DeepSeek, and others, and it
is my opinion that all apps can benefit from AI models such as moderating
content, generating avatars, and countless features that would have been
inconceivable even just five years ago.
Developer Environment
- biome.js: This formats and lints my TypeScript code. It is fast and I
hardly think about it because it just works.
- nushell: When I was in graduate school, I gained a lot of experience with
the Linux command line. In my opinion, nushell is
the logical next step for the command line which dramatically improves the
utility of pipes by support rich data types. I love nushell and I use it for
everything.
- neovim: I used to use vim, and then VS Code, and now I’ve switched back to
neovim. It is my humble opinion after many years of experience that neovim is
fundamentally faster than VS Code and could never be matched. Augmented with
GitHub Copilot, and extensive customization, neovim is extremely fast for
editing. Most of my code is written with AI, I don’t have to waste time
clicking around inside the editor!
- wezterm: Wezterm is a terminal emulator that
supports GPU rendering and is extremely fast. Once I started using it, it has
seamlessly blended into the background and I hardly even think about it
anymore.
- tmux: Theoretically wezterm solves the entire terminal emulation problem,
but I have found a good workflow is to also use tmux inside wezterm. This
allows me to use the best of both worlds: wezterm for the GUI, and tmux for
all key-stroke based terminals for each project that I work on.
- GitHub Copilot: I use GitHub Copilot for almost all of my code. Everybody
is using AI these days, so I almost forgot to mention it, but I consider
GitHub Copilot one of the biggest milestones in the history of IDEs. I would
never want to go back to writing code without it. By using context
thoughtfully, most of my lines of code are now written with AI.
- Grok: I also keep a Grok tab open whenever I need to
chat with an AI. I have found Grok to be on par with the best AI models for
programming tasks, and it serves me well whenever I need to ask a question or
solve some one-shot web problem.
Future Tech Stack
I plan to build some apps for mobile as well as migrate my cloud infrastructure
to AWS, so here are my plans for the future:
- AWS Fargate: While I deeply love fly.io, it is not the ideal hosting
solution to me, because their data centers are in different physical locations
than my databases, which introduces needless latency. To reduce latency, I
either have to put my database in fly.io or put my app in AWS (where my
PlanetScale database is hosted). Because fly.io’s reliability and maturity are
not at the level of AWS, it makes sense to use AWS’s solution for deploying
horizontally scalable webapps, which is Fargate. I plan to slowly migrate my
apps with time as needed.
- Tauri: Tauri seems to be an outstanding tool for
building cross-platform native apps with web technologies. Conceptually
similar to Electron, the biggest difference is that the system webview is used
instead of bundling Chromium. This makes it possible to run on mobile, not
just desktop! Tauri seems to be very well thought out and I am excited to try
it out.
- Electron: Although Tauri looks great, it has one issue for me, which is
mining EarthBucks, which only works in Chromium-based browsers. Thus, for the
EarthBucks mining app specifically, I plan to use
Electron.
Conclusion
The web is a mature platform that makes it possible to build almost any sort of
app, and I’ve had success with a node.js-based tech stack.