Public
HTTP (deprecated)
Val Town is a social website to write and deploy JavaScript.
Build APIs and schedule functions from your browser.
Readme

Sidebar.io Archiver

Sidebar's been one of my biggest design resources for the last decade. Since sidebar.io's break announcement this morning (https://sidebar.io/break/) I've set out to mess around with using Val.town to archive sidebar. The Google Sheet can be found here: https://docs.google.com/spreadsheets/d/1RghvMfPTR5xvHMAk1pKYuH2pFYYKOJ6bH0LLkHNZiuc/edit?usp=sharing

Initially I was just piping data to Google Sheets but that's slow, wasteful and kind of dumb... instead I just wrapped Hono around the code to provide a download the CSV to browser.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import { Hono } from 'npm:hono';
import sheet from 'npm:@yawnxyz/sheetlog@0.0.15';
import { fetchJSON } from "https://esm.town/v/stevekrouse/fetchJSON?v=41";
import { Sema } from 'npm:async-sema';
import { modelProvider } from 'https://esm.town/v/yawnxyz/ai';
// Public Sheet:
// https://docs.google.com/spreadsheets/d/1RghvMfPTR5xvHMAk1pKYuH2pFYYKOJ6bH0LLkHNZiuc/edit?gid=0#gid=0
sheet.setup({
sheet: "links",
sheetUrl: "https://script.google.com/macros/s/AKfycbzavst1u2rbRAw-bkIrhoQT07507yvSHRFSkMKkDRQvsHAAe9lQ78s8c1TIfJJb7F50/exec"
})
// Create a semaphore to limit concurrency
const sema = new Sema(5); // Adjust the number based on your desired concurrency
export async function addLinksToSheet(links) {
let counter = 0;
for (const link of links) {
await sema.acquire();
(async () => {
try {
// let embeddings = await modelProvider.gen({
// embed: true,
// value: JSON.stringify(link)
// });
// console.log(`Adding link ${counter}:`, link.title, link.url, embeddings);
console.log(`Adding link ${counter}:`, link.title, link.url);
counter++;
await sheet.log({
title: link.title,
url: link.url,
postedAt: new Date(link.postedAt).toLocaleString('en-US', { timeZone: 'UTC' }),
data: JSON.stringify(link),
// embeddings: embeddings.embedding.join(','),
});
} finally {
sema.release();
}
})();
}
}
export async function getSidebar(limit = 1, start = 0) {
const gql = {
"operationName": "posts",
"variables": {
"input": {
"limit": limit,
"offset": start,
"enableTotal": true,
"enableCache": true,
"filter": {
"status": {
"_eq": 2
}
},
"sort": {
"postedAt": "desc"
}
}
},
"query": `query posts($input: MultiPostInput) {
posts(input: $input) {
results {
...PostFragment
__typename
}
totalCount
__typename
}
}
fragment PostFragment on Post {
_id
title
shortTitle
url
credit
twitterName
postedAt
createdAt
pageUrl
body
userId
categories {
...CategoryFragment
}
}
fragment CategoryFragment on Category {
_id
name
slug
pagePath
}`
};
// console.log('gql:', JSON.stringify(gql));
let results = await fetchJSON(`https://archive.sidebar.io/graphql`, {
yawnxyz-sidebartoarchive.web.val.run
June 12, 2024