Back to APIs list

Hacker News API examples & templates

Use these vals as a playground to view and fork Hacker News API examples and templates on Val Town. Run any example below or find templates that can be used as a pre-built solution.
iakovos avatar
renderTopStories
@iakovos
Script
An interactive, runnable TypeScript val by iakovos
rodrigotello avatar
valTownInspoList
@rodrigotello
Script
Val Town inspiration & use cases list List [as object] used in Val Town's use cases and inspiration. Check it out at in /examples/use-cases and /docs/tutorial/4
jxnblk avatar
VALLErun
@jxnblk
HTTP (deprecated)
Forked from janpaul123/VALLErun
stevekrouse avatar
code_search_is_easy
@stevekrouse
HTTP (deprecated)
Forked from pomdtr/code_search_is_easy
pomdtr avatar
greenSnipe
@pomdtr
HTTP (deprecated)
Forked from stevekrouse/code_search_is_easy
pomdtr avatar
code_search_is_easy
@pomdtr
HTTP (deprecated)
Code Search is Easy Earlier this week, Tom MacWright posted Code Search is Hard . He describes the research he his doing to improve the code search experience of Val Town . It was a great read, and you might have seen it trending on Hacker News . As Val Town's most active user (behind Steve Krouse, one of the founders of Val Town), I for sure agree with Tom that the search feature needs improvements. But while reading his post, I immediately thought of a different approach to the problem. And a few hours later, Val Town Search was born. Do things that don't scale How does this new shiny search engine work? Well, it's quite simple. I wrote a Deno script that fetches all vals from the Val Town API. #!/usr/bin/env -S deno run -A import * as path from "https://deno.land/std/path/mod.ts"; const dir = path.join(import.meta.dirname!, "..", "vals"); const blocklist = Deno.readTextFileSync( path.join(import.meta.dirname!, "blocklist.txt") ) .split("\n") .map((line) => line.trim()) .filter((line) => line.length > 0); let url = `https://api.val.town/v1/search/vals?limit=100&query=+`; const vals = []; while (true) { console.log("fetching", url); const resp = await fetch(url); if (!resp.ok) { console.error(resp.statusText); Deno.exit(1); } const { data, links } = await resp.json(); vals.push(...data); if (!links.next) { break; } url = links.next; } Deno.removeSync(dir, { recursive: true }); Deno.mkdirSync(dir, { recursive: true }); for (const val of vals) { const slug = `${val.author.username}/${val.name}`; if (blocklist.includes(slug)) { console.log("skipping", slug); continue; } const userDir = path.join(dir, val.author.username); Deno.mkdirSync(userDir, { recursive: true }); Deno.writeTextFileSync(path.join(userDir, `${val.name}.tsx`), val.code); } I pushed the data to a Github Repository (now private) I added a Github Action that runs the script every hour to refresh the data. #!/usr/bin/env -S deno run -A import * as path from "https://deno.land/std/path/mod.ts"; const dir = path.join(import.meta.dirname!, "..", "vals"); const blocklist = Deno.readTextFileSync( path.join(import.meta.dirname!, "blocklist.txt") ) .split("\n") .map((line) => line.trim()) .filter((line) => line.length > 0); let url = `https://api.val.town/v1/search/vals?limit=100&query=+`; const vals = []; while (true) { console.log("fetching", url); const resp = await fetch(url); if (!resp.ok) { console.error(resp.statusText); Deno.exit(1); } const { data, links } = await resp.json(); vals.push(...data); if (!links.next) { break; } url = links.next; } Deno.removeSync(dir, { recursive: true }); Deno.mkdirSync(dir, { recursive: true }); for (const val of vals) { const slug = `${val.author.username}/${val.name}`; if (blocklist.includes(slug)) { console.log("skipping", slug); continue; } const userDir = path.join(dir, val.author.username); Deno.mkdirSync(userDir, { recursive: true }); Deno.writeTextFileSync(path.join(userDir, `${val.name}.tsx`), val.code); } I created a simple frontend on top of the Github Search API that allows you to search the data. It's hosted on Val Town (obviously). That was it. I didn't have to build a complex search engine, I just used the tools that were available to me. Is this a scalable solution for Val Town? Probably not. Am I abusing the Github API? Maybe. Does it work better than the current search feature of Val Town? Absolutely! I hope that the val.town engineers will come up with a search feature that will put my little project to shame. But for now, you won't find a better way to search for vals than Val Town Search . PS: This post was written / is served from Val Town
cofsana avatar
VALLErun
@cofsana
HTTP (deprecated)
Forked from jxnblk/VALLErun
arash2060 avatar
VALLErun
@arash2060
HTTP (deprecated)
Forked from janpaul123/VALLErun
ejfox avatar
VALLErun
@ejfox
HTTP (deprecated)
Forked from janpaul123/VALLErun
ubyk avatar
VALLErun
@ubyk
HTTP (deprecated)
Forked from janpaul123/VALLErun
petermillspaugh avatar
january2024
@petermillspaugh
Script
petemillspaugh.com clippings: #1 – January 2024 Process for sending out a newsletter: Publish newsletter on the Web Fork this val and update subject, webUrl, targetSendDate Uncomment call to insertIntoNewslettersTable Add to @petermillspaugh/newsletters list Val
vawogbemi avatar
whoIsHiringAbout
@vawogbemi
Script
@jsxImportSource https://esm.sh/react
chet avatar
notifyHackerNewsReplies
@chet
Cron
An interactive, runnable TypeScript val by chet
nknj avatar
hackerNewsRAG
@nknj
HTTP (deprecated)
Forked from substrate/hackerNewsRAG
cenktekin avatar
hackerNewsRAG
@cenktekin
HTTP (deprecated)
Forked from substrate/hackerNewsRAG
paulhoule avatar
hackerNewsRAG
@paulhoule
HTTP (deprecated)
Forked from substrate/hackerNewsRAG