summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/publications.tsx28
-rw-r--r--lib/feed.ts53
-rw-r--r--package-lock.json305
-rw-r--r--package.json3
-rw-r--r--pages/_document.tsx4
-rw-r--r--pages/index.tsx11
-rw-r--r--public/rss/atom.xml80
-rw-r--r--public/rss/feed.json57
-rw-r--r--public/rss/feed.xml40
9 files changed, 439 insertions, 142 deletions
diff --git a/data/publications.tsx b/data/publications.tsx
index b7649575..fff0eddd 100644
--- a/data/publications.tsx
+++ b/data/publications.tsx
@@ -1,27 +1,37 @@
type Publication = {
- name: string,
+ title: string,
url: string,
+ summary: string,
+ publishedAt: string,
}
const Publications : Array<Publication> = [
{
- name: "Buffers, splits and tabs in Vim",
- url: "https://medium.com/@msapka/buffers-splits-and-tabs-in-vim-5bb3b6dc1c19"
+ title: "Buffers, splits and tabs in Vim",
+ url: "https://medium.com/@msapka/buffers-splits-and-tabs-in-vim-5bb3b6dc1c19",
+ summary: "",
+ publishedAt: "Aug 18, 2022"
},
{
- name: "A month with a disgusting ThinkPad",
- url: "https://medium.com/@msapka/a-month-with-a-disgusting-thinkpad-936e7c675a74"
+ title: "A month with a disgusting ThinkPad",
+ url: "https://medium.com/@msapka/a-month-with-a-disgusting-thinkpad-936e7c675a74",
+ summary: "",
+ publishedAt: "Aug 8, 2022",
},
{
- name: "Managing dotfiles with GNU Stow",
- url: "https://medium.com/@msapka/managing-dotfiles-with-gnu-stow-72b4e3bb9434"
+ title: "Managing dotfiles with GNU Stow",
+ url: "https://medium.com/@msapka/managing-dotfiles-with-gnu-stow-72b4e3bb9434",
+ summary: "",
+ publishedAt: "Aug 5, 2022",
},
{
- name: "Adding dynamic DNS to my home server",
- url: "https://medium.com/@msapka/adding-dynamic-dns-to-my-home-server-d05bf65358cc"
+ title: "Adding dynamic DNS to my home server",
+ url: "https://medium.com/@msapka/adding-dynamic-dns-to-my-home-server-d05bf65358cc",
+ summary: "",
+ publishedAt: "Aug 4, 2022",
}
]
diff --git a/lib/feed.ts b/lib/feed.ts
new file mode 100644
index 00000000..92d61fc0
--- /dev/null
+++ b/lib/feed.ts
@@ -0,0 +1,53 @@
+import fs from "fs";
+import { Feed } from "feed";
+import Publications from "../data/publications";
+
+const generateRssFeed = async () => {
+ const siteURL = "https://michal.sapka.pl";
+ const date = new Date();
+ const author = {
+ name: "Michał M. Sapka",
+ email: "michal@sapka.pl",
+ link: "https://michal.sapka.pl",
+ };
+
+ const feed = new Feed({
+ title: "Michał's publications",
+ description: "Michał Sapka's recent publications",
+ id: siteURL,
+ link: siteURL,
+ //image: `${siteURL}/logo.svg`,
+ //favicon: `${siteURL}/favicon.png`,
+ copyright: `All rights reserved ${date.getFullYear()}, Michał M. Sapka`,
+ updated: date,
+ generator: "Feed for Node.js",
+ feedLinks: {
+ rss2: `${siteURL}/rss/feed.xml`,
+ json: `${siteURL}/rss/feed.json`,
+ atom: `${siteURL}/rss/atom.xml`,
+ },
+ author,
+
+ });
+
+ Publications.forEach((post) => {
+ const url = post.url;
+ feed.addItem({
+ title: post.title,
+ id: url,
+ link: url,
+ description: post.summary,
+ content: post.summary,
+ author: [author],
+ contributor: [author],
+ date: new Date(post.publishedAt),
+ });
+ });
+
+ fs.mkdirSync("./public/rss", { recursive: true });
+ fs.writeFileSync("./public/rss/feed.xml", feed.rss2());
+ fs.writeFileSync("./public/rss/atom.xml", feed.atom1());
+ fs.writeFileSync("./public/rss/feed.json", feed.json1());
+};
+
+export default generateRssFeed
diff --git a/package-lock.json b/package-lock.json
index a1f6ae49..662c9c91 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,8 +13,9 @@
"@emotion/styled": "^11.10.0",
"@fontsource/lato": "^4.5.9",
"@fontsource/open-sans": "^4.5.11",
+ "feed": "^4.2.2",
"framer-motion": "^7.0.0",
- "next": "12.2.3",
+ "next": "^12.2.5",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-icons": "^4.4.0"
@@ -1626,9 +1627,9 @@
}
},
"node_modules/@next/env": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.3.tgz",
- "integrity": "sha512-2lWKP5Xcvnor70NaaROZXBvU8z9mFReePCG8NhZw6NyNGnPvC+8s+Cre/63LAB1LKzWw/e9bZJnQUg0gYFRb2Q=="
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.5.tgz",
+ "integrity": "sha512-vLPLV3cpPGjUPT3PjgRj7e3nio9t6USkuew3JE/jMeon/9Mvp1WyR18v3iwnCuX7eUAm1HmAbJHHLAbcu/EJcw=="
},
"node_modules/@next/eslint-plugin-next": {
"version": "12.2.3",
@@ -1640,9 +1641,9 @@
}
},
"node_modules/@next/swc-android-arm-eabi": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.3.tgz",
- "integrity": "sha512-JxmCW9XB5PYnkGE67BdnBTdqW0SW6oMCiPMHLdjeRi4T3U4JJKJGnjQld99+6TPOfPWigtw3W7Cijp5gc+vJ/w==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.5.tgz",
+ "integrity": "sha512-cPWClKxGhgn2dLWnspW+7psl3MoLQUcNqJqOHk2BhNcou9ARDtC0IjQkKe5qcn9qg7I7U83Gp1yh2aesZfZJMA==",
"cpu": [
"arm"
],
@@ -1655,9 +1656,9 @@
}
},
"node_modules/@next/swc-android-arm64": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.3.tgz",
- "integrity": "sha512-3l4zXpWnzy0fqoedsFRxzMy/eGlMMqn6IwPEuBmtEQ4h7srmQFHyT+Bk+eVHb0o1RQ7/TloAa+mu8JX5tz/5tA==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.5.tgz",
+ "integrity": "sha512-vMj0efliXmC5b7p+wfcQCX0AfU8IypjkzT64GiKJD9PgiA3IILNiGJr1fw2lyUDHkjeWx/5HMlMEpLnTsQslwg==",
"cpu": [
"arm64"
],
@@ -1670,9 +1671,9 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.3.tgz",
- "integrity": "sha512-eutDO/RH6pf7+8zHo3i2GKLhF0qaMtxWpY8k3Oa1k+CyrcJ0IxwkfH/x3f75jTMeCrThn6Uu8j3WeZOxvhto1Q==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.5.tgz",
+ "integrity": "sha512-VOPWbO5EFr6snla/WcxUKtvzGVShfs302TEMOtzYyWni6f9zuOetijJvVh9CCTzInnXAZMtHyNhefijA4HMYLg==",
"cpu": [
"arm64"
],
@@ -1685,9 +1686,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.3.tgz",
- "integrity": "sha512-lve+lnTiddXbcT3Lh2ujOFywQSEycTYQhuf6j6JrPu9oLQGS01kjIqqSj3/KMmSoppEnXo3BxkgYu+g2+ecHkA==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.5.tgz",
+ "integrity": "sha512-5o8bTCgAmtYOgauO/Xd27vW52G2/m3i5PX7MUYePquxXAnX73AAtqA3WgPXBRitEB60plSKZgOTkcpqrsh546A==",
"cpu": [
"x64"
],
@@ -1700,9 +1701,9 @@
}
},
"node_modules/@next/swc-freebsd-x64": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.3.tgz",
- "integrity": "sha512-V4bZU1qBFkULTPW53phY8ypioh3EERzHu9YKAasm9RxU4dj+8c/4s60y+kbFkFEEpIUgEU6yNuYZRR4lHHbUGA==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.5.tgz",
+ "integrity": "sha512-yYUbyup1JnznMtEBRkK4LT56N0lfK5qNTzr6/DEyDw5TbFVwnuy2hhLBzwCBkScFVjpFdfiC6SQAX3FrAZzuuw==",
"cpu": [
"x64"
],
@@ -1715,9 +1716,9 @@
}
},
"node_modules/@next/swc-linux-arm-gnueabihf": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.3.tgz",
- "integrity": "sha512-MWxS/i+XSEKdQE0ZmdYkPPrWKBi4JwMVaXdOW9J/T/sZJsHsLlSC9ErBcNolKAJEVka+tnw9oPRyRCKOj+q0sw==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.5.tgz",
+ "integrity": "sha512-2ZE2/G921Acks7UopJZVMgKLdm4vN4U0yuzvAMJ6KBavPzqESA2yHJlm85TV/K9gIjKhSk5BVtauIUntFRP8cg==",
"cpu": [
"arm"
],
@@ -1730,9 +1731,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.3.tgz",
- "integrity": "sha512-ikXkqAmvEcWTzIQFDdmrUHLWzdDAF5s2pVsSpQn9rk/gK1i9webH1GRQd2bSM7JLuPBZSaYrNGvDTyHZdSEYlg==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.5.tgz",
+ "integrity": "sha512-/I6+PWVlz2wkTdWqhlSYYJ1pWWgUVva6SgX353oqTh8njNQp1SdFQuWDqk8LnM6ulheVfSsgkDzxrDaAQZnzjQ==",
"cpu": [
"arm64"
],
@@ -1745,9 +1746,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.3.tgz",
- "integrity": "sha512-wE45gGFkeLLLnCoveKaBrdpYkkypl3qwNF2YhnfvfVK7etuu1O679LwClhCWinDVBr+KOkmyHok00Z+0uI1ycg==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.5.tgz",
+ "integrity": "sha512-LPQRelfX6asXyVr59p5sTpx5l+0yh2Vjp/R8Wi4X9pnqcayqT4CUJLiHqCvZuLin3IsFdisJL0rKHMoaZLRfmg==",
"cpu": [
"arm64"
],
@@ -1760,9 +1761,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.3.tgz",
- "integrity": "sha512-MbFI6413VSXiREzHwYD8YAJLTknBaC+bmjXgdHEEdloeOuBFQGE3NWn3izOCTy8kV+s98VDQO8au7EKKs+bW0g==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.5.tgz",
+ "integrity": "sha512-0szyAo8jMCClkjNK0hknjhmAngUppoRekW6OAezbEYwHXN/VNtsXbfzgYOqjKWxEx3OoAzrT3jLwAF0HdX2MEw==",
"cpu": [
"x64"
],
@@ -1775,9 +1776,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.3.tgz",
- "integrity": "sha512-jMBD0Va6fInbPih/dNySlNY2RpjkK6MXS+UGVEvuTswl1MZr+iahvurmshwGKpjaRwVU4DSFMD8+gfWxsTFs1Q==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.5.tgz",
+ "integrity": "sha512-zg/Y6oBar1yVnW6Il1I/08/2ukWtOG6s3acdJdEyIdsCzyQi4RLxbbhkD/EGQyhqBvd3QrC6ZXQEXighQUAZ0g==",
"cpu": [
"x64"
],
@@ -1790,9 +1791,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.3.tgz",
- "integrity": "sha512-Cq8ToPdc0jQP2C7pjChYctAsEe7+lO/B826ZCK5xFzobuHPiCyJ2Mzx/nEQwCY4SpYkeJQtCbwlCz5iyGW5zGg==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.5.tgz",
+ "integrity": "sha512-3/90DRNSqeeSRMMEhj4gHHQlLhhKg5SCCoYfE3kBjGpE63EfnblYUqsszGGZ9ekpKL/R4/SGB40iCQr8tR5Jiw==",
"cpu": [
"arm64"
],
@@ -1805,9 +1806,9 @@
}
},
"node_modules/@next/swc-win32-ia32-msvc": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.3.tgz",
- "integrity": "sha512-BtFq4c8IpeB0sDhJMHJFgm86rPkOvmYI8k3De8Y2kgNVWSeLQ0Q929PWf7e+GqcX1015ei/gEB41ZH8Iw49NzA==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.5.tgz",
+ "integrity": "sha512-hGLc0ZRAwnaPL4ulwpp4D2RxmkHQLuI8CFOEEHdzZpS63/hMVzv81g8jzYA0UXbb9pus/iTc3VRbVbAM03SRrw==",
"cpu": [
"ia32"
],
@@ -1820,9 +1821,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.3.tgz",
- "integrity": "sha512-huSNb98KSG77Kl96CoPgCwom28aamuUsPpRmn/4s9L0RNbbHVSkp9E6HA4yOAykZCEuWcdNsRLbVVuAbt8rtIw==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.5.tgz",
+ "integrity": "sha512-7h5/ahY7NeaO2xygqVrSG/Y8Vs4cdjxIjowTZ5W6CKoTKn7tmnuxlUc2h74x06FKmbhAd9agOjr/AOKyxYYm9Q==",
"cpu": [
"x64"
],
@@ -3219,6 +3220,17 @@
"reusify": "^1.0.4"
}
},
+ "node_modules/feed": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz",
+ "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==",
+ "dependencies": {
+ "xml-js": "^1.6.11"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@@ -4094,15 +4106,15 @@
"dev": true
},
"node_modules/next": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/next/-/next-12.2.3.tgz",
- "integrity": "sha512-TA0tmSA6Dk6S6kfvCNbF7CWYW8468gZUxr/3/30z4KvAQbXnl2ASYZElVe7q/hBW/1F1ee0tSBlHa4/sn+ZIBw==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/next/-/next-12.2.5.tgz",
+ "integrity": "sha512-tBdjqX5XC/oFs/6gxrZhjmiq90YWizUYU6qOWAfat7zJwrwapJ+BYgX2PmiacunXMaRpeVT4vz5MSPSLgNkrpA==",
"dependencies": {
- "@next/env": "12.2.3",
+ "@next/env": "12.2.5",
"@swc/helpers": "0.4.3",
"caniuse-lite": "^1.0.30001332",
"postcss": "8.4.14",
- "styled-jsx": "5.0.2",
+ "styled-jsx": "5.0.4",
"use-sync-external-store": "1.2.0"
},
"bin": {
@@ -4112,19 +4124,19 @@
"node": ">=12.22.0"
},
"optionalDependencies": {
- "@next/swc-android-arm-eabi": "12.2.3",
- "@next/swc-android-arm64": "12.2.3",
- "@next/swc-darwin-arm64": "12.2.3",
- "@next/swc-darwin-x64": "12.2.3",
- "@next/swc-freebsd-x64": "12.2.3",
- "@next/swc-linux-arm-gnueabihf": "12.2.3",
- "@next/swc-linux-arm64-gnu": "12.2.3",
- "@next/swc-linux-arm64-musl": "12.2.3",
- "@next/swc-linux-x64-gnu": "12.2.3",
- "@next/swc-linux-x64-musl": "12.2.3",
- "@next/swc-win32-arm64-msvc": "12.2.3",
- "@next/swc-win32-ia32-msvc": "12.2.3",
- "@next/swc-win32-x64-msvc": "12.2.3"
+ "@next/swc-android-arm-eabi": "12.2.5",
+ "@next/swc-android-arm64": "12.2.5",
+ "@next/swc-darwin-arm64": "12.2.5",
+ "@next/swc-darwin-x64": "12.2.5",
+ "@next/swc-freebsd-x64": "12.2.5",
+ "@next/swc-linux-arm-gnueabihf": "12.2.5",
+ "@next/swc-linux-arm64-gnu": "12.2.5",
+ "@next/swc-linux-arm64-musl": "12.2.5",
+ "@next/swc-linux-x64-gnu": "12.2.5",
+ "@next/swc-linux-x64-musl": "12.2.5",
+ "@next/swc-win32-arm64-msvc": "12.2.5",
+ "@next/swc-win32-ia32-msvc": "12.2.5",
+ "@next/swc-win32-x64-msvc": "12.2.5"
},
"peerDependencies": {
"fibers": ">= 3.1.0",
@@ -4771,6 +4783,11 @@
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
"node_modules/scheduler": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
@@ -4944,9 +4961,9 @@
}
},
"node_modules/styled-jsx": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz",
- "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==",
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.4.tgz",
+ "integrity": "sha512-sDFWLbg4zR+UkNzfk5lPilyIgtpddfxXEULxhujorr5jtePTUqiPDc5BC0v1NRqTr/WaFBGQQUoYToGlF4B2KQ==",
"engines": {
"node": ">= 12.0.0"
},
@@ -5251,6 +5268,17 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
+ "node_modules/xml-js": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
+ "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
+ "dependencies": {
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "xml-js": "bin/cli.js"
+ }
+ },
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -6492,9 +6520,9 @@
}
},
"@next/env": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.3.tgz",
- "integrity": "sha512-2lWKP5Xcvnor70NaaROZXBvU8z9mFReePCG8NhZw6NyNGnPvC+8s+Cre/63LAB1LKzWw/e9bZJnQUg0gYFRb2Q=="
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.5.tgz",
+ "integrity": "sha512-vLPLV3cpPGjUPT3PjgRj7e3nio9t6USkuew3JE/jMeon/9Mvp1WyR18v3iwnCuX7eUAm1HmAbJHHLAbcu/EJcw=="
},
"@next/eslint-plugin-next": {
"version": "12.2.3",
@@ -6506,81 +6534,81 @@
}
},
"@next/swc-android-arm-eabi": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.3.tgz",
- "integrity": "sha512-JxmCW9XB5PYnkGE67BdnBTdqW0SW6oMCiPMHLdjeRi4T3U4JJKJGnjQld99+6TPOfPWigtw3W7Cijp5gc+vJ/w==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.5.tgz",
+ "integrity": "sha512-cPWClKxGhgn2dLWnspW+7psl3MoLQUcNqJqOHk2BhNcou9ARDtC0IjQkKe5qcn9qg7I7U83Gp1yh2aesZfZJMA==",
"optional": true
},
"@next/swc-android-arm64": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.3.tgz",
- "integrity": "sha512-3l4zXpWnzy0fqoedsFRxzMy/eGlMMqn6IwPEuBmtEQ4h7srmQFHyT+Bk+eVHb0o1RQ7/TloAa+mu8JX5tz/5tA==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.5.tgz",
+ "integrity": "sha512-vMj0efliXmC5b7p+wfcQCX0AfU8IypjkzT64GiKJD9PgiA3IILNiGJr1fw2lyUDHkjeWx/5HMlMEpLnTsQslwg==",
"optional": true
},
"@next/swc-darwin-arm64": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.3.tgz",
- "integrity": "sha512-eutDO/RH6pf7+8zHo3i2GKLhF0qaMtxWpY8k3Oa1k+CyrcJ0IxwkfH/x3f75jTMeCrThn6Uu8j3WeZOxvhto1Q==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.5.tgz",
+ "integrity": "sha512-VOPWbO5EFr6snla/WcxUKtvzGVShfs302TEMOtzYyWni6f9zuOetijJvVh9CCTzInnXAZMtHyNhefijA4HMYLg==",
"optional": true
},
"@next/swc-darwin-x64": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.3.tgz",
- "integrity": "sha512-lve+lnTiddXbcT3Lh2ujOFywQSEycTYQhuf6j6JrPu9oLQGS01kjIqqSj3/KMmSoppEnXo3BxkgYu+g2+ecHkA==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.5.tgz",
+ "integrity": "sha512-5o8bTCgAmtYOgauO/Xd27vW52G2/m3i5PX7MUYePquxXAnX73AAtqA3WgPXBRitEB60plSKZgOTkcpqrsh546A==",
"optional": true
},
"@next/swc-freebsd-x64": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.3.tgz",
- "integrity": "sha512-V4bZU1qBFkULTPW53phY8ypioh3EERzHu9YKAasm9RxU4dj+8c/4s60y+kbFkFEEpIUgEU6yNuYZRR4lHHbUGA==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.5.tgz",
+ "integrity": "sha512-yYUbyup1JnznMtEBRkK4LT56N0lfK5qNTzr6/DEyDw5TbFVwnuy2hhLBzwCBkScFVjpFdfiC6SQAX3FrAZzuuw==",
"optional": true
},
"@next/swc-linux-arm-gnueabihf": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.3.tgz",
- "integrity": "sha512-MWxS/i+XSEKdQE0ZmdYkPPrWKBi4JwMVaXdOW9J/T/sZJsHsLlSC9ErBcNolKAJEVka+tnw9oPRyRCKOj+q0sw==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.5.tgz",
+ "integrity": "sha512-2ZE2/G921Acks7UopJZVMgKLdm4vN4U0yuzvAMJ6KBavPzqESA2yHJlm85TV/K9gIjKhSk5BVtauIUntFRP8cg==",
"optional": true
},
"@next/swc-linux-arm64-gnu": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.3.tgz",
- "integrity": "sha512-ikXkqAmvEcWTzIQFDdmrUHLWzdDAF5s2pVsSpQn9rk/gK1i9webH1GRQd2bSM7JLuPBZSaYrNGvDTyHZdSEYlg==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.5.tgz",
+ "integrity": "sha512-/I6+PWVlz2wkTdWqhlSYYJ1pWWgUVva6SgX353oqTh8njNQp1SdFQuWDqk8LnM6ulheVfSsgkDzxrDaAQZnzjQ==",
"optional": true
},
"@next/swc-linux-arm64-musl": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.3.tgz",
- "integrity": "sha512-wE45gGFkeLLLnCoveKaBrdpYkkypl3qwNF2YhnfvfVK7etuu1O679LwClhCWinDVBr+KOkmyHok00Z+0uI1ycg==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.5.tgz",
+ "integrity": "sha512-LPQRelfX6asXyVr59p5sTpx5l+0yh2Vjp/R8Wi4X9pnqcayqT4CUJLiHqCvZuLin3IsFdisJL0rKHMoaZLRfmg==",
"optional": true
},
"@next/swc-linux-x64-gnu": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.3.tgz",
- "integrity": "sha512-MbFI6413VSXiREzHwYD8YAJLTknBaC+bmjXgdHEEdloeOuBFQGE3NWn3izOCTy8kV+s98VDQO8au7EKKs+bW0g==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.5.tgz",
+ "integrity": "sha512-0szyAo8jMCClkjNK0hknjhmAngUppoRekW6OAezbEYwHXN/VNtsXbfzgYOqjKWxEx3OoAzrT3jLwAF0HdX2MEw==",
"optional": true
},
"@next/swc-linux-x64-musl": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.3.tgz",
- "integrity": "sha512-jMBD0Va6fInbPih/dNySlNY2RpjkK6MXS+UGVEvuTswl1MZr+iahvurmshwGKpjaRwVU4DSFMD8+gfWxsTFs1Q==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.5.tgz",
+ "integrity": "sha512-zg/Y6oBar1yVnW6Il1I/08/2ukWtOG6s3acdJdEyIdsCzyQi4RLxbbhkD/EGQyhqBvd3QrC6ZXQEXighQUAZ0g==",
"optional": true
},
"@next/swc-win32-arm64-msvc": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.3.tgz",
- "integrity": "sha512-Cq8ToPdc0jQP2C7pjChYctAsEe7+lO/B826ZCK5xFzobuHPiCyJ2Mzx/nEQwCY4SpYkeJQtCbwlCz5iyGW5zGg==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.5.tgz",
+ "integrity": "sha512-3/90DRNSqeeSRMMEhj4gHHQlLhhKg5SCCoYfE3kBjGpE63EfnblYUqsszGGZ9ekpKL/R4/SGB40iCQr8tR5Jiw==",
"optional": true
},
"@next/swc-win32-ia32-msvc": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.3.tgz",
- "integrity": "sha512-BtFq4c8IpeB0sDhJMHJFgm86rPkOvmYI8k3De8Y2kgNVWSeLQ0Q929PWf7e+GqcX1015ei/gEB41ZH8Iw49NzA==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.5.tgz",
+ "integrity": "sha512-hGLc0ZRAwnaPL4ulwpp4D2RxmkHQLuI8CFOEEHdzZpS63/hMVzv81g8jzYA0UXbb9pus/iTc3VRbVbAM03SRrw==",
"optional": true
},
"@next/swc-win32-x64-msvc": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.3.tgz",
- "integrity": "sha512-huSNb98KSG77Kl96CoPgCwom28aamuUsPpRmn/4s9L0RNbbHVSkp9E6HA4yOAykZCEuWcdNsRLbVVuAbt8rtIw==",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.5.tgz",
+ "integrity": "sha512-7h5/ahY7NeaO2xygqVrSG/Y8Vs4cdjxIjowTZ5W6CKoTKn7tmnuxlUc2h74x06FKmbhAd9agOjr/AOKyxYYm9Q==",
"optional": true
},
"@nodelib/fs.scandir": {
@@ -7623,6 +7651,14 @@
"reusify": "^1.0.4"
}
},
+ "feed": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz",
+ "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==",
+ "requires": {
+ "xml-js": "^1.6.11"
+ }
+ },
"file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@@ -8271,28 +8307,28 @@
"dev": true
},
"next": {
- "version": "12.2.3",
- "resolved": "https://registry.npmjs.org/next/-/next-12.2.3.tgz",
- "integrity": "sha512-TA0tmSA6Dk6S6kfvCNbF7CWYW8468gZUxr/3/30z4KvAQbXnl2ASYZElVe7q/hBW/1F1ee0tSBlHa4/sn+ZIBw==",
- "requires": {
- "@next/env": "12.2.3",
- "@next/swc-android-arm-eabi": "12.2.3",
- "@next/swc-android-arm64": "12.2.3",
- "@next/swc-darwin-arm64": "12.2.3",
- "@next/swc-darwin-x64": "12.2.3",
- "@next/swc-freebsd-x64": "12.2.3",
- "@next/swc-linux-arm-gnueabihf": "12.2.3",
- "@next/swc-linux-arm64-gnu": "12.2.3",
- "@next/swc-linux-arm64-musl": "12.2.3",
- "@next/swc-linux-x64-gnu": "12.2.3",
- "@next/swc-linux-x64-musl": "12.2.3",
- "@next/swc-win32-arm64-msvc": "12.2.3",
- "@next/swc-win32-ia32-msvc": "12.2.3",
- "@next/swc-win32-x64-msvc": "12.2.3",
+ "version": "12.2.5",
+ "resolved": "https://registry.npmjs.org/next/-/next-12.2.5.tgz",
+ "integrity": "sha512-tBdjqX5XC/oFs/6gxrZhjmiq90YWizUYU6qOWAfat7zJwrwapJ+BYgX2PmiacunXMaRpeVT4vz5MSPSLgNkrpA==",
+ "requires": {
+ "@next/env": "12.2.5",
+ "@next/swc-android-arm-eabi": "12.2.5",
+ "@next/swc-android-arm64": "12.2.5",
+ "@next/swc-darwin-arm64": "12.2.5",
+ "@next/swc-darwin-x64": "12.2.5",
+ "@next/swc-freebsd-x64": "12.2.5",
+ "@next/swc-linux-arm-gnueabihf": "12.2.5",
+ "@next/swc-linux-arm64-gnu": "12.2.5",
+ "@next/swc-linux-arm64-musl": "12.2.5",
+ "@next/swc-linux-x64-gnu": "12.2.5",
+ "@next/swc-linux-x64-musl": "12.2.5",
+ "@next/swc-win32-arm64-msvc": "12.2.5",
+ "@next/swc-win32-ia32-msvc": "12.2.5",
+ "@next/swc-win32-x64-msvc": "12.2.5",
"@swc/helpers": "0.4.3",
"caniuse-lite": "^1.0.30001332",
"postcss": "8.4.14",
- "styled-jsx": "5.0.2",
+ "styled-jsx": "5.0.4",
"use-sync-external-store": "1.2.0"
}
},
@@ -8709,6 +8745,11 @@
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
"scheduler": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
@@ -8837,9 +8878,9 @@
}
},
"styled-jsx": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz",
- "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==",
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.4.tgz",
+ "integrity": "sha512-sDFWLbg4zR+UkNzfk5lPilyIgtpddfxXEULxhujorr5jtePTUqiPDc5BC0v1NRqTr/WaFBGQQUoYToGlF4B2KQ==",
"requires": {}
},
"stylis": {
@@ -9039,6 +9080,14 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
+ "xml-js": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
+ "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
+ "requires": {
+ "sax": "^1.2.4"
+ }
+ },
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
diff --git a/package.json b/package.json
index a89aef3f..3156103d 100644
--- a/package.json
+++ b/package.json
@@ -14,8 +14,9 @@
"@emotion/styled": "^11.10.0",
"@fontsource/lato": "^4.5.9",
"@fontsource/open-sans": "^4.5.11",
+ "feed": "^4.2.2",
"framer-motion": "^7.0.0",
- "next": "12.2.3",
+ "next": "^12.2.5",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-icons": "^4.4.0"
diff --git a/pages/_document.tsx b/pages/_document.tsx
index ef9fcd3b..ca81402c 100644
--- a/pages/_document.tsx
+++ b/pages/_document.tsx
@@ -6,6 +6,10 @@ export default function Document() {
return (
<Html lang="en">
<Head />
+ <title>Michał Sapka's website</title>
+ <link rel="alternate" type="application/rss+xml" href="https://michal.sapka.me/rss/feed.xml" title="Recent publications RSS Feed" />
+ <link rel="alternate" type="application/feed+json" href="https://michal.sapka.me/rss/feed.json" title="Recent publications RSS Feed" />
+ <link rel="alternate" type="application/atom+xml" href="https://michal.sapka.me/rss/atom.xml" title="Recent publications RSS Feed" />
<body>
<ColorModeScript initialColorMode={theme.config.initialColorMode} />
<Main />
diff --git a/pages/index.tsx b/pages/index.tsx
index 4477d0b0..2e733685 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -1,8 +1,5 @@
import type { NextPage } from 'next'
-import Head from 'next/head'
-import Image from 'next/image'
import Layout from '../components/layout'
-import styles from '../styles/Home.module.css'
import {
VStack,
HStack,
@@ -17,6 +14,7 @@ import {
} from '@chakra-ui/react'
import { AiFillGithub,AiFillMediumCircle} from "react-icons/ai";
import Publications from "../data/publications"
+import generateRssFeed from "../lib/feed"
type BioEntryType = {
date: string,
@@ -71,7 +69,7 @@ const Home: NextPage = () => {
<VStack spacing="1" alignItems="start">
{Publications.map((value, key) => {
return <Box key={key}>
- <Link href={value.url} isExternal>{value.name}</Link>
+ <Link href={value.url} isExternal>{value.title}</Link>
</Box>
})}
@@ -103,4 +101,9 @@ const Home: NextPage = () => {
)
}
+export const getStaticProps = async (context : any) => {
+ await generateRssFeed();
+ return { props: {} };
+};
+
export default Home
diff --git a/public/rss/atom.xml b/public/rss/atom.xml
new file mode 100644
index 00000000..75ad28b3
--- /dev/null
+++ b/public/rss/atom.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <id>https://michal.sapka.pl</id>
+ <title>Michał's publications</title>
+ <updated>2022-09-05T20:50:45.878Z</updated>
+ <generator>Feed for Node.js</generator>
+ <author>
+ <name>Michał M. Sapka</name>
+ <email>michal@sapka.pl</email>
+ <uri>https://michal.sapka.pl</uri>
+ </author>
+ <link rel="alternate" href="https://michal.sapka.pl"/>
+ <link rel="self" href="https://michal.sapka.pl/rss/atom.xml"/>
+ <subtitle>Michał Sapka's recent publications</subtitle>
+ <rights>All rights reserved 2022, Michał M. Sapka</rights>
+ <entry>
+ <title type="html"><![CDATA[Buffers, splits and tabs in Vim]]></title>
+ <id>https://medium.com/@msapka/buffers-splits-and-tabs-in-vim-5bb3b6dc1c19</id>
+ <link href="https://medium.com/@msapka/buffers-splits-and-tabs-in-vim-5bb3b6dc1c19"/>
+ <updated>2022-08-17T22:00:00.000Z</updated>
+ <author>
+ <name>Michał M. Sapka</name>
+ <email>michal@sapka.pl</email>
+ <uri>https://michal.sapka.pl</uri>
+ </author>
+ <contributor>
+ <name>Michał M. Sapka</name>
+ <email>michal@sapka.pl</email>
+ <uri>https://michal.sapka.pl</uri>
+ </contributor>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[A month with a disgusting ThinkPad]]></title>
+ <id>https://medium.com/@msapka/a-month-with-a-disgusting-thinkpad-936e7c675a74</id>
+ <link href="https://medium.com/@msapka/a-month-with-a-disgusting-thinkpad-936e7c675a74"/>
+ <updated>2022-08-07T22:00:00.000Z</updated>
+ <author>
+ <name>Michał M. Sapka</name>
+ <email>michal@sapka.pl</email>
+ <uri>https://michal.sapka.pl</uri>
+ </author>
+ <contributor>
+ <name>Michał M. Sapka</name>
+ <email>michal@sapka.pl</email>
+ <uri>https://michal.sapka.pl</uri>
+ </contributor>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Managing dotfiles with GNU Stow]]></title>
+ <id>https://medium.com/@msapka/managing-dotfiles-with-gnu-stow-72b4e3bb9434</id>
+ <link href="https://medium.com/@msapka/managing-dotfiles-with-gnu-stow-72b4e3bb9434"/>
+ <updated>2022-08-04T22:00:00.000Z</updated>
+ <author>
+ <name>Michał M. Sapka</name>
+ <email>michal@sapka.pl</email>
+ <uri>https://michal.sapka.pl</uri>
+ </author>
+ <contributor>
+ <name>Michał M. Sapka</name>
+ <email>michal@sapka.pl</email>
+ <uri>https://michal.sapka.pl</uri>
+ </contributor>
+ </entry>
+ <entry>
+ <title type="html"><![CDATA[Adding dynamic DNS to my home server]]></title>
+ <id>https://medium.com/@msapka/adding-dynamic-dns-to-my-home-server-d05bf65358cc</id>
+ <link href="https://medium.com/@msapka/adding-dynamic-dns-to-my-home-server-d05bf65358cc"/>
+ <updated>2022-08-03T22:00:00.000Z</updated>
+ <author>
+ <name>Michał M. Sapka</name>
+ <email>michal@sapka.pl</email>
+ <uri>https://michal.sapka.pl</uri>
+ </author>
+ <contributor>
+ <name>Michał M. Sapka</name>
+ <email>michal@sapka.pl</email>
+ <uri>https://michal.sapka.pl</uri>
+ </contributor>
+ </entry>
+</feed> \ No newline at end of file
diff --git a/public/rss/feed.json b/public/rss/feed.json
new file mode 100644
index 00000000..81429569
--- /dev/null
+++ b/public/rss/feed.json
@@ -0,0 +1,57 @@
+{
+ "version": "https://jsonfeed.org/version/1",
+ "title": "Michał's publications",
+ "home_page_url": "https://michal.sapka.pl",
+ "feed_url": "https://michal.sapka.pl/rss/feed.json",
+ "description": "Michał Sapka's recent publications",
+ "author": {
+ "name": "Michał M. Sapka",
+ "url": "https://michal.sapka.pl"
+ },
+ "items": [
+ {
+ "id": "https://medium.com/@msapka/buffers-splits-and-tabs-in-vim-5bb3b6dc1c19",
+ "content_html": "",
+ "url": "https://medium.com/@msapka/buffers-splits-and-tabs-in-vim-5bb3b6dc1c19",
+ "title": "Buffers, splits and tabs in Vim",
+ "date_modified": "2022-08-17T22:00:00.000Z",
+ "author": {
+ "name": "Michał M. Sapka",
+ "url": "https://michal.sapka.pl"
+ }
+ },
+ {
+ "id": "https://medium.com/@msapka/a-month-with-a-disgusting-thinkpad-936e7c675a74",
+ "content_html": "",
+ "url": "https://medium.com/@msapka/a-month-with-a-disgusting-thinkpad-936e7c675a74",
+ "title": "A month with a disgusting ThinkPad",
+ "date_modified": "2022-08-07T22:00:00.000Z",
+ "author": {
+ "name": "Michał M. Sapka",
+ "url": "https://michal.sapka.pl"
+ }
+ },
+ {
+ "id": "https://medium.com/@msapka/managing-dotfiles-with-gnu-stow-72b4e3bb9434",
+ "content_html": "",
+ "url": "https://medium.com/@msapka/managing-dotfiles-with-gnu-stow-72b4e3bb9434",
+ "title": "Managing dotfiles with GNU Stow",
+ "date_modified": "2022-08-04T22:00:00.000Z",
+ "author": {
+ "name": "Michał M. Sapka",
+ "url": "https://michal.sapka.pl"
+ }
+ },
+ {
+ "id": "https://medium.com/@msapka/adding-dynamic-dns-to-my-home-server-d05bf65358cc",
+ "content_html": "",
+ "url": "https://medium.com/@msapka/adding-dynamic-dns-to-my-home-server-d05bf65358cc",
+ "title": "Adding dynamic DNS to my home server",
+ "date_modified": "2022-08-03T22:00:00.000Z",
+ "author": {
+ "name": "Michał M. Sapka",
+ "url": "https://michal.sapka.pl"
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/public/rss/feed.xml b/public/rss/feed.xml
new file mode 100644
index 00000000..4cdc9f3c
--- /dev/null
+++ b/public/rss/feed.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0">
+ <channel>
+ <title>Michał's publications</title>
+ <link>https://michal.sapka.pl</link>
+ <description>Michał Sapka's recent publications</description>
+ <lastBuildDate>Mon, 05 Sep 2022 20:50:45 GMT</lastBuildDate>
+ <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
+ <generator>Feed for Node.js</generator>
+ <copyright>All rights reserved 2022, Michał M. Sapka</copyright>
+ <item>
+ <title><![CDATA[Buffers, splits and tabs in Vim]]></title>
+ <link>https://medium.com/@msapka/buffers-splits-and-tabs-in-vim-5bb3b6dc1c19</link>
+ <guid>https://medium.com/@msapka/buffers-splits-and-tabs-in-vim-5bb3b6dc1c19</guid>
+ <pubDate>Wed, 17 Aug 2022 22:00:00 GMT</pubDate>
+ <author>michal@sapka.pl (Michał M. Sapka)</author>
+ </item>
+ <item>
+ <title><![CDATA[A month with a disgusting ThinkPad]]></title>
+ <link>https://medium.com/@msapka/a-month-with-a-disgusting-thinkpad-936e7c675a74</link>
+ <guid>https://medium.com/@msapka/a-month-with-a-disgusting-thinkpad-936e7c675a74</guid>
+ <pubDate>Sun, 07 Aug 2022 22:00:00 GMT</pubDate>
+ <author>michal@sapka.pl (Michał M. Sapka)</author>
+ </item>
+ <item>
+ <title><![CDATA[Managing dotfiles with GNU Stow]]></title>
+ <link>https://medium.com/@msapka/managing-dotfiles-with-gnu-stow-72b4e3bb9434</link>
+ <guid>https://medium.com/@msapka/managing-dotfiles-with-gnu-stow-72b4e3bb9434</guid>
+ <pubDate>Thu, 04 Aug 2022 22:00:00 GMT</pubDate>
+ <author>michal@sapka.pl (Michał M. Sapka)</author>
+ </item>
+ <item>
+ <title><![CDATA[Adding dynamic DNS to my home server]]></title>
+ <link>https://medium.com/@msapka/adding-dynamic-dns-to-my-home-server-d05bf65358cc</link>
+ <guid>https://medium.com/@msapka/adding-dynamic-dns-to-my-home-server-d05bf65358cc</guid>
+ <pubDate>Wed, 03 Aug 2022 22:00:00 GMT</pubDate>
+ <author>michal@sapka.pl (Michał M. Sapka)</author>
+ </item>
+ </channel>
+</rss> \ No newline at end of file