Compare commits

...

25 Commits

Author SHA1 Message Date
39f002fae7 oh i need to actually commit the listing file 2026-05-04 10:16:11 -07:00
8adb96f38f work in rate stuff 2026-05-04 10:15:34 -07:00
df88404769 make listings a template 2026-05-04 10:15:21 -07:00
8a6c10cab9 add day to day listings to footer 2026-05-04 09:44:16 -07:00
bda6ae5eb9 new listing and may 4th page 2026-05-04 09:39:34 -07:00
3c94a3b8b9 daily listings page and update daily titles 2026-05-04 09:38:41 -07:00
9790042526 move layout setting to 11data file 2026-05-04 09:38:18 -07:00
d7ea149189 build-codeberg command 2026-05-04 09:37:50 -07:00
2b70a85da2 new listing and add fedi to submit page 2026-05-03 08:38:01 -07:00
7a7e977270 new listings daily roundups rss 2026-05-03 08:11:23 -07:00
d3441c94b0 remove lorem ipsum line 2026-05-02 07:50:57 -07:00
1feda56206 reorg litsings folder and add lots of new ones incl one in progress still 2026-05-02 07:46:55 -07:00
d955cf9c94 remove sample data 2026-05-01 18:32:27 -07:00
d260e7ff6c adrianriskin listing 2026-05-01 18:25:15 -07:00
13960b60c5 drop opacity for sample data even more 2026-05-01 17:10:29 -07:00
bef2373fad add ads tag to listings, title change for listing, some cleanup 2026-05-01 17:07:58 -07:00
576c15a876 mask listing 2026-05-01 16:52:45 -07:00
b37b9117e0 remove embed its been buggy 2026-05-01 16:39:18 -07:00
213316ba2a new listings, business category, a few small tweaks 2026-05-01 16:34:35 -07:00
7f8db19f54 dog training 2026-05-01 12:56:25 -07:00
cd3d7e8848 add alice and nilajones 2026-05-01 12:26:00 -07:00
7e1fbbc484 fix rl for test 06 2026-05-01 12:16:38 -07:00
b09875aea1 fix urls 2026-05-01 12:15:33 -07:00
30712b53a0 add what the hell is c 2026-05-01 11:45:40 -07:00
8cb076de0d spacing, attribution, clearer language 2026-05-01 11:24:29 -07:00
80 changed files with 921 additions and 146 deletions

View File

