the-data-nerd commited on
Commit
68991d2
·
1 Parent(s): 7d08a91

Ship VC Deal Flow Signal Gradio demo

Browse files

- Live signals tab: top startups by 14-day commit-velocity acceleration
- Glossary search: 84-term controlled vocabulary
- Citation generator: BibTeX, RIS, APA, Wikipedia for paper + dataset

Backed by signals.gitdealflow.com/api/v1/* (public, no-auth, CC BY 4.0).

Files changed (3) hide show
  1. README.md +51 -7
  2. app.py +273 -0
  3. requirements.txt +2 -0
README.md CHANGED
@@ -1,13 +1,57 @@
1
  ---
2
- title: Vc Deal Flow Signal
3
- emoji: 🐠
4
- colorFrom: green
5
  colorTo: indigo
6
  sdk: gradio
7
- sdk_version: 6.15.1
8
- python_version: '3.13'
9
  app_file: app.py
10
- pinned: false
 
 
 
 
 
 
 
 
 
 
 
 
11
  ---
12
 
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: VC Deal Flow Signal — Live Engineering Acceleration
3
+ emoji: 📊
4
+ colorFrom: blue
5
  colorTo: indigo
6
  sdk: gradio
7
+ sdk_version: 5.42.0
 
8
  app_file: app.py
9
+ pinned: true
10
+ license: cc-by-4.0
11
+ short_description: Live VC startup signals from GitHub acceleration
12
+ datasets:
13
+ - the-data-nerd/vc-deal-flow-signal-glossary
14
+ tags:
15
+ - venture-capital
16
+ - github
17
+ - alternative-data
18
+ - deal-sourcing
19
+ - signal-detection
20
+ - fintech
21
+ - finance
22
  ---
23
 
24
+ # VC Deal Flow Signal Live Engineering Acceleration
25
+
26
+ Live interactive demo of the methodology published in
27
+ [SSRN 6606558](https://ssrn.com/abstract=6606558):
28
+ **A Longitudinal Panel of GitHub Engineering Velocity for Venture-Backed Startups**.
29
+
30
+ ## What this Space does
31
+
32
+ Three tabs that exercise the public, no-auth GitDealFlow API
33
+ (`signals.gitdealflow.com/api/v1/*`):
34
+
35
+ 1. **Live signals** — top startups ranked by 14-day commit-velocity acceleration.
36
+ Each row is a public-data delta computed deterministically from the GitHub REST
37
+ API with the bot filter applied (Dependabot/Renovate/GitHub Actions excluded).
38
+ 2. **Glossary search** — the 84-term controlled vocabulary (Code-Side Sourcing,
39
+ Commit Velocity, Two-Period Confirmation, etc.). Same corpus as the
40
+ [`the-data-nerd/vc-deal-flow-signal-glossary`](https://huggingface.co/datasets/the-data-nerd/vc-deal-flow-signal-glossary)
41
+ dataset.
42
+ 3. **Cite this** — copy-paste BibTeX, RIS, APA, MLA, Chicago, and Wikipedia
43
+ `{{cite journal}}` snippets for the paper and the dataset.
44
+
45
+ ## License
46
+
47
+ Output is **CC BY 4.0** — free to use commercially, attribution required.
48
+
49
+ ## Provenance
50
+
51
+ - **Methodology**: SSRN 6606558 (DOI [10.2139/ssrn.6606558](https://doi.org/10.2139/ssrn.6606558))
52
+ - **Dataset**: [the-data-nerd/vc-deal-flow-signal-glossary](https://huggingface.co/datasets/the-data-nerd/vc-deal-flow-signal-glossary)
53
+ - **Live API**: [signals.gitdealflow.com/api/v1/openapi.json](https://signals.gitdealflow.com/api/v1/openapi.json)
54
+ - **MCP server**: [signals.gitdealflow.com/.well-known/mcp.json](https://signals.gitdealflow.com/.well-known/mcp.json)
55
+ - **Wikidata**: [Q139376302](https://www.wikidata.org/wiki/Q139376302)
56
+
57
+ Full canonical site: [gitdealflow.com](https://gitdealflow.com).
app.py ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ VC Deal Flow Signal — live demo Space.
3
+
4
+ Three Gradio tabs that exercise the public, no-auth GitDealFlow API:
5
+ 1. Live signals — top startups by 14-day commit-velocity acceleration.
6
+ 2. Glossary search — the 84-term controlled vocabulary.
7
+ 3. Cite this — copy-paste citation snippets for the SSRN paper + dataset.
8
+
9
+ All data is fetched live from signals.gitdealflow.com/api/v1/* on every
10
+ interaction so we never serve stale snapshots. The API is rate-limited,
11
+ public, and CC BY 4.0.
12
+
13
+ License: CC BY 4.0 — attribution required.
14
+ Canonical site: https://gitdealflow.com
15
+ Methodology paper: https://ssrn.com/abstract=6606558
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import gradio as gr
21
+ import requests
22
+
23
+ BASE = "https://signals.gitdealflow.com"
24
+ UA = "vc-deal-flow-signal-hf-space/1.0 (+https://huggingface.co/spaces/the-data-nerd/vc-deal-flow-signal)"
25
+ TIMEOUT = 15
26
+
27
+
28
+ def _get_json(path: str) -> dict | list:
29
+ """GET an API endpoint and return parsed JSON, raising on non-2xx."""
30
+ url = f"{BASE}{path}"
31
+ r = requests.get(url, headers={"User-Agent": UA}, timeout=TIMEOUT)
32
+ r.raise_for_status()
33
+ return r.json()
34
+
35
+
36
+ # ── Tab 1: Live signals ────────────────────────────────────────────────
37
+
38
+
39
+ def load_signals(limit: int) -> list[list]:
40
+ """Fetch top startups ranked by engineering acceleration."""
41
+ try:
42
+ data = _get_json("/api/v1/signals.json")
43
+ except requests.RequestException as e:
44
+ return [["—", "—", "—", "—", f"API unavailable: {e}"]]
45
+
46
+ # API shape: {"meta": {...}, "trending": [...], "sectors": [...]}.
47
+ # Each trending item has: name, description, stage, geography,
48
+ # commitVelocity14d, commitVelocityChange, contributors, contributorGrowth,
49
+ # newRepos, signalType, githubUrl, websiteUrl.
50
+ rows = data.get("trending") if isinstance(data, dict) else []
51
+ if not isinstance(rows, list):
52
+ return [["—", "—", "—", "—", "Unexpected API shape"]]
53
+
54
+ out = []
55
+ for r in rows[: max(1, min(int(limit), 50))]:
56
+ name = r.get("name") or "—"
57
+ signal = r.get("signalType") or "—"
58
+ delta = r.get("commitVelocityChange") or "—"
59
+ stage = r.get("stage") or "—"
60
+ # Prefer GitHub deep link (Code-Side Sourcing source of truth).
61
+ link = r.get("githubUrl") or r.get("websiteUrl") or BASE
62
+ out.append([name, signal, str(delta), stage, link])
63
+ if not out:
64
+ out = [["—", "—", "—", "—", "No trending signals returned"]]
65
+ return out
66
+
67
+
68
+ # ── Tab 2: Glossary search ─────────────────────────────────────────────
69
+
70
+
71
+ def _load_glossary() -> list[dict]:
72
+ """Fetch the controlled vocabulary from the public JSON-LD surface."""
73
+ try:
74
+ data = _get_json("/api/v1/glossary.json")
75
+ except requests.RequestException:
76
+ return []
77
+ if not isinstance(data, dict):
78
+ return []
79
+ terms = data.get("hasDefinedTerm") or []
80
+ return [t for t in terms if isinstance(t, dict)]
81
+
82
+
83
+ GLOSSARY_CACHE: list[dict] = _load_glossary()
84
+
85
+
86
+ def search_glossary(query: str) -> list[list]:
87
+ """Substring filter across term name + definition."""
88
+ q = (query or "").strip().lower()
89
+ if not GLOSSARY_CACHE:
90
+ return [["—", "Glossary API unavailable — try again in a minute.", "—"]]
91
+ if not q:
92
+ rows = GLOSSARY_CACHE[:20]
93
+ else:
94
+ rows = [
95
+ t
96
+ for t in GLOSSARY_CACHE
97
+ if q in (t.get("name") or "").lower()
98
+ or q in (t.get("description") or "").lower()
99
+ ][:50]
100
+ if not rows:
101
+ return [[f"No match for '{query}'", "—", "—"]]
102
+ out = []
103
+ for t in rows:
104
+ name = t.get("name") or "—"
105
+ defn = t.get("description") or "—"
106
+ if len(defn) > 280:
107
+ defn = defn[:277] + "…"
108
+ term_id = t.get("termCode") or ""
109
+ link = f"{BASE}/define/{term_id}" if term_id else BASE
110
+ out.append([name, defn, link])
111
+ return out
112
+
113
+
114
+ # ── Tab 3: Cite this ───────────────────────────────────────────────────
115
+
116
+ CITATIONS = {
117
+ "BibTeX (paper)": """@article{thedatanerd2026vcdealflow,
118
+ title = {A Longitudinal Panel of GitHub Engineering Velocity for Venture-Backed Startups},
119
+ author = {{The Data Nerd}},
120
+ journal = {SSRN Electronic Journal},
121
+ year = {2026},
122
+ doi = {10.2139/ssrn.6606558},
123
+ url = {https://ssrn.com/abstract=6606558},
124
+ note = {Published by VC Deal Flow Signal (GitDealFlow). CC BY 4.0.},
125
+ orcid = {0009-0002-2222-4112}
126
+ }""",
127
+ "RIS (paper)": """TY - JOUR
128
+ AU - The Data Nerd
129
+ TI - A Longitudinal Panel of GitHub Engineering Velocity for Venture-Backed Startups
130
+ JO - SSRN Electronic Journal
131
+ PY - 2026
132
+ DO - 10.2139/ssrn.6606558
133
+ UR - https://ssrn.com/abstract=6606558
134
+ ER -""",
135
+ "APA (paper)": (
136
+ "The Data Nerd. (2026). A Longitudinal Panel of GitHub Engineering "
137
+ "Velocity for Venture-Backed Startups. SSRN Electronic Journal. "
138
+ "https://doi.org/10.2139/ssrn.6606558"
139
+ ),
140
+ "Wikipedia (paper)": (
141
+ "<ref>{{cite journal |last=The Data Nerd "
142
+ "|title=A Longitudinal Panel of GitHub Engineering Velocity for Venture-Backed Startups "
143
+ "|journal=SSRN Electronic Journal |year=2026 |doi=10.2139/ssrn.6606558 "
144
+ "|url=https://ssrn.com/abstract=6606558 "
145
+ "|publisher=VC Deal Flow Signal (GitDealFlow) "
146
+ "|orcid=0009-0002-2222-4112}}</ref>"
147
+ ),
148
+ "Wikipedia (dataset)": (
149
+ "<ref>{{cite web |last=The Data Nerd "
150
+ "|title=VC Deal Flow Signal — Public Engineering-Velocity Panel "
151
+ "|publisher=VC Deal Flow Signal (GitDealFlow) |year=2026 "
152
+ "|url=https://signals.gitdealflow.com/api/dataset.jsonl "
153
+ "|format=NDJSON |access-date={{subst:CURRENTDATE}}}}</ref>"
154
+ ),
155
+ "HF dataset (BibTeX)": """@dataset{thedatanerd2026vcdealflowglossary,
156
+ title = {VC Deal Flow Signal — Controlled Vocabulary Glossary},
157
+ author = {{The Data Nerd}},
158
+ year = {2026},
159
+ publisher = {Hugging Face},
160
+ url = {https://huggingface.co/datasets/the-data-nerd/vc-deal-flow-signal-glossary},
161
+ license = {CC BY 4.0}
162
+ }""",
163
+ }
164
+
165
+
166
+ def get_citation(fmt: str) -> str:
167
+ return CITATIONS.get(fmt, "")
168
+
169
+
170
+ # ── App layout ─────────────────────────────────────────────────────────
171
+
172
+
173
+ HEADER = """
174
+ # 📊 VC Deal Flow Signal
175
+
176
+ **Engineering acceleration as a leading indicator of fundraise events.**
177
+ Three-to-six-week lead time, all from public GitHub data, fully reproducible.
178
+
179
+ [Methodology paper (SSRN)](https://ssrn.com/abstract=6606558) ·
180
+ [Glossary dataset](https://huggingface.co/datasets/the-data-nerd/vc-deal-flow-signal-glossary) ·
181
+ [Live API](https://signals.gitdealflow.com/api/v1/openapi.json) ·
182
+ [MCP server](https://signals.gitdealflow.com/.well-known/mcp.json) ·
183
+ [Wikidata Q139376302](https://www.wikidata.org/wiki/Q139376302)
184
+ """
185
+
186
+ FOOTER = """
187
+ ---
188
+ Built by [VC Deal Flow Signal](https://gitdealflow.com).
189
+ Data is **CC BY 4.0** — free to use commercially, attribution required.
190
+ """
191
+
192
+
193
+ with gr.Blocks(
194
+ title="VC Deal Flow Signal — Live Engineering Acceleration",
195
+ theme=gr.themes.Soft(primary_hue="blue", neutral_hue="slate"),
196
+ ) as demo:
197
+ gr.Markdown(HEADER)
198
+
199
+ with gr.Tabs():
200
+ with gr.Tab("Live signals"):
201
+ gr.Markdown(
202
+ "Top startups ranked by 14-day commit-velocity acceleration. "
203
+ "Live from `signals.gitdealflow.com/api/v1/signals.json`. "
204
+ "Bot filter applied (Dependabot, Renovate, GitHub Actions excluded)."
205
+ )
206
+ sig_limit = gr.Slider(
207
+ minimum=5,
208
+ maximum=50,
209
+ value=20,
210
+ step=5,
211
+ label="How many signals to show",
212
+ )
213
+ sig_btn = gr.Button("Fetch live signals", variant="primary")
214
+ sig_table = gr.Dataframe(
215
+ headers=[
216
+ "Company",
217
+ "Signal type",
218
+ "Δ velocity (14d)",
219
+ "Stage",
220
+ "GitHub / website",
221
+ ],
222
+ interactive=False,
223
+ wrap=True,
224
+ )
225
+ sig_btn.click(load_signals, inputs=[sig_limit], outputs=[sig_table])
226
+ demo.load(load_signals, inputs=[sig_limit], outputs=[sig_table])
227
+
228
+ with gr.Tab("Glossary search"):
229
+ gr.Markdown(
230
+ "Search the 84-term controlled vocabulary. Same corpus as the "
231
+ "[`the-data-nerd/vc-deal-flow-signal-glossary`]"
232
+ "(https://huggingface.co/datasets/the-data-nerd/vc-deal-flow-signal-glossary) "
233
+ "Hugging Face dataset."
234
+ )
235
+ glossary_query = gr.Textbox(
236
+ label="Search term or definition (substring match)",
237
+ placeholder="e.g. commit velocity, hiring burst, dream 100…",
238
+ )
239
+ glossary_table = gr.Dataframe(
240
+ headers=["Term", "Definition", "Deep link"],
241
+ interactive=False,
242
+ wrap=True,
243
+ )
244
+ glossary_query.change(
245
+ search_glossary,
246
+ inputs=[glossary_query],
247
+ outputs=[glossary_table],
248
+ )
249
+ demo.load(search_glossary, inputs=[glossary_query], outputs=[glossary_table])
250
+
251
+ with gr.Tab("Cite this"):
252
+ gr.Markdown(
253
+ "Copy-paste-ready citation snippets for the SSRN paper, the "
254
+ "public dataset, and the Hugging Face glossary corpus."
255
+ )
256
+ fmt = gr.Radio(
257
+ choices=list(CITATIONS.keys()),
258
+ value="BibTeX (paper)",
259
+ label="Format",
260
+ )
261
+ cite_box = gr.Code(
262
+ language=None,
263
+ interactive=False,
264
+ lines=10,
265
+ )
266
+ fmt.change(get_citation, inputs=[fmt], outputs=[cite_box])
267
+ demo.load(get_citation, inputs=[fmt], outputs=[cite_box])
268
+
269
+ gr.Markdown(FOOTER)
270
+
271
+
272
+ if __name__ == "__main__":
273
+ demo.queue().launch()
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ gradio==5.42.0
2
+ requests==2.32.3