This site is driven by two keys, like the machine it came from. Reading: j and k scroll, d and u move half a page, gg goes to the top, G to the bottom, H and L switch windows, ? opens the help. Space is the Neovim leader and handles content: Space then h home, r research, p projects, g gear, a about, / tags, or Space then a digit to jump to that window. Home is the tmux prefix and handles windows: Home then c opens a terminal, Home then & closes a window, Home then space goes to the next one. While focus is on the keyboard, h j k l move between keys and Enter opens one.

ResearchR AboutA Gear: G for gear, keyboard, terminal, editor, homelab.G
    ProjectsP Tags: / as in vim: search./
    ×
    Menu

    ~/arisjirat

    Aris Jirat Kurniawan

    Craftsman Software Engineer

    Currently Software Engineer @ BFI Finance

    Trust me, this is nicer on a desktop: that is where you get the setup I actually work in. 🙂

    Selected projects

    1. Hardware

      ArkButton

      Designed, printed, soldered and flashed by me: 58 keys, two nRF52840s, ZMK. The tenting plate failed ten times because I printed it lying down; it had to stand up.

    2. Temporal terminal UI

      tmprl

      A terminal UI for Temporal in Rust, built toward parity with its web UI: find workflows with a query bar that completes clauses from the cluster’s own search attributes, follow a history like tail -f or read it as a timeline, search the values inside its payloads, and see an activity being retried, when it tries again and why it last failed. A dashboard sums up a namespace’s statuses, failures and task queues, and gf opens the code behind an event. Payloads go through jq and a codec server; mutations, schedules, and batches work over a visual selection. Before any mutation runs, the screen shows the equivalent temporal CLI command, and a production profile can be locked read-only. Four crates, 1004 tests; installs from Homebrew or crates.io.

    3. Go library

      fate

      Harel statecharts for Go: nested states, parallel regions, history, guards, delayed transitions. Zero dependencies, and CI fails the build if that changes. Timers are pulled, not pushed, so the engine is safe inside a Temporal workflow. v0.5.0 fixed parallel regions quietly running their neighbour’s Exit actions.

    4. Visual simulator

      fate-studio

      Where fate is watched running: statechart diagrams you step through in the browser over Server-Sent Events. It opens snapshots from disk and redraws as the file changes, proxies the simulator to a machine inside another service, or runs it virtually with no backend at all. One Go binary, and the page makes no external request.

    5. Applied cryptography

      sirna

      Encrypted messages and files whose KEY can be destroyed on demand, and once it is gone every copy of the ciphertext dies with it, including the copies you do not control. Rust, XChaCha20-Poly1305, and the server links the header parser only, so it cannot decrypt anything it holds.

    6. AR game

      Tombakan

      Place a virtual water surface in your actual room through AR, then throw a spear at the fish matching the target colour. Unity URP + ARFoundation, 32 commits across seven weekly iterations, built for Android and iOS.

      Tombakan
    7. Algorithms from scratch

      pothole-detection

      Not one framework import. LeNet-5 convolution, pooling, softmax, cross-entropy and backpropagation, derived by hand and written in NumPy. What proves the derivatives right is not the accuracy but a numerical gradient check: error under 1e-5.

    Where I've worked

    1. BFI Finance

      now Software Engineer

      Workflow-driven process services

      Approval processes that run for days, executed as workflows that survive a restart.

    2. Ruangguru

      Senior Software Engineer

      A video player with quizzes inside it

      The video pauses at defined points, shows a question, and resumes once it is answered.

    3. Mola TV

      Frontend Engineer

      Maintaining the streaming video player

      Maintenance on a player already running in production: playback error handling, behaviour when bandwidth changes, and fixes along the paths that failed most often.

    Full history in About

    Recent
    id en
    rss gh in