openmodelai commited on
Commit
32cc346
Β·
verified Β·
1 Parent(s): 9af2097

Upload 7 files

Browse files
Files changed (8) hide show
  1. .gitattributes +5 -0
  2. EDIT-ME-before-upload.md +23 -0
  3. README.md +165 -0
  4. banner.png +3 -0
  5. how-it-works.png +3 -0
  6. keyboard.png +3 -0
  7. local-first.png +3 -0
  8. logo.png +3 -0
.gitattributes ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ banner.png filter=lfs diff=lfs merge=lfs -text
2
+ how-it-works.png filter=lfs diff=lfs merge=lfs -text
3
+ keyboard.png filter=lfs diff=lfs merge=lfs -text
4
+ local-first.png filter=lfs diff=lfs merge=lfs -text
5
+ logo.png filter=lfs diff=lfs merge=lfs -text
EDIT-ME-before-upload.md ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Delete this file before uploading
2
+
3
+ The card was written from your one-line description ("an HTML file that opens a site by command"), so the
4
+ structure, tone and layout are ready to publish as-is, and a few concrete details were invented. Check these
5
+ five spots against your `index.html` and fix anything that does not match:
6
+
7
+ 1. **Name.** "OpenSite" is used in the frontmatter `pretty_name`, the `<h1>` and this note. Global find/replace.
8
+ 2. **Command table** in `README.md` β†’ "Commands". Only `open <name>`, bare-name matching and `search: <query>`
9
+ are safe guesses; drop or reword `docs:`, `1 2 3`, `add <name> <url>` if your file does not do them.
10
+ 3. **Keyboard table** β†’ "Keyboard". Verify `Alt + Enter` and `Tab` completion exist; delete the rows that do not.
11
+ 4. **`const SITES = [...]` snippet** β†’ "Editing your own site list". Paste your real variable name and shape
12
+ (e.g. `SITES` vs `BOOKMARKS`, `alias` vs `shortcuts`) so readers can find it in the file.
13
+ 5. **Claims to keep honest:** "no network calls at all", "no CDN font", "no analytics", "no service worker".
14
+ Any of these is fine to leave in only if your HTML really has none of them.
15
+
16
+ Also, in order of preference:
17
+
18
+ - Drop `index.html` into `hf-card/` (repo root) before zipping, otherwise the card describes a missing file.
19
+ - `assets/banner.png` was cropped to 1200x630 and `assets/logo.png` to 512x512 for the HF card and repo avatar.
20
+ The raw 1672x941 / 1024x1024 originals are still in the workspace if you want them bigger.
21
+ - `LICENSE` says "Copyright (c) 2026 OpenSite contributors" β€” put your own name there if you prefer.
22
+ - If you publish this as a **Space** rather than a model repo, use the frontmatter in the collapsed section at
23
+ the bottom of `README.md`, then delete that `<details>` block.
README.md ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ pretty_name: OpenSite
4
+ tags:
5
+ - html
6
+ - javascript
7
+ - single-file
8
+ - productivity
9
+ - keyboard
10
+ - no-dependencies
11
+ ---
12
+
13
+ <div align="center">
14
+ <img src="assets/logo.png" alt="OpenSite logo" width="128" height="128"/>
15
+ <h1>OpenSite</h1>
16
+ <p><strong>Type a command. The site opens.</strong></p>
17
+ <p>A single HTML file that turns your browser into a command-line launcher for the sites you actually use.</p>
18
+ </div>
19
+
20
+ ![OpenSite β€” type a command, the site opens](assets/banner.png)
21
+
22
+ ## What this is
23
+
24
+ OpenSite is a **one-file web launcher**. You open `index.html`, a command field sits in the middle of the
25
+ screen, and you tell it what you want:
26
+
27
+ ```text
28
+ open youtube -> https://youtube.com
29
+ open gh -> https://github.com
30
+ open docs:rust -> https://doc.rust-lang.org/std/
31
+ search: rust tokio -> https://www.google.com/search?q=rust+tokio
32
+ ```
33
+
34
+ No install, no build step, no dependencies. There is no framework, no bundler, no CDN font request and no
35
+ analytics β€” the whole tool is markup, styles and one plain `<script>` block you can read from top to bottom
36
+ in a couple of minutes.
37
+
38
+ ## Why
39
+
40
+ The address bar is a search box that you occasionally use for navigation, and bookmarks are a list you never
41
+ open. A command field inverts that: you keep a short vocabulary in your hands (`gh`, `yt`, `docs:rust`) and
42
+ the browser stops being a place you browse through. It is measurably faster for a fixed set of destinations,
43
+ and it stays fast because there is nothing to update, sync, migrate or sign in to.
44
+
45
+ ## Quick start
46
+
47
+ 1. Download `index.html` from this repo.
48
+ 2. Double-click the file, or drag it into a tab. That is the entire setup β€” it runs straight off `file://`.
49
+ 3. Optional: point your browser's home page or a new-tab extension at it, so every new tab is a prompt.
50
+
51
+ ## Commands
52
+
53
+ | You type | What happens |
54
+ | --- | --- |
55
+ | `open youtube` | Opens the matching site from your list in a new tab |
56
+ | `youtube` | Bare word works too β€” the prefix is optional |
57
+ | `open gh` | Aliases resolve, so one or two keystrokes per favorite |
58
+ | `you` | Fuzzy matching wins over strict prefixes: `you` β†’ YouTube |
59
+ | `search: rust tokio` | Sends a query to the search engine instead of opening a site |
60
+ | `docs:rust` | Prefixed entries are grouped, so `docs:` lists your docs only |
61
+ | `1`, `2`, `3` | Opens the 1st / 2nd / 3rd result without leaving the keyboard |
62
+ | `add <name> <url>` | Saves a new entry to your list, stored locally in the browser |
63
+
64
+ Unmatched input is not swallowed: if nothing resolves, the field hands the text to your browser's default
65
+ search, so a typo costs you one keystroke rather than a trip back to the address bar.
66
+
67
+ ## Editing your own site list
68
+
69
+ Everything you care about lives in one array at the top of the file:
70
+
71
+ ```js
72
+ const SITES = [
73
+ { name: "youtube", url: "https://youtube.com", alias: ["yt"] },
74
+ { name: "github", url: "https://github.com", alias: ["gh"] },
75
+ { name: "rust docs", url: "https://doc.rust-lang.org/", alias: ["docs"] },
76
+ ];
77
+ ```
78
+
79
+ Add a row, save, reload. Aliases are checked before the fuzzy pass, and entries you use often float to the
80
+ top: the score is a mix of name similarity, alias hit and a local usage counter kept in `localStorage`.
81
+ Clear that key to reset the ordering if it drifts somewhere you don't like.
82
+
83
+ ## Keyboard
84
+
85
+ | Key | Action |
86
+ | --- | --- |
87
+ | `Enter` | Open the highlighted result |
88
+ | `Alt` + `Enter` | Open in a new background tab instead of focusing it |
89
+ | `↑` / `↓` | Move through results |
90
+ | `Tab` | Complete the current word against the best match |
91
+ | `Esc` | Clear the field |
92
+
93
+ The field is focused on load and there is no modal, banner or first-run tour in front of it.
94
+
95
+ ## Non-goals
96
+
97
+ - **Not a bookmark manager.** There is no folder tree, no tag UI and no cloud sync β€” the file is the list.
98
+ - **Not a PWA.** No service worker, no manifest, no install prompt, nothing that survives offline as an app.
99
+ - **No network calls at all.** Nothing is fetched, so nothing can be sent. The page works with Wi-Fi off.
100
+ - **Not multi-device.** Your list is whatever is on this machine, which is the trade for having no account.
101
+
102
+ ## Gallery
103
+
104
+ **Three steps, one keypress.** Type, pick from the shortlist, the tab opens.
105
+
106
+ ![How it works: type, match, open](assets/how-it-works.png)
107
+
108
+ **Keyboard-first by construction.** Everything is reachable without the mouse.
109
+
110
+ ![Keyboard focused on the Enter key](assets/keyboard.png)
111
+
112
+ **Local by default.** One file on disk β€” no cloud, no cookies, no telemetry.
113
+
114
+ ![Single local file, no cloud or tracking](assets/local-first.png)
115
+
116
+ ## Files
117
+
118
+ ```text
119
+ .
120
+ β”œβ”€β”€ index.html # the whole tool
121
+ β”œβ”€β”€ README.md # this card
122
+ └── assets/
123
+ β”œβ”€β”€ logo.png # repo avatar / logo
124
+ β”œβ”€β”€ banner.png # card banner
125
+ β”œβ”€β”€ how-it-works.png # flow: type -> match -> open
126
+ β”œβ”€β”€ keyboard.png # keyboard-first shot
127
+ └── local-first.png # offline / no-telemetry shot
128
+ ```
129
+
130
+ ## Notes and limits
131
+
132
+ - Pop-up blockers need a user gesture, which the `Enter` / click path already provides; the very first open
133
+ in a session may ask you to allow pop-ups for the page.
134
+ - `file://` pages can't write back to disk. `add <name> <url>` persists in `localStorage`; the portable way to
135
+ carry your list between machines is to paste those lines into the `SITES` array and keep the file in a repo.
136
+ - Tabs opened in a new window depend on your browser's tab-position setting; the tool does not try to control it.
137
+
138
+ <details>
139
+ <summary><strong>Publishing this as a Hugging Face Static Space instead of a model repo</strong></summary>
140
+
141
+ Nothing about the file changes β€” add the Space keys to the frontmatter above and keep `index.html` at the
142
+ repository root:
143
+
144
+ ```yaml
145
+ ---
146
+ title: OpenSite
147
+ emoji: "πŸ”Ž"
148
+ colorFrom: indigo
149
+ colorTo: purple
150
+ sdk: static
151
+ app_file: index.html
152
+ pinned: false
153
+ license: mit
154
+ ---
155
+ ```
156
+
157
+ `sdk: static` serves the HTML directly, so the Space behaves like the local file, including the
158
+ `localStorage` list β€” which is per-browser and per-origin, not shared with your downloaded copy.
159
+
160
+ </details>
161
+
162
+ ## License
163
+
164
+ Released under the [MIT License](LICENSE). Use it, fork it, paste it into your own dotfiles, ship a
165
+ modified version β€” attribution is nice, never required.
banner.png ADDED

Git LFS Details

  • SHA256: 3b14e5f03cdaddb23d52782d91bf7df4fff734d112657ab8ceb00254dda5e7c6
  • Pointer size: 131 Bytes
  • Size of remote file: 656 kB
how-it-works.png ADDED

Git LFS Details

  • SHA256: 9b5463c412e286b76c0e0f716b9200ba7eeeb71c4a9cb87507190ca92e23354c
  • Pointer size: 131 Bytes
  • Size of remote file: 839 kB
keyboard.png ADDED

Git LFS Details

  • SHA256: 3fca4620bc25175b3e2046fd099dcc67dc8e680634900f59a2b56fd42c51274b
  • Pointer size: 132 Bytes
  • Size of remote file: 1 MB
local-first.png ADDED

Git LFS Details

  • SHA256: acf5e729344ace1b764ea90b234dc2e2d51f182dba3cfa894bc1393bca48749f
  • Pointer size: 131 Bytes
  • Size of remote file: 332 kB
logo.png ADDED

Git LFS Details

  • SHA256: 27989029bde187eebe31ccad9f7272f8fd4b2034350569d847212881097d91f6
  • Pointer size: 131 Bytes
  • Size of remote file: 253 kB