---
slug: "voop"
source_type: "readme"
source_url: "https://cdn.jsdelivr.net/gh/yemyat/voop@main/README.md"
repo: "https://github.com/yemyat/voop"
source_file: "README.md"
branch: "main"
---
# voop

Publish files to the web instantly with a single command.

![Demo](https://github.com/yemyat/voop/raw/HEAD/demo.gif)

## Why?

I use coding agents to create interactive HTML pages instead of static markdown docs. When you can just say "make me a visualization of this data" and get a working HTML page, you need a fast way to share it. This tool lets me go from local file to public URL in one command.

**Markdown files get beautifully rendered too.** Tired of sharing `.md` files that people have to open in a text editor? voop automatically converts markdown to styled HTML pages with:
- Syntax highlighting for code blocks
- Mermaid diagram rendering
- Table of contents sidebar
- Dark mode support
- Clean typography

Share docs with your team and they'll see properly formatted content, not raw markdown.

| Raw Markdown | Rendered HTML |
|:---:|:---:|
| [![Raw](https://share.yemyat.com/voop-raw-version-d4fda207.png)](https://share.yemyat.com/example-9afa27ba.md) | [![Rendered](https://share.yemyat.com/voop-html-version-09b5b6c8.png)](https://share.yemyat.com/example-20a6d65b.html) |
| `voop doc.md --raw` | `voop doc.md` |

## Alternatives

| Tool | Pros | Cons |
|------|------|------|
| [Surge.sh](https://surge.sh) | Free, easy, custom domains | Don't own infra, account required |
| [Vercel CLI](https://vercel.com) | Great DX, preview URLs | Opinionated, expects frameworks |
| [Netlify CLI](https://netlify.com) | Feature-rich | Overkill for single files |
| [Cloudflare Pages](https://pages.cloudflare.com) | Fast CDN | Requires git/project setup |
| GitHub Pages | Free | Requires repo + git push |

**Why voop?**
- You own the infrastructure (your R2 bucket, your rules)
- No account signup/login each time
- No git workflow or project structure required
- Files stay up forever (no expiring preview URLs)
- Single file → single URL, nothing else

```bash
npx voop index.html
# https://your-bucket.r2.dev/index-a1b2c3d4.html
# (copied)
```

Uses Cloudflare R2 for storage with free egress and global CDN.

## Install

Run directly without installing:

```bash
npx voop <file>
# or
bunx voop <file>
```

Or install globally:

```bash
npm install -g voop
# or
bun install -g voop
```

## AI Agent Skill

Install the voop skill so AI agents can use voop automatically when you ask to upload files:

```bash
npx add-skill yemyat/voop
```

## Setup

On first run, you'll be guided through an interactive setup wizard:

```bash
npx voop myfile.html
# No configuration found. Let's set things up first.
# → Prompts for credentials...
# → Tests connection...
# → Proceeds to upload
```

Before running, you'll need:

1. **Create R2 Bucket**: [Cloudflare Dashboard](https://dash.cloudflare.com) → R2 → Create bucket → Enable public access
2. **Create API Token**: R2 → Manage R2 API Tokens → Create with Object Read & Write permissions

The wizard will ask for:
- Cloudflare Account ID
- R2 Access Key ID
- R2 Secret Access Key
- Bucket name
- Public URL (e.g., `https://pub-xxx.r2.dev`)

Config is stored at `~/.config/voop/config.json`.

## Usage

```bash
voop mypage.html      # Upload a file
voop docs.md          # Markdown → styled HTML with ToC
voop docs.md --raw    # Upload raw markdown (no conversion)
voop --setup          # Reconfigure credentials
voop --test           # Test R2 connection
voop --help           # Show help
```

Each file gets a unique URL with a random suffix to avoid conflicts.

## License

MIT
