Recent Posts

Cursor Control Plane, Rewritten on the Official SDK

May 31, 2026

In March I wrote about Cursor-ControlPlane — a way to drive Cursor CLI sessions on my own machine from a web dashboard or Telegram chat. The goal was the same then as now: keep work on my local environment (databases, Docker, SSH keys, private networks) while still being able to kick off a session from my phone and follow it through to a pull request.

That first version worked, but it was built on a layer I did not own. It spawned the agent acp subprocess and spoke JSON-RPC over newline-delimited stdin/stdout — essentially a custom client for Cursor’s ACP wire protocol. Model discovery came from parsing agent models output. On Windows I had to wrap .cmd and .ps1 shims so subprocesses would start reliably. Every Cursor CLI release was a compatibility risk, and the old README even warned that the ACP format might change.

Cursor has since shipped the official @cursor/sdk. That was the signal to rewrite. The new project is cursor-cp — same idea, cleaner foundation.

Why the SDK is the better fit

The old control plane treated the CLI as a black box: start a process, pipe JSON, hope the protocol stayed stable. The SDK inverts that. Cursor documents the API, ships TypeScript types, and owns the agent lifecycle.

In practice that means:

  • No subprocess juggling. The old AcpClient managed process groups, stderr tails, graceful kills, and Windows taskkill fallbacks. The new AgentService calls Agent.create(), agent.send(), and disposes cleanly with Symbol.asyncDispose.
  • Structured streaming. Responses arrive as typed events (assistant, request, task, and so on) through run.stream() instead of hand-parsing session/update chunks and guessing which ones were real assistant text.
  • Session resume across restarts. Each session stores a sdk_agent_id in SQLite. After a server restart, the control plane calls Agent.resume() and picks up where it left off. The old version kept one long-lived CLI process per session; restart the service and that context was gone.
  • Model listing via API. Cursor.models.list() replaces shelling out to agent models and normalizing CLI output.
  • Local execution stays local. Agent.create() accepts a local.cwd so agents still run in your workspace on your machine — the same reason I built the original.

The core loop is now a few lines instead of hundreds of protocol plumbing:

const agent = await Agent.create({
  apiKey,
  model: { id: effectiveModel },
  local: { cwd: workspacePath, settingSources: [] },
});

const run = await agent.send(prompt);
for await (const event of run.stream()) {
  // handle assistant text, questions, status
}
const result = await run.wait();

That is the integration surface I wanted from the start.

What stayed the same

If you used the first version, the workflow should feel familiar:

  • Web dashboard with real-time WebSocket streaming
  • Telegram bot with inline buttons for sessions, models, and repos
  • Pick a local folder or clone a GitHub repo with gh, then chat with the agent
  • Up to five concurrent sessions, each scoped to a workspace and model
  • Phone → change → commit → push → PR, all on your own hardware

The GitHub workflow from the earlier post still applies. The control plane is a remote control; the agent does the work where your environment already exists.

What changed

  Old (cursor-controlplane) New (cursor-cp)
Language Python TypeScript (Node 20+)
Agent integration agent acp subprocess + custom JSON-RPC client Official @cursor/sdk
Install PyInstaller binary + shell/PowerShell scripts curl \| bash~/.local/share/cursor-cp
Config .env + config.yaml + SQLite overrides ~/cursor-cp/config.yaml (merged with defaults)
Default port 8080 8747
Windows service Scheduled Task support Foreground only for now
Session persistence In-memory CLI process SDK agent IDs stored in SQLite, resumed on restart

The new repo is a clean break, not a drop-in upgrade. If you are on the Python version and it works for you, nothing forces a move. But if you want the supported API path — or session resume after restarts — cursor-cp is where active development lives.

Quick start

macOS / Linux

curl -fsSL https://raw.githubusercontent.com/sanjaysingh/cursor-cp/main/install.sh | bash
cursor-cp setup    # API key, model, port, optional Telegram, daemon
cursor-cp            # http://localhost:8747

The setup wizard walks through your Cursor API key (get one from the dashboard), default model, and optional Telegram bot. On macOS and Linux you can enable a user-level daemon so it starts on login.

For day-to-day checks: cursor-cp doctor.

From source

git clone https://github.com/sanjaysingh/cursor-cp.git
cd cursor-cp
npm install
cp config.default.yaml config.yaml   # set cursor.api_key
npm run dev

Closing thought

