BrowserClick-V0.1 / README.md
openmodelai's picture
Upload 7 files
32cc346 verified
|
Raw History Blame Contribute Delete
6.32 kB
---
license: mit
pretty_name: OpenSite
tags:
- html
- javascript
- single-file
- productivity
- keyboard
- no-dependencies
---
<div align="center">
<img src="assets/logo.png" alt="OpenSite logo" width="128" height="128"/>
<h1>OpenSite</h1>
<p><strong>Type a command. The site opens.</strong></p>
<p>A single HTML file that turns your browser into a command-line launcher for the sites you actually use.</p>
</div>
![OpenSite β€” type a command, the site opens](assets/banner.png)
## 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:
```text
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:
```js
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](assets/how-it-works.png)
**Keyboard-first by construction.** Everything is reachable without the mouse.
![Keyboard focused on the Enter key](assets/keyboard.png)
**Local by default.** One file on disk β€” no cloud, no cookies, no telemetry.
![Single local file, no cloud or tracking](assets/local-first.png)
## Files
```text
.
β”œβ”€β”€ 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.
<details>
<summary><strong>Publishing this as a Hugging Face Static Space instead of a model repo</strong></summary>
Nothing about the file changes β€” add the Space keys to the frontmatter above and keep `index.html` at the
repository root:
```yaml
---
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.
</details>
## License
Released under the [MIT License](LICENSE). Use it, fork it, paste it into your own dotfiles, ship a
modified version β€” attribution is nice, never required.