OpenSite logo

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.

OpenSite β€” type a command, the site opens

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

  1. Download index.html from this repo.
  2. Double-click the file, or drag it into a tab. That is the entire setup β€” it runs straight off file://.
  3. 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.

How it works: type, match, open

Keyboard-first by construction. Everything is reachable without the mouse.

Keyboard focused on the Enter key

Local by default. One file on disk β€” no cloud, no cookies, no telemetry.

Single local file, no cloud or tracking

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 in localStorage; the portable way to carry your list between machines is to paste those lines into the SITES array 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.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support