OpenSite
Type a command. The site opens.
A single HTML file that turns your browser into a command-line launcher for the sites you actually use.
What this is
OpenSite is a one-file web launcher. You open index.html, a command field sits in the middle of the
screen, and you tell it what you want:
open youtube -> https://youtube.com
open gh -> https://github.com
open docs:rust -> https://doc.rust-lang.org/std/
search: rust tokio -> https://www.google.com/search?q=rust+tokio
No install, no build step, no dependencies. There is no framework, no bundler, no CDN font request and no
analytics β the whole tool is markup, styles and one plain <script> block you can read from top to bottom
in a couple of minutes.
Why
The address bar is a search box that you occasionally use for navigation, and bookmarks are a list you never
open. A command field inverts that: you keep a short vocabulary in your hands (gh, yt, docs:rust) and
the browser stops being a place you browse through. It is measurably faster for a fixed set of destinations,
and it stays fast because there is nothing to update, sync, migrate or sign in to.
Quick start
- Download
index.htmlfrom this repo. - Double-click the file, or drag it into a tab. That is the entire setup β it runs straight off
file://. - Optional: point your browser's home page or a new-tab extension at it, so every new tab is a prompt.
Commands
| You type | What happens |
|---|---|
open youtube |
Opens the matching site from your list in a new tab |
youtube |
Bare word works too β the prefix is optional |
open gh |
Aliases resolve, so one or two keystrokes per favorite |
you |
Fuzzy matching wins over strict prefixes: you β YouTube |
search: rust tokio |
Sends a query to the search engine instead of opening a site |
docs:rust |
Prefixed entries are grouped, so docs: lists your docs only |
1, 2, 3 |
Opens the 1st / 2nd / 3rd result without leaving the keyboard |
add <name> <url> |
Saves a new entry to your list, stored locally in the browser |
Unmatched input is not swallowed: if nothing resolves, the field hands the text to your browser's default search, so a typo costs you one keystroke rather than a trip back to the address bar.
Editing your own site list
Everything you care about lives in one array at the top of the file:
const SITES = [
{ name: "youtube", url: "https://youtube.com", alias: ["yt"] },
{ name: "github", url: "https://github.com", alias: ["gh"] },
{ name: "rust docs", url: "https://doc.rust-lang.org/", alias: ["docs"] },
];
Add a row, save, reload. Aliases are checked before the fuzzy pass, and entries you use often float to the
top: the score is a mix of name similarity, alias hit and a local usage counter kept in localStorage.
Clear that key to reset the ordering if it drifts somewhere you don't like.
Keyboard
| Key | Action |
|---|---|
Enter |
Open the highlighted result |
Alt + Enter |
Open in a new background tab instead of focusing it |
β / β |
Move through results |
Tab |
Complete the current word against the best match |
Esc |
Clear the field |
The field is focused on load and there is no modal, banner or first-run tour in front of it.
Non-goals
- Not a bookmark manager. There is no folder tree, no tag UI and no cloud sync β the file is the list.
- Not a PWA. No service worker, no manifest, no install prompt, nothing that survives offline as an app.
- No network calls at all. Nothing is fetched, so nothing can be sent. The page works with Wi-Fi off.
- Not multi-device. Your list is whatever is on this machine, which is the trade for having no account.
Gallery
Three steps, one keypress. Type, pick from the shortlist, the tab opens.
Keyboard-first by construction. Everything is reachable without the mouse.
Local by default. One file on disk β no cloud, no cookies, no telemetry.
Files
.
βββ index.html # the whole tool
βββ README.md # this card
βββ assets/
βββ logo.png # repo avatar / logo
βββ banner.png # card banner
βββ how-it-works.png # flow: type -> match -> open
βββ keyboard.png # keyboard-first shot
βββ local-first.png # offline / no-telemetry shot
Notes and limits
- Pop-up blockers need a user gesture, which the
Enter/ click path already provides; the very first open in a session may ask you to allow pop-ups for the page. file://pages can't write back to disk.add <name> <url>persists inlocalStorage; the portable way to carry your list between machines is to paste those lines into theSITESarray and keep the file in a repo.- Tabs opened in a new window depend on your browser's tab-position setting; the tool does not try to control it.
Publishing this as a Hugging Face Static Space instead of a model repo
Nothing about the file changes β add the Space keys to the frontmatter above and keep index.html at the
repository root:
---
title: OpenSite
emoji: "π"
colorFrom: indigo
colorTo: purple
sdk: static
app_file: index.html
pinned: false
license: mit
---
sdk: static serves the HTML directly, so the Space behaves like the local file, including the
localStorage list β which is per-browser and per-origin, not shared with your downloaded copy.
License
Released under the MIT License. Use it, fork it, paste it into your own dotfiles, ship a modified version β attribution is nice, never required.



