├── .github └── workflows │ └── scrape.yml ├── README.md ├── datasette-io.json ├── requirements.txt ├── scrape.js ├── simonwillison-net.json └── submit-to-datasette-cloud.sh /.github/workflows/scrape.yml: -------------------------------------------------------------------------------- 1 | name: Scrape Hacker News 2 | 3 | on: 4 | push: 5 | workflow_dispatch: 6 | schedule: 7 | - cron: '17 * * * *' 8 | 9 | jobs: 10 | shot-scraper: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | - name: Set up Python 3.12 15 | uses: actions/setup-python@v5 16 | with: 17 | python-version: "3.12" 18 | cache: "pip" 19 | - name: Cache Playwright browsers 20 | uses: actions/cache@v4 21 | with: 22 | path: ~/.cache/ms-playwright/ 23 | key: ${{ runner.os }}-browsers 24 | - name: Install dependencies 25 | run: | 26 | pip install -r requirements.txt 27 | - name: Install Playwright dependencies 28 | run: | 29 | shot-scraper install 30 | - name: Scrape 31 | run: | 32 | shot-scraper javascript \ 33 | "https://news.ycombinator.com/from?site=simonwillison.net" \ 34 | -i scrape.js -o simonwillison-net-new.json 35 | sleep 5 36 | shot-scraper javascript \ 37 | "https://news.ycombinator.com/from?site=datasette.io" \ 38 | -i scrape.js -o datasette-io-new.json 39 | - name: Generate commit message 40 | run: | 41 | echo "$(date -u)" > /tmp/commit.txt 42 | echo "" >> /tmp/commit.txt 43 | csv-diff simonwillison-net.json simonwillison-net-new.json --key id --format json \ 44 | --extra title '{title}' \ 45 | --extra latest 'https://news.ycombinator.com/latest?id={id}' \ 46 | --extra item 'https://news.ycombinator.com/item?id={id}' >> /tmp/commit.txt 47 | echo "" >> /tmp/commit.txt 48 | csv-diff datasette-io.json datasette-io-new.json --key id --format json \ 49 | --extra title '{title}' \ 50 | --extra latest 'https://news.ycombinator.com/latest?id={id}' \ 51 | --extra item 'https://news.ycombinator.com/item?id={id}' >> /tmp/commit.txt 52 | - name: Update data 53 | run: | 54 | mv simonwillison-net-new.json simonwillison-net.json 55 | mv datasette-io-new.json datasette-io.json 56 | - name: Submit fresh data to my Datasette Cloud space 57 | env: 58 | DS_TOKEN: ${{ secrets.SIMON_DS_WRITE_TOKEN }} 59 | run: | 60 | ./submit-to-datasette-cloud.sh 61 | - name: Commit and push 62 | run: |- 63 | git config user.name "Automated" 64 | git config user.email "actions@users.noreply.github.com" 65 | git add -A 66 | git commit -F /tmp/commit.txt || exit 0 67 | git pull --rebase 68 | git push 69 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # scrape-hacker-news-by-domain 2 | 3 | Scrape HN to track links from specific domains 4 | 5 | See [Scraping web pages from the command-line with shot-scraper](https://simonwillison.net/2022/Mar/14/scraping-web-pages-shot-scraper/) for details of how this works. 6 | 7 | Recently scraped data from this repo is also published to this Datasette table: 8 | 9 | https://simon.datasette.cloud/data/hacker_news_posts?_sort_desc=dt 10 | 11 | More about how that works in [Datasette’s new JSON write API: The first alpha of Datasette 1.0](https://simonwillison.net/2022/Dec/2/datasette-write-api/). 12 | -------------------------------------------------------------------------------- /datasette-io.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "42707592", 4 | "title": "LLM \u2013 A CLI utility and Python library for interacting with LLMs", 5 | "url": "https://llm.datasette.io/en/stable/index.html", 6 | "dt": "2025-01-15T05:18:25", 7 | "points": 1, 8 | "submitter": "tzury", 9 | "commentsUrl": "https://news.ycombinator.com/item?id=42707592", 10 | "numComments": 0 11 | }, 12 | { 13 | "id": "42236321", 14 | "title": "SQLite-utils: a tool for manipulating SQLite databases", 15 | "url": "https://sqlite-utils.datasette.io/en/stable/", 16 | "dt": "2024-11-25T13:56:43", 17 | "points": 9, 18 | "submitter": "mpbart", 19 | "commentsUrl": "https://news.ycombinator.com/item?id=42236321", 20 | "numComments": 0 21 | }, 22 | { 23 | "id": "41382987", 24 | "title": "LLM Command Line Tool", 25 | "url": "https://llm.datasette.io/en/stable/", 26 | "dt": "2024-08-28T19:00:40", 27 | "points": 9, 28 | "submitter": "franze", 29 | "commentsUrl": "https://news.ycombinator.com/item?id=41382987", 30 | "numComments": 1 31 | }, 32 | { 33 | "id": "40909106", 34 | "title": "CLI tool and Python library for manipulating SQLite databases", 35 | "url": "https://sqlite-utils.datasette.io/en/stable/index.html#", 36 | "dt": "2024-07-08T20:09:43", 37 | "points": 4, 38 | "submitter": "punnerud", 39 | "commentsUrl": "https://news.ycombinator.com/item?id=40909106", 40 | "numComments": 1 41 | }, 42 | { 43 | "id": "40617385", 44 | "title": "Learn SQL with Datasette", 45 | "url": "https://datasette.io/tutorials/learn-sql", 46 | "dt": "2024-06-08T13:22:16", 47 | "points": 4, 48 | "submitter": "tosh", 49 | "commentsUrl": "https://news.ycombinator.com/item?id=40617385", 50 | "numComments": 0 51 | }, 52 | { 53 | "id": "39591769", 54 | "title": "Shot-Scraper", 55 | "url": "https://shot-scraper.datasette.io/en/stable/", 56 | "dt": "2024-03-04T15:44:51", 57 | "points": 1, 58 | "submitter": "brk", 59 | "commentsUrl": "https://news.ycombinator.com/item?id=39591769", 60 | "numComments": 0 61 | }, 62 | { 63 | "id": "39504750", 64 | "title": "Shot-scraper: Scraping pages using JavaScript", 65 | "url": "https://shot-scraper.datasette.io/en/stable/javascript.html", 66 | "dt": "2024-02-25T21:05:57", 67 | "points": 1, 68 | "submitter": "stefankuehnel", 69 | "commentsUrl": "https://news.ycombinator.com/item?id=39504750", 70 | "numComments": 0 71 | }, 72 | { 73 | "id": "38097642", 74 | "title": "LLM CLI tool (can connect to public and self-hosted LLMs)", 75 | "url": "https://llm.datasette.io/en/stable/", 76 | "dt": "2023-11-01T13:03:51", 77 | "points": 2, 78 | "submitter": "tmsh", 79 | "commentsUrl": "https://news.ycombinator.com/item?id=38097642", 80 | "numComments": 0 81 | }, 82 | { 83 | "id": "36914612", 84 | "title": "SQLite-Utils", 85 | "url": "https://sqlite-utils.datasette.io/en/stable/index.html", 86 | "dt": "2023-07-28T23:09:17", 87 | "points": 142, 88 | "submitter": "dedalus", 89 | "commentsUrl": "https://news.ycombinator.com/item?id=36914612", 90 | "numComments": 17 91 | }, 92 | { 93 | "id": "36372190", 94 | "title": "llm 0.4: Notable update for command-line utility for interacting with LLMs", 95 | "url": "https://llm.datasette.io/en/stable/changelog.html", 96 | "dt": "2023-06-17T17:16:59", 97 | "points": 3, 98 | "submitter": "CharlesW", 99 | "commentsUrl": "https://news.ycombinator.com/item?id=36372190", 100 | "numComments": 0 101 | }, 102 | { 103 | "id": "34689624", 104 | "title": "OpenAI-to-SQLite", 105 | "url": "https://datasette.io/tools/openai-to-sqlite", 106 | "dt": "2023-02-07T06:57:40", 107 | "points": 203, 108 | "submitter": "thunderbong", 109 | "commentsUrl": "https://news.ycombinator.com/item?id=34689624", 110 | "numComments": 60 111 | }, 112 | { 113 | "id": "34317898", 114 | "title": "Building a location to time zone API with SpatiaLite and Datasette", 115 | "url": "https://datasette.io/tutorials/spatialite", 116 | "dt": "2023-01-09T23:11:35", 117 | "points": 2, 118 | "submitter": "todsacerdoti", 119 | "commentsUrl": "https://news.ycombinator.com/item?id=34317898", 120 | "numComments": 0 121 | }, 122 | { 123 | "id": "33792855", 124 | "title": "First alpha release of Datasette 1.0 intros new APIs for writing to the db", 125 | "url": "https://docs.datasette.io/en/latest/changelog.html#a0-2022-11-29", 126 | "dt": "2022-11-29T20:31:21", 127 | "points": 2, 128 | "submitter": "ghuntley", 129 | "commentsUrl": "https://news.ycombinator.com/item?id=33792855", 130 | "numComments": 0 131 | }, 132 | { 133 | "id": "33221723", 134 | "title": "Random ScotRail Apology Generator", 135 | "url": "https://scotrail.datasette.io/scotrail/random_apology", 136 | "dt": "2022-10-16T07:11:11", 137 | "points": 81, 138 | "submitter": "notpushkin", 139 | "commentsUrl": "https://news.ycombinator.com/item?id=33221723", 140 | "numComments": 46 141 | }, 142 | { 143 | "id": "32538495", 144 | "title": "ScotRail Random Apology Generator", 145 | "url": "https://scotrail.datasette.io/scotrail/random_apology", 146 | "dt": "2022-08-21T09:04:10", 147 | "points": 3, 148 | "submitter": "rcarmo", 149 | "commentsUrl": "https://news.ycombinator.com/item?id=32538495", 150 | "numComments": 1 151 | }, 152 | { 153 | "id": "32300050", 154 | "title": "Cleaning data with SQLite-utils and Datasette", 155 | "url": "https://datasette.io/tutorials/clean-data", 156 | "dt": "2022-07-31T23:49:00", 157 | "points": 3, 158 | "submitter": "ghuntley", 159 | "commentsUrl": "https://news.ycombinator.com/item?id=32300050", 160 | "numComments": 0 161 | }, 162 | { 163 | "id": "31176054", 164 | "title": "The Datasette Ecosystem", 165 | "url": "https://docs.datasette.io/en/stable/ecosystem.html", 166 | "dt": "2022-04-27T03:43:29", 167 | "points": 186, 168 | "submitter": "Tomte", 169 | "commentsUrl": "https://news.ycombinator.com/item?id=31176054", 170 | "numComments": 22 171 | }, 172 | { 173 | "id": "30575225", 174 | "title": "Learn SQL with Datasette", 175 | "url": "https://datasette.io/tutorials/learn-sql", 176 | "dt": "2022-03-06T05:15:00", 177 | "points": 5, 178 | "submitter": "JNRowe", 179 | "commentsUrl": "https://news.ycombinator.com/item?id=30575225", 180 | "numComments": 0 181 | }, 182 | { 183 | "id": "30446530", 184 | "title": "sqlite-utils - CLI & Python utility functions for manipulating SQLite databases", 185 | "url": "https://sqlite-utils.datasette.io/en/stable/index.html", 186 | "dt": "2022-02-23T21:13:36", 187 | "points": 134, 188 | "submitter": "punnerud", 189 | "commentsUrl": "https://news.ycombinator.com/item?id=30446530", 190 | "numComments": 16 191 | }, 192 | { 193 | "id": "28527978", 194 | "title": "Show HN: Datasette Desktop, macOS App for SQLite and CSVs", 195 | "url": "https://datasette.io/desktop", 196 | "dt": "2021-09-14T17:30:14", 197 | "points": 22, 198 | "submitter": "simonw", 199 | "commentsUrl": "https://news.ycombinator.com/item?id=28527978", 200 | "numComments": 2 201 | }, 202 | { 203 | "id": "28268484", 204 | "title": "The Datasette Ecosystem", 205 | "url": "https://docs.datasette.io/en/stable/ecosystem.html", 206 | "dt": "2021-08-22T19:07:33", 207 | "points": 4, 208 | "submitter": "Tomte", 209 | "commentsUrl": "https://news.ycombinator.com/item?id=28268484", 210 | "numComments": 0 211 | }, 212 | { 213 | "id": "27732281", 214 | "title": "Django SQL Dashboard", 215 | "url": "https://django-sql-dashboard.datasette.io/en/stable/", 216 | "dt": "2021-07-04T20:16:01", 217 | "points": 2, 218 | "submitter": "edward", 219 | "commentsUrl": "https://news.ycombinator.com/item?id=27732281", 220 | "numComments": 0 221 | }, 222 | { 223 | "id": "27107428", 224 | "title": "Show HN: Django SQL Dashboard", 225 | "url": "https://django-sql-dashboard.datasette.io/en/latest/", 226 | "dt": "2021-05-10T15:53:54", 227 | "points": 204, 228 | "submitter": "simonw", 229 | "commentsUrl": "https://news.ycombinator.com/item?id=27107428", 230 | "numComments": 27 231 | }, 232 | { 233 | "id": "25385296", 234 | "title": "Datasette: An open source multi-tool for exploring and publishing data", 235 | "url": "https://datasette.io/", 236 | "dt": "2020-12-11T13:09:55", 237 | "points": 285, 238 | "submitter": "robin_reala", 239 | "commentsUrl": "https://news.ycombinator.com/item?id=25385296", 240 | "numComments": 22 241 | }, 242 | { 243 | "id": "24734230", 244 | "title": "Datasette 0.50", 245 | "url": "https://docs.datasette.io/en/stable/changelog.html#v0-50", 246 | "dt": "2020-10-09T20:41:53", 247 | "points": 5, 248 | "submitter": "tosh", 249 | "commentsUrl": "https://news.ycombinator.com/item?id=24734230", 250 | "numComments": 0 251 | }, 252 | { 253 | "id": "21389850", 254 | "title": "SQL Murder Mystery", 255 | "url": "https://sql-murder-mystery.datasette.io/sql-murder-mystery", 256 | "dt": "2019-10-29T17:36:37", 257 | "points": 4, 258 | "submitter": "kickscondor", 259 | "commentsUrl": "https://news.ycombinator.com/item?id=21389850", 260 | "numComments": 0 261 | } 262 | ] 263 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | shot-scraper 2 | csv-diff>=1.2 -------------------------------------------------------------------------------- /scrape.js: -------------------------------------------------------------------------------- 1 | () => { 2 | var items = Array.from(document.querySelectorAll('.athing'), el => { 3 | const title = el.querySelector('.titleline a').innerText; 4 | const points = parseInt(el.nextSibling.querySelector('.score').innerText); 5 | const url = el.querySelector('.titleline a').href; 6 | const dt = el.nextSibling.querySelector('.age').title.split(' ')[0]; 7 | const submitter = el.nextSibling.querySelector('.hnuser').innerText; 8 | const commentsUrl = el.nextSibling.querySelector('.age a').href; 9 | const id = commentsUrl.split('?id=')[1]; 10 | // Only posts with comments have a comments link 11 | const commentsLink = Array.from( 12 | el.nextSibling.querySelectorAll('a') 13 | ).filter(el => el && el.innerText.includes('comment'))[0]; 14 | let numComments = 0; 15 | if (commentsLink) { 16 | numComments = parseInt(commentsLink.innerText.split()[0]); 17 | } 18 | return {id, title, url, dt, points, submitter, commentsUrl, numComments}; 19 | }); 20 | if (!items.length) { 21 | throw 'No items found'; 22 | } 23 | return items; 24 | } 25 | -------------------------------------------------------------------------------- /simonwillison-net.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "44151027", 4 | "title": "The Perfect Commit (2022)", 5 | "url": "https://simonwillison.net/2022/Oct/29/the-perfect-commit/", 6 | "dt": "2025-06-01T14:11:52", 7 | "points": 3, 8 | "submitter": "saikatsg", 9 | "commentsUrl": "https://news.ycombinator.com/item?id=44151027", 10 | "numComments": 0 11 | }, 12 | { 13 | "id": "44147498", 14 | "title": "How Often Do LLMs Snitch? Recreating Theo's SnitchBench with LLM", 15 | "url": "https://simonwillison.net/2025/May/31/snitchbench-with-llm/", 16 | "dt": "2025-05-31T22:53:39", 17 | "points": 8, 18 | "submitter": "Philpax", 19 | "commentsUrl": "https://news.ycombinator.com/item?id=44147498", 20 | "numComments": 2 21 | }, 22 | { 23 | "id": "44147283", 24 | "title": "No build front end is so much more fun", 25 | "url": "https://simonwillison.net/2025/May/31/no-build/", 26 | "dt": "2025-05-31T22:11:32", 27 | "points": 9, 28 | "submitter": "xnx", 29 | "commentsUrl": "https://news.ycombinator.com/item?id=44147283", 30 | "numComments": 1 31 | }, 32 | { 33 | "id": "44110584", 34 | "title": "Show HN: My LLM CLI tool can run tools now, from Python code or plugins", 35 | "url": "https://simonwillison.net/2025/May/27/llm-tools/", 36 | "dt": "2025-05-27T20:53:03", 37 | "points": 521, 38 | "submitter": "simonw", 39 | "commentsUrl": "https://news.ycombinator.com/item?id=44110584", 40 | "numComments": 165 41 | }, 42 | { 43 | "id": "44104528", 44 | "title": "GitHub MCP Exploited: Accessing Private Repositories via MCP", 45 | "url": "https://simonwillison.net/2025/May/26/github-mcp-exploited/", 46 | "dt": "2025-05-27T06:54:12", 47 | "points": 1, 48 | "submitter": "todsacerdoti", 49 | "commentsUrl": "https://news.ycombinator.com/item?id=44104528", 50 | "numComments": 0 51 | }, 52 | { 53 | "id": "44101833", 54 | "title": "Highlights from the Claude 4 system prompt", 55 | "url": "https://simonwillison.net/2025/May/25/claude-4-system-prompt/", 56 | "dt": "2025-05-26T21:25:56", 57 | "points": 309, 58 | "submitter": "Anon84", 59 | "commentsUrl": "https://news.ycombinator.com/item?id=44101833", 60 | "numComments": 90 61 | }, 62 | { 63 | "id": "44095956", 64 | "title": "Highlights from the Claude 4 system prompt", 65 | "url": "https://simonwillison.net/2025/May/25/claude-4-system-prompt/", 66 | "dt": "2025-05-26T10:29:51", 67 | "points": 2, 68 | "submitter": "iNic", 69 | "commentsUrl": "https://news.ycombinator.com/item?id=44095956", 70 | "numComments": 0 71 | }, 72 | { 73 | "id": "44094980", 74 | "title": "GitHub issues is almost the best notebook in the world", 75 | "url": "https://simonwillison.net/2025/May/26/notes/", 76 | "dt": "2025-05-26T07:41:24", 77 | "points": 312, 78 | "submitter": "ingve", 79 | "commentsUrl": "https://news.ycombinator.com/item?id=44094980", 80 | "numComments": 193 81 | }, 82 | { 83 | "id": "44087920", 84 | "title": "Highlights from the Claude 4 system prompt", 85 | "url": "https://simonwillison.net/2025/May/25/claude-4-system-prompt/", 86 | "dt": "2025-05-25T14:02:47", 87 | "points": 9, 88 | "submitter": "dcre", 89 | "commentsUrl": "https://news.ycombinator.com/item?id=44087920", 90 | "numComments": 1 91 | }, 92 | { 93 | "id": "44085943", 94 | "title": "Subscribe to my sponsors-only monthly newsletter", 95 | "url": "https://simonwillison.net/2025/May/25/sponsors-only-newsletter/", 96 | "dt": "2025-05-25T06:14:38", 97 | "points": 2, 98 | "submitter": "pros", 99 | "commentsUrl": "https://news.ycombinator.com/item?id=44085943", 100 | "numComments": 0 101 | }, 102 | { 103 | "id": "44085920", 104 | "title": "Claude 4 System Card", 105 | "url": "https://simonwillison.net/2025/May/25/claude-4-system-card/", 106 | "dt": "2025-05-25T06:06:39", 107 | "points": 699, 108 | "submitter": "pvg", 109 | "commentsUrl": "https://news.ycombinator.com/item?id=44085920", 110 | "numComments": 250 111 | }, 112 | { 113 | "id": "44085750", 114 | "title": "How I used o3 to find CVE-2025-37899, a remote zeroday vulnerability", 115 | "url": "https://simonwillison.net/2025/May/24/sean-heelan/", 116 | "dt": "2025-05-25T05:28:17", 117 | "points": 2, 118 | "submitter": "thunderbong", 119 | "commentsUrl": "https://news.ycombinator.com/item?id=44085750", 120 | "numComments": 0 121 | }, 122 | { 123 | "id": "44077031", 124 | "title": "Remote Prompt Injection in Gitlab Duo Leads to Source Code Theft", 125 | "url": "https://simonwillison.net/2025/May/23/remote-prompt-injection-in-gitlab-duo/", 126 | "dt": "2025-05-23T22:03:41", 127 | "points": 9, 128 | "submitter": "thunderbong", 129 | "commentsUrl": "https://news.ycombinator.com/item?id=44077031", 130 | "numComments": 0 131 | }, 132 | { 133 | "id": "44075715", 134 | "title": "Honey Badger", 135 | "url": "https://simonwillison.net/2025/May/23/honey-badger/", 136 | "dt": "2025-05-23T19:17:42", 137 | "points": 6, 138 | "submitter": "tosh", 139 | "commentsUrl": "https://news.ycombinator.com/item?id=44075715", 140 | "numComments": 0 141 | }, 142 | { 143 | "id": "44063893", 144 | "title": "Live blog: Claude 4 launch at Code with Claude", 145 | "url": "https://simonwillison.net/2025/May/22/code-with-claude-live-blog/", 146 | "dt": "2025-05-22T16:48:30", 147 | "points": 1, 148 | "submitter": "dmazin", 149 | "commentsUrl": "https://news.ycombinator.com/item?id=44063893", 150 | "numComments": 1 151 | }, 152 | { 153 | "id": "44058105", 154 | "title": "I don't like ChatGPT's new memory dossier", 155 | "url": "https://simonwillison.net/2025/May/21/chatgpt-new-memory/", 156 | "dt": "2025-05-22T02:11:54", 157 | "points": 13, 158 | "submitter": "Sami_Lehtinen", 159 | "commentsUrl": "https://news.ycombinator.com/item?id=44058105", 160 | "numComments": 2 161 | }, 162 | { 163 | "id": "44057971", 164 | "title": "Building software on top of large language models", 165 | "url": "https://simonwillison.net/2025/May/15/building-on-llms/", 166 | "dt": "2025-05-22T01:44:32", 167 | "points": 36, 168 | "submitter": "gregorymichael", 169 | "commentsUrl": "https://news.ycombinator.com/item?id=44057971", 170 | "numComments": 0 171 | }, 172 | { 173 | "id": "44057820", 174 | "title": "Gemini Diffusion", 175 | "url": "https://simonwillison.net/2025/May/21/gemini-diffusion/", 176 | "dt": "2025-05-22T01:13:50", 177 | "points": 890, 178 | "submitter": "mdp2021", 179 | "commentsUrl": "https://news.ycombinator.com/item?id=44057820", 180 | "numComments": 244 181 | }, 182 | { 183 | "id": "44052246", 184 | "title": "I don't like ChatGPT's new memory dossier", 185 | "url": "https://simonwillison.net/2025/May/21/chatgpt-new-memory/", 186 | "dt": "2025-05-21T15:03:26", 187 | "points": 24, 188 | "submitter": "ingve", 189 | "commentsUrl": "https://news.ycombinator.com/item?id=44052246", 190 | "numComments": 6 191 | }, 192 | { 193 | "id": "44020782", 194 | "title": "Quoting Neal Stephenson", 195 | "url": "https://simonwillison.net/2025/May/18/neal-stephenson/", 196 | "dt": "2025-05-18T12:16:41", 197 | "points": 6, 198 | "submitter": "mdp2021", 199 | "commentsUrl": "https://news.ycombinator.com/item?id=44020782", 200 | "numComments": 3 201 | }, 202 | { 203 | "id": "44014535", 204 | "title": "Building software on top of Large Language Models", 205 | "url": "https://simonwillison.net/2025/May/15/building-on-llms/", 206 | "dt": "2025-05-17T14:21:19", 207 | "points": 12, 208 | "submitter": "thunderbong", 209 | "commentsUrl": "https://news.ycombinator.com/item?id=44014535", 210 | "numComments": 0 211 | }, 212 | { 213 | "id": "43995155", 214 | "title": "Building Software on Top of LLMs", 215 | "url": "https://simonwillison.net/2025/May/15/building-on-llms/", 216 | "dt": "2025-05-15T13:57:48", 217 | "points": 6, 218 | "submitter": "ridruejo", 219 | "commentsUrl": "https://news.ycombinator.com/item?id=43995155", 220 | "numComments": 6 221 | }, 222 | { 223 | "id": "43981586", 224 | "title": "o4-mini-high leaks the URL to OpenAI's internal engineering handbook", 225 | "url": "https://simonwillison.net/2025/May/13/launching-chatgpt-images/", 226 | "dt": "2025-05-14T06:46:44", 227 | "points": 6, 228 | "submitter": "rcarmo", 229 | "commentsUrl": "https://news.ycombinator.com/item?id=43981586", 230 | "numComments": 0 231 | }, 232 | { 233 | "id": "43959550", 234 | "title": "Cursor: Security", 235 | "url": "https://simonwillison.net/2025/May/11/cursor-security/", 236 | "dt": "2025-05-12T04:05:32", 237 | "points": 1, 238 | "submitter": "thunderbong", 239 | "commentsUrl": "https://news.ycombinator.com/item?id=43959550", 240 | "numComments": 0 241 | }, 242 | { 243 | "id": "43948367", 244 | "title": "Trying out llama.cpp's new vision support", 245 | "url": "https://simonwillison.net/2025/May/10/llama-cpp-vision/", 246 | "dt": "2025-05-10T19:50:01", 247 | "points": 1, 248 | "submitter": "marviel", 249 | "commentsUrl": "https://news.ycombinator.com/item?id=43948367", 250 | "numComments": 0 251 | }, 252 | { 253 | "id": "43947161", 254 | "title": "Simon Willison's first blog on LLMs (2022)", 255 | "url": "https://simonwillison.net/2022/May/31/a-datasette-tutorial-written-by-gpt-3/", 256 | "dt": "2025-05-10T17:04:25", 257 | "points": 17, 258 | "submitter": "Alifatisk", 259 | "commentsUrl": "https://news.ycombinator.com/item?id=43947161", 260 | "numComments": 2 261 | }, 262 | { 263 | "id": "43898545", 264 | "title": "Request for more articles on prompting techniques", 265 | "url": "https://simonwillison.net/2025/May/5/prompting/", 266 | "dt": "2025-05-05T19:27:32", 267 | "points": 10, 268 | "submitter": "quinncom", 269 | "commentsUrl": "https://news.ycombinator.com/item?id=43898545", 270 | "numComments": 2 271 | }, 272 | { 273 | "id": "43858250", 274 | "title": "Two publishers and three authors fail to understand what \"vibe coding\" means", 275 | "url": "https://simonwillison.net/2025/May/1/not-vibe-coding/", 276 | "dt": "2025-05-01T14:36:07", 277 | "points": 84, 278 | "submitter": "Tomte", 279 | "commentsUrl": "https://news.ycombinator.com/item?id=43858250", 280 | "numComments": 115 281 | }, 282 | { 283 | "id": "43852409", 284 | "title": "Understanding the recent criticism of the Chatbot Arena", 285 | "url": "https://simonwillison.net/2025/Apr/30/criticism-of-the-chatbot-arena/", 286 | "dt": "2025-05-01T00:43:47", 287 | "points": 5, 288 | "submitter": "todsacerdoti", 289 | "commentsUrl": "https://news.ycombinator.com/item?id=43852409", 290 | "numComments": 0 291 | }, 292 | { 293 | "id": "43842567", 294 | "title": "A comparison of ChatGPT/GPT-4o's previous and current system prompts", 295 | "url": "https://simonwillison.net/2025/Apr/29/chatgpt-sycophancy-prompt/", 296 | "dt": "2025-04-30T08:29:50", 297 | "points": 3, 298 | "submitter": "myfonj", 299 | "commentsUrl": "https://news.ycombinator.com/item?id=43842567", 300 | "numComments": 0 301 | } 302 | ] 303 | -------------------------------------------------------------------------------- /submit-to-datasette-cloud.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -euo pipefail 3 | 4 | export SIMONWILLISON_ROWS=$( 5 | jq -n --argjson rows "$(cat simonwillison-net.json)" \ 6 | '{ "rows": $rows, "replace": true }' 7 | ) 8 | export DATASETTE_ROWS=$( 9 | jq -n --argjson rows "$(cat datasette-io.json)" \ 10 | '{ "rows": $rows, "replace": true }' 11 | ) 12 | curl -X POST \ 13 | https://simon.datasette.cloud/data/hacker_news_posts/-/insert \ 14 | -H "Content-Type: application/json" \ 15 | -H "Authorization: Bearer $DS_TOKEN" \ 16 | -d "$SIMONWILLISON_ROWS" 17 | curl -X POST \ 18 | https://simon.datasette.cloud/data/hacker_news_posts/-/insert \ 19 | -H "Content-Type: application/json" \ 20 | -H "Authorization: Bearer $DS_TOKEN" \ 21 | -d "$DATASETTE_ROWS" 22 | --------------------------------------------------------------------------------