The first control plane proved the workflow: remote access to local Cursor agents is useful, especially when your real environment cannot move to the cloud. The rewrite does not change that thesis. It changes the plumbing — from reverse-engineered CLI protocol to a supported SDK — which makes the project easier to maintain and better positioned for whatever Cursor ships next.

Source: https://github.com/sanjaysingh/cursor-cp

Previous version (archived approach): https://github.com/sanjaysingh/cursor-controlplane

Imprint: Styled Text on Images, Exported in the Browser

April 15, 2026

I built Imprint for a simple workflow: put styled text on top of a photo or graphic and download the result as PNG or JPG—without sending the image to a server. Everything runs locally in the browser. It is deployed and available at https://imprint.meilt.com/.

Why it exists

Quick social graphics, watermarks, captions, and memes often need a few text layers with different fonts, sizes, and colors. Many tools are either heavyweight editors or upload your file to the cloud. Imprint stays lightweight and keeps processing on the client.

Features

  • Upload or drop an image onto the canvas
  • Multiple draggable text layers with font, size, weight, italic, and color
  • A floating formatting toolbar for the selected layer
  • Export the composite image to PNG or JPG

Tech stack and running it

The app is a small Vite + TypeScript project. You need Node.js 18+.

git clone https://github.com/sanjaysingh/imprint.git
cd imprint
npm install
npm run dev

