# Experiments | Bagas Wastu

## Experiments

### [Connect Your Agent](https://wastu.net/projects?tab=experiments)

Temporary command access for AI agents without VPNs or SSH keys

- Year: 2026
- Links: [GitHub](https://github.com/bgwastu/connectyouragent.com), [Try Connect Your Agent](https://cya.wastu.net)

## Problem

The story starts from my mom's printer. She couldn't add F4 paper size in Microsoft Word, so she asked me to help, but after a few minutes of troubleshooting and searching, I just couldn't find a solution.

I thought about using my own AI agent to fix the problem, but I didn't want to install Tailscale on her machine, deal with SSH keys, or leave permanent remote software running on her computer.

## Solution
So I built Connect Your Agent (CYA). It was a tiny weekend project that I built to give my agent temporary shell access to my agent.

It was quite simple to use, just create a session via web, run the one-line install command on the target machine, and paste the generated prompt into Claude Code, Codex, or whatever agent that we're using. No CLI, no VPN, no SSH keys or whatever else. As long as the target machine has an internet connection, it just works.

## How I use it

I also use CYA to mess around with my low-end home router. Now, I can ask my agent to mess around with OpenWrt configs without messing with the complicated network setup.

### [Usagi](https://wastu.net/projects?tab=experiments)

Self-hosted usage board for AI provider accounts

- Year: 2026
- Links: [GitHub](https://github.com/bgwastu/usagi)

I wasn't satisfied with any existing solution for tracking AI usage across providers.

Nothing could handle the mix of OAuth providers like Codex and Antigravity alongside cookie-based ones like Cursor and OpenCode Go. And none of them tracked non-AI providers like Tavily or Exa at all.

I wanted a single board where I could see every quota, every reset timer, and every usage bar across all my accounts at a glance. So I built Usagi.

It supports OAuth with auto-refresh tokens (Codex, Antigravity), session cookies (Cursor, OpenCode Go), and plain API keys (Tavily, Exa, Composio, Command Code). You add your accounts, and the board refreshes usage data automatically.

## Supported providers

- **Codex** — OAuth (PKCE) with auto-refresh tokens; tracks 5-hour and weekly usage windows.
- **Antigravity** — Google OAuth (desktop flow) with auto-refresh; tracks Gemini and Claude & Other quota families, expandable per model.
- **OpenCode Go** — Session cookie authentication; auto-discovers workspaces and monitors 5-hour, weekly, and monthly windows.
- **Cursor** — Session cookie authentication (`WorkosCursorSessionToken`); tracks Pro plan usage, Auto + Composer quotas, and API limits.
- **Command Code** — Studio API key (`user_…`); tracks monthly plan credits alongside 5-hour and weekly limits.
- **Tavily** — API key authentication; tracks Researcher/Plan credits and key allowances.
- **Exa** — Team Management service key; monitors 3d, 7d, and 30d spend windows plus key budgets.
- **Composio** — Org API key (`oak_…`); monitors monthly tool-call quotas, Pro tool calls, and session limits.

I'll continue adding more providers over time as my workflow evolves and new tools make their way into my day-to-day stack.

## Tech stack

Built with React, Vite, and Hono. Runs self-hosted with Bun and SQLite, or as a Docker container. Credentials are encrypted at rest with AES when an encryption key is set.

### [Meshflare](https://wastu.net/projects?tab=experiments)

Cloudflare Zero Trust mesh and tunnel manager

- Year: 2025
- Links: [GitHub](https://github.com/bgwastu/meshflare), [Live Demo](https://meshflare-demo.wastu.workers.dev)

## Problem
I used to be the number one fan of Tailscale. It just worked, and having all my devices in a single mesh network was a lifesaver, especially back when I was still learning to manage my own servers (and messing things up constantly).

The problem is, on mobile, you only get one active VPN slot.

Here in Indonesia, that's a big deal. Local ISPs have notoriously bad peering with overseas services, and they block websites I visit every day, like Reddit. An always-on VPN wasn't optional for me; I had to run Cloudflare WARP for my everyday connection, which meant Tailscale had to go.

Over time, I moved my self-hosted stuff behind Cloudflare Tunnels and Access. Tailscale became this thing I only turned on once in a blue moon when I needed to SSH into an instance.

When Cloudflare launched WARP-to-WARP routing, it felt like the answer. But using it wasn't anything like Tailscale:

- You had to open the Cloudflare dashboard just to find a device's IP.
- No ✨ magic dns ✨.
- Cloudflare loves redesigning their dashboard, so every few months you're hunting for where settings moved.
- The split tunnel defaulted to exclude mode, which managed to lock me out of my own server more times than I'd like to admit lol.

## Solution
At first, I just hacked together a script that created magic DNS records automatically whenever a device showed up. That script quietly ran for about a year.

Eventually, I got tired of the Cloudflare dashboard stripping away the joy every time I needed to change a simple setting. So I built Meshflare to do what I actually wanted:

- See all my devices and their status in one clean view
- Set custom "magic dns" (`.mesh`) automatically whenever a new device connects
- Manage tunnels without getting lost in nested menus
- Block ads network-wide via DNS blocklists (basically Pi-hole inside Zero Trust)

## Tech stack

Runs serverless on Cloudflare Workers + D1, or self-hosted with Bun and SQLite. Built with React and TanStack Query.

### [Notestorm](https://wastu.net/projects?tab=experiments)

Minimalist writing app with AI that keeps you in flow

- Year: 2025
- Links: [GitHub](https://github.com/bgwastu/notestorm), [Start writing](https://notestorm.wastu.net)

I built this scratchpad for those frustrating moments when I know what I want to say, but the words just won't come out. By the time I find the right words, I've completely lost my train of thought.

## What makes it different

Most note apps interrupt my flow. Notestorm keeps me writing by suggesting completions that match how I sound. I can skip the words I'm stuck on and keep the ideas flowing. Everything runs locally, my notes never leave my device.

## Features

- AI autocomplete that learns your writing style
- Multiple AI provider support (Google, Groq, Anthropic, OpenAI, OpenRouter)
- VS Code keybindings support
- Perfect for brainstorming, drafting emails, or scratch notes
- Optional Chrome built-in AI support (Canary only)

## How I use it

Quick brainstorming sessions, drafting emails before copying to Gmail, and temporary notes I know I'll delete later.

## Building it

Spent 5 days building this with TanStack Start, CodeMirror 6, and Vercel AI SDK. Getting the autocomplete UX right is the hardest part. When to trigger suggestions, which keyboard shortcuts feel natural, and keeping it instant.

### [Parsley](https://wastu.net/projects?tab=experiments)

AI document parser that transforms PDFs or images into structured JSON or CSV data

- Year: 2025
- Links: [GitHub](https://github.com/bgwastu/parsley), [Try Parsley](https://parsley.wastu.net)

I used to build custom OCR systems for every document type I needed to parse. Bank statements were especially tedious: hardcoded pixel positions, regex patterns for each bank's format, and brittle parsing logic that broke with every minor PDF template change. Then I'd need similar setups for invoices, receipts, forms.

## The solution

Rather than keep fighting with OCR, I built Parsley with LLMs. It understands the content directly and structures it as needed. If you ask for "customer name" it finds it, whether it's labeled "Bill To:", "Customer:", or hidden in a paragraph. No hardcoded positions or regex.

Your API keys are used directly in the web app, so documents go straight to Google or OpenRouter. I can't access them. Everything stays stateless.

## Features

- Custom schemas (define your own structure, or let AI generate it)
- Supports PDF (including password-protected) and images (PNG, JPEG, WebP)
- Multiple AI providers (Google Gemini, OpenRouter, your own keys)
- Demo mode with rate-limited free tier (no API key needed)
- Export as JSON or CSV
- API works with n8n, Zapier, or other automation tools

## How I use it

I run invoices through Parsley in n8n, extract the needed data, and send it straight to my accounting spreadsheet. Same approach for bank statements, receipts, forms, any document where I want structured data fast.

### [Cek Sandi](https://wastu.net/projects?tab=experiments)

Password strength checker using zxcvbn algorithm

- Year: 2024
- Links: [GitHub](https://github.com/bgwastu/ceksandi), [Check your password](https://ceksandi.wastu.net)

I built this password strength checker to give awareness to people and developers about proper password rules. The goal? So we don't end up with more entries on [dumbpasswordrules.com](https://dumbpasswordrules.com/).

## What makes it different

Most password checkers are simplistic. Uppercase, lowercase, numbers, symbols, done. Cek Sandi uses the [zxcvbn algorithm](https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/wheeler), the same tool security professionals use. It analyzes common words, keyboard patterns, and predictable substitutions to show how resistant your password actually is to cracking attempts.

## Features

- Accurate strength analysis using zxcvbn algorithm
- Tips for creating strong passwords (passphrases, not just random characters)
- Open source, you can inspect the code and verify its security
- Focused on Indonesian users with localized tips

Built with Next.js and Mantine, deployed on Cloudflare Pages.

### [DeleteX](https://wastu.net/projects?tab=experiments)

Selectively delete your content on X (formerly Twitter)

- Year: 2024
- Links: [GitHub](https://github.com/bgwastu/deletex), [Delete your X posts](https://deletex.wastu.net/)

I wanted to clean up my X timeline but didn't want to nuke everything. So I built this tool to selectively delete tweets, retweets, and likes based on whatever criteria I need.

## How it works

DeleteX uses your [X archive data](https://help.x.com/en/managing-your-account/how-to-download-your-x-archive) to generate a userscript that runs in your browser. The script only deletes what you selected. Everything happens locally in your browser, so your data never leaves your device.

## Tech stack

Built with Next.js and IndexedDB. The archive stays in the browser, where it can be searched and filtered without sending the data anywhere.

### [Moonlit](https://wastu.net/projects?tab=experiments)

Slowed/nightcore effects for your favorite YouTube & TikTok videos

- Year: 2023
- Links: [GitHub](https://github.com/bgwastu/moonlit), [Listen to music](https://moonlit.wastu.net)

I'm kind of a weird person who can only focus when listening to nightcore or slowed+reverb looped music. So I built a music player that lets me customize playback speed and reverb in real-time.

## Features

- Change playback speed and reverb effect in real-time
- 3 default modes (slowed, normal, speed up) with a customizable mode
- Custom background for personalized aesthetics
- YouTube integration with quick link (youtubelit.com)

## The backstory

I used to reverse-engineer my audio driver just to access the legacy Realtek HD Audio Manager. It was the only way to change output audio pitch manually. I even wrote [a simple script](https://github.com/bgwastu/ytnc_cli) to convert YouTube songs into nightcore, but it was painfully slow and not very customizable.

At first, I was very reliant on AudioContext API for everything. But then I realized I could just use playback speed on the video element and only use AudioContext for reverb. Much simpler.

Building this taught me how audio and frequencies work, and more importantly, not to waste time writing features that nobody (including myself) would actually use.

### [XY Puzzle](https://wastu.net/projects?tab=experiments)

Escape room-style puzzle for tech enthusiasts

- Year: 2023
- Links: [Try solving the puzzle](https://xy.wastu.net)

Five days before TeknumConf 2023, I had a random idea: what if my name card was a puzzle? Medium complexity escape room-style challenge that requires some cryptography knowledge, but nothing too deep.

## The story

I wanted something like [hacker.gifts](https://frantic.im/hacker-gifts/) but more accessible. Had three days to pull it off - one day for designing and ordering the card, two days for coding the puzzle using Next.js server components (which was brand new tech at the time, making things way harder than expected).

## The plot twist

After distributing the cards at the conference, no one could solve it. Maybe it was too hard, or maybe they just weren't motivated enough. So I recently updated the puzzle to be more accessible while keeping it challenging.

Building this pushed me to think creatively and gave me hands-on experience with the app router and server components. Try [the puzzle](https://xy.wastu.net) yourself, even without the name card.

