[{"content":"Aloha! I\u0026rsquo;m Laurence A. Lee — software engineer, tinkerer, and occasional opinionated blogger. Born and raised in Hawaii, educated at the University of Hawaii at Manoa (B.S. Information \u0026amp; Computer Science, 1996), and about as Island as it gets.\nThis is the fun side of my online presence. The professional version is at lalee.net. The resume is at rubyjedi.com.\nThe Journey # I started my career at Decision Research Corporation in Honolulu, writing middleware for insurance CRM systems. Then I went to the mainland for a few years — San Mateo, then Las Vegas working at MGM MIRAGE — before coming back to Hawaii, which is where I belong.\nI\u0026rsquo;ve been independent consulting in Hawaii since 2008, first as Lalee Consulting and now as Lalee Innovations. In between I spent four years as Cloud Platform Engineer at Hawaiian Airlines — starting in Honolulu, then relocating to Mesa, AZ in 2022 to work out of their Tempe offices. When I accepted a position as Enterprise Architect Manager at American Savings Bank in 2025, I moved back to Honolulu to fulfill that onsite role, and stayed through May 2026.\nAs of June 2026 I\u0026rsquo;m back to independent consulting full-time.\nThe short version: for work I write code. For fun I write even more code.\nThe Geek Resume # Former Fedora Linux Ambassador for Hawaii and the Pacific Rim Microsoft Certified Enterprise Applications Developer Open-source contributor — most notably Soap4R-ng, a long-running maintenance effort to keep Ruby\u0026rsquo;s SOAP library alive across several major Ruby versions I once ran Fedora Core on an original Xbox. I\u0026rsquo;m not sorry. This Site # not404.com has existed in some form since 2004 — forum, Drupal site, Rails blog, Joomla blog, and most recently a five-year run as a placeholder video. The name is a nod to HTTP 404: this page is found.\nThe reboot in 2026 is less grand ambition and more: I have things to write about and projects to document, and they don\u0026rsquo;t belong on a client-facing site.\nContact # Email: rubyjedi@gmail.com\nGitHub: github.com/rubyjedi\nLinkedIn: linkedin.com/in/rubyjedi\n","date":"1 June 2026","externalUrl":null,"permalink":"/about/","section":"not404.com","summary":"Aloha! I’m Laurence A. Lee — software engineer, tinkerer, and occasional opinionated blogger. Born and raised in Hawaii, educated at the University of Hawaii at Manoa (B.S. Information \u0026 Computer Science, 1996), and about as Island as it gets.\n","title":"About","type":"page"},{"content":"","date":"1 June 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"1 June 2026","externalUrl":null,"permalink":"/categories/geek-life/","section":"Categories","summary":"","title":"Geek-Life","type":"categories"},{"content":"","date":"1 June 2026","externalUrl":null,"permalink":"/posts/","section":"Journal","summary":"","title":"Journal","type":"posts"},{"content":"","date":"1 June 2026","externalUrl":null,"permalink":"/tags/meta/","section":"Tags","summary":"","title":"Meta","type":"tags"},{"content":"","date":"1 June 2026","externalUrl":null,"permalink":"/","section":"not404.com","summary":"","title":"not404.com","type":"page"},{"content":"","date":"1 June 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"If you visited this domain any time between 2021 and now, you saw a looping background video of a Hawaiian beach with some placeholder text about relaunching. Twice. Once for a Hawaii-based MakerSpace venture that didn\u0026rsquo;t happen, and once for an Arizona rebranding that also didn\u0026rsquo;t happen.\nThird time\u0026rsquo;s the charm.\nThe site is back — sibling to lalee.net and rubyjedi.com.\nWhere I\u0026rsquo;ve Been # The short version: I left Honolulu in April 2022, spent a few years in Mesa, AZ (out in the Eastmark community), came back to Hawaii in mid-2025 to take a staff position as Enterprise Architect Manager at American Savings Bank, wrapped that up in May 2026, and am now back to independent consulting under Lalee Innovations.\nThat\u0026rsquo;s a lot of change for a site that was showing the same placeholder page the whole time.\nWhat to Expect Here # This is the \u0026ldquo;for fun\u0026rdquo; part of my online presence. No billable hours, no SLAs.\nHardware and software hacks Maker projects (things involving a CNC, a 3D printer, or both) Geek opinions that don\u0026rsquo;t belong on a professional site Occasional Hawaii life content Let\u0026rsquo;s see how long this one lasts.\n","date":"1 June 2026","externalUrl":null,"permalink":"/posts/2026-were-back/","section":"Journal","summary":"not404.com has been a placeholder video for about five years. Time to fix that.","title":"We're Back (Sort Of)","type":"posts"},{"content":"","date":"1 January 2026","externalUrl":null,"permalink":"/tags/bbs/","section":"Tags","summary":"","title":"Bbs","type":"tags"},{"content":"","date":"1 January 2026","externalUrl":null,"permalink":"/tags/fastapi/","section":"Tags","summary":"","title":"Fastapi","type":"tags"},{"content":"","date":"1 January 2026","externalUrl":null,"permalink":"/tags/hawaii/","section":"Tags","summary":"","title":"Hawaii","type":"tags"},{"content":"","date":"1 January 2026","externalUrl":null,"permalink":"/tags/kubernetes/","section":"Tags","summary":"","title":"Kubernetes","type":"tags"},{"content":"","date":"1 January 2026","externalUrl":null,"permalink":"/projects/","section":"Projects","summary":"","title":"Projects","type":"projects"},{"content":"","date":"1 January 2026","externalUrl":null,"permalink":"/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":"","date":"1 January 2026","externalUrl":null,"permalink":"/tags/retro/","section":"Tags","summary":"","title":"Retro","type":"tags"},{"content":"In the 1980s, before the internet reached Hawaii\u0026rsquo;s living rooms, there was Saimin Chat System — an Apple II+ in Aiea running five phone lines at 300 baud. You dialed in, you got routed to whichever line was open, and you chatted in real time with whoever else happened to be connected that evening. The system operator held the title \u0026ldquo;Noodle.\u0026rdquo; Saimin 2 is that system, rebuilt for the browser.\nThe Welcome Screen # When you connected to the original, you got this — and Saimin 2 preserves it exactly:\nSAIMIN CHAT SYSTEM \u0026nbsp;—\u0026nbsp; LINE 3 \u0026nbsp;—\u0026nbsp; 300 BAUD Why did the chicken cross the road? SAIMIN! Entry Code: ▌ Press Return to connect as a guest. Type your credentials to log in as a member. That was the whole welcome ceremony — a joke, a punchline, a blank field.\nWhat It Is # A browser-based multi-user chat system modeled on the original:\n15 numbered lines — one caller per line, same mechanics as the original A browser terminal — xterm.js presenting VT100/ANSI output, no app to install Guest and member sessions — guests get 10 minutes; members get allocated monthly time The original moderation model — members issue strikes against bad actors; three strikes disconnects you The same welcome screen, preserved exactly 15 lines One caller per numbered line 300 baud Default terminal output speed — the original 10 min guest Guest sessions are time-limited 99 members max Hard cap — not designed to scale When the lines are full, you get a system-busy message and no entry. That\u0026rsquo;s the whole thing, and it\u0026rsquo;s intentional.\nThe Business Model # Membership\nFees → Hosting \u0026amp; Operating Costs Year-End Surplus → Charity Membership fees cover hosting costs. This is not a commercial project. Any surplus at year end is donated to charity.\nThe Tech # Browser terminal: xterm.js over a WebSocket connection. No web framework, no SPA — the interface is the terminal.\nBackend: Python and FastAPI with native async WebSocket support. All 15 connections run in a single asyncio event loop — no Redis, no message broker, no external session store. If the process restarts, sessions reset, the same way the original reset when you powered it off.\nData: SQLite in WAL mode. Member records, time balances, message boards, audit log — all one file on a mounted volume.\nBilling: Stripe Checkout for membership. Card data never touches the BBS.\nDeployment: Kubernetes.\nSite: saimin2.com\nTechnical breakdown — stack, architecture decisions, and the EA governance model — in my professional portfolio at rubyjedi.com.\n","date":"1 January 2026","externalUrl":null,"permalink":"/projects/saimin2/","section":"Projects","summary":"In the 1980s, before the internet reached Hawaii’s living rooms, there was Saimin Chat System — an Apple II+ in Aiea running five phone lines at 300 baud. You dialed in, you got routed to whichever line was open, and you chatted in real time with whoever else happened to be connected that evening. The system operator held the title “Noodle.” Saimin 2 is that system, rebuilt for the browser.\n","title":"Saimin 2 Chat System","type":"projects"},{"content":"","date":"1 January 2026","externalUrl":null,"permalink":"/tags/websocket/","section":"Tags","summary":"","title":"Websocket","type":"tags"},{"content":"","date":"1 January 2020","externalUrl":null,"permalink":"/tags/javascript/","section":"Tags","summary":"","title":"Javascript","type":"tags"},{"content":"","date":"1 January 2020","externalUrl":null,"permalink":"/tags/observability/","section":"Tags","summary":"","title":"Observability","type":"tags"},{"content":"","date":"1 January 2020","externalUrl":null,"permalink":"/tags/open-source/","section":"Tags","summary":"","title":"Open-Source","type":"tags"},{"content":"","date":"1 January 2020","externalUrl":null,"permalink":"/tags/postman/","section":"Tags","summary":"","title":"Postman","type":"tags"},{"content":"Fork: github.com/rubyjedi/postman-prometheus\nUpstream: postman-prometheus\nThe original postman-prometheus tool was useful: run a Postman collection, export the results as Prometheus metrics. One shot, one collection.\nWhat I needed was: run several collections, continuously, all feeding into one /metrics endpoint. The idea being that your Postman collections — which already describe your API contracts — double as live health checks you can scrape with Prometheus and visualize in Grafana.\nWhat I Added # Multiple collections in parallel — each one configured independently, running on its own continuous loop Per-collection metric namespacing — so results from different collections don\u0026rsquo;t collide in Prometheus Single /metrics endpoint — Prometheus scrapes one place, gets everything Why It Exists # I had several independent API surfaces to monitor across different teams. Running a separate exporter instance per collection would have been fine but messier to operate. One process, one scrape target, unified Grafana dashboard — much cleaner.\nStatus # Active. Still runs in production monitoring setups where I\u0026rsquo;ve deployed it.\nMore details on this project in my professional portfolio at rubyjedi.com.\n","date":"1 January 2020","externalUrl":null,"permalink":"/projects/postman-prometheus/","section":"Projects","summary":"Fork: github.com/rubyjedi/postman-prometheus\nUpstream: postman-prometheus\nThe original postman-prometheus tool was useful: run a Postman collection, export the results as Prometheus metrics. One shot, one collection.\nWhat I needed was: run several collections, continuously, all feeding into one /metrics endpoint. The idea being that your Postman collections — which already describe your API contracts — double as live health checks you can scrape with Prometheus and visualize in Grafana.\n","title":"Postman Prometheus","type":"projects"},{"content":"","date":"1 January 2020","externalUrl":null,"permalink":"/tags/prometheus/","section":"Tags","summary":"","title":"Prometheus","type":"tags"},{"content":"","date":"1 January 2015","externalUrl":null,"permalink":"/tags/ruby/","section":"Tags","summary":"","title":"Ruby","type":"tags"},{"content":"","date":"1 January 2015","externalUrl":null,"permalink":"/tags/soap/","section":"Tags","summary":"","title":"Soap","type":"tags"},{"content":"Repo: github.com/rubyjedi/soap4r\nBack in the early 2010s, a lot of enterprise Ruby on Rails apps were neck-deep in SOAP integrations — insurance carriers, healthcare systems, EDI pipelines. The de-facto library for that was soap4r. And then it went unmaintained right as Ruby was moving past 1.8.\nThat left a lot of production systems in a bad spot.\nWhat I Did # Took the fork, made it work again, and kept it working across Ruby versions. Specifically:\nRuby 1.8 → 2.1+ compatibility Swapped in Ox and Nokogiri as faster, lower-memory XML parser options (the original parser was not great) Added Curb as an HTTP client option for connection pooling Maintained backward API compatibility so existing code could drop it in without changes Status # Quiet. The Ruby SOAP era is mostly over — the world moved to REST/JSON — so there\u0026rsquo;s not much to maintain. But the gem is still published and still gets the occasional download from someone maintaining something old, which is exactly the situation it was built for.\nMore details on this project in my professional portfolio at rubyjedi.com.\n","date":"1 January 2015","externalUrl":null,"permalink":"/projects/soap4r-ng/","section":"Projects","summary":"Repo: github.com/rubyjedi/soap4r\nBack in the early 2010s, a lot of enterprise Ruby on Rails apps were neck-deep in SOAP integrations — insurance carriers, healthcare systems, EDI pipelines. The de-facto library for that was soap4r. And then it went unmaintained right as Ruby was moving past 1.8.\n","title":"Soap4R-ng","type":"projects"},{"content":"","date":"1 January 2015","externalUrl":null,"permalink":"/tags/xml/","section":"Tags","summary":"","title":"Xml","type":"tags"}]