Open the URL Vite prints (by default http://localhost:5173). For a production build, use npm run build and npm run preview.

Source: https://github.com/sanjaysingh/imprint.

Cursor-ControlPlane: Run Cursor CLI From Your Phone

March 25, 2026

I built Cursor-ControlPlane to control Cursor CLI sessions on my own machine from a web UI or a Telegram chat.

The main reason for building this was that I wanted to work on projects on my own machine and not on Cursor Cloud. Many projects already have the right environment locally with databases, Docker containers, SSH keys, GitHub auth, private network access, and other setup that I do not want to recreate elsewhere. At the same time I wanted to control those sessions from my phone.

Cursor-ControlPlane solves that by letting me start and manage persistent Cursor CLI sessions through web and Telegram while everything still runs on my own machine.

Features

  • Start Cursor CLI sessions in a selected repo or workspace
  • Manage sessions from a web dashboard or Telegram
  • Keep sessions persistent so follow-up prompts continue in the same context
  • See streamed updates and answer agent questions
  • Pick local folders or clone GitHub repos into the workspace

GitHub workflow

If GitHub is configured on the host machine then this becomes even more useful. I can clone a repo, ask Cursor to make a change, and then commit, push and raise a pull request from the same chat flow in web or Telegram.

This means I can go from phone to PR while the actual work still happens on my own machine.

Installation

Linux / macOS

curl -fsSL https://raw.githubusercontent.com/sanjaysingh/cursor-controlplane/main/scripts/install.sh | bash

Windows (PowerShell)

irm https://raw.githubusercontent.com/sanjaysingh/cursor-controlplane/main/scripts/install.ps1 | iex

The source is at https://github.com/sanjaysingh/cursor-controlplane

Domain Finder: A Tool to Discover Available Domain Names

March 20, 2026

I’ve built Domain Finder—a tool to check domain availability and discover available domains. It uses RDAP to verify registration status.

Features

  • Check domain – Enter any domain to see if it’s available or taken
  • Find domains – Generate random domain names and check availability
    • Choose TLD (.com, .net, .org, .io, .dev, .app, .co, .ai, .xyz, .me, .tech, .info)
    • Configure name length (4–8 characters)
    • Configure number of candidates to check (10, 20, 30, or 40)

Try it

https://domainfinder.meilt.com/

In-Browser GraphQL Playground

September 17, 2025

Hey folks!

I put together a lightweight, modern GraphQL playground that runs entirely in your browser. It uses Monaco Editor for the editing experience and GraphQL.js for execution — no servers or frameworks required.

What it is

A self-contained GraphQL playground you can open in any browser. It includes:

  • Interactive Query Editor with Monaco: syntax highlighting, autocompletion
  • Real-time Query Execution using in-memory sample data
  • Sample Queries to explore the schema quickly
  • Sample Data Viewer for users and posts
  • Deep Linking so queries are encoded in the URL for easy sharing
  • Mobile Responsive layout

Why I built it

I wanted a teaching and demo tool for GraphQL that anyone can open, tweak, and share — without a backend or build step. Deep links make it easy to bookmark examples or drop links in docs and slides.

Deep linking examples

The playground keeps your query synced to the URL so you can share exactly what you’re looking at. When a URL is opened, the query auto-loads and executes.

Schema and sample data

  • Users: 50 sample users with id, name, email
  • Posts: ~200 sample posts with id, title, content, and author relationship
  • Query support includes fetching single items, lists, pagination, and relationships.

Try it locally

You can open index.html directly in a browser, or serve the folder with any static server:

python -m http.server 8000
# or
npx serve .
# or
php -S localhost:8000

Then open http://localhost:8000.

Tech stack

  • Monaco Editor for a rich editing experience
  • GraphQL.js to parse and execute queries
  • Tailwind CSS for responsive UI
  • Vanilla JavaScript for maximum portability

If you have ideas for improving the schema, adding sample queries, or tweaking the UI/UX, feel free to send PRs or open issues.

References: GitHub – gql-playground

An Offline Code Editor

April 05, 2025

Hey everyone,

Sharing another little tool I whipped up: an Offline Code Editor. Think of it as a super-stripped-down VS Code that runs entirely in your browser and works offline.

Sometimes you just need a decent place to quickly view or edit a code snippet or a text file without firing up a full IDE. And crucially, you don’t want to rely on some online tool that might be sending your code off somewhere.

What It Is (and what it can do)

It’s more than just a basic text area:

  • Powered by Monaco: It uses the same editor engine that powers VS Code, so you get a familiar feel.
  • Syntax Highlighting: Supports a bunch of languages out of the box (JavaScript, Python, HTML, CSS, Java, C#, C++, SQL, YAML, JSON, Markdown, and more!).
  • Language Auto-Detection: Tries to figure out the language from the file extension or even the content itself.
  • Works Offline: Once the page loads, it’s good to go, no internet needed.
  • Themes: Comes with Dark (default), Light, and High Contrast themes.
  • Basic Formatting: Can auto-format code (Alt+Shift+F or on paste) for several languages.
  • Editor Goodies: Includes line numbers, code folding, bracket matching, find/replace, auto-indent, and more.

Why It’s Useful

  • Privacy First: Your files stay on your machine. It even actively blocks network requests to be extra sure.
  • Simplicity: While powerful under the hood, the interface is clean and focused.
  • Offline Access: Perfect for quick edits on the go, even without Wi-Fi.
  • Speed: Loads fast, ready when you need it.
  • Familiar Feel: If you use VS Code, you’ll feel somewhat at home.

How It Works

Built with just HTML, CSS, and JavaScript, using the Monaco Editor library. No server-side stuff involved.

  1. Go to https://static.sanjaysingh.net/editor/
  2. Open a text or code file onto the page, or Just paste, or start writing.
  3. When code is pasted, editor will try to detect the language.
  4. Make your edits using the familiar editor features.
  5. Hit Ctrl+S (or Cmd+S on Mac) to download the edited content as a new file.

Check It Out

Give it a try here: https://static.sanjaysingh.net/editor/

The source code, if you’re curious, is on GitHub.

Hash Generator: A Simple Browser Tool That Actually Respects Your Privacy

April 04, 2025

Hey folks! I just wrapped up another little weekend project - a browser-based Hash Generator. It’s super lightweight and lets you generate all sorts of cryptographic hashes right in your browser. No servers, no fuss.

Why I Built This

Look, there are probably a million hash generators out there, but most of them make me a bit uneasy.

  • Keeps everything in your browser (your data never leaves your device)
  • Has a clean interface without all the clutter
  • Supports the hash algorithms you’d actually use
  • Shows results as you type

What It Does

Nothing fancy, just the essentials:

  1. Multiple hash types - MD5, SHA-1, SHA-256, and more
  2. Real-time hashing - See results instantly as you type
  3. One-click copy - Grab that hash with a single click
  4. Works on phones - Because who’s not on their phone these days?
  5. Completely private - Your data stays with you

How to Use It

Super simple:

  1. Head over to https://static.sanjaysingh.net/hash/
  2. Pick your hash algorithm
  3. Type or paste your text
  4. Boom - there’s your hash
  5. Hit copy if you need it on your clipboard

Privacy (Yes, Actually)

  • Nothing gets stored - Everything happens in your browser’s memory
  • No sneaky network calls - The page loads and that’s it
  • Code is open - Check GitHub if you don’t believe me

Give It a Try

Feel free to check it out: https://static.sanjaysingh.net/hash/

Code’s on GitHub if you want to peek under the hood.

Other Stuff I’ve Made

If you like this, I’ve built a few other browser tools:

Browser-Based Bitcoin Test Wallet

April 01, 2025

Hey everyone! I wanted to share a fun little project I’ve been tinkering with lately – a completely browser-based Bitcoin wallet that doesn’t need any servers to run. It’s perfect for testing and learning about Bitcoin.

Why I Built This

  1. Runs right in your browser – no downloads needed
  2. Keeps your test keys private and never sends them anywhere
  3. Lets you connect to any Bitcoin API you trust
  4. Looks decent enough that it’s not painful to use
  5. Is totally open for anyone to inspect or improve

So that’s exactly what I did! This is definitely NOT meant for your life savings (seriously, please don’t use it for that), but it’s perfect for playing around with small amounts or just learning how Bitcoin transactions work.

What Can This Little Wallet Do?

Your Keys Stay With You

The coolest part about this wallet:

  • Nothing gets saved to a server – your keys never leave your browser
  • You choose your Bitcoin API – don’t trust mine? Use your own!
  • No tracking or analytics – I don’t want to know what you’re testing

All the Basic Stuff You Need

For a test wallet, it does all the essential things:

  1. Create or Import Test Wallets
    • Hit a button, get a fresh wallet
    • Already have a WIF key you want to test? Just paste it in
    • Peek at your private key when needed, or keep it hidden
  2. Send Some Test Bitcoin
    • Send to any address (great for testing your other wallets)
    • Play with different fee settings to see how they work
    • See your test transaction status and follow it on a block explorer
  3. Receive Bitcoin
    • Show someone your wallet address to receive funds
    • Scan the QR code with another wallet to test sending
    • Easy copy button for sharing your address
  4. Check Your Balance
    • See your balance update in real-time
    • Hit refresh when you’re impatient (we’ve all been there!)

Switch Networks Easily

One thing I really wanted was flexibility:

  • Flip between testnet (for free test coins) and mainnet
  • Use Blockstream’s API by default, or plug in your own
  • Try different APIs to see how they perform

Keeping It Safe-ish

Even though it’s for testing, I added some basic safety features:

  • Private keys are hidden by default (no accidental shoulder-surfing)
  • Everything stays in your current browser session
  • No server to get hacked (because there isn’t one!)

Take It For a Spin!

Want to try it out? Head over to: https://static.sanjaysingh.net/btcwallet/

If you’re curious about how I built it or want to improve it, the code is on GitHub: https://github.com/sanjaysingh/staticsites/tree/master/btcwallet

Final Thoughts

It’s meant for learning and experimenting, not safeguarding your crypto fortune.

If you try it out, let me know what you think! Found a bug? Have a feature request? The GitHub repo is open for issues and pull requests - or just drop me a comment below.

Happy testing! 🚀

Simple QR Code Generator: A Lightweight, Browser-Based Tool

March 07, 2025

Today, I’m sharing a simple yet effective tool I’ve developed: a browser-based QR Code Generator. In an era where QR codes have become ubiquitous, having a quick, reliable, and privacy-focused way to generate them is essential.

Why Another QR Code Generator?

While there are numerous QR code generators available online, I wanted to create one that is:

  • Completely client-side with no server dependencies
  • Privacy-focused (no data collection or tracking)
  • Lightning fast and responsive
  • Simple and straightforward to use
  • Free from ads and distractions

Features

The tool offers essential QR code generation capabilities:

  1. Text/URL Input: Generate QR codes for any text or URL
  2. Customizable Size: Adjust the QR code size to your needs
  3. Instant Generation: See QR codes generated in real-time
  4. Download Option: Save generated QR codes as PNG images
  5. Mobile Friendly: Works perfectly on both desktop and mobile devices

How to Use

The interface is intentionally minimalist:

  1. Visit https://static.sanjaysingh.net/qrcode/
  2. Enter your text or URL in the input field
  3. Adjust the size if needed (default size works for most cases)
  4. Click “Generate QR Code”
  5. Use “Download QR Code” to save the image

Technical Implementation

The tool is built with simplicity and performance in mind:

// Core technologies used:
- Pure HTML5 and JavaScript
- QRCode.js library for QR generation
- CSS for minimal, clean styling

Key technical features:

  • No external dependencies beyond the QR code library
  • Completely static deployment
  • No backend required
  • Cross-browser compatible
  • Mobile-responsive design

Privacy and Security

Privacy was a key consideration in the design:

  • No Data Storage: All QR code generation happens in your browser
  • No Analytics: No tracking or usage monitoring
  • No External Calls: Besides loading the page, no network requests are made
  • Open Source: Code is available on GitHub for review

Use Cases

This tool is perfect for:

  1. Business Users:
    • Creating QR codes for business cards
    • Adding QR codes to marketing materials
    • Generating quick links for presentations
  2. Personal Use:
    • Sharing Wi-Fi credentials
    • Creating quick links to social profiles
    • Generating contact information QR codes
  3. Developers:
    • Quick testing of QR code implementations
    • Generating QR codes for documentation
    • Creating QR codes for app testing

Benefits

  1. Speed and Efficiency:
    • Instant QR code generation
    • No page reloads needed
    • Quick download option
  2. Accessibility:
    • Works on any device with a browser
    • No installation required
    • Simple, intuitive interface
  3. Privacy:
    • No data collection
    • No account needed
    • No cookies or tracking

Future Enhancements

While keeping the tool simple, I’m considering adding:

  • Color customization options
  • Error correction level selection
  • SVG export format
  • QR code scanning capability
  • Batch generation feature

Try It Out

You can access the QR Code Generator at: https://static.sanjaysingh.net/qrcode/

The source code is available on GitHub

Contributing

As with all my tools, this QR code generator is open source. Feel free to:

  • Report issues
  • Suggest improvements
  • Submit pull requests
  • Share your use cases

Browser-Based Ethereum Wallet for Testing

March 05, 2025

I’ve developed: a browser-based Ethereum wallet specifically designed for testing purposes. While there are many Ethereum wallets available, I created this one with a specific focus on ease of access by making it accessible directly from the browser.

Why Another Ethereum Wallet?

During blockchain development and testing, I often found myself needing a lightweight wallet that:

  • Works directly in the browser without installation
  • Supports multiple networks (including testnets)
  • Doesn’t store any sensitive data
  • No server side and connects directly with RPC that you specify
  • Is completely transparent in its operations

Security-First Design

The wallet is built with several security principles in mind:

  1. No Server-Side Storage: All wallet operations happen entirely in your browser
  2. No External Dependencies: The wallet runs as a static site with minimal dependencies
  3. Transparent Code: The entire source code is available on GitHub
  4. Ephemeral Storage: Keys are never saved between sessions

Key Features

The wallet includes essential features needed for testing:

  • Custom RPC Endpoint Support: Connect to any Ethereum-compatible network
  • Seed Phrase/Private Key Import: Easily import test accounts
  • New Wallet Generation: Generate fresh wallets for testing
  • Native Token Support: Send and receive network native tokens
  • ERC20 Token Support: Interact with token contracts
  • Gas Estimation: Built-in gas cost estimation with safety buffer
  • Balance Checking: Real-time balance updates

How to Use

  1. Visit https://static.sanjaysingh.net/ethwallet/
  2. Enter your RPC endpoint
  3. Either:
    • Generate a new wallet for testing
    • Import an existing wallet using seed phrase or private key
  4. Start interacting with the blockchain

Important Security Notes

While the wallet is designed with security in mind, please note:

⚠️ This is a TESTING tool only. Do not use it with real funds.

  • Always use test accounts and test networks
  • Never enter production private keys or seed phrases
  • The wallet is intended for development and testing purposes only

Use Cases

This wallet is particularly useful for:

  1. Developers:
    • Testing smart contracts
    • Debugging transactions
    • Quick network interactions
  2. QA Teams:
    • Validating blockchain applications
    • Testing different network configurations
    • Verifying transaction flows
  3. Learning:
    • Understanding wallet operations
    • Exploring blockchain interactions
    • Studying Web3 development

Try It Out

You can access the wallet at https://static.sanjaysingh.net/ethwallet/

The source code is available on GitHub

Feedback Welcome

As this is a tool for the developer community, I welcome:

  • Bug reports
  • Feature suggestions
  • Security improvement ideas
  • General feedback

Feel free to open issues or submit pull requests on GitHub.

Remember: This is a testing tool. Always use appropriate security measures when dealing with real cryptocurrency transactions.