name: Projects by Ari (Hamid) Zare
url: https://arizare.com/projects/
author:
  name: Ari (Hamid) Zare
  url: https://arizare.com
updated: 2026-10-23
projects:
  - slug: determined
    name: Determined
    tagline: Open-source deep learning training platform for GPU clusters, acquired
      by HPE
    description: "Open-source platform for distributed training, hyperparameter
      search, and GPU cluster resource management, with a Go master, a Python
      training harness, and Kubernetes and Slurm resource managers. Joined
      Determined AI as engineer #14 in 2019 and stayed through the 2021 HPE
      acquisition, working across the job scheduler, metrics storage, Kubernetes
      support, APIs, and CLI. Landed 695 merged PRs in the public repo, which
      has 3k+ GitHub stars."
    highlights:
      - "Built the job queue: persisted jobs, queue position in the WebUI and
        CLI, then reordering, priority, and weight controls"
      - Fixed priority scheduler preemption and unified ordering logic across
        the Kubernetes and priority schedulers
      - Moved metrics to partitioned PostgreSQL tables with generic custom-type
        metrics, summary metrics, and Python SDK support
      - Led the PyTorch Lightning adapter integration, with mixed precision
        support, docs, and examples
      - Cut CLI startup time by 80% through dependency tree analysis and lazy
        imports
    period: 2019 - 2024
    stack:
      - Go
      - Python
      - PostgreSQL
      - Kubernetes
      - gRPC
      - TypeScript
    links:
      - label: GitHub
        url: https://github.com/determined-ai/determined
    media:
      - src: https://arizare.com/assets/images/projects/determined-1.webp
        width: 1600
        height: 802
        alt: Determined web UI experiment page with best validation metric curve and a
          table of trials
        kind: image
    tier: feature
    featured: true
    path: /projects/determined/
    updated: 2026-10-23
    url: https://arizare.com/projects/determined/
  - slug: multi-cluster-kubernetes-gateway-proxies
    name: Multi-cluster Kubernetes gateway proxies
    tagline: One Determined master running tasks across multiple Kubernetes clusters
      through gateway proxies
    description: Feature in the open-source Determined platform that lets a single
      master schedule tasks across multiple Kubernetes clusters and resource
      managers. Gateway resources deploy alongside each task's rank 0 pod, and
      task ports are translated to a configurable range of gateway listener
      ports so proxied traffic reaches tasks in remote clusters. Led the project
      at HPE through implementation, tests, and user docs, and spun out a
      developer tool that connects a local dev cluster to remote Kubernetes
      clusters.
    highlights:
      - Port translation from gateway listeners to proxied task ports, with a
        configurable and validated port range
      - Gateway resources deployed only with rank 0 pods, and gateway startup
        hardened to run without passwordless sudo
      - Multi-node, multi-port test experiments in CI, port registry tests, and
        task logs captured on failure
      - Authored the user documentation for gateway setup
      - Built a developer tool to connect a local dev cluster to remote
        Kubernetes clusters
    period: "2024"
    stack:
      - Go
      - Kubernetes
      - Helm
      - Python
    links: []
    media: []
    tier: feature
    featured: true
    path: /projects/multi-cluster-kubernetes-gateway-proxies/
    updated: 2026-10-23
    url: https://arizare.com/projects/multi-cluster-kubernetes-gateway-proxies/
  - slug: mao
    name: mao
    tagline: Multi-agent orchestrator that fans one prompt across coding agents and
      reconciles the results
    description: Python orchestrator that runs CLI coding agents concurrently in
      fan-out, fan-in, and organizer pipelines, and tracks their sessions across
      machines. A hosted console authenticates requests and enqueues typed
      commands into a Postgres registry; per-machine workers claim them with
      leases, run local agents, and report topology. The browser never executes
      shell commands or sees secrets, and API contracts are OpenAPI snapshots
      with generated clients and drift checks.
    highlights:
      - Durable command queue with lease-claimed workers and separate
        write-control leases per session
      - Fan-out, fan-in, and organizer pipelines across six agent CLIs with
        per-agent timeouts, retries, and quota-aware profile selection
      - Batched Go process collector replacing Python polling on workers, backed
        by benchmarks
      - Security model recorded as ADRs, including sandboxed artifact rendering
        and an approval-intent flow
      - append-only registry migrations enforced by a static check
    period: "2026"
    stack:
      - Python
      - PostgreSQL
      - FastAPI
      - Go
      - React
      - Docker
    links:
      - label: Live
        url: https://mao.lbyte.app
    media: []
    tier: feature
    featured: true
    path: /projects/mao/
    updated: 2026-10-23
    url: https://arizare.com/projects/mao/
  - slug: virtualcam
    name: VirtualCam
    tagline: Face tracking and background effects for any video call app
    description: Real-time virtual camera pipeline that captures a camera or screen,
      runs segmentation and face tracking, and outputs through v4l2loopback on
      Linux or OBS Virtual Camera on macOS. Started in 2020 because Zoom had no
      virtual backgrounds on Linux; now adds background blur and swap, desk
      view, gesture reactions, and a native SwiftUI menu bar app that drives a
      managed Python worker over a JSONL protocol. 71 GitHub stars.
    highlights:
      - Bounded frame loop that drains a command queue between frames, with
        output cadence decoupled from processing speed
      - Segmentation backends (MediaPipe, Apple Vision, chroma key, motion-aware
        mask smoothing) compared on measured fixtures
      - Native macOS menu bar app with profiles, camera identity handling,
        live-applied effects, and hold-to-compare
      - Stabilized face-tracking framing with deadzones, time constants, and
        lost-face handling, plus desk-view perspective correction
    period: 2020 - 2026
    stack:
      - Python
      - OpenCV
      - MediaPipe
      - Swift
      - SwiftUI
      - v4l2loopback
    links:
      - label: GitHub
        url: https://github.com/hamidzr/webcam-mods
      - label: Product page
        url: https://latentbyte.com/products/webcam-mods
      - label: Demo video
        url: https://youtu.be/idp7ei-pF40
    media:
      - src: https://arizare.com/assets/images/projects/webcam-mods-1.webp
        width: 1280
        height: 720
        alt: Webcam Mods virtual camera feed shown next to an ffmpeg stream log in a
          demo video
        kind: video
        href: https://www.youtube.com/watch?v=idp7ei-pF40
    tier: feature
    featured: true
    path: /projects/virtualcam/
    updated: 2026-10-23
    url: https://arizare.com/projects/virtualcam/
  - slug: genai-studio
    name: GenAI Studio
    tagline: Generative AI playground built on the Determined training platform at HPE
    description: HPE's generative AI playground for deploying and prompting open
      models from a web UI, built on the Determined deep learning platform. As
      one of the early senior engineers, contributed to its design, iteration,
      and productionization. Platform work in the open-source repo includes
      proxying master requests to internal services, a new AWS deployment type,
      deployment health checks, and WebUI integration.
    highlights: []
    period: 2023 - 2024
    stack:
      - Go
      - Python
      - Kubernetes
      - AWS
      - TypeScript
    links: []
    media: []
    tier: feature
    featured: true
    path: /projects/genai-studio/
    updated: 2026-10-23
    url: https://arizare.com/projects/genai-studio/
  - slug: portable-browser
    name: Portable Browser
    tagline: Control plane that runs remote Chromium sessions and hands agents
      scoped CDP access
    description: Control plane for remote browser sessions. Workers dial out over a
      single persistent WebSocket, so they need no inbound ports, and that
      connection multiplexes control messages, Chrome DevTools Protocol tunnels,
      and HTTP and WebSocket proxy frames under a zod-typed wire protocol.
      Consumers get short-lived scoped tokens, persistent browser profiles, and
      shared or exclusive session locks through an OpenAPI API, generated SDKs,
      a CLI, and an operator UI.
    highlights:
      - Outbound-only worker tunnel multiplexing control, CDP, and proxy traffic
        over one WebSocket
      - Session attachments with concurrency modes and advisory exclusive or
        shared locks on sessions and profiles
      - Profile snapshots with retention and encrypted storage; uncertain
        uploads reconciled through a completion outbox, not blind retries
      - "Resource-aware workers: per-session memory cgroups, tab reaper, CDP
        watchdog, and health probes."
    period: "2026"
    stack:
      - TypeScript
      - PostgreSQL
      - WebSocket
      - Chrome DevTools Protocol
    links:
      - label: Live
        url: https://portable-browsers.lbyte.app
    media: []
    tier: feature
    featured: true
    path: /projects/portable-browser/
    updated: 2026-10-23
    url: https://arizare.com/projects/portable-browser/
  - slug: netsblox
    name: NetsBlox
    tagline: Networked block-based programming language for teaching distributed
      computing
    description: "Open-source, web-based visual programming environment that extends
      Snap! with message passing and remote procedure calls, so students build
      networked apps with blocks. As a research assistant at Vanderbilt ISIS
      from 2017 to 2019, worked on the Node.js server: the RPC framework,
      service caching, the message router, API doc generation, and CI. Landed
      213 merged PRs and co-authored papers on the platform at SIGCSE and IEEE
      Blocks and Beyond."
    highlights:
      - Improved messaging throughput by up to 24x under load with selective
        caching and cache busting near the networking layer
      - Standardized a base class for RPC services, cutting lines of code by up
        to 70%
      - Built a parser that generates documentation for service APIs, covering
        130 modules
      - Reduced production client bugs by 20% through automated browser tests, a
        chaos monkey, and CI
      - "Roboscape service work: access control and extendable ciphers including
        Speck"
    period: 2017 - 2019
    stack:
      - JavaScript
      - Node.js
      - MongoDB
      - WebSockets
      - Snap!
    links:
      - label: GitHub
        url: https://github.com/NetsBlox/NetsBlox
      - label: Live
        url: https://netsblox.org
    media:
      - src: https://arizare.com/assets/images/projects/netsblox-1.webp
        width: 1440
        height: 900
        alt: NetsBlox home page with the Create button and the RoboScape extension
          banner
        kind: screenshot
        href: https://netsblox.org
      - src: https://arizare.com/assets/images/projects/netsblox-2.webp
        width: 1056
        height: 686
        alt: NetsBlox editor showing a Hangman game built from visual blocks next to its
          stage
        kind: image
    tier: feature
    featured: true
    path: /projects/netsblox/
    updated: 2026-10-23
    url: https://arizare.com/projects/netsblox/
  - slug: zmenu
    name: zmenu
    tagline: Fast native fuzzy menu for macOS, written in Zig directly against AppKit
    description: dmenu-style fuzzy menu that drives AppKit from Zig through the
      Objective-C runtime. Items arrive on stdin or live over a versioned,
      length-prefixed JSON IPC socket via zmenuctl, are filtered with fuzzy
      matching and a Levenshtein fallback, and the selection prints to stdout.
      Startup latency is measured with benchmarks that send real keyboard
      events, and it serves as the UI for ComboSwitcher. Started in 2023 as
      GMenu, a Go version, and rewritten in Zig in 2026.
    highlights:
      - Pure-Zig AppKit app with hand-written Objective-C runtime bridging for
        views, table rows, and activation policy
      - Cut median foreground handoff from 114.6 ms to 67.3 ms; launches that
        dropped keystrokes went from 10 of 10 to 0 of 10
      - Versioned IPC protocol with length-prefixed JSON frames and
        forward-compatible unknown fields
      - Repeatable visual regression, spawn, render, and startup benchmarks
    period: 2023 - 2026
    stack:
      - Zig
      - AppKit
      - Objective-C runtime
      - Unix sockets
      - Swift
    links:
      - label: GitHub
        url: https://github.com/hamidzr/zmenu
      - label: Product page
        url: https://latentbyte.com/products/gmenu
    media:
      - src: https://arizare.com/assets/images/projects/zmenu-1.webp
        width: 1200
        height: 600
        alt: zmenu popup filtering a list by the query al and showing the matches alpha
          and alpine
        kind: image
    tier: feature
    featured: true
    path: /projects/zmenu/
    updated: 2026-10-23
    url: https://arizare.com/projects/zmenu/
  - slug: gopm
    name: gopm
    tagline: PM2-style process manager in Go with a user-level daemon and
      sleep-aware cron
    description: Process manager for long-running apps, shipped as one static Go
      binary. A Cobra CLI talks over a Unix socket to a user-level daemon that
      needs no sudo, adopts running children, persists run history in BoltDB,
      applies restart policies, captures logs, and sends crash-loop alerts. Cron
      scheduling follows wall-clock time across machine sleep, and the daemon is
      tuned for laptops with a single shared ticker for adopted processes.
    highlights:
      - Cron scheduling on wall-clock time across sleep, with a configurable
        missed-run policy
      - Battery-aware daemon that polls adopted processes from one shared ticker
      - Signed macOS app bundle so Local Network permission persists; CLI
        upgrades refuse on daemon version mismatch
      - Run history indexed by process, IPC read deadlines, and owner-only log
        and config permissions
    period: 2025 - 2026
    stack:
      - Go
      - Cobra
      - BoltDB
      - Unix sockets
      - launchd
    links: []
    media: []
    tier: feature
    featured: true
    path: /projects/gopm/
    updated: 2026-10-23
    url: https://arizare.com/projects/gopm/
  - slug: generalizable-q-learning-framework
    name: Generalizable Q-Learning Framework
    tagline: Deep Q-learning framework that trains agents for Snake, Tic-Tac-Toe,
      Connect-N, and CartPole
    description: Python framework built around a reusable Double DQN agent with a
      target network, replay memory, Huber loss, and epsilon decay, plus a
      shared game interface so new environments plug in as small drivers.
      Supports self-play training for two-player games and ships trained
      Tic-Tac-Toe weights and Snake reward curves.
    highlights:
      - Reusable Double DQN agent with target network, replay memory, and
        configurable hyperparameters shared across games
      - Self-play training loop for adversarial games such as Tic-Tac-Toe and
        Connect-N
      - "Training diagnostics: moving-average reward plots, outlier removal, and
        SIGINT-safe stats saving"
      - Distance-based reward shaping for Snake, with reward and score curves
        included
    period: "2018"
    stack:
      - Python
      - Keras
      - TensorFlow
      - OpenAI Gym
      - Matplotlib
    links:
      - label: GitHub
        url: https://github.com/hamidzr/q-learning
    media: []
    tier: feature
    featured: true
    path: /projects/generalizable-q-learning-framework/
    updated: 2026-10-23
    url: https://arizare.com/projects/generalizable-q-learning-framework/
  - slug: browser-control
    name: Browser Control
    tagline: Lets CLI coding agents drive a real browser through a Go daemon and
      Native Messaging bridge
    description: Automation layer that lets CLI coding agents operate a real Chrome,
      Firefox, or Zen browser. A Go CLI talks over a Unix socket to a local
      daemon, and a Native Messaging host relays framed JSON to a Manifest V3
      extension, built on the open-source ScriptCat userscript manager, that
      owns a dedicated agent window. Agents get per-task session leases, tab
      access controls, screenshots, page snapshots with element refs, and a
      guide mode that draws steps on the page and waits for the human.
    highlights:
      - Go daemon, CLI, and Native Messaging shim with a stable JSON protocol
        and multi-browser, multi-profile routing
      - "Agent safety model: registered agent window, per-session tab leases,
        and marker checks that never fall back to the personal window"
      - "Page API for agents: snapshots with refs, batched actions, page-origin
        fetch, console and network monitoring, viewport emulation"
      - Hardened against hangs with framed message offloading, cancellation of
        queued requests, and clean daemon and shim shutdown
      - Human-in-the-loop guide mode where the agent draws steps on the page and
        blocks until the human responds
    period: "2026"
    stack:
      - Go
      - TypeScript
      - React
      - Manifest V3
      - Native Messaging
      - Playwright
    links: []
    media: []
    tier: keep
    featured: false
    path: /projects/#browser-control
    updated: 2026-10-23
    url: https://arizare.com/projects/#browser-control
  - slug: openwrt-store
    name: openwrt-store
    tagline: Durable JSON record store for a home router with CAS, atomic batches,
      and change feeds
    description: Always-on record store for home-LAN apps, running on an OpenWrt
      router as a 3 MB static binary. An axum service on a single-threaded tokio
      runtime over SQLite in WAL mode provides namespaces, bearer tokens and
      quotas, store-wide monotonic revisions, If-Match compare-and-swap, atomic
      batches, and long-poll change feeds. Durability settings were chosen from
      benchmarks run on the router itself.
    highlights:
      - Store-wide monotonic revisions, If-Match compare-and-swap, atomic
        batches, and long-poll change feeds
      - fsync on every commit, chosen after measuring a 509 ms WAL checkpoint
        stall on the router
      - "On-router benchmarks: 4,877 gets/s at 0.39 ms p50 and 282 durable
        puts/s at 6.7 ms p50, with 3.5 MB peak RSS"
      - Static arm64 build, procd service behind nginx, sysupgrade preservation,
        and an append-only migration check
    period: "2026"
    stack:
      - Rust
      - axum
      - tokio
      - SQLite
      - OpenWrt
      - nginx
    links: []
    media: []
    tier: keep
    featured: false
    path: /projects/#openwrt-store
    updated: 2026-10-23
    url: https://arizare.com/projects/#openwrt-store
  - slug: dubit
    name: Dubit
    tagline: Duration-aware video dubbing with translated speech fitted to the
      original timing
    description: Web app that dubs videos from their timed captions, starting with
      Persian. The pipeline groups captions into cost-aware chunks, translates
      each against a target duration, synthesizes speech through pluggable TTS
      providers, then measures every clip and stretches it with pitch preserved,
      pads silence, or shortens and re-synthesizes it to fit its source window
      before mixing dialogue over the original audio bed. Jobs are asynchronous
      and resumable, with Postgres-backed checkpoints, caching, and per-job cost
      tracking.
    highlights:
      - "Duration-fit pipeline: time-budgeted translation, TTS measurement,
        pitch-preserving stretch, silence padding, and shorten-and-retry for
        overlong clips"
      - "Learned voice pacing: characters per second estimated from recent jobs
        per voice, with outlier trimming and shrinkage toward a prior"
      - "Cost controls: cost-aware chunking, an estimate endpoint, TTS and
        transcript caches, and per-job cost aggregation"
      - "Long-running job hardening: cancel locks, resumable checkpoints,
        blocking work kept off the event loop, streamed downloads"
      - OpenAPI contract with a generated TypeScript client and an append-only
        migration check
    period: 2025 - 2026
    stack:
      - Python
      - FastAPI
      - PostgreSQL
      - FFmpeg
      - React
      - TypeScript
    links:
      - label: Product page
        url: https://latentbyte.com/products/dubit
      - label: Live
        url: https://dubit.lbyte.app
    media:
      - src: https://arizare.com/assets/images/projects/dubit-1.webp
        width: 1440
        height: 900
        alt: Dubit landing page with a caption timeline and measured audio waveform
          fitted to the video timeline
        kind: screenshot
        href: https://dubit.lbyte.app
    tier: keep
    featured: false
    path: /projects/#dubit
    updated: 2026-10-23
    url: https://arizare.com/projects/#dubit
  - slug: doomgate
    name: Doomgate
    tagline: Android app that interrupts compulsive scrolling with pauses, time
      budgets, and surface blocking
    description: "Kotlin Android app that uses an AccessibilityService to interrupt
      reflexive app opens, meter per-app allowances, and block short-video
      surfaces such as Reels and Shorts while leaving messaging and search
      usable. A pure-Kotlin rule engine handles schedules, DST-aware hourly
      allowances, session caps, cooldowns, and strictness modes. Local-first by
      construction: no accounts or telemetry, with network use limited to signed
      APK update checks, enforced by automated release privacy gates."
    highlights:
      - Surface recipes detect short-video views from accessibility trees,
        independent of the target app's version
      - Layered modules with pure-JVM domain logic; a boundary check keeps
        on-device ML code out of the enforcement path
      - "Release privacy gates: permission allowlist, banned-dependency check,
        and Gradle dependency checksum verification"
      - Append-only Room schema checksums with a pre-push guard, and recorded
        architecture decisions
      - Opt-in on-device surface training with MediaProjection and Gemini Nano
        through ML Kit GenAI
    period: "2026"
    stack:
      - Kotlin
      - Jetpack Compose
      - Room
      - DataStore
      - AccessibilityService
      - ML Kit
    links: []
    media: []
    tier: keep
    featured: false
    path: /projects/#doomgate
    updated: 2026-10-23
    url: https://arizare.com/projects/#doomgate
  - slug: forking-chat
    name: Forking Chat
    tagline: Restaurants upload their menus and guests chat with an AI assistant
      that knows them
    description: Multi-tenant SaaS where restaurants upload menu images or PDFs, an
      LLM pipeline extracts and validates structured menus, and guests chat with
      a menu-aware assistant per restaurant. FastAPI and Postgres backend with
      sqlc-typed SQL, a React 19 UI served from a Cloudflare Worker, and a
      durable import job system with orphaned-job recovery. The public LLM
      endpoint is protected by layered per-guest and global rate limits,
      concurrency caps, and repetitive-content detection.
    highlights:
      - LLM menu import with a durable job store, orphaned-job recovery at
        startup, retry caps, and size limits
      - "Layered abuse prevention: per-guest burst, 5-minute, and daily limits,
        global LLM call caps, and trusted-proxy IP handling"
      - Server-side tenant scoping with regression tests for private access,
        cross-tenant slug collisions, and prompt isolation
      - "Contract-first stack: OpenAPI-generated TypeScript client, sqlc typed
        SQL, and append-only migrations checked before push"
      - Hermetic Playwright suite with route mocking covering guest chat,
        dashboard, auth refresh, and SEO
    period: 2025 - 2026
    stack:
      - Python
      - FastAPI
      - PostgreSQL
      - React
      - TypeScript
      - Cloudflare Workers
    links:
      - label: Product page
        url: https://latentbyte.com/products/forkingchat
    media: []
    tier: keep
    featured: false
    path: /projects/#forking-chat
    updated: 2026-10-23
    url: https://arizare.com/projects/#forking-chat
  - slug: investments
    name: Investments
    tagline: Looks through funds to true sector, region, and fee exposure, and picks
      ETF mixes with a MILP
    description: Portfolio analysis web app that imports holdings from OFX/QFX,
      brokerage CSV, and other exports, then splits each holding across sectors,
      regions, and underlying companies, including funds of funds, using SEC
      N-PORT filings and prospectus fee data. It compares portfolios against
      saved targets, models fee drag and switch plans, and solves ETF selection
      as a mixed-integer program with HiGHS in WebAssembly on a worker thread.
      Multi-user, with private per-user data, export, and delete.
    highlights:
      - ETF selection as a MILP with tolerance bands and ticker caps, solved by
        HiGHS in WebAssembly off the main thread
      - Fund look-through from SEC N-PORT filings and prospectus fee tables,
        with region, sector, and company-overlap views
      - Pure TypeScript domain layer with no I/O; importers covered by golden
        tests frozen from the earlier Python implementation
      - "Per-user privacy: no-store private API responses, uploads isolated from
        shared data, full export and delete"
      - Unit, golden, integration, and desktop and mobile Playwright test suites
    period: 2025 - 2026
    stack:
      - TypeScript
      - Next.js
      - Bun
      - PostgreSQL
      - Drizzle
      - HiGHS
    links:
      - label: Product page
        url: https://latentbyte.com/products/investments
      - label: Live
        url: https://investments.lbyte.app
    media:
      - src: https://arizare.com/assets/images/projects/investments-1.webp
        width: 1440
        height: 900
        alt: Investments landing page with a look-through sector allocation bar chart on
          synthetic data
        kind: screenshot
        href: https://investments.lbyte.app
    tier: keep
    featured: false
    path: /projects/#investments
    updated: 2026-10-23
    url: https://arizare.com/projects/#investments
  - slug: compcalc
    name: CompCalc
    tagline: Browser-only compensation forecaster with stock scenarios and startup
      equity modeling
    description: Static Next.js app that turns a compensation plan into a multi-year
      forecast across bear, base, and bull stock paths with a
      probability-weighted expected value. Models RSUs, ISO and NSO options with
      strikes, dilution, illiquid private equity until exit, vesting cliffs,
      promotions, and refreshers. All computation runs client-side with
      versioned plan files and undo, and offers import through the URL hash, so
      no data reaches a server.
    highlights:
      - Scenario engine with named price paths, underwater-option handling,
        dilution, and expected value across scenarios
      - Versioned plan files with migrations and a guard against malformed
        persisted state
      - Offer import through a versioned URL-hash contract that never reaches
        the server
      - Pure, tested calculation modules behind a Zustand store persisted to
        localStorage
    period: 2025 - 2026
    stack:
      - TypeScript
      - Next.js
      - Zustand
      - Recharts
      - Tailwind
    links:
      - label: Product page
        url: https://latentbyte.com/products/total-comp
      - label: Live
        url: https://comp.lbyte.app
    media:
      - src: https://arizare.com/assets/images/projects/total-comp-planner-1.webp
        width: 1440
        height: 900
        alt: Total compensation planner showing yearly cash, equity and scenario summary
          cards
        kind: screenshot
        href: https://comp.lbyte.app
    tier: keep
    featured: false
    path: /projects/#compcalc
    updated: 2026-10-23
    url: https://arizare.com/projects/#compcalc
  - slug: roboscape-device-provisioning
    name: Roboscape Device Provisioning
    tagline: Mobile app that batch-provisions WiFi on classroom robots with no
      shared network
    description: "Cordova mobile app that configures groups of Parallax robots with
      Xbee WiFi modules when no common network exists, built for the Roboscape
      cybersecurity curriculum. After evaluating four provisioning strategies,
      including a WiFi Direct prototype the Xbee could not support, it treats
      each robot as an access point: the app scans, joins, configures, and
      rejoins the user's network in batch. Includes C firmware changes and
      opt-in ownership verification."
    highlights:
      - Evaluated four provisioning strategies and shipped a
        robots-as-access-points batch flow
      - Batch configuration with per-robot status and automatic rejoin of the
        original network
      - Opt-in ownership verification that registers configured robots to the
        user's account
      - "Firmware changes in C: a button hold enters setup mode, signaled by a
        melody"
    period: 2018 - 2019
    stack:
      - JavaScript
      - Cordova
      - Vue
      - C
      - Android
    links:
      - label: GitHub
        url: https://github.com/NetsBlox/roboscape-provisioning
      - label: Camp page
        url: https://cps-vo.org/group/CPSScamp18
    media:
      - src: https://arizare.com/assets/images/projects/roboscape-device-provisioning-1.webp
        width: 622
        height: 252
        alt: "Diagram of robot provisioning: provisioner supplies WiFi credentials so
          the robot can join the access point"
        kind: image
      - src: https://arizare.com/assets/images/projects/roboscape-device-provisioning-2.webp
        width: 722
        height: 324
        alt: Diagram of claiming robot ownership with a preshared key through the
          NetsBlox server and RoboScape service
        kind: image
    tier: keep
    featured: false
    path: /projects/#roboscape-device-provisioning
    updated: 2026-10-23
    url: https://arizare.com/projects/#roboscape-device-provisioning
  - slug: msc-thesis-hands-on-ai-and-cybersecurity-education-in-high-schools
    name: "MSc thesis: Hands-On AI and Cybersecurity Education in High Schools"
    tagline: Vanderbilt master's thesis on block-based AI and cybersecurity
      education tools
    description: Master's thesis in computer science at Vanderbilt on hands-on AI
      and cybersecurity education for high school students. Contributions
      include Visual RL, a Snap!-based reinforcement learning playground with
      Q-learning abstractions; portable batch provisioning and access control
      for networked RoboScape robots; and NetsBlox Player, a mobile runtime for
      NetsBlox projects. The cybersecurity lessons expose virtual network
      traffic so students can attack and defend networked robots.
    highlights:
      - Block-based Q-learning abstractions that let high school students train
        agents in Snap!
      - Batch provisioning and access control for networked RoboScape classroom
        robots
      - NetsBlox Player, a cross-platform mobile runtime for networked NetsBlox
        projects
      - Built on RoboScape, which exposes virtual network traffic so students
        can attack and defend robots
    period: "2019"
    stack:
      - NetsBlox
      - Snap!
      - JavaScript
      - Reinforcement learning
      - LaTeX
    links: []
    media:
      - src: https://arizare.com/assets/images/projects/msc-thesis-1.webp
        width: 1284
        height: 792
        alt: NetsBlox editor with a weather map project built from visual blocks
        kind: image
    tier: keep
    featured: false
    path: /projects/#msc-thesis-hands-on-ai-and-cybersecurity-education-in-high-schools
    updated: 2026-10-23
    url: https://arizare.com/projects/#msc-thesis-hands-on-ai-and-cybersecurity-education-in-high-schools
  - slug: latent-byte-utils
    name: Latent Byte Utils
    tagline: Android utility app, starting with highly configurable home and lock
      screen widgets
    description: Kotlin and Jetpack Compose app built around a pluggable utility
      registry. Its first utility is a single Glance widget that renders photos,
      folders, feeds, JSON values, web page snapshots, and offline trackers such
      as countdowns, counters, and habits. WorkManager refreshes content with
      last-good fallback, Wi-Fi-only and quiet-hours rules, change alerts, and
      dedupe of identical fetches. Ships signed APKs with an in-app updater.
    highlights:
      - Editor live preview rendered by the real Glance widget code rather than
        a mock
      - Persisted-schema discipline with stable serial names and field defaults
        so stored widgets survive upgrades
      - Release pipeline derives versionCode, pins and verifies the signing
        certificate SHA-256, and prunes old releases
      - One content widget for every source plus plugin kinds for offline
        trackers
    period: "2026"
    stack:
      - Kotlin
      - Jetpack Compose
      - Glance
      - WorkManager
      - OkHttp
      - kotlinx.serialization
    links: []
    media: []
    tier: keep
    featured: false
    path: /projects/#latent-byte-utils
    updated: 2026-10-23
    url: https://arizare.com/projects/#latent-byte-utils
  - slug: pycalc
    name: PyCalc
    tagline: Plugin-based calculators where Pydantic models generate the web UI,
      charts, and SEO pages
    description: Calculator platform where each calculator is a Python plugin with
      Pydantic input and output models and a compute function. A React UI
      renders forms from the input schema and results, stat tiles, trend charts,
      and tables from the output schema, so a new calculator needs no frontend
      code. The live calculator models rental properties with taxes,
      depreciation, sale costs, and a year-by-year buy versus rent-and-invest
      comparison, served as crawlable server-rendered pages.
    highlights:
      - "Auto-discovered plugins: one logic.py with Input, Output, and compute
        is a complete calculator"
      - Server-rendered pages with JSON-LD, generated 1200x630 Open Graph
        images, sitemap, and canonical redirects
      - Rental-property model with federal and state tax, NIIT, depreciation,
        sale costs, and buy versus rent-and-invest
      - Shareable input links, saved inputs, and an optional LLM explanation of
        results using your own OpenAI or OpenRouter key
    period: 2023 - 2026
    stack:
      - Python
      - Flask
      - Pydantic
      - React
      - TypeScript
      - Tailwind
    links:
      - label: Product page
        url: https://latentbyte.com/products/calculators
      - label: Live
        url: https://calculators.lbyte.app
    media:
      - src: https://arizare.com/assets/images/projects/py-calculator-1.webp
        width: 1440
        height: 900
        alt: Rental property calculator with input form and a results summary of net
          worth versus market
        kind: screenshot
        href: https://calculators.lbyte.app/rental-property
    tier: keep
    featured: false
    path: /projects/#pycalc
    updated: 2026-10-23
    url: https://arizare.com/projects/#pycalc
  - slug: roamline
    name: Roamline
    tagline: Trip planner for comparing multi-stop routes, deciding as a group, and
      sharing travel history
    description: Full-stack trip planner for comparing alternative multi-stop
      routes, coordinating group decisions, and sharing travel history. A React
      and MapLibre SPA talks to a Hono API on Bun backed by PostgreSQL with
      PostGIS and a self-hosted reference geodata layer, so place labels and
      regions need no third-party API. Time and location are captured exactly,
      and viewing precision is applied when shared.
    highlights:
      - Self-hosted reference geodata layer with import and re-resolve,
        referenced by opaque ids
      - "Precision model: capture exact time and location, then coarsen location
        and time when shared"
      - Companions, voting, comments, itinerary legs, and read-only share links
        with a no-referrer policy and CSP
      - Tests against a PostGIS test database, zod-validated API bodies, and a
        trip-level authorization module
    period: "2026"
    stack:
      - TypeScript
      - Bun
      - Hono
      - React
      - MapLibre
      - PostgreSQL/PostGIS
    links:
      - label: Product page
        url: https://latentbyte.com/products/roamline
      - label: Live
        url: https://roamline.lbyte.app
    media:
      - src: https://arizare.com/assets/images/projects/roamline-1.webp
        width: 1440
        height: 900
        alt: Roamline landing page with a ranked multi-destination route preview
          starting from Lisbon
        kind: screenshot
        href: https://roamline.lbyte.app
    tier: keep
    featured: false
    path: /projects/#roamline
    updated: 2026-10-23
    url: https://arizare.com/projects/#roamline
  - slug: comboswitcher
    name: ComboSwitcher
    tagline: One fuzzy menu over windows, apps, browser tabs, tmux sessions, files,
      and scripts on macOS
    description: Daily-driver launcher and window switcher for macOS, inspired by
      Rofi on Linux. A Go daemon aggregates items from pluggable providers,
      including tiling window manager windows, installed apps, browser tabs,
      tmux sessions, recent files, and external scripts, then ranks and merges
      them by usage and drives the zmenu UI over Unix-socket IPC. A thin client
      toggles it from a hotkey.
    highlights:
      - Provider plugin architecture plus a versioned external-script protocol
        with discovery and manifest caching
      - Usage-based scoring with expiry, focus history, and dedupe across
        window, app, and tab entries
      - Written incident review with root cause and a regression test for a
        window dropped after a workspace switch
      - The daemon restarts on config change and refreshes its catalog on AC
        power
    period: 2024 - 2026
    stack:
      - Go
      - Cobra
      - Viper
      - Unix sockets
      - AeroSpace
      - Zig (zmenu UI)
    links:
      - label: Product page
        url: https://latentbyte.com/products/combo-switcher
    media: []
    tier: keep
    featured: false
    path: /projects/#comboswitcher
    updated: 2026-10-23
    url: https://arizare.com/projects/#comboswitcher
  - slug: filter-merge
    name: filter-merge
    tagline: Low-memory DNS filter-list merger for AdGuard Home on OpenWrt routers
    description: Zero-dependency Rust HTTP server that downloads configured DNS
      filter lists, merges them with an external sort over bounded on-disk runs,
      drops duplicate rules across lists, and serves one merged list on loopback
      for AdGuard Home. On a GL-MT3000 router, AdGuard RSS fell 30.5% right
      after activation and restart (12.4% once warmed), while the merger and its
      curl downloads peaked at 11.3 MiB combined. Ships static ARM64 and x86_64
      binaries with a checksum-verifying OpenWrt installer.
    highlights:
      - External merge sort with 2 MiB sorted runs and a k-way combine with
        dedupe, under hard input, output, and time caps
      - AdGuard RSS dropped from 136.7 MiB to 95.0 MiB right after activation
        and restart; 1M-rule output verified by an independent hash
      - Size-optimized static binary with no crate dependencies, about 452 KiB
        as released
      - Release pipeline publishes static binaries and SHA256SUMS with a procd
        installer that verifies checksums
    period: "2026"
    stack:
      - Rust
      - OpenWrt
      - Shell
      - GitHub Actions
    links:
      - label: GitHub
        url: https://github.com/hamidzr/filter-merge
    media: []
    tier: keep
    featured: false
    path: /projects/#filter-merge
    updated: 2026-10-23
    url: https://arizare.com/projects/#filter-merge
  - slug: netstats
    name: netstats
    tagline: Network-quality monitor in Go that runs on an OpenWrt router
    description: Go collector that probes targets over ICMP and TCP every 5 seconds,
      stores samples in SQLite, and serves stats through a CLI, an HTTP API, and
      a dashboard hosted on the router itself. Runs on Linux, macOS, and
      OpenWrt. On the router it keeps the live database in RAM and snapshots it
      to flash to limit wear, and adds on-demand speed tests recorded with
      connection context.
    highlights:
      - "Flash-wear-aware storage: live SQLite DB in RAM, gzip snapshots every
        30 minutes and on shutdown, restored on boot"
      - Weighted compaction of old samples and trimmed query memory so the
        dashboard fits a constrained router
      - "Speed-test API limited to the local network: Origin and header checks,
        loopback-only trusted proxy, SHA-256 pinned binary"
      - Cross-compiled one-command router deploy, plus battery-aware probe rates
        on macOS
    period: 2025 - 2026
    stack:
      - Go
      - SQLite
      - OpenWrt
      - nginx
      - JavaScript
      - Shell
    links: []
    media: []
    tier: keep
    featured: false
    path: /projects/#netstats
    updated: 2026-10-23
    url: https://arizare.com/projects/#netstats
  - slug: aboard
    name: ABoard
    tagline: Android keyboard that reads on-screen conversation context and drafts
      LLM replies
    description: Extends an open-source Jetpack Compose keyboard into an AI reply
      assistant for Android. Captures conversation context through
      MediaProjection screenshots with ML Kit OCR or an AccessibilityService
      text pipeline, filters it into a structured prompt, calls LLMs through
      OpenRouter, retrying without tools when a model lacks tool support, and
      inserts the chosen reply into the focused field. Ships signed APK releases
      with an in-app updater.
    highlights:
      - Two context-capture paths, screenshot OCR and accessibility tree, with
        event filtering and conversation extraction
      - Prompt context reduction tuned from context bundles exported from real
        devices, with analyzer and filter-suggester scripts
      - "Assistant overlays outside the IME: floating handle, voice-bubble
        dictation, and text insertion into focused fields"
      - Release pipeline with signed APKs, retention pruning, a shared in-app
        updater module, and tested Python release tooling
    period: "2026"
    stack:
      - Kotlin
      - Jetpack Compose
      - Android IME
      - AccessibilityService
      - ML Kit
      - OpenRouter
    links: []
    media: []
    tier: keep
    featured: false
    path: /projects/#aboard
    updated: 2026-10-23
    url: https://arizare.com/projects/#aboard
  - slug: markdown-notes
    name: Markdown Notes
    tagline: Mobile PWA editor for a git-backed Markdown notes file, with no database
    description: Self-hosted web editor for a Markdown notes file kept in a git
      repository, with git as the only storage and sync layer. Parses lines into
      typed blocks, applies small line patches guarded by block hashes so
      concurrent edits are detected, commits every accepted write, and syncs
      with fetch, rebase, and push. Includes OIDC sign-in, an offline PWA with
      queued writes, a conflict-resolution UI, and vim-style navigation.
    highlights:
      - Lossless block model preserves unknown text, CRLF line endings, fenced
        code, and exact heading identity across edits
      - Hash-guarded line patches detect concurrent edits, with block-level
        conflict previews and recovery after failed commits
      - "Security pass: git option injection blocked in repo URL and branch,
        sandboxed file serving, fail-closed auth"
      - Offline write queue with replay in a mobile-first card UI, plus a raw
        view and vim keybindings
    period: "2026"
    stack:
      - TypeScript
      - Bun
      - Hono
      - Vite
      - git
      - Docker
    links: []
    media: []
    tier: keep
    featured: false
    path: /projects/#markdown-notes
    updated: 2026-10-23
    url: https://arizare.com/projects/#markdown-notes
  - slug: anonymous-inbox
    name: Anonymous Inbox
    tagline: "Anonymous two-way inbox: share a link, senders write back without an
      account"
    description: Owners sign in, publish an inbox link, and receive messages from
      senders who need no account. Senders return to their thread with a secret
      capability code carried only in the URL fragment and stored server-side as
      a peppered fingerprint. Owner notifications never include message text.
      Built on Next.js and Postgres with validated server actions, rate
      limiting, and a custom migration runner.
    highlights:
      - Capability codes live only in URL fragments and form posts, stored as
        peppered fingerprints; sender sessions use encrypted cookies
      - "Abuse controls: DB-backed rate-limit buckets, proxy-aware client IP
        extraction, anti-bot checks, and a same-origin CSRF guard"
      - Custom SQL migration runner with sha256 checksums, an advisory lock, and
        an append-only check against the trunk merge-base
      - Zod-validated server actions over a separate domain layer
    period: "2026"
    stack:
      - TypeScript
      - Next.js
      - React
      - PostgreSQL
      - Drizzle
      - Bun
    links:
      - label: Product page
        url: https://latentbyte.com/products/anonymous-msg
      - label: Live
        url: https://anonymous-msg.lbyte.app
    media:
      - src: https://arizare.com/assets/images/projects/anonymous-inbox-1.webp
        width: 1440
        height: 900
        alt: Anonymous Inbox landing page with create inbox and check a reply actions
        kind: screenshot
        href: https://anonymous-msg.lbyte.app
    tier: keep
    featured: false
    path: /projects/#anonymous-inbox
    updated: 2026-10-23
    url: https://arizare.com/projects/#anonymous-inbox
  - slug: calendar
    name: Calendar
    tagline: Merged multi-user calendar agenda with push alerts, plus a CLI for
      status bars and availability
    description: Python toolkit that started as a CLI for ICS feeds (status bar
      output, next events, HTML agenda, multi-timezone availability) and grew
      into a multi-user FastAPI server. Users sign in, add private calendar feed
      URLs, and get a merged agenda, shareable links, and web push
      notifications. The CLI and server share one ICS loading and
      recurrence-expansion core.
    highlights:
      - Recurrence handling covers overrides, RECURRENCE-ID timezones, EXDATE
        DST folds, and lookback windows, with regression tests
      - Feed fetching hardened with SSRF guards, a source allowlist, a 10 MB
        cap, unlogged feed URLs, and at most one fetch per hour
      - Postgres-backed feed cache; tests run against throwaway Postgres 18
        containers with per-test schemas
      - Append-only migration guard wired into static checks and a pre-push hook
    period: 2025 - 2026
    stack:
      - Python
      - FastAPI
      - PostgreSQL
      - Web Push
      - Docker
      - uv
    links:
      - label: Product page
        url: https://latentbyte.com/products/calendar
      - label: Live
        url: https://calendar.lbyte.app
    media:
      - src: https://arizare.com/assets/images/projects/calendar-1.webp
        width: 1440
        height: 900
        alt: Calendar app landing page listing merged agenda, share links and reminders
          features
        kind: screenshot
        href: https://calendar.lbyte.app
    tier: keep
    featured: false
    path: /projects/#calendar
    updated: 2026-10-23
    url: https://arizare.com/projects/#calendar
  - slug: falcon-9-simulation
    name: Falcon 9 Simulation
    tagline: Numerical simulation of a reusable rocket launch and landing that
      minimizes leftover fuel
    description: Two-person project simulating a Falcon 9 style rocket in 2D as it
      climbs to a 200 km apogee and performs a landing burn, modeling thrust,
      gravity, drag, and altitude-dependent air density. Each flight stage is
      re-solved with adjusted launch ratio, takeoff angle, and landing-burn
      parameters to converge on the profile that minimizes leftover propellant
      and maximizes horizontal velocity at apogee. Prototyped in Matlab, then
      ported to Python.
    highlights:
      - Iterative thrust and landing-burn solvers that warm-start from the
        previous best parameters
      - Altitude-dependent atmosphere and drag model, with plotted attempts,
        altitudes, and angles for each run
      - Cached results and batch plotting controlled by CLI flags for timestep,
        attempt limits, save, and load
      - 16 GitHub stars
    period: "2018"
    stack:
      - Python
      - NumPy
      - Matplotlib
      - Matlab
    links:
      - label: GitHub
        url: https://github.com/hamidzr/rocket-simulation
    media:
      - src: https://arizare.com/assets/images/projects/falcon-9-simulation-1.webp
        width: 640
        height: 480
        alt: Simulated rocket trajectory plot of altitude against horizontal position in
          kilometers
        kind: image
      - src: https://arizare.com/assets/images/projects/falcon-9-simulation-2.webp
        width: 640
        height: 480
        alt: Plot of explored landing burn altitudes converging across optimizer
          iterations
        kind: image
    tier: keep
    featured: false
    path: /projects/#falcon-9-simulation
    updated: 2026-10-23
    url: https://arizare.com/projects/#falcon-9-simulation
  - slug: next-block-prediction
    name: Next Block Prediction
    tagline: Language models that suggest the next block in block-based programs
    description: Graduate research that treats block-based programs (Scratch,
      NetsBlox) as token sequences and predicts the next block a student will
      use. Compares n-gram models with Kneser-Ney smoothing, evaluated by
      perplexity, against GRU and LSTM networks using one-hot or word2vec block
      embeddings, trained on a public Scratch project corpus. Includes t-SNE
      views of block embeddings and an interactive top-3 predictor.
    highlights:
      - N-gram baselines with add-one and interpolated Kneser-Ney smoothing,
        evaluated by perplexity on a sample set
      - One-hot vs word2vec-embedded RNNs with configurable GRU or LSTM cells
        and dropout
      - Domain-aware tokenizer that splits programs into valid language blocks,
        with duplicate detection and parallel preprocessing
      - t-SNE visualizations of learned block embeddings and n-gram distribution
        charts
    period: "2017"
    stack:
      - Python
      - TensorFlow
      - Keras
      - word2vec
      - Matplotlib
    links:
      - label: GitHub
        url: https://github.com/hamidzr/next-block-prediction
    media: []
    tier: keep
    featured: false
    path: /projects/#next-block-prediction
    updated: 2026-10-23
    url: https://arizare.com/projects/#next-block-prediction
  - slug: distributed-pubsub-broker
    name: Distributed PubSub Broker
    tagline: Topic-based publish/subscribe broker over a Chord-style DHT with
      failure detection
    description: Led a student team that designed and built a resilient topic-based
      pub/sub broker from scratch in Python and ZeroMQ, exploring Chord and
      ZooKeeper based designs. Event servers form a consistent-hash ring;
      publishers and subscribers look up the node that owns a topic, register,
      and exchange events, and heartbeats trigger re-lookup and re-registration
      when a server dies. Evaluated on Mininet network topologies with latency
      measurements.
    highlights:
      - Chord-style DHT prototype with finger tables, node join and leave, and
        successor lookup
      - "Failure handling: heartbeat detection, a ring organizer that drops dead
        nodes, and automatic client re-lookup and re-registration"
      - Consistent hashing maps topics to event servers, with clients
        registering over ZeroMQ request/reply and receiving events over pub/sub
      - Mininet topology simulations measuring publish-to-subscribe latency
    period: "2017"
    stack:
      - Python
      - ZeroMQ
      - Chord DHT
      - ZooKeeper
      - Mininet
    links:
      - label: GitHub
        url: https://github.com/hamidzr/pubsub-broker
    media:
      - src: https://arizare.com/assets/images/projects/distributed-pubsub-broker-1.webp
        width: 1600
        height: 1122
        alt: Simulated star topology with publisher, subscriber and broker apps
          connected through a switch
        kind: image
    tier: keep
    featured: false
    path: /projects/#distributed-pubsub-broker
    updated: 2026-10-23
    url: https://arizare.com/projects/#distributed-pubsub-broker
  - slug: branchlogic
    name: BranchLogic
    tagline: Write a decision tree in YAML and share a link that walks anyone
      through it step by step
    description: Web app that turns small YAML decision trees, including loops and
      conditional branches, into navigable step-by-step walkthroughs. Trees are
      validated against a JSON schema, edited in an in-browser Monaco YAML
      editor with schema-aware completion, and stored locally, with breadcrumbs,
      back navigation, and shareable deep links to any step. Served as a static
      SPA from Cloudflare Workers.
    highlights:
      - YAML-to-interactive-tree pipeline with JSON Schema validation (ajv) and
        schema-aware Monaco editing in the browser
      - Shareable deep links to any step, with validated restore of navigation
        paths and skipping of corrupt stored trees
      - Six bundled sample trees, including a walkthrough of how a dog reacts to
        any object
      - Lazy-loaded routes, security headers, SEO metadata, and tests for
        routing and SEO
    period: 2020 - 2026
    stack:
      - TypeScript
      - React
      - Vite
      - Material UI
      - Monaco Editor
      - Cloudflare Workers
    links:
      - label: Product page
        url: https://latentbyte.com/products/decision-tree
      - label: Live
        url: https://decision-tree.lbyte.app
    media:
      - src: https://arizare.com/assets/images/projects/decision-tree-1.webp
        width: 740
        height: 439
        alt: Example decision tree starting at Weather with branches to Time, Hungry and
          Bus, Walk outcomes
        kind: image
      - src: https://arizare.com/assets/images/projects/decision-tree-2.webp
        width: 1440
        height: 340
        alt: Decision tree app asking how is the weather with Rain, Sun and Cloud answer
          buttons
        kind: screenshot
        href: https://decision-tree.lbyte.app/dt/work-journey
    tier: keep
    featured: false
    path: /projects/#branchlogic
    updated: 2026-10-23
    url: https://arizare.com/projects/#branchlogic
  - slug: netsblox-player
    name: NetsBlox Player
    tagline: Mobile app that runs networked NetsBlox projects on Android and iOS
    description: Ionic and Cordova app that embeds the full NetsBlox browser client
      so students can run their networked block-based programs on phones and
      tablets. Kept in sync with the web client through a submodule and rebuild
      script, with mobile-specific keyboard and room-tab UX fixes.
    highlights:
      - Wrapped the NetsBlox web client in a native mobile shell for Android and
        iOS
      - Submodule-based update script that rebuilds the embedded client when the
        web app changes
      - Mobile UX fixes for on-screen keyboard handling and room tabs
    period: 2017 - 2019
    stack:
      - Ionic
      - Cordova
      - TypeScript
      - JavaScript
      - Android
    links:
      - label: GitHub
        url: https://github.com/NetsBlox/mobile
    media:
      - src: https://arizare.com/assets/images/projects/netsblox-player-1.webp
        width: 406
        height: 481
        alt: NetsBlox Player mobile app running an earthquake map project with an Open
          button
        kind: image
      - src: https://arizare.com/assets/images/projects/netsblox-player-2.webp
        width: 1080
        height: 1920
        alt: NetsBlox Player mobile app room view with roleA and roleB slots for
          collaborating
        kind: image
    tier: keep
    featured: false
    path: /projects/#netsblox-player
    updated: 2026-10-23
    url: https://arizare.com/projects/#netsblox-player
  - slug: stackrank
    name: Stackrank
    tagline: Mobile-first stack ranking for text, links, and images with shareable
      campaigns
    description: Owners build a campaign of text, link, or image items, publish a
      share link, and respondents drag-rank on touch, pointer, or keyboard, with
      results aggregated per campaign. Images go through an HMAC-signed upload
      proxy to object storage that treats uncertain storage writes as accepted
      and reconciles them through idempotent completion instead of blind
      retries. Built on Next.js and Postgres.
    highlights:
      - Upload proxy maps storage timeouts, 409/412, and 5xx to 202 and
        reconciles via idempotent completion, and surfaces platform
        storage-quota errors
      - Accessible drag ranking with keyboard, pointer, and touch support via
        dnd-kit
      - Content Security Policy, an append-only migration check before push, and
        a health endpoint reporting the deployed commit
      - Generated typed client for platform APIs, plus sitemap, robots, and Open
        Graph images for sharing
    period: "2026"
    stack:
      - TypeScript
      - Next.js
      - React
      - PostgreSQL
      - Drizzle
      - dnd-kit
    links:
      - label: Product page
        url: https://latentbyte.com/products/stack-ranker
      - label: Live
        url: https://ranked.lbyte.app
    media:
      - src: https://arizare.com/assets/images/projects/stackrank-1.webp
        width: 1440
        height: 900
        alt: Stackrank landing page with a draggable ranked list of launch priorities
        kind: screenshot
        href: https://ranked.lbyte.app
    tier: keep
    featured: false
    path: /projects/#stackrank
    updated: 2026-10-23
    url: https://arizare.com/projects/#stackrank
  - slug: small-web-utilities
    name: Small Web Utilities
    tagline: Shareable link lists, AI question links, and contact cards served from
      the edge
    description: Monorepo of small public web tools, including Linked List, Let Me
      Do That For You, and a shareable contact card with QR code. Linked List
      encodes anonymous lists entirely in the URL and serves them from a
      Cloudflare Worker, so they keep working when the origin is down, while
      signed-in managed lists pass through to a Next.js and Postgres origin.
      Analytics are scrubbed of phone numbers and contact details before
      tracking.
    highlights:
      - "Edge split: URL-encoded anonymous lists render from a Cloudflare Worker
        independent of the origin; managed routes proxy through"
      - Legacy CORS proxy with a target-host allowlist and a private-IP
        blocklist re-checked on every redirect hop to block SSRF
      - Privacy-preserving analytics helper that strips phone numbers and
        contact details from tracked URLs, with tests
      - Append-only migration check enforced by a pre-push hook
    period: 2025 - 2026
    stack:
      - TypeScript
      - JavaScript
      - Next.js
      - Cloudflare Workers
      - PostgreSQL
      - Bun
    links:
      - label: "Product page: Let Me Do That For You"
        url: https://latentbyte.com/products/let-me-do-that-for-you
      - label: "Product page: Linked List"
        url: https://latentbyte.com/products/linked-list
      - label: "Product page: Contact Me"
        url: https://latentbyte.com/products/contact-me
      - label: "Live: Linked List"
        url: https://linkedlist.lbyte.app
      - label: "Live: Let Me Do That For You"
        url: https://letmedothatforyou.lbyte.app
      - label: "Live: Utilities"
        url: https://utils.apps.latentbyte.com
    media:
      - src: https://arizare.com/assets/images/projects/serverless-pages-1.webp
        width: 1440
        height: 900
        alt: Linked List page maker landing page with a preview of an ordered list of
          links
        kind: screenshot
        href: https://linkedlist.lbyte.app
      - src: https://arizare.com/assets/images/projects/serverless-pages-2.webp
        width: 1440
        height: 900
        alt: Let me do that for you page with a question box and buttons for Google,
          ChatGPT, Claude and others
        kind: screenshot
        href: https://letmedothatforyou.lbyte.app
      - src: https://arizare.com/assets/images/projects/serverless-pages-3.webp
        width: 1440
        height: 900
        alt: LBC Utilities launcher with cards for Hotel Launcher, Let Me Do That For
          You, ContactMe and Linked List
        kind: screenshot
        href: https://utils.apps.latentbyte.com
    tier: keep
    featured: false
    path: /projects/#small-web-utilities
    updated: 2026-10-23
    url: https://arizare.com/projects/#small-web-utilities
  - slug: task-manager-nvim
    name: task-manager.nvim
    tagline: Neovim plugin to triage, prioritize, and sort Markdown to-do lists
    description: Lua plugin for Markdown task lists in Neovim. Assigns [pN]
      priorities interactively, moves tasks between categories with generated
      shortcuts, sorts stably by priority while preserving sub-item hierarchy,
      and moves checked tasks to the bottom of their section. A headless
      regression harness runs in CI across Neovim stable, v0.10.0, and nightly.
    highlights:
      - Stable priority sort that preserves nested sub-items and keeps orphan
        sub-items in place
      - Checked-task moves bounded by nested headings so items never leave their
        section
      - Interactive triage flow with generated category shortcuts and
        configurable keymaps
      - Headless test harness in a CI matrix over Neovim stable, v0.10.0, and
        nightly
    period: 2025 - 2026
    stack:
      - Lua
      - Neovim API
      - GitHub Actions
    links:
      - label: GitHub
        url: https://github.com/hamidzr/task-manager.nvim
    media: []
    tier: keep
    featured: false
    path: /projects/#task-manager-nvim
    updated: 2026-10-23
    url: https://arizare.com/projects/#task-manager-nvim
  - slug: user-scripts
    name: user-scripts
    tagline: Browser userscripts for web annoyances, from review-aware shopping
      scores to GitHub tweaks
    description: Public collection of browser userscripts organized by site, built
      from a separate typed TypeScript source repo. Adds review-aware scoring to
      Amazon, Airbnb, and AliExpress listings using a Wilson lower bound ranked
      relative to the page, puts failing GitHub checks first and adds PR diff
      stats, auto-mutes Meet and Teams, and adds shift-click range selection to
      web dashboards.
    highlights:
      - Wilson lower bound scoring with page-relative ranking, so listings with
        a handful of reviews do not outrank proven ones
      - Site enhancers that survive SPA navigation and dynamic re-renders on
        Airbnb, Hostelworld, and Super.com
      - "GitHub workflow scripts: failing checks sorted first and diff stats on
        PR lists"
      - Scripts for 21 sites, published as installable .user.js files from a
        linted, type-checked source build
    period: 2019 - 2026
    stack:
      - JavaScript
      - TypeScript
      - Tampermonkey
      - Violentmonkey
    links:
      - label: GitHub
        url: https://github.com/hamidzr/user-scripts
    media:
      - src: https://arizare.com/assets/images/projects/user-scripts-1.webp
        width: 1600
        height: 914
        alt: Userscript adding score and value sorting to an Airbnb listings grid
        kind: image
      - src: https://arizare.com/assets/images/projects/user-scripts-2.webp
        width: 1600
        height: 1125
        alt: Userscript overlaying review-based score badges on Amazon search results
        kind: image
    tier: keep
    featured: false
    path: /projects/#user-scripts
    updated: 2026-10-23
    url: https://arizare.com/projects/#user-scripts
  - slug: visual-machine-learning
    name: Visual Machine Learning
    tagline: Machine learning and reinforcement learning blocks for the Snap! visual
      programming environment
    description: Research prototype at Vanderbilt that exposes machine learning and
      reinforcement learning as blocks in Snap!, so students can train agents
      without writing text code. Runs in the browser with TensorFlow.js with a
      deep Q-learning agent (neural Q-network with replay memory) exposed as
      blocks, and blocks to build, train and save models.
    highlights:
      - Block-level ML and RL abstractions for Snap!, aimed at teaching learning
        concepts to students
      - Deep Q-learning agent on TensorFlow.js exposed as Snap blocks, with
        model save and load
      - Blocks for defining, compiling and fitting TensorFlow.js models
    period: "2018"
    stack:
      - JavaScript
      - TensorFlow.js
      - Snap!
    links:
      - label: GitHub
        url: https://github.com/hamidzr/Snap--Build-Your-Own-Blocks/tree/rl-snap
    media:
      - src: https://arizare.com/assets/images/projects/visual-machine-learning-1.webp
        width: 426
        height: 207
        alt: Snap block script that creates a Q-learning agent, loads a model and trains
          it with blocks
        kind: image
      - src: https://arizare.com/assets/images/projects/visual-machine-learning-2.webp
        width: 1111
        height: 639
        alt: Snap visual blocks for building, compiling, fitting and predicting with a
          machine learning model
        kind: image
    tier: keep
    featured: false
    path: /projects/#visual-machine-learning
    updated: 2026-10-23
    url: https://arizare.com/projects/#visual-machine-learning
  - slug: fog-alert
    name: Fog Alert
    tagline: Fog-based intrusion detection with a Raspberry Pi camera, MQTT, and
      pluggable detectors
    description: "Led a two-person team building an intrusion detection system from
      decoupled components: an edge Raspberry Pi captures camera frames, an
      analyzer server classifies them with swappable detectors, and alerts flow
      over an MQTT broker to a NodeMCU alert module. End-to-end timing carried
      through the message path compares cloud and fog deployments, and Ansible
      provisions the broker and servers."
    highlights:
      - Components decoupled over MQTT pub/sub so languages and hardware can be
        mixed freely
      - End-to-end latency instrumentation carrying publish time through MQTT to
        compare cloud and fog setups
      - Swappable detector modules on the analyzer server
      - Ansible playbooks provisioning the MQTT broker and web servers
    period: "2018"
    stack:
      - Python
      - MQTT
      - Raspberry Pi
      - Arduino
      - Ansible
      - Docker
    links:
      - label: GitHub
        url: https://github.com/hamidzr/fog-alert
    media: []
    tier: keep
    featured: false
    path: /projects/#fog-alert
    updated: 2026-10-23
    url: https://arizare.com/projects/#fog-alert
  - slug: sketch-adventures
    name: Sketch Adventures
    tagline: Global Game Jam 2018 game where hand-drawn doodles come to life
    description: "Global Game Jam 2018 team entry in Rust: players move with the
      arrow keys and draw with the mouse, and each drawing is classified by a
      CNN trained on Quick, Draw! doodles, then spawned into the world as an
      entity, a few of which affect gameplay. Contributed the Python recognition
      side: the 10-category classifier wrapper, drawing preprocessing, and the
      predictor output consumed by the game."
    highlights:
      - "Sketch recognition wired into gameplay: the Rust game calls a Python
        CNN classifier and spawns the predicted entity"
      - Built the 10-category doodle classifier integration and a parseable
        predictor output format
      - Drawing preprocessing that trims user sketches to square and resizes
        them for the model
      - Made in a single jam weekend, partly as a way to learn Rust
    period: "2018"
    stack:
      - Rust
      - Python
      - Piston
    links:
      - label: GitHub
        url: https://github.com/hamidzr/gamejam-2018
    media: []
    tier: keep
    featured: false
    path: /projects/#sketch-adventures
    updated: 2026-10-23
    url: https://arizare.com/projects/#sketch-adventures
  - slug: humanize
    name: Humanize
    tagline: Offline, deterministic prose checker and rewriter with a CLI and an
      OpenAPI web API
    description: Rule-based writing tool that reports repetitive-prose metrics and
      applies small deterministic edits, such as wordy phrases, punctuation,
      optional contractions, typos, and formatting cleanup, with no model or
      network calls. A seeded batch mode distributes options across many drafts
      exactly and reports cross-item repetition. One engine powers a Bun CLI and
      a web workbench with a contract-first API.
    highlights:
      - Prose rewrites skip protected spans such as code, links, URLs, and
        quoted text by routing through one prose-mapping path
      - Seeded batch mode allocates option shares exactly and reports cross-item
        repetition
      - "Contract-first Hono API: zod routes generate the OpenAPI 3.1 spec and a
        typed client, with a drift check, plus a tested llms.txt"
      - Privacy-tested analytics with payload sanitization, host gating, and Do
        Not Track support
    period: "2026"
    stack:
      - TypeScript
      - Bun
      - Hono
      - zod
      - Next.js
      - Docker
    links:
      - label: Product page
        url: https://latentbyte.com/products/humanize
      - label: Live
        url: https://humanize.lbyte.app
    media:
      - src: https://arizare.com/assets/images/projects/humanize-1.webp
        width: 1440
        height: 900
        alt: Humanize prose rewriter with side by side Before and After panels for a
          draft
        kind: screenshot
        href: https://humanize.lbyte.app
    tier: keep
    featured: false
    path: /projects/#humanize
    updated: 2026-10-23
    url: https://arizare.com/projects/#humanize
  - slug: snippet-recorder
    name: Snippet Recorder
    tagline: Android app for quick text and voice notes with on-device Gemini Nano
      summaries
    description: Flutter app that captures text snippets and voice recordings,
      stores them locally, and optionally transcribes audio through Deepgram.
      Generates titles and summaries on-device with Gemini Nano through ML Kit
      via a Kotlin platform channel, with a fallback path on unsupported
      devices. Ships as signed APKs with an in-app updater and scripted release
      tooling.
    highlights:
      - On-device LLM titles and summaries via Gemini Nano, with a tested
        fallback when the device lacks support
      - Release flow with a fingerprint-pinned signing key, generated update
        catalog, and pruning of old releases
      - Fixes for save and restore races covering drafts, interrupted
        processing, and startup restoration
    period: "2026"
    stack:
      - Flutter
      - Dart
      - Kotlin
      - ML Kit
      - Deepgram
      - Android
    links: []
    media: []
    tier: keep
    featured: false
    path: /projects/#snippet-recorder
    updated: 2026-10-23
    url: https://arizare.com/projects/#snippet-recorder
  - slug: qlearner-js
    name: QLearner.js
    tagline: Q-learning agent library that trains in the browser with TensorFlow.js
    description: JavaScript port of an earlier Python deep Q-learning project that
      trains agents directly in the browser with TensorFlow.js. Provides an
      agent with replay memory, player and game abstractions, a live
      training-history chart, and a tic-tac-toe demo where the agent trains
      against an alpha-beta minimax opponent.
    highlights:
      - DQN-style agent with replay memory and a capped memory size, trained
        entirely client-side
      - Agent save and load so trained models persist between sessions
      - Live training-history chart and a tic-tac-toe training demo against a
        minimax opponent
    period: "2018"
    stack:
      - JavaScript
      - TensorFlow.js
      - Chart.js
      - Babel
    links: []
    media: []
    tier: keep
    featured: false
    path: /projects/#qlearner-js
    updated: 2026-10-23
    url: https://arizare.com/projects/#qlearner-js
