{"version":1,"pages":[{"id":"-Lpzikrm8ECDNOzH2bhs","title":"What I'm Making and What I Use","pathname":"/","siteSpaceId":"sitesp_41xYY","description":"blog.keithkim.org"},{"id":"-M3hbWwljUu10tWsELM4","title":"Fun with flat_map (in Ruby)","pathname":"/code-patterns/fun-with-flatmap","siteSpaceId":"sitesp_41xYY","description":"How I accidentally learned about...","breadcrumbs":[{"label":"Code Patterns"}]},{"id":"-LpzrB0wq5DcNlAosH00","title":"Enumerating Union Types in Elm","pathname":"/code-patterns/enumerating-union-types-in-elm","siteSpaceId":"sitesp_41xYY","description":"aka Sum Types, now officially Custom Types","breadcrumbs":[{"label":"Code Patterns"}]},{"id":"-M4jgACaKTO8-FD9OXgj","title":"Software Design Patterns","pathname":"/code-patterns/software-design-patterns","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Code Patterns"}]},{"id":"-M4jqSEeeUEPcJOiKiEC","title":"Authn / Authz","pathname":"/code-patterns/authn-authz","siteSpaceId":"sitesp_41xYY","description":"Authentication and Authorization","breadcrumbs":[{"label":"Code Patterns"}]},{"id":"-LpznSm9H7KJaSRI0PBr","title":"Type-safe SQL with SafeQL","pathname":"/data-access/type-safe-sql-with-safeql","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Data access"}]},{"id":"-M4jZ8gCI9c-w7-WihCv","title":"JDBI","pathname":"/data-access/jdbi","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Data access"}]},{"id":"-M4jbHXGGAqKghHmaaHS","title":"Jooq","pathname":"/data-access/jooq","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Data access"}]},{"id":"-MBafP_Kn6hlKfZ-YqnI","title":"Keyboard Layouts","pathname":"/opensource/keyboard-layouts","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"OpenSource"}]},{"id":"-MADWC7Kw6jU8i0-FRiZ","title":"Qwickly: Keyboard Layout","pathname":"/opensource/keyboard-layouts/making-the-qwickest-keyboard-layout","siteSpaceId":"sitesp_41xYY","description":"The objectively qwickest keyboard layout","breadcrumbs":[{"label":"OpenSource"},{"label":"Keyboard Layouts"}]},{"id":"-MBafgPj9DdSsEp6XYX2","title":"Colemak + Niro + Soul + MTGAP","pathname":"/opensource/keyboard-layouts/mtgap-+-colemak-+-soul-+-niro","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"OpenSource"},{"label":"Keyboard Layouts"}]},{"id":"-M4kmt-A4923T_aFsDoW","title":"Libraries","pathname":"/opensource/libraries","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"OpenSource"}]},{"id":"-M4kiFmITiYX9dQUKkGh","title":"SafeQL","pathname":"/opensource/libraries/safeql","siteSpaceId":"sitesp_41xYY","description":"Typesafe query interface for Java, Kotlin, etc.","breadcrumbs":[{"label":"OpenSource"},{"label":"Libraries"}]},{"id":"-M4kiL9PFRSUYaxMvuH5","title":"Moja","pathname":"/opensource/libraries/moja","siteSpaceId":"sitesp_41xYY","description":"A derivation of some Monad patterns in Java","breadcrumbs":[{"label":"OpenSource"},{"label":"Libraries"}]},{"id":"-M4kjF1xIePhmC2EGoK3","title":"Monadts","pathname":"/opensource/libraries/monadts","siteSpaceId":"sitesp_41xYY","description":"A derivation of some Monad patterns in TypeScript","breadcrumbs":[{"label":"OpenSource"},{"label":"Libraries"}]},{"id":"-M4kmvAElQTZRwnJcNo_","title":"Apps","pathname":"/opensource/apps","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"OpenSource"}]},{"id":"-M4kl5kufoeMpGws4K44","title":"Database Diagram","pathname":"/opensource/apps/database-diagram","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"OpenSource"},{"label":"Apps"}]},{"id":"-M4kjlGt_sKj1nMZQ224","title":"Unfurlist","pathname":"/opensource/apps/unfurlist","siteSpaceId":"sitesp_41xYY","description":"A URL unfurling service","breadcrumbs":[{"label":"OpenSource"},{"label":"Apps"}]},{"id":"-M4khAz2VESPFgxEG1gL","title":"Hackerer.news","pathname":"/products-services/hackerer.news","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Products / Services"}]},{"id":"-M4kgrDhUGMl1CDmhHYG","title":"Gitgrep.com","pathname":"/products-services/gitgrep.com","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Products / Services"}]},{"id":"-M4kh6BdoOGbZIOBlN7m","title":"Quicklog.io","pathname":"/products-services/quicklog.io","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Products / Services"}]},{"id":"-M70TJ8t7Vk5u30L-4VC","title":"Client libraries","pathname":"/products-services/quicklog.io/client-libraries","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Products / Services"},{"label":"Quicklog.io"}]},{"id":"-M4khM-50Rx5elSGoGwb","title":"QuickX.app","pathname":"/products-services/quickx.app","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Products / Services"}]},{"id":"-M70T-MgWDEYgNar1RL2","title":"Vultrdata (opensource)","pathname":"/products-services/quickx.app/quickx.app-opensource","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Products / Services"},{"label":"QuickX.app"}]},{"id":"-M4jlqfWy2eW2zl0vg_f","title":"Vultr instance metadata","pathname":"/products-services/quickx.app/quickx.app-opensource/vultr-metadata-service","siteSpaceId":"sitesp_41xYY","description":"Service to return redacted metadata about the requesting instance itself.","breadcrumbs":[{"label":"Products / Services"},{"label":"QuickX.app"},{"label":"Vultrdata (opensource)"}]},{"id":"-M4khd6tGiFpcq8QBitI","title":"Statuspages.me","pathname":"/products-services/statuspages.me","siteSpaceId":"sitesp_41xYY","description":"All the statuspages, all the time.","breadcrumbs":[{"label":"Products / Services"}]},{"id":"-M70RkZFFrdew9szIUjE","title":"Coming soon...","pathname":"/products-services/coming-soon...","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Products / Services"}]},{"id":"-M70Rz6nKA3lfbFrHaQI","title":"CheatsheetsDB.com","pathname":"/products-services/coming-soon.../cheatsheetsdb.com","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Products / Services"},{"label":"Coming soon..."}]},{"id":"-M70RpH6Hswe1D4eJRGo","title":"iSpecsDB.com","pathname":"/products-services/coming-soon.../ispecsdb.com","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Products / Services"},{"label":"Coming soon..."}]},{"id":"-M70SBnYoxPT-P2FFD-F","title":"Slackflows.com","pathname":"/products-services/coming-soon.../slackflows.com","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Products / Services"},{"label":"Coming soon..."}]},{"id":"-M4jeeSCB51yL6rgL03Z","title":"About Frameworks","pathname":"/frameworks/about-frameworks","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"}]},{"id":"-M4jZFGfhuL3ma-VNXzm","title":"A Replacement for Spring Boot","pathname":"/frameworks/a-replacement-for-spring-boot","siteSpaceId":"sitesp_41xYY","description":"SparkJava, Javalin, Dropwizard, Micronaut, Ktor, Vert.x","breadcrumbs":[{"label":"Frameworks"}]},{"id":"-M4jhFkcbwH1lnfM-NZr","title":"Back-end","pathname":"/frameworks/back-end","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"}]},{"id":"-M4jbNK6SShyxUhTZBkQ","title":"Node.js","pathname":"/frameworks/back-end/node.js","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Back-end"}]},{"id":"-M4jYsY2ITsDcAQedS0Z","title":"Spring Boot/Java","pathname":"/frameworks/back-end/spring-boot-java","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Back-end"}]},{"id":"-M4jZ3m2pch8GDv289DK","title":"Javalin/Java(Kotlin)","pathname":"/frameworks/back-end/javalin-java-kotlin","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Back-end"}]},{"id":"-M4jgu-NvFfCrxHrucW9","title":"Full-stack","pathname":"/frameworks/full-stack","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"}]},{"id":"-M4jYJcG3ROr78cNCZE5","title":"Phoenix/Elixir","pathname":"/frameworks/full-stack/phoenix-elixir","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Full-stack"}]},{"id":"-M4jY9S7a35ns7Pk7Sgy","title":"Rails/Ruby","pathname":"/frameworks/full-stack/rails-ruby","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Full-stack"}]},{"id":"-M4jYnpO3TspAz1Lxo3i","title":"Yii/Php","pathname":"/frameworks/full-stack/yii-php","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Full-stack"}]},{"id":"-M4jgap8pvS7wqjsJXmA","title":"Front-end","pathname":"/frameworks/front-end","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"}]},{"id":"-M4jY4Eey8PDx5KsAq0c","title":"Vue.js/TypeScript","pathname":"/frameworks/front-end/vue.js-typescript","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Front-end"}]},{"id":"-M4jgWdi-I9nqUz72jWo","title":"React","pathname":"/frameworks/front-end/react","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Front-end"}]},{"id":"-M4jgU0Uu-CO405_UGCF","title":"Elm","pathname":"/frameworks/front-end/elm","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Front-end"}]},{"id":"-M4jh7w8qknig1ug7wMr","title":"Mobile/Client","pathname":"/frameworks/mobile-client","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"}]},{"id":"-M4jb9KsVQnq4tfV6JAb","title":"Flutter","pathname":"/frameworks/mobile-client/flutter","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Mobile/Client"}]},{"id":"-M4jbBzVbbPy874ofOx5","title":"JavaFX","pathname":"/frameworks/mobile-client/javafx","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Frameworks"},{"label":"Mobile/Client"}]},{"id":"-M4jyz-jrcnFqchtn9Rp","title":"SQL / NewSQL","pathname":"/databases-datastores/sql-newsql","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"}]},{"id":"-M4j_9lewqlQllpmaeG2","title":"MySQL","pathname":"/databases-datastores/sql-newsql/mysql","siteSpaceId":"sitesp_41xYY","description":"and Percona, MariaDB, WebScaleSQL","breadcrumbs":[{"label":"Databases / Datastores"},{"label":"SQL / NewSQL"}]},{"id":"-M4j_fRGlC-C5SFcThsx","title":"PostgreSQL","pathname":"/databases-datastores/sql-newsql/postgresql","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"},{"label":"SQL / NewSQL"}]},{"id":"-M4j_i78-Oz1w6IgHVPZ","title":"CockroachDB","pathname":"/databases-datastores/sql-newsql/cockroachdb","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"},{"label":"SQL / NewSQL"}]},{"id":"-M4jzB9ARgyLu50dgqHf","title":"Stream / Queue","pathname":"/databases-datastores/stream-queue","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"}]},{"id":"-M4jxqb3AAkPKpAvpFMU","title":"RabbitMQ","pathname":"/databases-datastores/stream-queue/rabbitmq","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"},{"label":"Stream / Queue"}]},{"id":"-M4jy1cDIQZbcyRMjFU2","title":"Apache Kafka","pathname":"/databases-datastores/stream-queue/apache-kafka","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"},{"label":"Stream / Queue"}]},{"id":"-M4jzbY6O4KcHhKSYBgC","title":"Cache / Search","pathname":"/databases-datastores/cache-search","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"}]},{"id":"-M4jxJqwGx7EphGs6l0e","title":"Redis","pathname":"/databases-datastores/cache-search/redis","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"},{"label":"Cache / Search"}]},{"id":"-M4j_pHGoCOOXIRf9CSi","title":"Elasticsearch / Solr / Lucene","pathname":"/databases-datastores/cache-search/elasticsearch-solr-lucene","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"},{"label":"Cache / Search"}]},{"id":"-M4jzuowgZYFkxFgJvLn","title":"Cloud","pathname":"/databases-datastores/cloud","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"}]},{"id":"-M4k-7S6UyLk4Dy_FiQq","title":"RDS / Cloud SQL","pathname":"/databases-datastores/cloud/rds-cloud-sql","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"},{"label":"Cloud"}]},{"id":"-M4k-WvDMiouLboUDTrq","title":"Spanner","pathname":"/databases-datastores/cloud/spanner","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"},{"label":"Cloud"}]},{"id":"-M4jbXPtWHk1nePbjo9o","title":"Firebase","pathname":"/databases-datastores/cloud/firebase","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"},{"label":"Cloud"}]},{"id":"-M4j_zoBudnxGWWGuIS4","title":"Datomic","pathname":"/databases-datastores/datomic","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Databases / Datastores"}]},{"id":"-M4jeoup4h5e5oLIyGHS","title":"About Languages","pathname":"/languages/about-languages","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"}]},{"id":"-M4jddnI9oTtXjprNgCC","title":"On the JVM","pathname":"/languages/java-virtual-machine","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"}]},{"id":"-M4jaSNFGb-B5BVWG7yC","title":"Kotlin","pathname":"/languages/java-virtual-machine/kotlin","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"},{"label":"On the JVM"}]},{"id":"-M4jafnrQnu3_YvUDeOD","title":"Java","pathname":"/languages/java-virtual-machine/java","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"},{"label":"On the JVM"}]},{"id":"-M4jaqucDz_75lD7ZYrC","title":"Clojure","pathname":"/languages/java-virtual-machine/clojure","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"},{"label":"On the JVM"}]},{"id":"-M4jaPhMFXkWcZutPahM","title":"Scala","pathname":"/languages/java-virtual-machine/scala","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"},{"label":"On the JVM"}]},{"id":"-M4je1Hq1s1J1yUqBM3P","title":"Client/Fullstack","pathname":"/languages/client-fullstack","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"}]},{"id":"-M4jalvbKa82ztC2a9y1","title":"TypeScript","pathname":"/languages/client-fullstack/typescript","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"},{"label":"Client/Fullstack"}]},{"id":"-M4jaUjS-AX2iHPf6nU7","title":"Dart","pathname":"/languages/client-fullstack/dart","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"},{"label":"Client/Fullstack"}]},{"id":"-M4jaxTdcQmK8PwCCsF0","title":"Elixir","pathname":"/languages/client-fullstack/elixir","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"},{"label":"Client/Fullstack"}]},{"id":"-M4jaGgb4Nu6RY1f0Jzi","title":"Ruby","pathname":"/languages/client-fullstack/ruby","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"},{"label":"Client/Fullstack"}]},{"id":"-M4jazyH9BhdxwyU8_4k","title":"PHP","pathname":"/languages/client-fullstack/php","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"},{"label":"Client/Fullstack"}]},{"id":"-M4jaBGJiI0ka8QIE9Bd","title":"Go / 2.0","pathname":"/languages/go-2.0","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"}]},{"id":"-M4jaMwyzIT5GenDwb50","title":"F# / OCaml","pathname":"/languages/f-ocaml","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"}]},{"id":"-M4jaIKErKjakkjjrVPH","title":"Crystal","pathname":"/languages/crystal","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"}]},{"id":"-M4jaEWavggg_DX9IyOO","title":"Pony","pathname":"/languages/pony","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Languages"}]},{"id":"-M4joChucUK5VBGniRPV","title":"About Services","pathname":"/third-party-services/about-services","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"}]},{"id":"-M4kfGAOg97HCCPmiOOs","title":"Domains / DNS / CDN","pathname":"/third-party-services/domains-dns-cdn","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"}]},{"id":"-M4jboOH7EWJQZ1v5WIX","title":"Cloudflare","pathname":"/third-party-services/domains-dns-cdn/cloudflare","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"},{"label":"Domains / DNS / CDN"}]},{"id":"-M4jbqisahDFdJ5WKrU4","title":"Namecheap","pathname":"/third-party-services/domains-dns-cdn/namecheap","siteSpaceId":"sitesp_41xYY","description":"A good domain name registrar.","breadcrumbs":[{"label":"Third-party Services"},{"label":"Domains / DNS / CDN"}]},{"id":"-M70WpnHsX-EfLKOaW_B","title":"NameSilo","pathname":"/third-party-services/domains-dns-cdn/namesilo","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"},{"label":"Domains / DNS / CDN"}]},{"id":"-M4jcLLdoq4hsyAnlzIZ","title":"GitHub, GitLab, Bitbucket","pathname":"/third-party-services/github-gitlab-bitbucket","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"}]},{"id":"-M4jnTMXrXFA5H2gWUva","title":"Deployment & Monitoring","pathname":"/third-party-services/deployment-and-monitoring","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"}]},{"id":"-M4jbhSBwWropHG6_3tC","title":"Netlify","pathname":"/third-party-services/deployment-and-monitoring/netlify","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"},{"label":"Deployment & Monitoring"}]},{"id":"-M4jbt68yGTnMgGuPT5T","title":"Cloud VM","pathname":"/third-party-services/deployment-and-monitoring/cloud-vm","siteSpaceId":"sitesp_41xYY","description":"EC2, GCP, Vultr, OVH","breadcrumbs":[{"label":"Third-party Services"},{"label":"Deployment & Monitoring"}]},{"id":"-M70WRCGUNmBYusoz9pb","title":"Vultr","pathname":"/third-party-services/deployment-and-monitoring/cloud-vm/vultr","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"},{"label":"Deployment & Monitoring"},{"label":"Cloud VM"}]},{"id":"-M4jn9D0tagim3XrBzf4","title":"Concourse CI on AWS EC2","pathname":"/third-party-services/deployment-and-monitoring/deploying-concourse-ci-on-aws-ec2","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"},{"label":"Deployment & Monitoring"}]},{"id":"-M4jnZptkpb3DxQt1h_O","title":"DataDog","pathname":"/third-party-services/deployment-and-monitoring/datadog","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"},{"label":"Deployment & Monitoring"}]},{"id":"-M4jo2htW2aemveY42A5","title":"Loggly","pathname":"/third-party-services/deployment-and-monitoring/loggly","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Third-party Services"},{"label":"Deployment & Monitoring"}]},{"id":"-M4jci9df8xvmqiWNTRX","title":"GitBook","pathname":"/other-software/gitbook","siteSpaceId":"sitesp_41xYY","description":"The software that formatted what you're reading now.","breadcrumbs":[{"label":"Other Software"}]},{"id":"-M4jcayBDazuUUVDHfDj","title":"Hugo","pathname":"/other-software/hugo","siteSpaceId":"sitesp_41xYY","description":"fast static-site generator","breadcrumbs":[{"label":"Other Software"}]},{"id":"-M4kfedOIKirhgsmkSju","title":"Servers","pathname":"/other-software/servers","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Other Software"}]},{"id":"-M4jcnVvx0bd9X9xYXn9","title":"Nginx","pathname":"/other-software/servers/nginx","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Other Software"},{"label":"Servers"}]},{"id":"-M4jcuMBxShioKD5SvRT","title":"Letsencrypt","pathname":"/other-software/servers/letsencrypt","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Other Software"},{"label":"Servers"}]},{"id":"-M4jcyTg1usNOYuoIib3","title":"Systemd","pathname":"/other-software/servers/systemd","siteSpaceId":"sitesp_41xYY","description":"Many Linux distributions (including Ubuntu) use systemd which manages system services.","breadcrumbs":[{"label":"Other Software"},{"label":"Servers"}]},{"id":"-M4jd0tmPzLCC_KTQup_","title":"Server Operating Systems","pathname":"/other-software/servers/server-operating-systems","siteSpaceId":"sitesp_41xYY","description":"Linux (Ubuntu, Alpine), CoreOS, Clear","breadcrumbs":[{"label":"Other Software"},{"label":"Servers"}]},{"id":"-M4jdM4An2tBeaqAjy_N","title":"Windows/WSL(2)","pathname":"/other-software/windows-wsl-2","siteSpaceId":"sitesp_41xYY","description":"","breadcrumbs":[{"label":"Other Software"}]},{"id":"-M4jfM5_rCQuFZ-unLsy","title":"Software Licences","pathname":"/other-software/software-licences","siteSpaceId":"sitesp_41xYY","description":"AGPLv3, GPLv3, LGPLv3, MPL 2.0, MIT, Apache 2.0","breadcrumbs":[{"label":"Other Software"}]}]}