# Software and Systems—Keith Kim

## Software and Systems—Keith Kim

- [What I'm Making and What I Use](https://blog.keithkim.org/master.md): blog.keithkim.org
- [Fun with flat\_map (in Ruby)](https://blog.keithkim.org/code-patterns/fun-with-flatmap.md): How I accidentally learned about...
- [Enumerating Union Types in Elm](https://blog.keithkim.org/code-patterns/enumerating-union-types-in-elm.md): aka Sum Types, now officially Custom Types
- [Software Design Patterns](https://blog.keithkim.org/code-patterns/software-design-patterns.md)
- [Authn / Authz](https://blog.keithkim.org/code-patterns/authn-authz.md): Authentication and Authorization
- [Type-safe SQL with SafeQL](https://blog.keithkim.org/data-access/type-safe-sql-with-safeql.md)
- [JDBI](https://blog.keithkim.org/data-access/jdbi.md)
- [Jooq](https://blog.keithkim.org/data-access/jooq.md)
- [Keyboard Layouts](https://blog.keithkim.org/opensource/keyboard-layouts.md)
- [Qwickly: Keyboard Layout](https://blog.keithkim.org/opensource/keyboard-layouts/making-the-qwickest-keyboard-layout.md): The objectively qwickest keyboard layout
- [Colemak + Niro + Soul + MTGAP](https://blog.keithkim.org/opensource/keyboard-layouts/mtgap-+-colemak-+-soul-+-niro.md)
- [Libraries](https://blog.keithkim.org/opensource/libraries.md)
- [SafeQL](https://blog.keithkim.org/opensource/libraries/safeql.md): Typesafe query interface for Java, Kotlin, etc.
- [Moja](https://blog.keithkim.org/opensource/libraries/moja.md): A derivation of some Monad patterns in Java
- [Monadts](https://blog.keithkim.org/opensource/libraries/monadts.md): A derivation of some Monad patterns in TypeScript
- [Apps](https://blog.keithkim.org/opensource/apps.md)
- [Database Diagram](https://blog.keithkim.org/opensource/apps/database-diagram.md)
- [Unfurlist](https://blog.keithkim.org/opensource/apps/unfurlist.md): A URL unfurling service
- [Hackerer.news](https://blog.keithkim.org/products-services/hackerer.news.md)
- [Gitgrep.com](https://blog.keithkim.org/products-services/gitgrep.com.md)
- [Quicklog.io](https://blog.keithkim.org/products-services/quicklog.io.md)
- [Client libraries](https://blog.keithkim.org/products-services/quicklog.io/client-libraries.md)
- [QuickX.app](https://blog.keithkim.org/products-services/quickx.app.md)
- [Vultrdata (opensource)](https://blog.keithkim.org/products-services/quickx.app/quickx.app-opensource.md)
- [Vultr instance metadata](https://blog.keithkim.org/products-services/quickx.app/quickx.app-opensource/vultr-metadata-service.md): Service to return redacted metadata about the requesting instance itself.
- [Statuspages.me](https://blog.keithkim.org/products-services/statuspages.me.md): All the statuspages, all the time.
- [Coming soon...](https://blog.keithkim.org/products-services/coming-soon....md)
- [CheatsheetsDB.com](https://blog.keithkim.org/products-services/coming-soon.../cheatsheetsdb.com.md)
- [iSpecsDB.com](https://blog.keithkim.org/products-services/coming-soon.../ispecsdb.com.md)
- [Slackflows.com](https://blog.keithkim.org/products-services/coming-soon.../slackflows.com.md)
- [About Frameworks](https://blog.keithkim.org/frameworks/about-frameworks.md)
- [A Replacement for Spring Boot](https://blog.keithkim.org/frameworks/a-replacement-for-spring-boot.md): SparkJava, Javalin, Dropwizard, Micronaut, Ktor, Vert.x
- [Back-end](https://blog.keithkim.org/frameworks/back-end.md)
- [Node.js](https://blog.keithkim.org/frameworks/back-end/node.js.md)
- [Spring Boot/Java](https://blog.keithkim.org/frameworks/back-end/spring-boot-java.md)
- [Javalin/Java(Kotlin)](https://blog.keithkim.org/frameworks/back-end/javalin-java-kotlin.md)
- [Full-stack](https://blog.keithkim.org/frameworks/full-stack.md)
- [Phoenix/Elixir](https://blog.keithkim.org/frameworks/full-stack/phoenix-elixir.md)
- [Rails/Ruby](https://blog.keithkim.org/frameworks/full-stack/rails-ruby.md)
- [Yii/Php](https://blog.keithkim.org/frameworks/full-stack/yii-php.md)
- [Front-end](https://blog.keithkim.org/frameworks/front-end.md)
- [Vue.js/TypeScript](https://blog.keithkim.org/frameworks/front-end/vue.js-typescript.md)
- [React](https://blog.keithkim.org/frameworks/front-end/react.md)
- [Elm](https://blog.keithkim.org/frameworks/front-end/elm.md)
- [Mobile/Client](https://blog.keithkim.org/frameworks/mobile-client.md)
- [Flutter](https://blog.keithkim.org/frameworks/mobile-client/flutter.md)
- [JavaFX](https://blog.keithkim.org/frameworks/mobile-client/javafx.md)
- [SQL / NewSQL](https://blog.keithkim.org/databases-datastores/sql-newsql.md)
- [MySQL](https://blog.keithkim.org/databases-datastores/sql-newsql/mysql.md): and Percona, MariaDB, WebScaleSQL
- [PostgreSQL](https://blog.keithkim.org/databases-datastores/sql-newsql/postgresql.md)
- [CockroachDB](https://blog.keithkim.org/databases-datastores/sql-newsql/cockroachdb.md)
- [Stream / Queue](https://blog.keithkim.org/databases-datastores/stream-queue.md)
- [RabbitMQ](https://blog.keithkim.org/databases-datastores/stream-queue/rabbitmq.md)
- [Apache Kafka](https://blog.keithkim.org/databases-datastores/stream-queue/apache-kafka.md)
- [Cache / Search](https://blog.keithkim.org/databases-datastores/cache-search.md)
- [Redis](https://blog.keithkim.org/databases-datastores/cache-search/redis.md)
- [Elasticsearch / Solr / Lucene](https://blog.keithkim.org/databases-datastores/cache-search/elasticsearch-solr-lucene.md)
- [Cloud](https://blog.keithkim.org/databases-datastores/cloud.md)
- [RDS / Cloud SQL](https://blog.keithkim.org/databases-datastores/cloud/rds-cloud-sql.md)
- [Spanner](https://blog.keithkim.org/databases-datastores/cloud/spanner.md)
- [Firebase](https://blog.keithkim.org/databases-datastores/cloud/firebase.md)
- [Datomic](https://blog.keithkim.org/databases-datastores/datomic.md)
- [About Languages](https://blog.keithkim.org/languages/about-languages.md)
- [On the JVM](https://blog.keithkim.org/languages/java-virtual-machine.md)
- [Kotlin](https://blog.keithkim.org/languages/java-virtual-machine/kotlin.md)
- [Java](https://blog.keithkim.org/languages/java-virtual-machine/java.md)
- [Clojure](https://blog.keithkim.org/languages/java-virtual-machine/clojure.md)
- [Scala](https://blog.keithkim.org/languages/java-virtual-machine/scala.md)
- [Client/Fullstack](https://blog.keithkim.org/languages/client-fullstack.md)
- [TypeScript](https://blog.keithkim.org/languages/client-fullstack/typescript.md)
- [Dart](https://blog.keithkim.org/languages/client-fullstack/dart.md)
- [Elixir](https://blog.keithkim.org/languages/client-fullstack/elixir.md)
- [Ruby](https://blog.keithkim.org/languages/client-fullstack/ruby.md)
- [PHP](https://blog.keithkim.org/languages/client-fullstack/php.md)
- [Go / 2.0](https://blog.keithkim.org/languages/go-2.0.md)
- [F# / OCaml](https://blog.keithkim.org/languages/f-ocaml.md)
- [Crystal](https://blog.keithkim.org/languages/crystal.md)
- [Pony](https://blog.keithkim.org/languages/pony.md)
- [About Services](https://blog.keithkim.org/third-party-services/about-services.md)
- [Domains / DNS / CDN](https://blog.keithkim.org/third-party-services/domains-dns-cdn.md)
- [Cloudflare](https://blog.keithkim.org/third-party-services/domains-dns-cdn/cloudflare.md)
- [Namecheap](https://blog.keithkim.org/third-party-services/domains-dns-cdn/namecheap.md): A good domain name registrar.
- [NameSilo](https://blog.keithkim.org/third-party-services/domains-dns-cdn/namesilo.md)
- [GitHub, GitLab, Bitbucket](https://blog.keithkim.org/third-party-services/github-gitlab-bitbucket.md)
- [Deployment & Monitoring](https://blog.keithkim.org/third-party-services/deployment-and-monitoring.md)
- [Netlify](https://blog.keithkim.org/third-party-services/deployment-and-monitoring/netlify.md)
- [Cloud VM](https://blog.keithkim.org/third-party-services/deployment-and-monitoring/cloud-vm.md): EC2, GCP, Vultr, OVH
- [Vultr](https://blog.keithkim.org/third-party-services/deployment-and-monitoring/cloud-vm/vultr.md)
- [Concourse CI on AWS EC2](https://blog.keithkim.org/third-party-services/deployment-and-monitoring/deploying-concourse-ci-on-aws-ec2.md)
- [DataDog](https://blog.keithkim.org/third-party-services/deployment-and-monitoring/datadog.md)
- [Loggly](https://blog.keithkim.org/third-party-services/deployment-and-monitoring/loggly.md)
- [GitBook](https://blog.keithkim.org/other-software/gitbook.md): The software that formatted what you're reading now.
- [Hugo](https://blog.keithkim.org/other-software/hugo.md): fast static-site generator
- [Servers](https://blog.keithkim.org/other-software/servers.md)
- [Nginx](https://blog.keithkim.org/other-software/servers/nginx.md)
- [Letsencrypt](https://blog.keithkim.org/other-software/servers/letsencrypt.md)
- [Systemd](https://blog.keithkim.org/other-software/servers/systemd.md): Many Linux distributions (including Ubuntu) use systemd which manages system services.
- [Server Operating Systems](https://blog.keithkim.org/other-software/servers/server-operating-systems.md): Linux (Ubuntu, Alpine), CoreOS, Clear
- [Windows/WSL(2)](https://blog.keithkim.org/other-software/windows-wsl-2.md)
- [Software Licences](https://blog.keithkim.org/other-software/software-licences.md): AGPLv3, GPLv3, LGPLv3, MPL 2.0, MIT, Apache 2.0


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information, you can query the documentation dynamically by asking a question.
Perform an HTTP GET request on a page URL with the `ask` query parameter:
```
GET https://blog.keithkim.org/master.md?ask=<question>
```
The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.
Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
