Expense splitting for trips and everyday life
Friends, roommates, and travel groups each log expenses on their own phones; the app converts everything to TWD, works out who owes whom, and settles up in one go. Sign in with LINE and join from an invite link in the group chat. Frontend and API ship together on Cloudflare Workers and are live in production.
- Each expense is converted at that day's exchange rate (market rate by default, or pasted Bank of Taiwan rates before settling); split evenly, by shares, by exact amounts, or among just a few people.
- Settlement finds the fewest transfers, can group families and couples into one household, and records repayments; a ledger cannot be deleted while anyone still owes money.
- The home page sums up balances, spending by category, and monthly trends across every ledger; an activity feed shows who added, edited, or deleted what; expenses logged offline abroad upload once the phone is back online.
- Every invite and settlement link gets its own share image (drawn on Canvas and stored in R2); separate phone, tablet, and desktop layouts, and installable to the iPhone / Android home screen.
- LINE Login (OpenID Connect + PKCE) with only session-token hashes stored and sign-out from all devices, plus rate limiting, CSP, and security headers.
ReactTypeScriptViteCloudflare WorkersD1R2LINE LoginOpenID ConnectCanvasPWAVitest
Quotes, orders, inventory, and revenue in one place
Covers the full retail flow from quoting and deal tracking to stock pulls, pre-delivery inspection, and revenue reporting. Self-hosted and used in live daily operations.
- Quotes for new builds, used PCs, laptops, and repairs, with live preview and PDF / JPG export.
- Inventory with stock movements, stock-take records, average cost, and low-stock alerts; stock is pulled automatically when an order enters assembly.
- Revenue dashboard by month and year with profit, customer-source, and region breakdowns; customers are tiered by lifetime spend.
- Admin / staff roles with Passkey (Touch ID / Face ID) sign-in; pushes to master deploy automatically through a self-hosted runner.
GoGinGORMPostgreSQLNext.jsReactTypeScriptTailwind CSSPodmanKubernetesTailscaleGitHub Actions
Personal knowledge base with local LLMs and AI agent access
A Notion-style app for notes, databases, to-dos, and a journal, self-hosted and reached over Tailscale at home and through Cloudflare Tunnel when I am out. Semantic search and Q&A run on local models, so notes never leave the machine.
- Semantic search: Ollama bge-m3 embeddings stored in PostgreSQL pgvector find notes even when the wording differs; pg_trgm handles Chinese keyword search.
- Ask mneme (RAG): ask a question in plain language; the most relevant passages go to a local LLM, which answers with [1], [2] citations back to the notes.
- MCP server: lets Claude Code search and read notes and append to work logs and dev logs, limited to chosen categories and to read and append only.
- Block editor, nested pages, databases (table / board / calendar), version history, and two-way sync with Google Calendar.
- Remote access: Cloudflare Tunnel opens no inbound ports and Cloudflare Access admits only listed emails; the backend verifies the Access JWT itself (RS256 signature, issuer, audience, expiry, email allow-list), and MCP stays Tailscale-only.
GoGinPostgreSQLpgvectorOllamaRAGMCPReactTypeScriptTailwind CSSPodmanTailscaleCloudflare TunnelCloudflare Access
Kubernetes operator for serving local LLMs
Describe a model in one LLMService custom resource; the operator fetches the model, runs the inference server, and exposes an OpenAI-compatible API inside the cluster.
- Two engines, Ollama and llama.cpp, behind the same Service port and OpenAI-compatible /v1 path.
- A StatefulSet gives each replica its own model cache volume, so models download once and survive restarts; changing the model rolls the pods.
- GPU scheduling: setting gpus requests nvidia.com/gpu, and llama.cpp switches to the CUDA image and offloads every layer to the GPU.
- Status phases and conditions explain why a service is not ready (model download, image pull, or no free GPU); supports the scale subresource and HPA, with CEL validation at the API.
GoKubebuildercontroller-runtimeKubernetesCRDOllamallama.cppGPUenvtestkind
Local LLM speed and capability benchmark
Benchmarks the same model across three inference engines (Ollama, llama.cpp, and MLX) with one consistent method, producing an interactive HTML report and a PDF while keeping every run for comparison.
- Speed: time to first token (TTFT), output and prompt-processing throughput, load time, and peak memory.
- Capability: MMLU (57 subjects) and GSM8K at temperature 0 with a fixed seed, keeping every answer for review.
- Built on the Python standard library only; datasets are verified by sha256 after download.
- ECharts report with a sortable, filterable summary table, speed-vs-accuracy scatter plot, and run history.
PythonOllamallama.cppMLXEChartsMMLUGSM8K
Local AI image generation web app
Generates images on your own machine from the browser with FLUX.1-dev (NF4 quantized) and WAI Illustrious SDXL; images never leave the device.
- FastAPI backend and React + TypeScript frontend with a job queue, live progress, and time-remaining estimates.
- Detects hardware automatically: Apple Silicon (MPS) and NVIDIA GPUs (CUDA) on macOS, Windows, and Linux.
- One-click install and in-app updates with automatic backup and rollback, plus amd64 / arm64 container images.
- Prompt builder with an editable tag library and content-safety checks before generation.
PythonFastAPIReactTypeScriptPyTorchdiffusersFLUX.1SDXLDocker
Pixel-art drinking game kit for parties
Pull the lever and the slot machine mixes a cocktail from drinks you can buy at any convenience store, alongside party games that everyone plays on one phone. A static frontend on Cloudflare Pages that opens straight from a LINE group chat.
- Three reels (base spirit, mixer, extra) land on 27 ready-made recipes with ratios, flavor notes, and estimated strength, sweetness, and fizz; lock a reel to the bottle you already have.
- Devil switch: the machine turns dark red and only spins high-ABV combos (about 19–26%), each with a note on why it hits hard.
- 20 one-phone drinking games plus 2 party tools; losers can jump straight to the slot machine or log a drink on the scoreboard, which feeds an end-of-party summary.
- Shopping lists by group size that buy the fewest items for the most recipes; cookie-free visit counts with GoatCounter.
ReactTypeScriptViteCanvasCloudflare PagesGitHub ActionsVitest
Spin the wheel, take the train
Spin three times: region, county, then station, and go wherever it lands. Two versions cover local trains (240 stations) and EMU3000 express trains (76 stations), built from Taiwan Railway open data.
- A pixel-art wheel drawn pixel by pixel on Canvas and redrawn every frame at the new angle, so pixels stay square while it spins; set in the Cubic 11 pixel font.
- Landing on a station prints a "ticket" with its address, roughly how many trains stop each day, and Google Maps and Wikipedia links, with a warning to check the way back when service is sparse.
- Exclude counties you do not want and the wheels and station counts shrink to match; a level with only one option left is picked automatically.
- A script pulls a week of timetables from the open data to count stops per station, spotting EMU3000 services by their premium car and warning when the railway changes its train-type codes.
ReactTypeScriptViteCanvasNode.jsTRA Open DataVitest