diff --git a/.eleventy.js b/.eleventy.js index 07888987..8b66b736 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -160,9 +160,8 @@ module.exports = function (eleventyConfig) { } if (item.data.links) { item.data.links.forEach((link) => { - const tagString = [ - ...new Set(link.tags.split(',').map((tag) => tagAliases[tag.toLowerCase()])), - ] + const tagString = link['tags'] + .map((tag) => tagAliases[tag.toLowerCase()]) .join(' ') .trim() if (tagString) tags[link.url] = tagString diff --git a/.env b/.env index e50b0ed4..3541d8d0 100644 --- a/.env +++ b/.env @@ -1,6 +1,7 @@ API_KEY_TRAKT= API_KEY_MOVIEDB= API_KEY_WEBMENTIONS_CORYD_DEV= +API_TOKEN_PINBOARD= API_APPLE_MUSIC_DEVELOPER_TOKEN= API_APPLE_MUSIC_USER_TOKEN= APPLE_RENEW_TOKEN_URL= diff --git a/src/_data/json/links.json b/src/_data/json/links.json deleted file mode 100644 index fc177b44..00000000 --- a/src/_data/json/links.json +++ /dev/null @@ -1 +0,0 @@ -{"links":[{"tags":"development","title":"What Happened to Separation of Concerns in Frontend Development","id":"https:\/\/meiert.com\/en\/blog\/what-happened-to-separation-of-concerns\/","url":"https:\/\/meiert.com\/en\/blog\/what-happened-to-separation-of-concerns\/","date":"Tue, 31 Oct 2023 10:25:06 -0700"},{"tags":"development","title":"It's 2023, here is why your web design sucks.","id":"https:\/\/heather-buchel.com\/blog\/2023\/10\/why-your-web-design-sucks\/","url":"https:\/\/heather-buchel.com\/blog\/2023\/10\/why-your-web-design-sucks\/","date":"Tue, 31 Oct 2023 10:27:36 -0700"},{"tags":"music","title":"You should look at this chart about music genres","id":"https:\/\/pudding.cool\/2023\/10\/genre\/","url":"https:\/\/pudding.cool\/2023\/10\/genre\/","date":"Tue, 31 Oct 2023 11:02:55 -0700"},{"tags":"development","title":"The Fight For The Main Thread","id":"https:\/\/www.smashingmagazine.com\/2023\/10\/speedcurve-fight-main-thread\/","url":"https:\/\/www.smashingmagazine.com\/2023\/10\/speedcurve-fight-main-thread\/","date":"Tue, 31 Oct 2023 11:04:41 -0700"},{"tags":"development","title":"Why I Won't Use Next.js","id":"https:\/\/www.epicweb.dev\/why-i-wont-use-nextjs","url":"https:\/\/www.epicweb.dev\/why-i-wont-use-nextjs","date":"Tue, 31 Oct 2023 11:18:47 -0700"},{"tags":"development","title":"The ideal viewport doesn’t exist","id":"https:\/\/viewports.fyi\/","url":"https:\/\/viewports.fyi\/","date":"Tue, 31 Oct 2023 12:40:05 -0700"},{"tags":"development","title":"Software disenchantment","id":"https:\/\/tonsky.me\/blog\/disenchantment\/","url":"https:\/\/tonsky.me\/blog\/disenchantment\/","date":"Tue, 31 Oct 2023 18:53:38 -0700"},{"tags":"development","title":"Second-guessing the modern web","id":"https:\/\/macwright.com\/2020\/05\/10\/spa-fatigue.html","url":"https:\/\/macwright.com\/2020\/05\/10\/spa-fatigue.html","date":"Thu, 02 Nov 2023 08:55:58 -0700"},{"tags":"development","title":"Presentational shadow DOM","id":"https:\/\/www.mayank.co\/blog\/presentational-shadow-dom\/","url":"https:\/\/www.mayank.co\/blog\/presentational-shadow-dom\/","date":"Fri, 03 Nov 2023 12:40:07 -0700"}]} \ No newline at end of file diff --git a/src/_data/links.js b/src/_data/links.js index 3a83eaf5..4027e6aa 100644 --- a/src/_data/links.js +++ b/src/_data/links.js @@ -1,5 +1,20 @@ -const links = require('../_data/json/links.json') +const EleventyFetch = require('@11ty/eleventy-fetch') module.exports = async function () { - return links.links.reverse() + const API_TOKEN_PINBOARD = process.env.API_TOKEN_PINBOARD + const url = `https://api.pinboard.in/v1/posts/recent?auth_token=${API_TOKEN_PINBOARD}&format=json&tag=share&count=5` + const res = EleventyFetch(url, { + duration: '1h', + type: 'json', + }).catch() + const links = await res + return links['posts'].map((link) => { + return { + title: link['description'], + url: link['href'], + tags: [...new Set(link['tags'].split(' '))], + date: link['time'], + description: link['extended'], + } + }) } diff --git a/src/_data/nav.js b/src/_data/nav.js index d94c382c..b6000532 100644 --- a/src/_data/nav.js +++ b/src/_data/nav.js @@ -21,6 +21,7 @@ module.exports = async function () { }, { name: 'Trakt', url: 'https://trakt.tv/users/cdransf', icon: 'device-tv' }, { name: 'StoryGraph', url: 'https://app.thestorygraph.com/profile/coryd', icon: 'books' }, + { name: 'Pinboard', url: 'http://pinboard.in/u:cdme', icon: 'pin' }, { name: 'Buy Me a Coffee', url: 'https://www.buymeacoffee.com/cory', icon: 'cup' }, ], resume: [ diff --git a/src/uses.md b/src/uses.md index d63ef8c9..a001e743 100644 --- a/src/uses.md +++ b/src/uses.md @@ -79,6 +79,7 @@ Software and services that I use for work and my own enjoyment. - Bunny.net: a powerful and affordable CDN. I use it to serve assets on my personal site (most notable my now page — raw assets are fetched by Eleventy and then optimized to webp). - Clicky: powerful and easy to understand analytics (if, perhaps, not the prettiest to look at). - Feedpress: they've been around for a while now and don't change much (nor do they need to), but look no further for reliable, helpful feed analytics. +- [Pinboard](https://pinboard.in): an old, reliable and slow to change web service that does exactly what it sets out to — provide reliable bookmarking. - [SavvyCal](https://savvycal.com): the most pleasant scheduling solution I've found to date. It offers a number of scheduling niceties and allows visitors to overlay their own calendars for a seamless booking experience. - [IVPN](https://www.ivpn.net): my VPN of choice for browsing outside of my home network. Privacy-focused and trustworthy. - [Kagi](https://kagi.com): search that's actually helpful and ad-free. It's lenses feature and the ability to up/downvote and block results from different sites are indispensable.