@ -1,6 +1,14 @@
import { DateTime } from "luxon";
export default function(eleventyConfig) {
eleventyConfig.addFilter("filterByDate", (listings, date) => {
date = DateTime.fromISO(date, { zone: "utc" });
return listings.filter((listing) => {
let postDate = DateTime.fromJSDate(listing.data.date, { zone: "utc" });
return postDate.equals(date);
});
})
// Return the keys used in an object
eleventyConfig.addFilter("getKeys", target => {
return Object.keys(target);
@ -19,12 +27,18 @@ export default function(eleventyConfig) {
case "beauty and health":
tagline = "feelin' good";
break;
case "business":
tagline = "makin' money";
break;
case "food and drink":
tagline = "good eatin'";
break;
case "history and science":
tagline = "book learnin'"
break;
case "miscellany and more":
tagline = "leaves me guessin'";
break;
case "repair and diy":
tagline = "fixin' stuff";
break;
@ -54,7 +68,7 @@ export default function(eleventyConfig) {
/* Filter out structural tags */
eleventyConfig.addFilter("removeCoreTags", (tags) => {
return tags.filter(tag => ["all"].indexOf(tag) === -1);
return tags.filter(tag => ["all", "ads", "daily"].indexOf(tag) === -1);
});
/* What it says on the tin */

View File

@ -1,6 +1,6 @@
export default {
title: "Fediverse Skillshare Classifieds",
description: "Skillshares and more",
url: "",
description: "Skillshare listings for the Fediverse",
url: "https://inherentlee.codeberg.page/fedi-skillshares",
author: "Lee Cattarin"
}

View File

@ -0,0 +1,16 @@
<div id="listings">
{% for tag in collections | getKeys | removeCoreTags | sortAlphabetically %}
<div class="category">
<div class="category-title">
<h2>{{ tag }}</h2>
<p>{{ tag | getTagline }}</p>
</div>
{% if collections[tag] | filterByDate(today) | length == 0 %}
<p>No listings.</p>
{% endif %}
{% for listing in collections[tag] | filterByDate(today) %}
{% include "listing.njk" %}
{% endfor %}
</div>
{% endfor %}
</div>

View File

@ -3,6 +3,12 @@
<li>
maintained by <a href="https://leecat.art" target="_blank">lee</a>
</li>
<li>
<a href="/daily/">Listings by day</a>
</li>
<li>
<a href="/feed.xml">RSS</a>
</li>
<li>
<a href="https://heckin.technology/inherentlee/fedi-classifieds"
target="_blank">source code</a>

16
_includes/listing.njk Normal file
View File

@ -0,0 +1,16 @@
<div class="listing{% if listing.data.draft %} draft{% endif %}">
<h3>{{ listing.data.title }}</h3>
<p class="blurb">
<strong>
<a href="https://{{ listing.data.url }}"
target="_blank">{{ listing.data.handle }}</a>
offers:</strong> {{ listing.data.blurb }}
</p>
{% if listing.data.rate %}
<p>Suggested rate: {{ listing.data.rate }}</p>
{% endif %}
<p class="listed-on">
listed on <time datetime="{{ listing.date | htmlDateString }}"
>{{ listing.date | readableDate() }}</time>
</p>
</div>

View File

@ -2,7 +2,7 @@
columns: 3;
}
@media (max-width: 1050px) {
@media (max-width: 1200px) {
#listings {
columns: 2;
}
@ -107,18 +107,3 @@
font-size: .85rem;
text-align: right;
}
/* Handling for sample data and wip stuff */
.draft h3,
.draft p {
opacity: .6;
}
.wip {
border-top: solid var(--color-pink);
border-bottom: solid var(--color-pink);
border-left: .5rem solid var(--color-cyan);
border-right: .5rem solid var(--color-cyan);
padding: 1rem 1rem 0;
margin: 1rem 0 2rem;
}

View File

@ -1,4 +1,7 @@
nav,
nav {
padding: .25rem 0 1rem;
}
footer {
padding: 1rem 0;
}

View File

@ -1,5 +1,5 @@
import { HtmlBasePlugin } from "@11ty/eleventy";
import { IdAttributePlugin } from "@11ty/eleventy";
import { HtmlBasePlugin, IdAttributePlugin } from "@11ty/eleventy";
import { feedPlugin } from "@11ty/eleventy-plugin-rss";
import pluginFilters from "./_config/filters.js";
@ -32,6 +32,32 @@ export default async function(eleventyConfig) {
/* `id` attributes */
eleventyConfig.addPlugin(IdAttributePlugin);
/* RSS */
eleventyConfig.addPlugin(feedPlugin, {
type: "atom", // or "rss", "json"
outputPath: "/feed.xml",
collection: {
name: "daily", // iterate over `collections.posts`
limit: 10, // 0 means no limit
},
metadata: {
language: "en",
title: "Fediverse Skillshare Classifieds",
subtitle: "Skillshare listings for the Fediverse",
base: "https://inherentlee.codeberg.page/",
author: {
name: "Lee Cattarin"
}
}
});
/* Draft handling */
eleventyConfig.addPreprocessor("drafts", "*", (data, content) => {
if(data.draft) {
return false;
}
});
/* Shortcodes */
eleventyConfig.addShortcode("currentBuildDate", () => {
return (new Date()).toISOString();

17
node_modules/.package-lock.json generated vendored
View File

@ -129,6 +129,23 @@
"url": "https://opencollective.com/11ty"
}
},
"node_modules/@11ty/eleventy-plugin-rss": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-3.0.0.tgz",
"integrity": "sha512-kKW4DcR57xAyRx0e8gNhKh56ahHVEaAj8/TuXQDnw+B46ig2bWADJAlyj/GdV37IG5ja9dZ4SgKZrs/CHz6YWQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@11ty/eleventy-utils": "^2.0.7",
"@11ty/posthtml-urls": "^1.0.2",
"debug": "^4.4.3",
"posthtml": "^0.16.7"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/11ty"
}
},
"node_modules/@11ty/eleventy-utils": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz",

20
node_modules/@11ty/eleventy-plugin-rss/.eleventy.js generated vendored Normal file
View File

@ -0,0 +1,20 @@
import rssPlugin from "./src/rssPlugin.js";
import dateRfc3339 from "./src/dateRfc3339.js";
import dateRfc822 from "./src/dateRfc822.js";
import getNewestCollectionItemDate from "./src/getNewestCollectionItemDate.js";
import virtualTemplate from "./src/virtualTemplate.js";
import absoluteUrl from "./src/absoluteUrl.js";
import convertHtmlToAbsoluteUrls from "./src/htmlToAbsoluteUrls.js";
export default rssPlugin;
export {
rssPlugin,
virtualTemplate as feedPlugin,
dateRfc3339 as dateToRfc3339,
dateRfc822 as dateToRfc822,
getNewestCollectionItemDate as getNewestCollectionItemDate,
absoluteUrl as absoluteUrl,
convertHtmlToAbsoluteUrls as convertHtmlToAbsoluteUrls
};

21
node_modules/@11ty/eleventy-plugin-rss/LICENSE generated vendored Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Zach Leatherman @zachleat
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

34
node_modules/@11ty/eleventy-plugin-rss/README.md generated vendored Normal file
View File

@ -0,0 +1,34 @@
<p align="center"><img src="https://www.11ty.dev/img/logo-github.svg" width="200" height="200" alt="11ty Logo"></p>
# eleventy-plugin-rss 🕚⚡️🎈🐀
A pack of [Eleventy](https://github.com/11ty/eleventy) filters for generating Atom, JSON and RSS feeds using the Nunjucks templating engine.
See `sample/feed.njk` for an example Atom feed template, `sample/feed.json` for an example JSON feed template, or `sample/feed-rss.njk` for an example RSS feed template.
## [The full `eleventy-plugin-rss` documentation is on 11ty.dev](https://www.11ty.dev/docs/plugins/rss/).
* _This is a plugin for the [Eleventy static site generator](https://www.11ty.dev/)._
* Find more [Eleventy plugins](https://www.11ty.dev/docs/plugins/).
* Please star [Eleventy on GitHub](https://github.com/11ty/eleventy/), follow [@eleven_ty](https://twitter.com/eleven_ty) on Twitter, and support [11ty on Open Collective](https://opencollective.com/11ty)
[![npm Version](https://img.shields.io/npm/v/@11ty/eleventy-plugin-rss.svg?style=for-the-badge)](https://www.npmjs.com/package/@11ty/eleventy-plugin-rss) [![GitHub issues](https://img.shields.io/github/issues/11ty/eleventy-plugin-rss.svg?style=for-the-badge)](https://github.com/11ty/eleventy-plugin-rss/issues)
## Installation
```
npm install @11ty/eleventy-plugin-rss
```
_[The full `eleventy-plugin-rss` documentation is on 11ty.dev](https://www.11ty.dev/docs/plugins/rss/)._
## Tests
```
npm run test
```
- We use the [ava JavaScript test runner](https://github.com/avajs/ava) ([Assertions documentation](https://github.com/avajs/ava/blob/master/docs/03-assertions.md))
- To keep tests fast, thou shalt try to avoid writing files in tests.

50
node_modules/@11ty/eleventy-plugin-rss/package.json generated vendored Normal file
View File

@ -0,0 +1,50 @@
{
"name": "@11ty/eleventy-plugin-rss",
"version": "3.0.0",
"type": "module",
"description": "Generate an Atom, RSS, or JSON feed.",
"publishConfig": {
"access": "public"
},
"main": ".eleventy.js",
"scripts": {
"test": "npx ava",
"sample": "cd sample && npx @11ty/eleventy --config=config-sample.js --pathprefix=pathprefix",
"clean": "rm -rf sample/_site"
},
"repository": {
"type": "git",
"url": "git+https://github.com/11ty/eleventy-plugin-rss.git"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/11ty"
},
"keywords": [
"eleventy",
"eleventy-plugin"
],
"author": {
"name": "Zach Leatherman",
"email": "zachleatherman@gmail.com",
"url": "https://zachleat.com/"
},
"license": "MIT",
"bugs": {
"url": "https://github.com/11ty/eleventy-plugin-rss/issues"
},
"homepage": "https://www.11ty.dev/docs/plugins/rss/",
"11ty": {
"compatibility": ">=3.0.0-alpha.15"
},
"devDependencies": {
"@11ty/eleventy": "^3.1.5",
"ava": "^6.4.1"
},
"dependencies": {
"@11ty/eleventy-utils": "^2.0.7",
"@11ty/posthtml-urls": "^1.0.2",
"debug": "^4.4.3",
"posthtml": "^0.16.7"
}
}

View File

@ -0,0 +1,13 @@
import debugUtil from "debug";
const debug = debugUtil("Eleventy:Rss");
// This is deprecated! Use the Eleventy HTML <base> plugin instead (2.0+)
export default function(url, base) {
try {
return (new URL(url, base)).toString()
} catch(e) {
debug("Trying to convert %o to be an absolute url with base %o and failed, returning: %o (invalid url)", url, base, url)
// TODO add debug output!
return url;
}
};

View File

@ -0,0 +1,11 @@
// Atom uses RFC 3339 dates
// https://tools.ietf.org/html/rfc3339#section-5.8
export default function(dateObj) {
let s = dateObj.toISOString();
// remove milliseconds
let split = s.split(".");
split.pop();
return split.join("") + "Z";
}

View File

@ -0,0 +1,23 @@
export default function pubDateRFC822(value, timeZone = undefined) {
const date = new Date(value);
const options = {
weekday: 'short',
day: '2-digit',
month: 'short',
year: 'numeric',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hourCycle: 'h23',
timeZone: timeZone,
timeZoneName: 'longOffset',
};
const formattedDate = new Intl.DateTimeFormat('en-US', options).format(date);
const [wkd, mmm, dd, yyyy, time, z] = formattedDate.replace(/([,\s]+)/g, ' ').split(' ');
const tz = z.replace(/GMT(?<sign>\+|\-)(?<hour>\d\d):(?<minute>\d\d)/, '$<sign>$<hour>$<minute>');
return `${wkd}, ${dd} ${mmm} ${yyyy} ${time} ${tz}`;
}

View File

@ -0,0 +1,7 @@
export default function(collection, emptyFallbackDate) {
if( !collection || !collection.length ) {
return emptyFallbackDate || new Date();
}
return new Date(Math.max(...collection.map(item => {return item.date})));
}

View File

@ -0,0 +1,21 @@
import posthtml from 'posthtml';
import urls from '@11ty/posthtml-urls';
import absoluteUrl from "./absoluteUrl.js";
// This is deprecated! Use the Eleventy HTML <base> plugin instead (2.0+)
export default async function(htmlContent, base, processOptions = {}) {
if( !base ) {
throw new Error( "eleventy-plugin-rss: htmlToAbsoluteUrls(absolutePostUrl) was missing the full URL base `absolutePostUrl` argument.")
}
let options = {
eachURL: function(url) {
return absoluteUrl(url.trim(), base);
}
};
let modifier = posthtml().use(urls(options));
let result = await modifier.process(htmlContent, processOptions);
return result.html;
};

View File

@ -0,0 +1,60 @@
import pkg from "../package.json" with {type: "json"};
import dateRfc3339 from "./dateRfc3339.js";
import dateRfc822 from "./dateRfc822.js";
import getNewestCollectionItemDate from "./getNewestCollectionItemDate.js";
import absoluteUrl from "./absoluteUrl.js";
import convertHtmlToAbsoluteUrls from "./htmlToAbsoluteUrls.js";
export default function eleventyRssPlugin(eleventyConfig, options = {}) {
eleventyConfig.versionCheck(pkg["11ty"].compatibility);
// Guaranteed unique, first add wins
const pluginHtmlBase = eleventyConfig.resolvePlugin("@11ty/eleventy/html-base-plugin");
eleventyConfig.addPlugin(pluginHtmlBase, options.htmlBasePluginOptions || {});
// Dates
eleventyConfig.addNunjucksFilter("getNewestCollectionItemDate", getNewestCollectionItemDate);
eleventyConfig.addNunjucksFilter("dateToRfc3339", dateRfc3339);
eleventyConfig.addNunjucksFilter("dateToRfc822", dateRfc822);
// Deprecated in favor of the more efficient HTML <base> plugin bundled with Eleventy
eleventyConfig.addNunjucksFilter("absoluteUrl", absoluteUrl);
// Deprecated in favor of the more efficient HTML <base> plugin bundled with Eleventy
eleventyConfig.addNunjucksAsyncFilter("htmlToAbsoluteUrls", (htmlContent, base, callback) => {
if(!htmlContent) {
callback(null, "");
return;
}
let posthtmlOptions = Object.assign({
// default PostHTML render options
closingSingleTag: "slash"
}, options.posthtmlRenderOptions);
convertHtmlToAbsoluteUrls(htmlContent, base, posthtmlOptions).then(html => {
callback(null, html);
});
});
// These are removed, their names are incorrect! Issue #8, #21
eleventyConfig.addNunjucksFilter("rssLastUpdatedDate", () => {
throw new Error("The `rssLastUpdatedDate` filter was removed. Use `getNewestCollectionItemDate | dateToRfc3339` (for Atom) or `getNewestCollectionItemDate | dateToRfc822` (for RSS) instead.")
});
eleventyConfig.addNunjucksFilter("rssDate", () => {
throw new Error("The `rssDate` filter was removed. Use `dateToRfc3339` (for Atom) or `dateToRfc822` (for RSS) instead.");
});
};
Object.defineProperty(eleventyRssPlugin, "eleventyPackage", {
value: pkg.name
});
Object.defineProperty(eleventyRssPlugin, "eleventyPluginOptions", {
value: {
unique: true
}
});

View File

@ -0,0 +1,204 @@
import debugUtil from "debug";
import pkg from "../package.json" with {type: "json"};
import { DeepCopy } from "@11ty/eleventy-utils";
import rssPlugin from "./rssPlugin.js";
const debug = debugUtil("Eleventy:Rss:Feed");
function getFeedContent({ type, stylesheet, collection, script }) {
// Note: page.lang comes from the i18n plugin: https://www.11ty.dev/docs/plugins/i18n/#page.lang
if(type === "rss") {
// Nunjucks template
return `<?xml version="1.0" encoding="utf-8"?>
${stylesheet ? `<?xml-stylesheet href="${stylesheet}" type="text/xsl"?>\n` : ""}<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="{{ metadata.base | addPathPrefixToFullUrl }}" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
${script ? `<script src="${script}" xmlns="http://www.w3.org/1999/xhtml"></script>` : ""}
<title>{{ metadata.title }}</title>
<link>{{ metadata.base | addPathPrefixToFullUrl }}</link>
<atom:link href="{{ permalink | htmlBaseUrl(metadata.base) }}" rel="self" type="application/rss+xml" />
<description>{{ metadata.subtitle }}</description>
<language>{{ metadata.language or page.lang }}</language>
{%- if metadata.icon %}<image>{{ metadata.icon }}</image>{%- endif %}
{%- for post in collections.${collection.name} | reverse | eleventyFeedHead(${collection.limit}) %}
{%- set absolutePostUrl = post.url | htmlBaseUrl(metadata.base) %}
<item>
<title>{{ post.data.title }}</title>
<link>{{ absolutePostUrl }}</link>
{%- if (post.data.summary) -%}
<description>{{ post.data.summary }}</description>
<content:encoded>{{ post.content | renderTransforms(post.data.page, metadata.base) }}</content:encoded>
{%- else -%}
<description>{{ post.content | renderTransforms(post.data.page, metadata.base) }}</description>
{%- endif -%}
<pubDate>{{ post.date | dateToRfc822 }}</pubDate>
<dc:creator>{{ metadata.author.name }}</dc:creator>
<guid>{{ absolutePostUrl }}</guid>
</item>
{%- endfor %}
</channel>
</rss>`;
}
if(type === "atom") {
// Nunjucks template
return `<?xml version="1.0" encoding="utf-8"?>
${stylesheet ? `<?xml-stylesheet href="${stylesheet}" type="text/xsl"?>\n` : ""}<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="{{ metadata.language or page.lang }}">
${script ? `<script src="${script}" xmlns="http://www.w3.org/1999/xhtml"></script>` : ""}
<title>{{ metadata.title }}</title>
<subtitle>{{ metadata.subtitle }}</subtitle>
<link href="{{ permalink | htmlBaseUrl(metadata.base) }}" rel="self" />
<link href="{{ metadata.base | addPathPrefixToFullUrl }}" />
<updated>{{ collections['${collection.name}'] | getNewestCollectionItemDate | dateToRfc3339 }}</updated>
<id>{{ metadata.base | addPathPrefixToFullUrl }}</id>
{%- if metadata.icon %}
<icon>{{ metadata.icon }}</icon>
{%- endif %}
{%- if metadata.logo %}
<icon>{{ metadata.logo }}</icon>
{%- endif %}
<author>
<name>{{ metadata.author.name }}</name>
{%- if metadata.author.email %}
<email>{{ metadata.author.email }}</email>
{%- endif %}
</author>
{%- for post in collections['${collection.name}'] | reverse | eleventyFeedHead(${collection.limit}) %}
{%- set absolutePostUrl %}{{ post.url | htmlBaseUrl(metadata.base) }}{% endset %}
<entry>
<title>{{ post.data.title }}</title>
<link href="{{ absolutePostUrl }}" />
<updated>{{ post.date | dateToRfc3339 }}</updated>
<id>{{ absolutePostUrl }}</id>
{%- if post.data.summary %}
<summary>{{ post.data.summary }}</summary>
{%- endif %}
<content type="html">{{ post.content | renderTransforms(post.data.page, metadata.base) }}</content>
</entry>
{%- endfor %}
</feed>`;
}
if(type === "json") {
return `{
"version": "https://jsonfeed.org/version/1.1",
"title": "{{ metadata.title }}",
"language": "{{ metadata.language or page.lang }}",
"home_page_url": "{{ metadata.base | addPathPrefixToFullUrl }}",
"feed_url": "{{ permalink | htmlBaseUrl(metadata.base) }}",
"description": "{{ metadata.description }}",
"authors": [
{
"name": "{{ metadata.author.name }}"{% if metadata.author.email %},
"url": "mailto:{{ metadata.author.email }}"
{%- endif %}
}
],
"items": [
{%- for post in collections['${collection.name}'] | reverse | eleventyFeedHead(${collection.limit}) %}
{%- set absolutePostUrl %}{{ post.url | htmlBaseUrl(metadata.base) }}{% endset %}
{
"id": "{{ absolutePostUrl }}",
"url": "{{ absolutePostUrl }}",
"title": "{{ post.data.title }}",
"content_html": {% if post.content %}{{ post.content | renderTransforms(post.data.page, metadata.base) | dump | safe }}{% else %}""{% endif %},
"date_published": "{{ post.date | dateToRfc3339 }}"
}
{% if not loop.last %},{% endif %}
{%- endfor %}
]
}`
}
throw new Error("Missing or invalid feed type. Received: " + type);
}
export default function eleventyFeedPlugin(eleventyConfig, options = {}) {
eleventyConfig.versionCheck(pkg["11ty"].compatibility);
// Guaranteed unique, first add wins
const pluginHtmlBase = eleventyConfig.resolvePlugin("@11ty/eleventy/html-base-plugin");
eleventyConfig.addPlugin(pluginHtmlBase, options.htmlBasePluginOptions || {});
// Guaranteed unique, first add wins
eleventyConfig.addPlugin(rssPlugin, options.rssPluginOptions || {});
let slugifyFilter = eleventyConfig.getFilter("slugify");
let inputPathSuffix = options?.metadata?.title ? `-${slugifyFilter(options?.metadata?.title)}` : "";
options = DeepCopy({
// rss and json also supported
type: "atom",
collection: {
name: false, // required
limit: 0, // limit number of entries, 0 means no limit
},
outputPath: "/feed.xml",
inputPath: `eleventy-plugin-feed${inputPathSuffix}-${options.type || "atom"}.njk`, // TODO make this more unique
templateData: {},
metadata: {
title: "Blog Title",
subtitle: "This is a longer description about your blog.",
language: "", // downstream templates use `page.lang` as fallback
base: "https://example.com/",
author: {
name: "Your Name",
email: "", // Optional
}
}
}, options);
if(!options.collection?.name) {
throw new Error("Missing `collection.name` option in feedPlugin from @11ty/eleventy-plugin-rss.");
}
if(typeof options.collection?.name !== "string") {
throw new Error("Only string is supported in `collection.name` option in feedPlugin from @11ty/eleventy-plugin-rss. Received: " + typeof options.collection?.name);
}
let eleventyExcludeFromCollections;
let eleventyImport;
if(options.collection.name === "all") {
eleventyExcludeFromCollections = true;
eleventyImport = {};
} else {
eleventyExcludeFromCollections = [ options.collection.name ]
eleventyImport = {
collections: [ options.collection.name ],
};
}
let templateData = {
...options?.templateData || {},
permalink: options.outputPath,
eleventyExcludeFromCollections,
eleventyImport,
layout: false,
metadata: options.metadata,
};
// Get the first `n` elements of a collection.
eleventyConfig.addFilter("eleventyFeedHead", function(array, n) {
if(!n || n === 0) {
return array;
}
if(n < 0) {
return array.slice(n);
}
return array.slice(0, n);
});
eleventyConfig.addTemplate(options.inputPath, getFeedContent(options), templateData);
};
Object.defineProperty(eleventyFeedPlugin, "eleventyPackage", {
value: `${pkg.name}/feed-plugin`
});
Object.defineProperty(eleventyFeedPlugin, "eleventyPluginOptions", {
value: {
// multiple adds of this one is OK
unique: false
}
});

18
package-lock.json generated
View File

@ -10,6 +10,7 @@
"license": "AGPL-3.0-only",
"devDependencies": {
"@11ty/eleventy": "^3.1.5",
"@11ty/eleventy-plugin-rss": "^3.0.0",
"luxon": "^3.7.2"
}
},
@ -138,6 +139,23 @@
"url": "https://opencollective.com/11ty"
}
},
"node_modules/@11ty/eleventy-plugin-rss": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-3.0.0.tgz",
"integrity": "sha512-kKW4DcR57xAyRx0e8gNhKh56ahHVEaAj8/TuXQDnw+B46ig2bWADJAlyj/GdV37IG5ja9dZ4SgKZrs/CHz6YWQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@11ty/eleventy-utils": "^2.0.7",
"@11ty/posthtml-urls": "^1.0.2",
"debug": "^4.4.3",
"posthtml": "^0.16.7"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/11ty"
}
},
"node_modules/@11ty/eleventy-utils": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz",

View File

@ -3,7 +3,8 @@
"version": "1.0.0",
"description": "",
"scripts": {
"build": "rm -rf _site && npx @11ty/eleventy --pathprefix=fedi-skillshares",
"build": "rm -rf _site && npx @11ty/eleventy",
"build-codeberg": "rm -rf _site && npx @11ty/eleventy --pathprefix=fedi-skillshares",
"dev": "rm -rf _live && npx @11ty/eleventy --serve --quiet --output _live"
},
"keywords": [],
@ -12,6 +13,7 @@
"type": "module",
"devDependencies": {
"@11ty/eleventy": "^3.1.5",
"@11ty/eleventy-plugin-rss": "^3.0.0",
"luxon": "^3.7.2"
}
}

View File

@ -1,5 +1,4 @@
---
layout: base.njk
title: About the Classifieds
---
@ -29,20 +28,24 @@ title: About the Classifieds
<h2>Is this paid?</h2>
<p>
At current, the assumption is that these are free skillshares. If there's demand
for listings for paid skillshares, I can add that field to this listings and
let folks specify rate/pro bono. Pretty up to y'all. Let me know.
Some listings may have a stated rate, whether that is monetary, skill swap, or free.
If there's no stated rate, free is assumed. Feel free to talk to the person/people
you reach out to about compensation!
</p>
<h2>How do I let you know?</h2>
<h2>Who made this?</h2>
<p>
You can find all my contact methods on the site linked in the footer, or just
Hi, I'm Lee! I like to make silly little websites. You can find all my contact
methods on the site linked to my name in the footer, or just
<a href="https://flipping.rocks/@inherentlee" target="_blank">send me a message
on fedi</a>.
</p>
<h2>When does all the Lorem Ipsum go away?</h2>
<h2>Colophon</h2>
<p>
After you add your listing.
Built with <a href="https://11ty.dev" target="_blank">{{ eleventy.generator }}</a>,
and <a href="https://declare-ai.org/1.0.0/none.html" target="_blank">without the
aid of generative AI</a>. Hosted on Codeberg Pages.
</p>

View File

@ -1,9 +0,0 @@
---
title: film photography
handle: 00
server: test.test
draft: true
tags: art and crafts
blurb: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
date: 2026-04-21
---

View File

@ -1,9 +0,0 @@
---
title: let's talk about the roman empire
handle: 01
server: test.test
draft: true
tags: history and science
blurb: Quisque mauris erat, tempor non egestas sollicitudin, feugiat id risus. Duis eget ornare nunc. Cras sodales, eros quis finibus luctus, enim sem dictum ante, sed sodales ipsum ante a metus.
date: 2026-04-22
---

View File

@ -1,9 +0,0 @@
---
title: neurodivergent coping strats
handle: 02
server: test.test
draft: true
tags: interpersonal and life
blurb: Fusce faucibus mauris ut metus molestie viverra. In varius erat in lectus scelerisque, vitae ornare sapien euismod. Pellentesque ornare aliquam erat, pellentesque eleifend tellus consequat ut. Donec mollis, lacus vitae bibendum hendrerit, nisi metus dignissim lacus, nec tincidunt nisl ligula vel metus.
date: 2026-04-23
---

View File

@ -1,9 +0,0 @@
---
title: editing 102
handle: 03
server: test.test
draft: true
tags: writing editing and literature
blurb: Sed a commodo lectus. Curabitur tincidunt, eros vel mollis dapibus, mauris dui pharetra mauris, et dapibus leo nisi vitae eros.
date: 2026-04-24
---

View File

@ -1,9 +0,0 @@
---
title: sourdough starting!
handle: 04
server: test.test
draft: true
tags: food and drink
blurb: Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Vivamus vitae augue ac neque congue pellentesque vitae a enim. Donec euismod dolor sit amet dui dapibus posuere. Donec eget blandit ligula, ac tempor nunc.
date: 2026-04-25
---

View File

@ -1,9 +0,0 @@
---
title: bug identification for beginners
handle: 05
server: test.test
draft: true
tags: animals and the outdoors
blurb: Duis interdum purus non iaculis convallis. Nunc mi lorem, consequat sed luctus vitae, lobortis in arcu.
date: 2026-04-26
---

View File

@ -1,9 +0,0 @@
---
title: fix your sink or toilet
handle: 06
server: test.test
draft: true
tags: repair and diy
blurb: Aliquam justo justo, scelerisque a ligula sed, elementum pharetra quam. Ut augue nibh, finibus vel dui nec, sagittis bibendum leo. Quisque libero diam, maximus in dui ac, sollicitudin congue enim.
date: 2026-04-27
---

View File

@ -1,7 +1,7 @@
---
title: Navigating Workplace Transition
handle: 07
server: test.test
handle: "@07@test.test"
url: "test.test/@07"
draft: true
tags: interpersonal and life
blurb: Donec nisl ligula, mollis sit amet gravida eget, aliquam vitae nibh. Fusce diam nulla, interdum a ex a, semper lacinia elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc lacinia fermentum arcu, molestie ornare purus lobortis eget. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nunc convallis turpis nisi, nec volutpat dui semper at.

View File

@ -1,9 +0,0 @@
---
title: Picking the right haircut
handle: 08
server: test.test
draft: true
tags: beauty and health
blurb: Duis nec varius dui. In mauris neque, scelerisque sed commodo accumsan, sodales vitae tortor.
date: 2026-04-30
---

View File

@ -1,3 +1,6 @@
export default {
permalink: false,
tags: [
"ads"
]
};

View File

@ -0,0 +1,5 @@
export default {
tags: [
"animals and the outdoors"
]
};

View File

@ -0,0 +1,7 @@
---
title: Dog training
handle: "@Goodworkdog@sunny.garden"
url: "sunny.garden/@Goodworkdog"
blurb: "I can advise you on animal behavior, enrichment, problem solving, multi-pet homes, dog sports, and changes in home life. I have multiple certifications. I cant offer veterinary advice, but I will tell you when to see a vet instead of a trainer."
date: 2026-05-01
---

View File

@ -0,0 +1,7 @@
---
title: "🌿Home gardening - including low spoons 🪴🧑🏼‍🦽"
handle: "@NilaJones@zeroes.ca"
url: "zeroes.ca/@NilaJones"
blurb: "Want to grow a few herbs or flowers on your balcony? Or enough food to feed your family for a year? Something in between? I've been doing and teaching organic gardening for a long long time, and I love to answer questions or brainstorm together 🌿"
date: 2026-05-01
---

View File

@ -0,0 +1,7 @@
---
title: "Intimacy with Plants - Discovering Their Unique Features"
handle: "@taq@thicc.horse"
url: "thicc.horse/@taq"
blurb: "Not focused on plant care or identification, but building curiosity and awareness of the features of plants which help with identification. Enjoy walks more by taking the time to explore the differences in each plant. Leaf shape, texture, size and growth patterns, symmetries. Soon you'll be recognizing old friends from across the street!"
date: 2026-05-02
---

View File

@ -0,0 +1,7 @@
---
title: Foraging in the UK
handle: "@worshipthesquid@weirder.earth"
url: "weirder.earth/@worshipthesquid"
blurb: "I'm happy to share responsible UK plant foraging skills, including figuring out how you can get started. I'm in Scotland (but the rest of the UK shares a lot of the same plants). (Also always excited to hear about others' foraging and plant connection!)"
date: 2026-05-04
---

View File

@ -0,0 +1,5 @@
export default {
tags: [
"art and crafts"
]
};

View File

@ -0,0 +1,7 @@
---
title: "I can help you get started with recording music"
handle: "@JessicatheVIArtist@kind.social"
url: "kind.social/@JessicatheVIArtist"
blurb: "If you're just starting out with a digital audio workstation, I can help you understand concepts. How do I record myself, what are takes, and how do I make myself sound good? What the heck are pre- and post-fader sends, and what on earth is MIDI?? I can also help you understand synthesis if you've got a hardware or software synth you'd like to tame. What are oscillators, filters, envelopes and LFOs and how do I create a whole new sound? If you've got a website or app you're developing, I can also offer feedback on its accessibility to screen reader users."
date: 2026-05-02
---

View File

@ -0,0 +1,7 @@
---
title: "Art/design critique and encouragement"
handle: "@moss@kind.social"
url: "kind.social/@moss"
blurb: "I am a visual jack of all trades, pretty experienced in some. Creative critique & external support is a really great way to grow as an artist or designer (those titles used here in the broadest sense possible). Whether youre starting a project, stuck on a piece and trying to discern next steps, or its a finished project you want to reflect on, Im happy to give whatever balance of kind constructive critique &/or positive reinforcement you need. My best mediums are in no particular order: fountain pens & ink, photography, lighting & production design, analog/irl interaction design, visual narratives, and installation/themed environments. Ive taken classes in & enjoyed digital painting, game design, neon art, ceramics and many more. Im less skilled in audio, software, & film/video. I also enjoy creative research, as well as brainstorming how to make your interests adaptive and accessible for different kinds of disabilities & health challenges. (I have limited spoons so please check in with me on my bandwidth/timelines, and Id love to swap skills, especially if youre looking for a lot of support!)"
date: 2026-05-02
---

View File

@ -0,0 +1,5 @@
export default {
tags: [
"beauty and health"
]
};

View File

@ -0,0 +1,7 @@
---
title: Making the Respirator and Masking Experience Better
handle: "@Texan_Reverend@kind.social"
url: "kind.social/@Texan_Reverend"
blurb: Are you interested in a mask or respirator to protect you from wildfire smoke, pathogens, construction dust, or allergens? Are people close to you asking that you mask up, but it's uncomfortable or hard to get in the habit? I can help with... Finding models of a good size and shape. Adjustments to achieve a good fit and seal. Safe and effective modifications. Fun and engaging decorations. Learning more about how respirators work and how they're tested.
date: 2026-05-01
---

View File

@ -0,0 +1,7 @@
---
title: "AMA about parkrun"
handle: "@thegiddystitcher@sunny.garden"
url: "sunny.garden/@thegiddystitcher"
blurb: "Parkrun is a free weekly 5k event run by volunteers around the world. Talk to me to learn more about it, how to join, whether you're welcome at your level of fitness (yes), what it's like to volunteer. No question too anxious!"
date: 2026-05-03
---

View File

@ -0,0 +1,5 @@
export default {
tags: [
"business"
]
};

View File

@ -0,0 +1,7 @@
---
title: Answers to Your Silly Marketing Questions
handle: "@mariyadelano@hachyderm.io"
url: "hachyderm.io/@mariyadelano"
blurb: I want to answer marketing questions that you have been too afraid to ask. The sillier your question, the better! Examples for inspiration... why would I want to collect peoples emails for a list? Why do SEO blogs look like that? How did LinkedIn posts become this particular kind of cringe? Why does nobody think my website is the coolest thing since sliced bread? Be brave and maybe we will all learn something.
date: 2026-05-01
---

View File

@ -0,0 +1,7 @@
---
title: "How do I make this without meat/dairy/eggs?!"
handle: "@cthulku@zeroes.ca"
url: "zeroes.ca/@cthulku"
blurb: "I am a food dork with a couple decades' experience with both vegan and vegetarian (ovo-lacto) cookery, and I quite enjoy finding ways to make normally omnivorous dishes vegetarian. While I'm not one to build a homebrew Beyond burger, I have experience with a wide range of vegan proteins and preparations, as well as techniques and tips that I've picked up over the years, to make something that may not fool an omnivore, but will still be delicious! I'm thinking of more of a Q&A type service, rather than any kind of structured lesson, but every journey begins with a single step and all that."
date: 2026-05-02
---

View File

@ -0,0 +1,5 @@
export default {
tags: [
"food and drink"
]
};

View File

@ -0,0 +1,7 @@
---
title: How To Drink Wine
handle: "@lifertate@mas.to"
url: "mas.to/@liferstate"
blurb: If you've ever felt intimidated by the supermarket wine aisle, or wanted something better but not known where to start, I can help. Like food, wine tells stories about geography, history, politics. I can advise you on food pairings, lesser known regions/grape varieties, how to get a good deal, and what *not* to buy. Don't ask an app what you should drink - ask me! Unlike the people in the app, I know what I'm about and I will not bullshit you.
date: 2026-05-02
---

View File

@ -0,0 +1,7 @@
---
title: pure math Q&A
handle: "@AdrianRiskin@kolektiva.social"
url: "kolektiva.social/@AdrianRiskin"
blurb: I am happy to help with K-12 math, undergraduate pure math, e.g. college algebra, precalc, calc, discrete, intro to proof, abstract algebra, number theory, analysis, etc. Also graduate level graph theory.
date: 2026-05-01
---

View File

@ -0,0 +1,5 @@
export default {
tags: [
"history and science"
]
};

View File

@ -0,0 +1,7 @@
---
title: Applied statistics
handle: "@minmi@sfba.social"
url: "sfba.social/@minmi"
blurb: "I am happy to answer any questions about statistics and data analysis. Whether its homework, curiosity, trying to understand a study or run an analysis, happy to share what I know!"
date: 2026-05-02
---

View File

@ -0,0 +1,7 @@
---
title: Ask a math teacher
handle: "@TonyaMarie@chaosfem.tw"
url: "chaosfem.tw/@TonyaMarie"
blurb: "Need help with your kid's homework? Going back to school? Retired teacher will help with your math questions up through basic college level!"
date: 2026-05-01
---

View File

@ -0,0 +1,5 @@
export default {
tags: [
"interpersonal and life"
]
};

View File

@ -0,0 +1,7 @@
---
title: "Learn Lockpicking with Alice"
handle: "@alice@lgbtqia.space"
url: "lgbtqia.space/@alice"
blurb: "I've been an expert at opening things in unconventional ways for many years, and I'm always happy to talk locks, lockpicking/bypassing, and other security-related topics. I have short lessons under the #LearnLockpickingWithAlice hashtag on Fedi."
date: 2026-05-01
---

View File

@ -0,0 +1,5 @@
export default {
tags: [
"miscellany and more"
]
};

View File

@ -0,0 +1,7 @@
---
title: "Wind-up and Acoustic Record Players"
handle: "@Essanay@sfba.social"
url: "sfba.social/@Essanay"
blurb: "Do you have an old Victrola or Edison cylinder player that doesn't work? I've fixed a bunch of them and I can help diagnose problems, and maybe even help you fix it. And if you're anywhere near me (Northern California) I could even come take a look at it. This account is for the Niles Essanay Silent FIlm Museum, in Fremont CA, where we have several restored machines on display. I can also give advice on handling of movies (on physical film) and I'm learning how to fix projectors."
date: 2026-05-03
---

View File

@ -0,0 +1,7 @@
---
title: "How To Mend Things"
handle: "@iris@neuromatch.social"
url: "neuromatch.social/@iris"
blurb: "I attempt to fix everything, some of it succeeds. Bring me (virtually) your thing that is damaged and we can assess whether it is, or can shortly be, within your capabilities (and current inventory of tools and materials) to fix it. Examples: favorite mug cracked, zipper broke, office chair sinking, backpack falling apart."
date: 2026-05-02
---

View File

@ -0,0 +1,5 @@
export default {
tags: [
"repair and diy"
]
};

View File

@ -0,0 +1,7 @@
---
title: "Emotional support and technical advice when repairing your bicycle"
handle: "@TheSecondVariation@graz.social"
url: "graz.social/@TheSecondVariation"
blurb: "I can help you repair your bicycle by giving advice. Besides I am also happy to give you advice on other bicycle related things."
date: 2026-05-03
---

View File

@ -1,8 +1,8 @@
---
title: introductory web development and terminal basics
handle: inherentlee
server: flipping.rocks
tags: technology
handle: "@inherentlee@flipping.rocks"
url: "flipping.rocks/@inherentlee"
blurb: I'm happy to help you set up a personal or hobby site with HTML, CSS, and JS basics, or maybe a static site generator! Alternately, I'll talk about git and the terminal.
rate: free or skill swap
date: 2026-04-29
---

View File

@ -0,0 +1,7 @@
---
title: "Renewable Energy Q&A"
handle: "@mzedp@plasmatrap.com"
url: "plasmatrap.com/@mzedp"
blurb: "I'm an electrical engineer with a specialization in Solar energy, glad to offer guidance on solar energy/renewables/energy transition related questions."
date: 2026-05-03
---

View File

@ -0,0 +1,7 @@
---
title: Mobile device hacking advice
handle: "@rpgwaiter@based.zone"
url: "based.zone/@rpgwaiter"
blurb: "I've been exploiting/reverse engineering mobile devices for over 10 years. I'm always happy to discuss tooling, techniques, or anything else related to hacking mobile devices. Want to know how a certain app works? I have experience in everything from mitm traffic capture to memory hacking with Frida and static binary analysis, feel free to ask!"
date: 2026-05-01
---

View File

@ -0,0 +1,5 @@
export default {
tags: [
"technology"
]
};

View File

@ -0,0 +1,7 @@
---
title: what the hell is C?
handle: "@twinkle@sweet.succubi.services"
url: "sweet.succubi.services/twinkle"
blurb: Have you wanted to get into programming but don't know where to start? Do you know a programming language already but feel like you don't get Why Things Are Like This? I myself started out with the C programming language-- and I'd love to pass on the knowledge to more people, because I think a good programming lesson is rare nowadays!
date: 2026-05-01
---

View File

@ -0,0 +1,7 @@
---
title: NVDA screen reader basics to advanced
handle: "@x0@dragonscave.space"
url: "dragonscave.space/@x0"
blurb: I'm a blind Windows user who has been cutting my teeth on Non-Visual Desktop Access (NVDA) for over a decade. I use it to do everything from file management to web apps to development. If you're just getting started with screen readers, or know your way around the basics and want to take your usage to the next level, I can help! I'll happily teach a sighted person who is picking up NVDA for proper accessibility testing as well, you never know if your app or website works right with a screen reader until you drive it with one.
date: 2026-05-02
---

View File

@ -1,8 +1,7 @@
---
title:
handle:
server:
tags:
url:
blurb:
date:
---

View File

@ -0,0 +1,7 @@
---
title: Scientific paper editing
handle: "@SRLevine@neuromatch.social"
url: "neuromatch.social/@SRLevine"
blurb: Do you have all of the information/data/figures, but an awkwardly worded paper? Do you need help getting it ready for submission? Would you otherwise turn to AI? Happy to help, particularly in field (organic chemistry, chemical biology), but should be able to mange most of chemistry & biology. Can also help with qualifying exam papers, etc.
date: 2026-05-02
---

View File

@ -0,0 +1,5 @@
export default {
tags: [
"writing editing and literature"
]
};

21
src/daily.njk Normal file
View File

@ -0,0 +1,21 @@
---
title: Day-by-day listings
pagination:
data: collections.daily
size: 30
reverse: true
---
{% css %}
ol {
list-style: none;
text-align: center;
}
{% endcss %}
<ol>
{% for post in pagination.items %}
<li>
<a href="{{ post.url }}">{{ post.data.title }}</a>
</li>
{% endfor %}
</ol>

7
src/daily/2026-04-29.njk Normal file
View File

@ -0,0 +1,7 @@
---
title: April 29th, 2026
---
{% css %}{% include "css/listings.css" %}{% endcss %}
{% set today = "2026-04-29" %}
{% include "daily-listings.njk" %}

7
src/daily/2026-05-01.njk Normal file
View File

@ -0,0 +1,7 @@
---
title: May 1st, 2026
---
{% css %}{% include "css/listings.css" %}{% endcss %}
{% set today = "2026-05-01" %}
{% include "daily-listings.njk" %}

7
src/daily/2026-05-02.njk Normal file
View File

@ -0,0 +1,7 @@
---
title: May 2nd, 2026
---
{% css %}{% include "css/listings.css" %}{% endcss %}
{% set today = "2026-05-02" %}
{% include "daily-listings.njk" %}

7
src/daily/2026-05-03.njk Normal file
View File

@ -0,0 +1,7 @@
---
title: May 3rd, 2026
---
{% css %}{% include "css/listings.css" %}{% endcss %}
{% set today = "2026-05-03" %}
{% include "daily-listings.njk" %}

7
src/daily/2026-05-04.njk Normal file
View File

@ -0,0 +1,7 @@
---
title: May 4th, 2026
---
{% css %}{% include "css/listings.css" %}{% endcss %}
{% set today = "2026-05-04" %}
{% include "daily-listings.njk" %}

View File

@ -0,0 +1,6 @@
export default {
layout: "base.njk",
tags: [
"daily"
]
}

View File

@ -1,16 +1,7 @@
---
layout: base.njk
title: Fediverse Skillshare Classifieds
---
{% css %}{% include "css/home.css" %}{% endcss %}
<div class="wip">
<p>
Hey! This is in early days, so please forgive the lack of real data. Any listing
that is greyed out is sample data, and should be ignored. As I get real listings,
I'll replace the samples!
</p>
</div>
{% css %}{% include "css/listings.css" %}{% endcss %}
<div id="jump-links">
<h2>jump to...</h2>
@ -30,19 +21,11 @@ title: Fediverse Skillshare Classifieds
<h2>{{ tag }}</h2>
<p>{{ tag | getTagline }}</p>
</div>
{% if collections[tag].length == 0 %}
<p>No listings.</p>
{% endif %}
{% for listing in collections[tag] %}
<div class="listing{% if listing.data.draft %} draft{% endif %}">
<h3>{{ listing.data.title }}</h3>
<p class="blurb">
<strong>
<a href="https://{{ listing.data.server }}/@{{ listing.data.handle }}"
target="_blank">@{{ listing.data.handle }}@{{ listing.data.server}}</a>
offers:</strong> {{ listing.data.blurb }}
</p>
<p class="listed-on">
listed on <time datetime="{{ listing.date | htmlDateString }}">{{ listing.date | readableDate() }}</time>
</p>
</div>
{% include "listing.njk" %}
{% endfor %}
</div>
{% endfor %}

3
src/src.11tydata.js Normal file
View File

@ -0,0 +1,3 @@
export default {
layout: "base.njk"
}

View File

@ -1,5 +1,4 @@
---
layout: base.njk
title: Submit a Listing
---
@ -15,29 +14,29 @@ title: Submit a Listing
<p>To submit to the Skillshare Classifieds, you'll need:</p>
<ul>
<li>your fediverse handle</li>
<li>the link to your fediverse profile</li>
<li>the <a href="#category-guide">most relevant category</a> for your listing</li>
<li>a title for your offering</li>
<li>a short description</li>
<li>optionally, a suggested rate - if not provided, free is the assumption</li>
</ul>
<p>See <a href="/">the home page</a> for inspiration.</p>
<p> You can submit using the embed below,
<p> You can submit using
<a href="https://airtable.com/appbdRJ59MLprB1iC/pagfJTOl4KPwh7trd/form"
target="_blank">open the form in a new tab</a>, or
target="_blank">the listing submission form</a>,
<a href="https://flipping.rocks/@inherentlee" target="_blank">message me on
fedi</a>, or
<a href="mailto:lee.cattarin@gmail.com?subject=Fediverse%20Skillshare%20Classifieds">email
Lee</a> all the information mentioned above.
me</a> all the information mentioned above.
</p>
<p>Feel free to submit multiple times in multiple categories, but I'd prefer that
all offerings within one category be grouped into one listing if possible!</p>
<iframe class="airtable-embed"
src="https://airtable.com/embed/appbdRJ59MLprB1iC/pagfJTOl4KPwh7trd/form"
frameborder="0" onmousewheel="" width="100%" height="533"
style="background: transparent; border: 1px solid #ccc;">
</iframe>
all offerings within one category be grouped into one listing if possible!
Exceptions can be made for wildly divergent topics, but try to keep it short
and sweet.
</p>
<h2>Category guide</h2>
@ -64,6 +63,13 @@ title: Submit a Listing
<li>Workouts for core strength</li>
</ul>
<h3 class="category-title">Business</h3>
<ul>
<li>Job interview practice</li>
<li>Guide to changing fields</li>
<li>Writing a good performance review</li>
</ul>
<h3 class="category-title">Food and Drink</h3>
<ul>
<li>Sourdough starting</li>
@ -81,10 +87,15 @@ title: Submit a Listing
<h3 class="category-title">Interpersonal and Life</h3>
<ul>
<li>Neurodivergent life tactics</li>
<li>Navigating workplace transition</li>
<li>Navigating workplace transition (also totally cool in "Business")</li>
<li>Mediating hard discussions</li>
</ul>
<h3 class="category-title">Miscellany and More</h3>
<ul>
<li>Surprise me!</li>
</ul>
<h3 class="category-title">Repair and DIY</h3>
<ul>
<li>Plumbing basics</li>