working-spaces / app.py
Ashsinha1's picture
Browse Spaces that are not broken - built from the 1.46M census
9972b5d verified
Raw
History Blame Contribute Delete
5.38 kB
"""Working Spaces — browse Hugging Face Spaces that are not broken.
A census of the complete public catalogue found that 38.57% of non-static
Spaces sit in a permanent error state, and the Hub offers no way to filter
them out when browsing. This does that.
Index built from that census; every Space listed here was NOT in
BUILD_ERROR / RUNTIME_ERROR / CONFIG_ERROR / NO_APP_FILE at snapshot time.
"""
import gzip
import json
from pathlib import Path
import gradio as gr
INDEX = Path(__file__).with_name("spaces.jsonl.gz")
CENSUS_DATE = "2026-08-28"
PAGE = 50
# Stage meanings, stated plainly so the listing is not mistaken for a
# liveness guarantee. SLEEPING is included because it is idle, not failed --
# though our own probing could not confirm sleeping Spaces reliably wake, so
# it is labelled honestly rather than promised as working.
STAGE_NOTE = {
"RUNNING": "running now",
"SLEEPING": "idle — wakes on request (usually)",
"PAUSED": "paused by author or quota",
"BUILDING": "building",
"APP_STARTING": "starting",
"RUNNING_BUILDING": "running, rebuilding",
"RUNNING_APP_STARTING": "running, restarting",
"DELETING": "being deleted",
}
def load():
rows = []
with gzip.open(INDEX, "rt", encoding="utf-8") as fh:
for line in fh:
rows.append(json.loads(line))
return rows
ROWS = load()
SDKS = sorted({r["sdk"] for r in ROWS if r["sdk"]})
STAGES = sorted({r["stage"] for r in ROWS if r["stage"]})
def search(query, sdk, stage, running_only, min_likes, page):
q = (query or "").strip().lower()
out = ROWS
if running_only:
out = [r for r in out if r["stage"].startswith("RUNNING")]
elif stage and stage != "any":
out = [r for r in out if r["stage"] == stage]
if sdk and sdk != "any":
out = [r for r in out if r["sdk"] == sdk]
if min_likes:
out = [r for r in out if r["likes"] >= min_likes]
if q:
out = [r for r in out if q in r["id"].lower()]
total = len(out)
page = max(1, int(page or 1))
start = (page - 1) * PAGE
rows = out[start:start + PAGE]
table = [[
f"[{r['id']}](https://huggingface.co/spaces/{r['id']})",
r["sdk"] or "—",
STAGE_NOTE.get(r["stage"], r["stage"]),
r["likes"],
r["modified"] or "—",
] for r in rows]
pages = max(1, -(-total // PAGE))
note = (f"**{total:,}** matches — page {min(page, pages)} of {pages:,}"
if total else "No matches. Try clearing a filter.")
return table, note
with gr.Blocks(title="Working Spaces") as demo:
gr.Markdown(f"""
# Working Spaces
Browse Hugging Face Spaces **that are not broken**.
A census of the complete public catalogue on {CENSUS_DATE} found that
**38.57% of non-static Spaces are in a permanent error state** — 443,683 of
1,150,413. Only 2.85% report `RUNNING`. The Hub exposes runtime stage through
its API but does not let you filter on it while browsing, so this does.
Every Space below was **not** in `BUILD_ERROR`, `RUNTIME_ERROR`,
`CONFIG_ERROR`, or `NO_APP_FILE` at snapshot time. Static Spaces are excluded —
they have no runtime and cannot fail, so including them would flatter the
numbers.
*Index: {len(ROWS):,} Spaces. This is a snapshot, not live state — a Space
listed here may have broken since.*
""")
with gr.Row():
query = gr.Textbox(label="Search name or author", scale=3,
placeholder="whisper, stable-diffusion, your-username…")
sdk = gr.Dropdown(["any"] + SDKS, value="any", label="SDK", scale=1)
stage = gr.Dropdown(["any"] + STAGES, value="any", label="Stage", scale=1)
with gr.Row():
running_only = gr.Checkbox(label="Only RUNNING right now (2.85% of the catalogue)")
min_likes = gr.Slider(0, 100, value=0, step=1, label="Minimum likes")
page = gr.Number(value=1, label="Page", precision=0, minimum=1)
go = gr.Button("Search", variant="primary")
note = gr.Markdown()
table = gr.Dataframe(
headers=["Space", "SDK", "Stage", "Likes", "Last modified"],
datatype=["markdown", "str", "str", "number", "str"],
interactive=False, wrap=True,
)
gr.Markdown("""
---
**Method and caveats.** Built from a complete enumeration of the public Spaces
catalogue (1,458,692 Spaces, 778,898 authors), using the `runtime.stage` field
Hugging Face publishes through its own API — nothing here is scraped or
inferred. Of 1,999 Spaces reporting `RUNNING` that we probed over HTTP, 91.5%
returned 200, so `RUNNING` means what it says.
`SLEEPING` Spaces are included and labelled as idle. Our attempt to verify
that they reliably wake was **inconclusive** — on a single request about half
returned a 2xx and half a 503, and two runs over the same sample disagreed. So
treat "wakes on request" as usually-true rather than guaranteed.
Data: [Ashsinha1/hf-spaces-census](https://huggingface.co/datasets/Ashsinha1/hf-spaces-census) ·
Code: [dataset-integrity-audit](https://github.com/ashishsinha1602/dataset-integrity-audit)
""")
inputs = [query, sdk, stage, running_only, min_likes, page]
go.click(search, inputs=inputs, outputs=[table, note])
query.submit(search, inputs=inputs, outputs=[table, note])
demo.load(search, inputs=inputs, outputs=[table, note])
if __name__ == "__main__":
demo.launch()