Uhhhhh
continuous-integration/drone/push Build is failing Details

Signed-off-by: Sam Therapy <sam@samtherapy.net>
This commit is contained in:
Sam Therapy 2022-05-11 20:35:34 +02:00
parent e7ef7e4d7d
commit 61463ff239
Signed by: sam
GPG Key ID: 4D8B07C18F31ACBD
50 changed files with 2782 additions and 5613 deletions

View File

@ -3,19 +3,19 @@ type: docker
name: default
steps:
- name: dependencies
image: node
commands:
- yarn
- name: dependencies
image: node
commands:
- yarn
- name: lint
image: node
commands:
- yarn lint
depends: [dependencies]
- name: lint
image: node
commands:
- yarn lint:ci
depends: [dependencies]
- name: test
image: node
commands:
- yarn test
depends: [lint]
- name: test
image: node
commands:
- yarn test
depends: [lint]

View File

@ -1 +1,2 @@
src/public/infinite-scroll.js
src/public/lib/infinite-scroll.pkgd.min.js
.yarn/

View File

@ -1,30 +1,19 @@
{
"env": {
"browser": true,
"es2021": true,
"node": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"rules": {
"indent": [
"error",
4
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"double"
],
"semi": [
"error",
"always"
]
}
"env": {
"browser": true,
"es2021": true,
"node": true
},
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": ["prettier"],
"rules": {
"linebreak-style": ["error", "unix"],
"quotes": ["error", "double"],
"semi": ["error", "always"],
"prettier/prettier": ["error", { "singleQuote": false }]
},
"extends": ["eslint:recommended", "plugin:prettier/recommended"]
}

4
.gitignore vendored
View File

@ -127,4 +127,6 @@ dist
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
.pnp.*
.dccache

2
.prettierignore Normal file
View File

@ -0,0 +1,2 @@
src/public/lib/infinite-scroll.pkgd.min.js
.yarn/

View File

@ -9,7 +9,7 @@ https://www.fedifeed.com
## User guide
The homepage has a tool for generating iframe code for you, with a sensible `sandbox` attribute. The feeds fit comfortably in a 400px wide area.
The homepage has a tool for generating iframe code for you, with a sensible `sandbox` attribute. The feeds fit comfortably in a 400px wide area.
## API
@ -19,28 +19,29 @@ The homepage has a tool for generating iframe code for you, with a sensible `san
> example: `/api/v1/feed?userurl=https%3A%2F%2Foctodon.social%2Fusers%2Ffenwick67&scale=90&theme=masto-light`
Returns a html page which displays a feed for a user URL. Note that URLs must be URI encoded (i.e. `encodeURIComponent('https://octodon.social/users/fenwick67')` ).
Returns a html page which displays a feed for a user URL. Note that URLs must be URI encoded (i.e. `encodeURIComponent('https://octodon.social/users/fenwick67')` ).
Querystring options:
| option | required | description |
| ------ | -------- | ----------- |
| `userurl` | **\*** | Mastodon/Pleroma/Misskey account URL (usually `https://${instance}/users/${username}` for MastoAPI or `https://${instance}/@${username}` for Misskey) |
| `instance` | **\*\***| Mastodon/Pleroma/Misskey instance URL (usually `https://${instance}`) |
| `user` | **\*\*** | Mastodon/Pleroma/Misskey user ID (usually `${username}`) |
| `feedurl` | no | a URL to a page of an ActivityPub post collection. Only used for pages beyond the first. |
| `theme` | no | either `masto-dark`, `masto-light` or `masto-auto`, to select the UI theme (default is `masto-dark`). `auto` will appear masto-light unless the user sets up masto-dark mode on their device. |
| `boosts` | no | whether to show boosts or not |
| `replies` | no | whether to show replies or not |
| `size` | no | the scale of the UI in percent. |
| option | required | description |
| ---------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `userurl` | **\*** | Mastodon/Pleroma/Misskey account URL (usually `https://${instance}/users/${username}` for MastoAPI or `https://${instance}/@${username}` for Misskey) |
| `instance` | **\*\*** | Mastodon/Pleroma/Misskey instance URL (usually `https://${instance}`) |
| `user` | **\*\*** | Mastodon/Pleroma/Misskey user ID (usually `${username}`) |
| `feedurl` | no | a URL to a page of an ActivityPub post collection. Only used for pages beyond the first. |
| `theme` | no | either `masto-dark`, `masto-light` or `masto-auto`, to select the UI theme (default is `masto-dark`). `auto` will appear masto-light unless the user sets up masto-dark mode on their device. |
| `boosts` | no | whether to show boosts or not |
| `replies` | no | whether to show replies or not |
| `size` | no | the scale of the UI in percent. |
\* `userurl` is required if `instance` and `user` are not specified.\*\*\* \
\*\* `instance` **and** `user` are required if `userurl` is not specified.\*\*\*
\*\*\* **`userurl` and `instance`/`user` are mutually exclusive.**
## Server Installation
This is a straightforward node project with zero databases or anything, you should just be able to run `yarn install` and then `yarn start` to get up and running. Set your `PORT` environment variable to change the port it listens on.
This is a straightforward node project with zero databases or anything, you should just be able to run `yarn install` and then `yarn start` to get up and running. Set your `PORT` environment variable to change the port it listens on.
## Improve me

160
index.js Normal file
View File

@ -0,0 +1,160 @@
import Express from "express";
// v2 api
import convertv2 from "./lib/convert.js";
import serveStatic from "serve-static";
import cors from "cors";
import errorPage from "./lib/errorPage.js";
import morgan from "morgan";
import { detector } from "megalodon";
import helmet from "helmet";
const app = Express();
app.use(
helmet({
contentSecurityPolicy: false,
crossOriginEmbedderPolicy: false,
crossOriginResourcePolicy: false,
})
);
const logger = morgan(":method :url :status via :referrer - :response-time ms");
app.use(
serveStatic("public", {
maxAge: "1d",
})
);
function doCache(res, durationSecs) {
res.set({
"Cache-Control": "max-age=" + durationSecs,
});
}
// this just redirects to the
app.options("/api/feed", cors());
app.get("/api/feed", cors(), logger, function (req, res) {
// get feed url
const feedUrl = req.query.url;
if (!feedUrl) {
res
.status(400)
.send(errorPage(400, "You need to specify a feed URL", null));
return;
}
const userUrl = feedUrl.replace(/\.atom.*/i, "");
const redirectUrl = "/api/v1/feed?";
const qs = ["userurl=" + encodeURIComponent(userUrl), "api=v1"];
["size", "theme", "boosts", "replies"].forEach((key) => {
if (typeof req.query[key] != "undefined") {
qs.push(key + "=" + encodeURIComponent(req.query[key]));
}
});
res.redirect(redirectUrl + qs.join("&"));
});
app.options("/api/v1/feed", cors());
app.get("/api/v1/feed", cors(), logger, async function (req, res) {
// get feed url
// userUrl
let type = req.query.instance_type;
let userUrl = req.query.userurl;
if (userUrl === "" || userUrl === undefined) {
const user = req.query.user;
const instance = req.query.instance;
if (type === "" || type === undefined) {
type = await detector(instance).catch(() => "");
}
if (type === "mastodon" || type === "pleroma")
userUrl = instance + "/users/" + user;
else if (type === "misskey") userUrl = instance + "/@" + user;
else {
res
.status(400)
.send(errorPage(400, "You need to specify a user URL", null));
return;
}
}
const feedUrl = req.query.feedurl;
const opts = {};
if (req.query.size) {
opts.size = req.query.size;
}
if (req.query.theme) {
opts.theme = req.query.theme;
if (opts.theme === "auto-auto") {
switch (type) {
case "mastodon":
opts.theme = "masto-auto";
break;
case "pleroma":
opts.theme = "pleroma";
break;
case "misskey":
opts.theme = "misskey-auto";
break;
default:
break;
}
} else if (opts.theme === "auto-light") {
switch (type) {
case "mastodon":
opts.theme = "masto-light";
break;
case "misskey":
opts.theme = "misskey-light";
break;
case "pleroma":
opts.theme = "pleroma-light";
break;
default:
break;
}
} else if (opts.theme === "auto-dark") {
switch (type) {
case "mastodon":
opts.theme = "masto-dark";
break;
case "misskey":
opts.theme = "misskey-dark";
break;
case "pleroma":
opts.theme = "pleroma-dark";
break;
default:
break;
}
}
}
if (req.query.header) opts.header = req.query.header.toLowerCase() === "true";
if (req.query.boosts) opts.boosts = req.query.boosts.toLowerCase() === "true";
if (req.query.replies)
opts.replies = req.query.replies.toLowerCase() === "true";
opts.instance_type = type;
opts.userUrl = userUrl;
opts.feedUrl = feedUrl;
opts.mastofeedUrl = req.url;
convertv2(opts)
.then((data) => {
doCache(res, 60 * 60);
res.status(200).send(data);
})
.catch((er) => {
res
.status(500)
.send(errorPage(500, null, { theme: opts.theme, size: opts.size }));
// TODO log the error
console.error(er, er.stack);
});
});
app.listen(process.env.PORT || 8000, "127.0.0.1", function () {
console.log("Server started, listening on " + (process.env.PORT || 8000));
});

View File

@ -12,238 +12,258 @@ const hour = 3600000;
// note: rejects on HTTP 4xx or 5xx
async function apGet(url) {
return new Promise(function(resolve,reject){
return new Promise(function (resolve, reject) {
// fail early
if (!url) {
reject(new Error("URL is invalid"));
}
// fail early
if (!url){
reject(new Error("URL is invalid"));
}
got( {
url:url,
cache:map,
headers: {
"accept": "application/activity+json"
}
})
.then(response=>JSON.parse(response.body))
.then(resolve)
.catch(reject);
});
got({
url: url,
cache: map,
headers: {
accept: "application/activity+json",
},
})
.then((response) => JSON.parse(response.body))
.then(resolve)
.catch(reject);
});
}
// like Promise.all except returns null on error instead of failing all the promises
async function promiseSome(proms){
function noRejectWrap(prom){
return new Promise(function(resolve){
prom // it's already been called
.then(resolve)
.catch( ()=>{
// console.warn(e);// for debugging
resolve(null);
});
async function promiseSome(proms) {
function noRejectWrap(prom) {
return new Promise(function (resolve) {
prom // it's already been called
.then(resolve)
.catch(() => {
// console.warn(e);// for debugging
resolve(null);
});
}
return await Promise.all(proms.map(noRejectWrap));
});
}
return await Promise.all(proms.map(noRejectWrap));
}
export default async function (opts) {
// let opts = opts;
// let opts = opts;
let feedUrl = opts.feedUrl;
let userUrl = opts.userUrl;
let isIndex = false;
let feedUrl = opts.feedUrl;
let userUrl = opts.userUrl;
let isIndex = false;
if (!userUrl) {
throw new Error("need user URL");
if (!userUrl) {
throw new Error("need user URL");
}
let user, feed;
// get user and feed in parallel if I have both URLs.
// can cache feed aggressively since it is a specific start and end.
if (userUrl && feedUrl) {
[user, feed] = await Promise.all([apGet(userUrl), apGet(feedUrl)]);
} else {
// get user, then outbox, then feed
user = await apGet(userUrl);
isIndex = true;
let outbox = await apGet(user.outbox);
// outbox.first can be a string for a URL, or an object with stuffs in it
if (typeof outbox.first == "object") {
feed = outbox.first;
} else {
feed = await apGet(outbox.first);
}
}
let user, feed;
// get user and feed in parallel if I have both URLs.
// can cache feed aggressively since it is a specific start and end.
if (userUrl && feedUrl){
[user, feed] = await Promise.all([ apGet(userUrl), apGet(feedUrl) ]);
}else{
// get user, then outbox, then feed
user = await apGet(userUrl,24 * hour);
isIndex = true;
let outbox = await apGet(user.outbox, 1 * hour);
// outbox.first can be a string for a URL, or an object with stuffs in it
if (typeof outbox.first == "object"){
feed = outbox.first;
} else {
feed = await apGet(outbox.first, hour/6);// 10 mins. Because the base feed URL can get new toots quickly.
}
}
let templateData = {
opts: opts,// from the request
meta: metaForUser(user),
items: await itemsForFeed(opts,user,feed),
nextPageLink: getNextPage(opts,user,feed),
isIndex: isIndex
};
return template(templateData);
let templateData = {
opts: opts, // from the request
meta: metaForUser(user),
items: await itemsForFeed(opts, user, feed),
nextPageLink: getNextPage(opts, user, feed),
isIndex: isIndex,
};
return template(templateData);
}
function metaForUser(user) {
return {
avatar: user.icon && user.icon.url?user.icon.url:null,
headerImage:user.image && user.image.url?user.image.url:null,
title: user.name||user.preferredUsername||null,
description: user.summary||null,
link:user.url||"#"
};
return {
avatar: user.icon && user.icon.url ? user.icon.url : null,
headerImage: user.image && user.image.url ? user.image.url : null,
title: user.name || user.preferredUsername || null,
description: user.summary || null,
link: user.url || "#",
};
}
async function itemsForFeed(opts,user,feed) {
async function itemsForFeed(opts, user, feed) {
let items = feed.orderedItems;
let items = feed.orderedItems;
if (opts.boosts){
// yes, I have to fetch all the fucking boosts for this whole feed apparently >:/
let boostData = [];
let boostUrls = feed.orderedItems.filter(i=>i.type=="Announce").map(i=>i.object);
// console.log(boostUrls);
boostData = await promiseSome(boostUrls.map(apGet));
if (opts.boosts) {
// yes, I have to fetch all the fucking boosts for this whole feed apparently >:/
let boostData = [];
let boostUrls = feed.orderedItems
.filter((i) => i.type == "Announce")
.map((i) => i.object);
// console.log(boostUrls);
boostData = await promiseSome(boostUrls.map(apGet));
// now get user data for each of those
let userData = await promiseSome(boostData.map(d=>d?d.attributedTo||"":null).map(apGet));
// now get user data for each of those
let userData = await promiseSome(
boostData.map((d) => (d ? d.attributedTo || "" : null)).map(apGet)
);
// put a ._userdata key on the item object if this is a boost
for (let i = 0; i < boostData.length; i ++){
if (userData[i] && boostData[i]){
boostData[i]._userdata = userData[i];
}
}
// some URLs may have failed but IDGAF
// console.log(boostData[0]);
boostData.forEach((boostToot)=>{
if (!boostToot){// failed request
return;
}
// inject in-place into items
let index = -1;
for (var i = 0; i < items.length; i ++){
if (items[i].object == boostToot.id){
index = i;
break;
}
}
if (index == -1){
console.warn("warning: couldn't match boost to item: ",boostToot);
return;
}
boostToot.object = boostToot;// this lets the later stage parser access object without errors :)
items[i] = boostToot;
});
// put a ._userdata key on the item object if this is a boost
for (let i = 0; i < boostData.length; i++) {
if (userData[i] && boostData[i]) {
boostData[i]._userdata = userData[i];
}
}
// some URLs may have failed but IDGAF
return items.filter((item)=>{
return typeof item.object == "object";// handle weird cases
}).map((item)=>{
// console.log(boostData[0]);
let enclosures = (item.object.attachment||[]).filter((a)=>{
return a.type == "Document";
}).map((a)=>{
return {
name:a.name,
type:a.mediaType,
url:a.url
};
boostData.forEach((boostToot) => {
if (!boostToot) {
// failed request
return;
}
// inject in-place into items
let index = -1;
for (var i = 0; i < items.length; i++) {
if (items[i].object == boostToot.id) {
index = i;
break;
}
}
if (index == -1) {
console.warn(`warning: couldn't match boost to item: ${boostToot}`);
return;
}
boostToot.object = boostToot; // this lets the later stage parser access object without errors :)
items[i] = boostToot;
});
}
return items
.filter((item) => {
return typeof item.object == "object"; // handle weird cases
})
.map((item) => {
let enclosures = (item.object.attachment || [])
.filter((a) => {
return a.type == "Document";
})
.map((a) => {
return {
name: a.name,
type: a.mediaType,
url: a.url,
};
});
let op = item._userdata?item._userdata:user;
let op = item._userdata ? item._userdata : user;
return {
isBoost:!!item._userdata,
title:item._userdata?user.preferredUsername+" shared a status by "+op.preferredUsername:"",
isReply:!!(item.object && item.object.inReplyTo),
hasCw:item.object.sensitive||false,
cw:item.object.summary,
content: item.object&&item.object.content?item.object.content:"",//TODO sanitize then render without entity escapes
atomHref:item.published?item.published.replace(/\W+/g,""):Math.random().toString().replace(".",""),// used for IDs
enclosures:enclosures,
stringDate:item.published?getTimeDisplay(Date.parse(item.published)):"",
permalink:item.object.id?item.object.id:"#",
author:{
uri:op.url,// link to author page
avatar:op.icon&&op.icon.url?op.icon.url:"",
displayName:op.name || op.preferredUsername,
fullName:op.preferredUsername+"@"+(new URL(op.url).hostname),
}
};
return {
isBoost: !!item._userdata,
title: item._userdata
? user.preferredUsername +
" shared a status by " +
op.preferredUsername
: "",
isReply: !!(item.object && item.object.inReplyTo),
hasCw: item.object.sensitive || false,
cw: item.object.summary,
content: item.object && item.object.content ? item.object.content : "", //TODO sanitize then render without entity escapes
atomHref: item.published
? item.published.replace(/\W+/g, "")
: Math.random().toString().replace("./g", ""), // used for IDs
enclosures: enclosures,
stringDate: item.published
? getTimeDisplay(Date.parse(item.published))
: "",
permalink: item.object.id ? item.object.id : "#",
author: {
uri: op.url, // link to author page
avatar: op.icon && op.icon.url ? op.icon.url : "",
displayName: op.name || op.preferredUsername,
fullName: op.preferredUsername + "@" + new URL(op.url).hostname,
},
};
});
}
function getNextPage(opts,user,feed){
//based on feed.next
if (!feed.next){return null;}
// take feed.next, uriencode it, then take user url, then take options.mastofeedUrl
//let base = opts.mastofeedUrl.slice(0,opts.mastofeedUrl.indexOf("?"));
function getNextPage(opts, user, feed) {
//based on feed.next
if (!feed.next) {
return null;
}
// take feed.next, uriencode it, then take user url, then take options.mastofeedUrl
//let base = opts.mastofeedUrl.slice(0,opts.mastofeedUrl.indexOf("?"));
let ret = "/api/v1/feed?userurl=" + encodeURIComponent(opts.userUrl) + "&feedurl=" +encodeURIComponent(feed.next) + "&instance_type=" + opts.instance_type;
// add other params to the end
(["theme","header","size","boosts","replies"]).forEach((k)=>{
if (typeof opts[k] != "undefined"){
ret+=`&${k}=${ opts[k].toString() }`;
}
});
return ret;
let ret =
"/api/v1/feed?userurl=" +
encodeURIComponent(opts.userUrl) +
"&feedurl=" +
encodeURIComponent(feed.next) +
"&instance_type=" +
opts.instance_type;
// add other params to the end
["theme", "header", "size", "boosts", "replies"].forEach((k) => {
if (typeof opts[k] != "undefined") {
ret += `&${k}=${opts[k].toString()}`;
}
});
return ret;
}
// utilities below
function getTimeDisplay(d) {
// let d = d;
if (typeof d !== "object") {
d = new Date(d);
}
// convert to number
let dt = d.getTime();
let now = Date.now();
// let d = d;
if (typeof d !== "object") {
d = new Date(d);
}
// convert to number
let dt = d.getTime();
let now = Date.now();
let delta = now - dt;
// over 6 days ago
if (delta > 1000 * 60 * 60 * 24 * 6) {
return isoDateToEnglish(d.toISOString());
} else {
return format(dt);
}
let delta = now - dt;
// over 6 days ago
if (delta > 1000 * 60 * 60 * 24 * 6) {
return isoDateToEnglish(d.toISOString());
} else {
return format(dt);
}
}
function isoDateToEnglish(d) {
let dt = d.split(/[t-]/gi);
let months = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
];
let dt = d.split(/[t-]/ig);
let months = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"];
return months[Number(dt[1]) - 1] + " " + dt[2] + ", " + dt[0];
return months[Number(dt[1]) - 1] + " " + dt[2] + ", " + dt[0];
}

View File

@ -2,35 +2,34 @@ import { compile } from "ejs";
import { readFileSync } from "fs";
let template = compile(readFileSync("./lib/template.ejs", "utf8"));
export default function(code,message,displayOptions){
export default function (code, message, displayOptions) {
let msg;
// const displayOptions = displayOptions || {};
let msg;
// const displayOptions = displayOptions || {};
if (code == 500 && !message) {
msg =
"<p>Sorry, we are having trouble fetching posts for this user. Please try again later.</p><br><p>If the issue persists, <a href=`https://git.froth.zone/Sam/fedifeed/issues`>please open an issue on Gitea</a>, or message sam@froth.zone</p>";
} else {
msg = message || "";
}
if (code == 500 && !message){
msg = "<p>Sorry, we are having trouble fetching posts for this user. Please try again later.</p><br><p>If the issue persists, <a href=\"https://git.froth.zone/Sam/fedifeed/issues\">please open an issue on Gitea</a>, or message sam@froth.zone</p>";
}else{
msg = message||"";
}
let options = {
opts: {
header: true,
theme: displayOptions?.theme || null,
size: displayOptions?.size || null,
},
meta: {
title: code.toString(),
description: msg,
link: "#",
// avatar:'',
// headerImage:''
},
items: [],
nextPageLink: null,
isIndex: true,
};
let options = {
opts:{
header:true,
theme:displayOptions.theme||null,
size:displayOptions.size||null
},
meta:{
title:code.toString(),
description:msg,
link:"#"
// avatar:'',
// headerImage:''
},
items:[],
nextPageLink:null,
isIndex:true
};
return template(options);
}
return template(options);
}

View File

@ -1,3 +1,4 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"></meta>
@ -6,7 +7,7 @@
<% if (opts.theme && opts.theme.toLowerCase() == 'masto-light'){ %>
<link rel="stylesheet" href="/css/masto-light.css"></link>
<% } else if (opts.theme && opts.theme.toLowerCase() == 'auto'){ %>
<% } else if (opts.theme && opts.theme.toLowerCase() == 'masto-auto'){ %>
<link rel="stylesheet" href="/css/masto-auto.css"></link>
<% } else if (opts.theme && opts.theme.toLowerCase() == 'misskey-dark'){ %>
<link rel="stylesheet" href="/css/misskey-dark.css"></link>
@ -113,7 +114,7 @@
<% } %>
<% if ( isIndex ){ %>
<script src="/infinite-scroll.js"></script>
<script src="/lib/infinite-scroll.pkgd.min.js"></script>
<script type="text/javascript">
let lastPageLoaded = null;

View File

@ -1,26 +1,31 @@
{
"dependencies": {
"cors": "^2.8.5",
"ejs": "^3.1.6",
"express": "^4.17.2",
"feedparser": "^2.2.10",
"got": "^12.0.1",
"megalodon": "^4.0.0",
"morgan": "^1.10.0",
"serve-static": "^1.14.2",
"timeago.js": "^4.0.2"
},
"main": "index.js",
"type": "module",
"license": "MIT",
"scripts": {
"start": "yarn build-styles && node src/index.js",
"build-styles": "node src/build-styles.js",
"lint": "eslint --ext .js src lib",
"test": "echo \"Error: no test specified\" && exit 0"
},
"devDependencies": {
"eslint": "8.15.0",
"node-sass": "7.0.1"
}
}
{
"dependencies": {
"cors": "2.8.5",
"ejs": "3.1.7",
"express": "4.18.1",
"feedparser": "2.2.10",
"got": "12.0.4",
"helmet": "5.0.2",
"megalodon": "4.0.1",
"morgan": "1.10.0",
"serve-static": "1.15.0",
"timeago.js": "4.0.2"
},
"main": "index.js",
"type": "module",
"license": "MIT",
"scripts": {
"start": "yarn node index.js",
"lint": "eslint --fix . && prettier --write .",
"lint:ci": "eslint . && prettier . --check",
"test": "echo \"Error: no test specified\" && exit 0"
},
"devDependencies": {
"eslint": "8.15.0",
"eslint-config-prettier": "8.5.0",
"eslint-plugin-prettier": "4.0.0",
"prettier": "2.6.2",
"sass": "1.51.0"
},
"packageManager": "yarn@3.2.0"
}

View File

@ -1,132 +1,162 @@
html,
body {
background-color: #ffffff;
font-family: 'Roboto', roboto, Arial, sans-serif;
font-family: "Roboto", roboto, Arial, sans-serif;
color: #282c37;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
word-break: break-word;
}
* {
margin: 0;
padding: 0; }
padding: 0;
}
a,
a * {
color: #2b90d9; }
color: #2b90d9;
}
.meta {
background-color: #ecf0f4; }
background-color: #ecf0f4;
}
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #282c37; }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(255, 255, 255, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(255, 255, 255, 0.85); }
.header .header-title {
font-size: 1.3rem; }
color: #282c37;
}
.header .header-left,
.header .header-right {
margin: 0;
}
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(255, 255, 255, 0.3);
}
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem);
}
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(255, 255, 255, 0.85);
}
.header .header-title {
font-size: 1.3rem;
}
.item {
padding: 1rem;
border-top: solid 1px #8494ab; }
border-top: solid 1px #8494ab;
}
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
font-weight: lighter;
}
.item-content *, .cw {
.item-content *,
.cw {
margin: 1rem 0;
line-height: 1.4rem; }
line-height: 1.4rem;
}
.item-title,
.date,
.author-fullname {
color: #90a1ba;
font-size: 0.9rem; }
font-size: 0.9rem;
}
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
display: block;
}
.date:hover {
text-decoration: underline; }
text-decoration: underline;
}
.item-title {
margin-bottom: 0.7rem; }
margin-bottom: 0.7rem;
}
.author {
display: flex;
margin-bottom: 1rem; }
margin-bottom: 1rem;
}
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #282c37;
text-decoration: none;
display: block;
font-weight: bolder; }
justify-content: space-around;
}
.author-info .author-displayname {
font-size: 1.2rem;
color: #282c37;
text-decoration: none;
display: block;
font-weight: bolder;
}
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
border-radius: 10%;
}
.avatar.circular {
border-radius: 100%;
}
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
overflow: hidden;
}
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
max-height: 12rem;
}
a.enclosure {
cursor: zoom-in; }
cursor: zoom-in;
}
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
object-fit: cover;
}
.meta .title {
font-weight: bold; }
font-weight: bold;
}
.hidden {
display: none; }
display: none;
}
.button {
padding: 0.5rem 1rem;
@ -140,145 +170,182 @@ a.enclosure {
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
user-select: none;
}
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #8494ab;
color: #ffffff;
font-size: 0.8rem; }
font-size: 0.8rem;
}
input[type=checkbox] {
input[type="checkbox"] {
position: absolute;
left: -9999px; }
left: -9999px;
}
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type="checkbox"]:checked ~ label::after {
content: " Less";
}
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type="checkbox"]:not(:checked) ~ label::after {
content: " More";
}
input[type=checkbox]:not(:checked) ~ div {
display: none; }
input[type="checkbox"]:not(:checked) ~ div {
display: none;
}
.item-content,
.description,
.title,
html,
body {
font-weight: normal; }
font-weight: normal;
}
@media (prefers-color-scheme: masto-dark) {
html,
body {
background-color: #282c37;
font-family: 'Roboto', roboto, Arial, sans-serif;
font-family: "Roboto", roboto, Arial, sans-serif;
color: #ffffff;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
word-break: break-word;
}
* {
margin: 0;
padding: 0; }
padding: 0;
}
a,
a * {
color: #2b90d9; }
color: #2b90d9;
}
.meta {
background-color: #39404d; }
background-color: #39404d;
}
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #ffffff; }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(40, 44, 55, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(40, 44, 55, 0.85); }
.header .header-title {
font-size: 1.3rem; }
color: #ffffff;
}
.header .header-left,
.header .header-right {
margin: 0;
}
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(40, 44, 55, 0.3);
}
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem);
}
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(40, 44, 55, 0.85);
}
.header .header-title {
font-size: 1.3rem;
}
.item {
padding: 1rem;
border-top: solid 1px #626d80; }
border-top: solid 1px #626d80;
}
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
font-weight: lighter;
}
.item-content *,
.cw {
margin: 1rem 0;
line-height: 1.4rem; }
line-height: 1.4rem;
}
.item-title,
.date,
.author-fullname {
color: #9baec8;
font-size: 0.9rem; }
font-size: 0.9rem;
}
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
display: block;
}
.date:hover {
text-decoration: underline; }
text-decoration: underline;
}
.item-title {
margin-bottom: 0.7rem; }
margin-bottom: 0.7rem;
}
.author {
display: flex;
margin-bottom: 1rem; }
margin-bottom: 1rem;
}
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #ffffff;
text-decoration: none;
display: block;
font-weight: bolder; }
justify-content: space-around;
}
.author-info .author-displayname {
font-size: 1.2rem;
color: #ffffff;
text-decoration: none;
display: block;
font-weight: bolder;
}
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
border-radius: 10%;
}
.avatar.circular {
border-radius: 100%;
}
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
overflow: hidden;
}
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
max-height: 12rem;
}
a.enclosure {
cursor: zoom-in; }
cursor: zoom-in;
}
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
object-fit: cover;
}
.meta .title {
font-weight: bold; }
font-weight: bold;
}
.hidden {
display: none; }
display: none;
}
.button {
padding: 0.5rem 1rem;
border: none;
@ -291,19 +358,26 @@ body {
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
user-select: none;
}
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem; }
input[type=checkbox] {
font-size: 0.8rem;
}
input[type="checkbox"] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; } }
left: -9999px;
}
input[type="checkbox"]:checked ~ label::after {
content: " Less";
}
input[type="checkbox"]:not(:checked) ~ label::after {
content: " More";
}
input[type="checkbox"]:not(:checked) ~ div {
display: none;
}
}

199
public/css/masto-dark.css Normal file
View File

@ -0,0 +1,199 @@
html,
body {
background-color: #282c37;
font-family: "Roboto", roboto, Arial, sans-serif;
color: #ffffff;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word;
}
* {
margin: 0;
padding: 0;
}
a,
a * {
color: #2b90d9;
}
.meta {
background-color: #39404d;
}
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #ffffff;
}
.header .header-left,
.header .header-right {
margin: 0;
}
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(40, 44, 55, 0.3);
}
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem);
}
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(40, 44, 55, 0.85);
}
.header .header-title {
font-size: 1.3rem;
}
.item {
padding: 1rem;
border-top: solid 1px #626d80;
}
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter;
}
.item-content *,
.cw {
margin: 1rem 0;
line-height: 1.4rem;
}
.item-title,
.date,
.author-fullname {
color: #9baec8;
font-size: 0.9rem;
}
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block;
}
.date:hover {
text-decoration: underline;
}
.item-title {
margin-bottom: 0.7rem;
}
.author {
display: flex;
margin-bottom: 1rem;
}
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.author-info .author-displayname {
font-size: 1.2rem;
color: #ffffff;
text-decoration: none;
display: block;
font-weight: bolder;
}
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%;
}
.avatar.circular {
border-radius: 100%;
}
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden;
}
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem;
}
a.enclosure {
cursor: zoom-in;
}
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover;
}
.meta .title {
font-weight: bold;
}
.hidden {
display: none;
}
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #ffffff;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none;
}
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem;
}
input[type="checkbox"] {
position: absolute;
left: -9999px;
}
input[type="checkbox"]:checked ~ label::after {
content: " Less";
}
input[type="checkbox"]:not(:checked) ~ label::after {
content: " More";
}
input[type="checkbox"]:not(:checked) ~ div {
display: none;
}

207
public/css/masto-light.css Normal file
View File

@ -0,0 +1,207 @@
html,
body {
background-color: #ffffff;
font-family: "Roboto", roboto, Arial, sans-serif;
color: #282c37;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word;
}
* {
margin: 0;
padding: 0;
}
a,
a * {
color: #2b90d9;
}
.meta {
background-color: #ecf0f4;
}
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #282c37;
}
.header .header-left,
.header .header-right {
margin: 0;
}
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(255, 255, 255, 0.3);
}
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem);
}
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(255, 255, 255, 0.85);
}
.header .header-title {
font-size: 1.3rem;
}
.item {
padding: 1rem;
border-top: solid 1px #8494ab;
}
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter;
}
.item-content *,
.cw {
margin: 1rem 0;
line-height: 1.4rem;
}
.item-title,
.date,
.author-fullname {
color: #90a1ba;
font-size: 0.9rem;
}
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block;
}
.date:hover {
text-decoration: underline;
}
.item-title {
margin-bottom: 0.7rem;
}
.author {
display: flex;
margin-bottom: 1rem;
}
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.author-info .author-displayname {
font-size: 1.2rem;
color: #282c37;
text-decoration: none;
display: block;
font-weight: bolder;
}
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%;
}
.avatar.circular {
border-radius: 100%;
}
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden;
}
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem;
}
a.enclosure {
cursor: zoom-in;
}
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover;
}
.meta .title {
font-weight: bold;
}
.hidden {
display: none;
}
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #282c37;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none;
}
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #8494ab;
color: #ffffff;
font-size: 0.8rem;
}
input[type="checkbox"] {
position: absolute;
left: -9999px;
}
input[type="checkbox"]:checked ~ label::after {
content: " Less";
}
input[type="checkbox"]:not(:checked) ~ label::after {
content: " More";
}
input[type="checkbox"]:not(:checked) ~ div {
display: none;
}
.item-content,
.description,
.title,
html,
body {
font-weight: normal;
}

428
public/css/misskey-auto.css Normal file
View File

@ -0,0 +1,428 @@
html,
body {
background-color: rgb(249, 249, 249);
font-family: "Roboto", roboto, Arial, sans-serif;
color: #282c37;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word;
}
* {
margin: 0;
padding: 0;
}
a,
a * {
color: rgb(68, 164, 193);
}
a[rel="tag"] {
color: rgb(255, 145, 86);
}
.meta {
background-color: #ecf0f4;
}
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #282c37;
}
.header .header-left,
.header .header-right {
margin: 0;
}
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(255, 255, 255, 0.3);
}
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem);
}
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(255, 255, 255, 0.85);
}
.header .header-title {
font-size: 1.3rem;
}
.item {
padding: 1rem;
border-top: solid 1px #8494ab;
}
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter;
}
.item-content *,
.cw {
margin: 1rem 0;
line-height: 1.4rem;
}
.item-title,
.date,
.author-fullname {
color: #90a1ba;
font-size: 0.9rem;
}
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block;
}
.date:hover {
text-decoration: underline;
}
.item-title {
margin-bottom: 0.7rem;
}
.author {
display: flex;
margin-bottom: 1rem;
}
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.author-info .author-displayname {
font-size: 1.2rem;
color: #282c37;
text-decoration: none;
display: block;
font-weight: bolder;
}
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%;
}
.avatar.circular {
border-radius: 100%;
}
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden;
}
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem;
}
a.enclosure {
cursor: zoom-in;
}
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover;
}
.meta .title {
font-weight: bold;
}
.hidden {
display: none;
}
.u-url,
.mention {
color: #86b300;
}
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #282c37;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none;
}
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #8494ab;
color: #ffffff;
font-size: 0.8rem;
}
input[type="checkbox"] {
position: absolute;
left: -9999px;
}
input[type="checkbox"]:checked ~ label::after {
content: " Less";
}
input[type="checkbox"]:not(:checked) ~ label::after {
content: " More";
}
input[type="checkbox"]:not(:checked) ~ div {
display: none;
}
.item-content,
.description,
.title,
html,
body {
font-weight: normal;
}
@media (prefers-color-scheme: misskey-dark) {
html,
body {
background-color: #232323;
font-family: "Roboto", roboto, Arial, sans-serif;
color: #dadada;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word;
}
* {
margin: 0;
padding: 0;
}
a,
a * {
color: rgb(134, 179, 0);
}
a[rel="tag"] {
color: rgb(76, 184, 212);
}
.meta {
background-color: #39404d;
}
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: rgb(199, 209, 216);
}
.header .header-left,
.header .header-right {
margin: 0;
}
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(45, 45, 45, 0.3);
}
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem);
}
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(45, 45, 45, 0.85);
}
.header .header-title {
font-size: 1.3rem;
}
.item {
padding: 1rem;
border-top: solid 1px #626d80;
}
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter;
}
.item-content *,
.cw {
margin: 1rem 0;
line-height: 1.4rem;
}
.item-title,
.date,
.author-fullname {
color: #9baec8;
font-size: 0.9rem;
opacity: 0.5;
}
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block;
}
.date:hover {
text-decoration: underline;
}
.item-title {
margin-bottom: 0.7rem;
}
.author {
display: flex;
margin-bottom: 1rem;
}
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.author-info .author-displayname {
font-size: 1.2rem;
color: #dadada;
text-decoration: none;
display: block;
font-weight: bolder;
}
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%;
}
.avatar.circular {
border-radius: 100%;
}
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden;
}
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem;
}
a.enclosure {
cursor: zoom-in;
}
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover;
}
.meta .title {
font-weight: bold;
}
.hidden {
display: none;
}
.u-url,
.mention {
color: #86b300;
}
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.1);
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none;
}
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem;
}
input[type="checkbox"] {
position: absolute;
left: -9999px;
}
input[type="checkbox"]:checked ~ label::after {
content: " Less";
}
input[type="checkbox"]:not(:checked) ~ label::after {
content: " More";
}
input[type="checkbox"]:not(:checked) ~ div {
display: none;
}
}

209
public/css/misskey-dark.css Normal file
View File

@ -0,0 +1,209 @@
html,
body {
background-color: #232323;
font-family: "Roboto", roboto, Arial, sans-serif;
color: #dadada;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word;
}
* {
margin: 0;
padding: 0;
}
a,
a * {
color: rgb(134, 179, 0);
}
a[rel="tag"] {
color: rgb(76, 184, 212);
}
.meta {
background-color: #39404d;
}
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: rgb(199, 209, 216);
}
.header .header-left,
.header .header-right {
margin: 0;
}
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(45, 45, 45, 0.3);
}
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem);
}
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(45, 45, 45, 0.85);
}
.header .header-title {
font-size: 1.3rem;
}
.item {
padding: 1rem;
border-top: solid 1px #626d80;
}
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter;
}
.item-content *,
.cw {
margin: 1rem 0;
line-height: 1.4rem;
}
.item-title,
.date,
.author-fullname {
color: #9baec8;
font-size: 0.9rem;
opacity: 0.5;
}
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block;
}
.date:hover {
text-decoration: underline;
}
.item-title {
margin-bottom: 0.7rem;
}
.author {
display: flex;
margin-bottom: 1rem;
}
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.author-info .author-displayname {
font-size: 1.2rem;
color: #dadada;
text-decoration: none;
display: block;
font-weight: bolder;
}
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%;
}
.avatar.circular {
border-radius: 100%;
}
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden;
}
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem;
}
a.enclosure {
cursor: zoom-in;
}
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover;
}
.meta .title {
font-weight: bold;
}
.hidden {
display: none;
}
.u-url,
.mention {
color: #86b300;
}
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.1);
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none;
}
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem;
}
input[type="checkbox"] {
position: absolute;
left: -9999px;
}
input[type="checkbox"]:checked ~ label::after {
content: " Less";
}
input[type="checkbox"]:not(:checked) ~ label::after {
content: " More";
}
input[type="checkbox"]:not(:checked) ~ div {
display: none;
}

View File

@ -0,0 +1,216 @@
html,
body {
background-color: rgb(249, 249, 249);
font-family: "Roboto", roboto, Arial, sans-serif;
color: #282c37;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word;
}
* {
margin: 0;
padding: 0;
}
a,
a * {
color: rgb(68, 164, 193);
}
a[rel="tag"] {
color: rgb(255, 145, 86);
}
.meta {
background-color: #ecf0f4;
}
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #282c37;
}
.header .header-left,
.header .header-right {
margin: 0;
}
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(255, 255, 255, 0.3);
}
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem);
}
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(255, 255, 255, 0.85);
}
.header .header-title {
font-size: 1.3rem;
}
.item {
padding: 1rem;
border-top: solid 1px #8494ab;
}
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter;
}
.item-content *,
.cw {
margin: 1rem 0;
line-height: 1.4rem;
}
.item-title,
.date,
.author-fullname {
color: #90a1ba;
font-size: 0.9rem;
}
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block;
}
.date:hover {
text-decoration: underline;
}
.item-title {
margin-bottom: 0.7rem;
}
.author {
display: flex;
margin-bottom: 1rem;
}
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.author-info .author-displayname {
font-size: 1.2rem;
color: #282c37;
text-decoration: none;
display: block;
font-weight: bolder;
}
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%;
}
.avatar.circular {
border-radius: 100%;
}
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden;
}
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem;
}
a.enclosure {
cursor: zoom-in;
}
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover;
}
.meta .title {
font-weight: bold;
}
.hidden {
display: none;
}
.u-url,
.mention {
color: #86b300;
}
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #282c37;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none;
}
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #8494ab;
color: #ffffff;
font-size: 0.8rem;
}
input[type="checkbox"] {
position: absolute;
left: -9999px;
}
input[type="checkbox"]:checked ~ label::after {
content: " Less";
}
input[type="checkbox"]:not(:checked) ~ label::after {
content: " More";
}
input[type="checkbox"]:not(:checked) ~ div {
display: none;
}
.item-content,
.description,
.title,
html,
body {
font-weight: normal;
}

199
public/css/pleroma.css Normal file
View File

@ -0,0 +1,199 @@
html,
body {
background-color: rgba(15, 22, 30, 1);
font-family: "Roboto", roboto, Arial, sans-serif;
color: rgba(185, 185, 186, 1);
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word;
}
* {
margin: 0;
padding: 0;
}
a,
a * {
color: #e2b188;
}
.meta {
background-color: #39404d;
}
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: rgba(185, 185, 186, 1);
}
.header .header-left,
.header .header-right {
margin: 0;
}
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(40, 44, 55, 0.3);
}
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem);
}
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(40, 44, 55, 0.85);
}
.header .header-title {
font-size: 1.3rem;
}
.item {
padding: 1rem;
border-top: solid 1px #626d80;
}
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter;
}
.item-content *,
.cw {
margin: 1rem 0;
line-height: 1.4rem;
}
.item-title,
.date,
.author-fullname {
color: rgba(185, 185, 186, 0.5);
font-size: 0.9rem;
}
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block;
}
.date:hover {
text-decoration: underline;
}
.item-title {
margin-bottom: 0.7rem;
}
.author {
display: flex;
margin-bottom: 1rem;
}
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.author-info .author-displayname {
font-size: 1.2rem;
color: rgba(185, 185, 186, 1);
text-decoration: none;
display: block;
font-weight: bolder;
}
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%;
}
.avatar.circular {
border-radius: 100%;
}
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden;
}
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem;
}
a.enclosure {
cursor: zoom-in;
}
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover;
}
.meta .title {
font-weight: bold;
}
.hidden {
display: none;
}
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: rgba(185, 185, 186, 1);
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none;
}
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem;
}
input[type="checkbox"] {
position: absolute;
left: -9999px;
}
input[type="checkbox"]:checked ~ label::after {
content: " Less";
}
input[type="checkbox"]:not(:checked) ~ label::after {
content: " More";
}
input[type="checkbox"]:not(:checked) ~ div {
display: none;
}

206
public/css/stylesheet.css Normal file
View File

@ -0,0 +1,206 @@
/*
* Based on .css file from https://joinmastodon.org (by Gargron and latrani)
*/
@import url(https://fonts.googleapis.com/css?family=Quando|Judson|Montserrat:500|Roboto:400,500);
a,
abbr,
acronym,
address,
applet,
article,
aside,
audio,
b,
big,
blockquote,
body,
canvas,
caption,
center,
cite,
code,
dd,
del,
details,
dfn,
div,
dl,
dt,
em,
embed,
fieldset,
figcaption,
figure,
footer,
form,
h1,
h2,
h3,
h4,
h5,
h6,
header,
hgroup,
html,
i,
iframe,
img,
ins,
kbd,
label,
legend,
li,
mark,
menu,
nav,
object,
ol,
output,
p,
pre,
q,
ruby,
s,
samp,
section,
small,
span,
strike,
strong,
sub,
summary,
sup,
table,
tbody,
td,
tfoot,
th,
thead,
time,
tr,
tt,
u,
ul,
var,
video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block;
}
a {
outline: 0;
}
label,
h3 {
color: #607ea7;
margin-bottom: 26px;
font-size: 16px;
line-height: 24px;
}
body {
text-rendering: optimizelegibility;
-webkit-font-feature-settings: "kern";
font-feature-settings: "kern";
-webkit-text-size-adjust: none;
-ms-text-size-adjust: none;
text-size-adjust: none;
box-sizing: border-box;
font-family: Roboto, sans-serif;
background-color: #000000;
color: #5f6b84;
font-size: 13px;
line-height: 18px;
font-weight: 400;
margin: 1em;
}
h1 {
font-family: Montserrat, sans-serif;
font-size: 26px;
margin-bottom: 20px;
}
input[type="text"],
input[type="number"],
select {
outline: 0;
box-sizing: border-box;
border-radius: 4px;
display: block;
width: 100%;
border: none;
padding: 10px;
padding-right: 30px;
font-family: inherit;
background: #0e1013;
color: #9baec8;
font-size: 14px;
margin: 0;
}
h4 {
font-family: Montserrat, sans-serif;
font-size: 16px;
line-height: 24px;
margin-bottom: 20px;
color: #9baec8;
}
img {
width: 25px;
height: 25px;
opacity: 0.5;
-webkit-transition: opacity 0.25s linear;
transition: opacity 0.25s linear;
}
div {
max-width: 800px;
margin: 0 auto;
}
.iframe-contain {
display: block;
text-align: center;
}
button,
a {
display: inline-block;
text-align: center;
font-size: 16px;
text-decoration: none;
line-height: 36px;
padding: 4px 16px;
background: transparent;
border: 1px solid #9baec8;
border-radius: 4px;
padding: 3px 15px;
color: #9baec8;
cursor: pointer;
}
button:hover,
a:hover {
background-color: #394150;
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640" xml:space="preserve" width="32" height="32"><path style="fill:#fff" d="m395.9 484.2-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z"/><path style="fill:#609926" d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path style="fill:#609926" d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

128
public/index.html Normal file
View File

@ -0,0 +1,128 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1" />
<title>Fedifeed - embeddable ActivityPub feeds</title>
<link rel="stylesheet" href="./css/stylesheet.css" />
<script src="./js/script.js" defer></script>
</head>
<body>
<br />
<div>
<h1>Fedifeed</h1>
<h4>Embedded ActivityPub feeds for blogs, websites, etc.</h4>
<a href="https://git.froth.zone/sam/fedifeed" class="cta button alt"
>Fork on Gitea
<img class="link-logo after" src="img/gitea-logo.svg" alt="Gitea Logo"
/></a>
<br />
<br />
<hr />
<br />
<form action="javascript:genUrl()">
<label
>Instance URL:<input
required
type="text"
id="urlin"
placeholder="froth.zone"
oninvalid="this.setCustomValidity('Insert your instance URL. Example: mastodon.social')"
oninput="this.setCustomValidity('')"
/></label>
<br />
<label
>Username:<input
required
type="text"
id="usernamein"
placeholder="sam"
oninvalid="this.setCustomValidity('Insert your username. Example: gargron')"
oninput="this.setCustomValidity('')"
/></label>
<br />
<label
>Width (px):<input
required
type="number"
id="width"
value="400"
oninvalid="this.setCustomValidity('Insert width of generated feed. Default: 400')"
oninput="this.setCustomValidity('')"
/></label>
<br />
<label
>Height (px):<input
required
type="number"
id="height"
value="800"
oninvalid="this.setCustomValidity('Insert height of generated feed. Default: 800')"
oninput="this.setCustomValidity('')"
/></label>
<br />
<label
>UI Scale (percent):<input
required
type="number"
id="size"
value="100"
oninvalid="this.setCustomValidity('Insert UI scale. Default: 100')"
oninput="this.setCustomValidity('')"
/></label>
<br />
<label
>Theme:
<select id="theme">
<option value="auto-auto">auto-auto (depends on instance, automatic)</option>
<option value="auto-dark">auto-dark (depends on instance, use dark)</option>
<option value="auto-light">auto-light (depends on instance, use light)</option>
<option value="masto-dark">masto-dark</option>
<option value="masto-light">masto-light</option>
<option value="masto-auto">
masto-auto (based on css prefers-color-scheme)
</option>
<option value="misskey-dark">misskey-dark</option>
<option value="misskey-light">misskey-light</option>
<option value="misskey-auto">
misskey-auto (based on css prefers-color-scheme)
</option>
<option value="pleroma">pleroma</option>
</select>
</label>
<br />
<label
>Show Header?<input id="header" type="checkbox" checked="checked"
/></label>
<br />
<label>Hide replies?<input type="checkbox" id="hidereplies" /></label>
<br />
<label>Hide boosts?<input type="checkbox" id="hideboosts" /></label>
<br />
<br />
<button value="generate">Generate</button>
</form>
<br /><br />
<label
>Use this markup in your HTML: <br /><textarea
id="result"
placeholder="result will go here"
></textarea>
</label>
<br /><br />
<h3>Live Preview:</h3>
<span class="iframe-contain">
<iframe
id="frame"
allowfullscreen
sandbox="allow-top-navigation allow-scripts"
width="400"
height="800"
src="/api/v1/feed?user=sam&instance=https%3A%2F%2Ffroth.zone&instance_type=&theme=pleroma&size=100&header=true&replies=true&boosts=true"
></iframe>
</span>
<br />
</div>
</body>
</html>

41
public/js/script.js Normal file
View File

@ -0,0 +1,41 @@
window.genUrl = function genUrl() {
function val(id) {
return document.getElementById(id).value;
}
let user = val("usernamein");
let instance = "https://" + val("urlin");
let showBoosts = (!document.getElementById("hideboosts").checked).toString();
let showReplies = (!document.getElementById("hidereplies")
.checked).toString();
let showHeader = document.getElementById("header").checked.toString();
let portStr =
window.location.port && window.location.port != 80
? ":" + window.location.port
: "";
// Generate the URL for the iframe
// Prettier, WHY
let iframeUrl = `${window.location.protocol}//${
window.location.hostname
}${portStr}/api/v1/feed?user=${encodeURIComponent(
user
)}&instance=${encodeURIComponent(instance)}&instance_type=&theme=${val(
"theme"
)}&size=${val(
"size"
)}&header=${showHeader}&replies=${showReplies}&boosts=${showBoosts}`;
// Prettier, WHY
document.getElementById(
"result"
).value = `<iframe allowfullscreen sandbox="allow-top-navigation allow-scripts" width="${val(
"width"
)}" height="${val("height")}" src="${iframeUrl}"></iframe>`;
let iframe = document.getElementById("frame");
iframe.src = iframeUrl;
iframe.width = val("width");
iframe.height = val("height");
};

17
public/lib/infinite-scroll.pkgd.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,4 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
]
"extends": ["config:base"]
}

View File

@ -1,22 +0,0 @@
// build the styles
import { readFileSync, writeFileSync } from "fs";
import { renderSync } from "node-sass";
let staticDir = "./src/public/";
let srcDir = "./src/stylesrc/";
let themes = ["masto-light","masto-dark","masto-auto"];
themes.forEach(function(s){
let sassFile = srcDir+s+".scss";
let cssFile = staticDir+s+".css";
let result = renderSync({
data: readFileSync(sassFile,"utf8"),
includePaths:[srcDir]
});
writeFileSync(cssFile,result.css,"utf8");
});
console.log("ok");

View File

@ -1,130 +0,0 @@
import Express from "express";
// v2 api
import convertv2 from "../lib/convert.js";
import serveStatic from "serve-static";
import cors from "cors";
import errorPage from "../lib/errorPage.js";
import morgan from "morgan";
import { detector } from "megalodon";
const app = Express();
const logger = morgan(":method :url :status via :referrer - :response-time ms");
app.use(
serveStatic("src/public", {
maxAge: "1d",
}),
);
function doCache(res, durationSecs) {
res.set({
"Cache-Control": "max-age=" + durationSecs,
});
}
// this just redirects to the
app.options("/api/feed", cors());
app.get("/api/feed", cors(), logger, function (req, res) {
// get feed url
const feedUrl = req.query.url;
if (!feedUrl) {
res.status(400);
res.send(errorPage(400, "You need to specify a feed URL"));
return;
}
const userUrl = feedUrl.replace(/\.atom.*/i, "");
const redirectUrl = "/api/v1/feed?";
const qs = [ "userurl=" + encodeURIComponent(userUrl), "api=v1" ];
([ "size", "theme", "boosts", "replies" ]).forEach((key) => {
if (typeof req.query[ key ] != "undefined") {
qs.push(key + "=" + encodeURIComponent(req.query[ key ]));
}
});
res.redirect(redirectUrl + qs.join("&"));
});
app.options("/api/v1/feed", cors());
// http://localhost:8000/api/v1/feed?userurl=https%3A%2F%2Foctodon.social%2Fusers%2Ffenwick67
app.get("/api/v1/feed", cors(), logger, async function (req, res) {
// get feed url
// userUrl
let type = req.query.instance_type;
let userUrl = req.query.userurl;
if (userUrl === "" || userUrl === undefined) {
const user = req.query.user;
const instance = req.query.instance;
if (type === "" || type === undefined) {
type = await detector(instance).catch(() =>
"",
);
}
if (type === "mastodon" || type === "pleroma")
userUrl = instance + "/users/" + user;
else if (type === "misskey")
userUrl = instance + "/@" + user;
else {
res.status(400);
res.send(errorPage(400, "You need to specify a user URL"));
return;
}
}
const feedUrl = req.query.feedurl;
const opts = {};
if (req.query.size) {
opts.size = req.query.size;
}
if (req.query.theme) {
opts.theme = req.query.theme;
}
if (req.query.header) {
if (req.query.header.toLowerCase() == "no" || req.query.header.toLowerCase() == "false") {
opts.header = false;
} else {
opts.header = true;
}
}
opts.instance_type = type;
opts.boosts = true;
if (req.query.boosts) {
if (req.query.boosts.toLowerCase() == "no" || req.query.boosts.toLowerCase() == "false") {
opts.boosts = false;
} else {
opts.boosts = true;
}
}
opts.replies = true;
if (req.query.replies) {
if (req.query.replies.toLowerCase() == "no" || req.query.replies.toLowerCase() == "false") {
opts.replies = false;
} else {
opts.replies = true;
}
}
opts.userUrl = userUrl;
opts.feedUrl = feedUrl;
opts.mastofeedUrl = req.url;
convertv2(opts).then((data) => {
res.status(200);
doCache(res, 60 * 60);
res.send(data);
}).catch((er) => {
res.status(500);
res.send(errorPage(500, null, { theme: opts.theme, size: opts.size }));
// TODO log the error
console.error(er, er.stack);
});
});
app.listen(process.env.PORT || 8000, "127.0.0.1", function () {
console.log("Server started, listening on " + (process.env.PORT || 8000));
});

View File

@ -1,309 +0,0 @@
html,
body {
background-color: #ffffff;
font-family: 'Roboto', roboto, Arial, sans-serif;
color: #282c37;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: #2b90d9; }
.meta {
background-color: #ecf0f4; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #282c37; }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(255, 255, 255, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(255, 255, 255, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #8494ab; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: #90a1ba;
font-size: 0.9rem; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #282c37;
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #282c37;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #8494ab;
color: #ffffff;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; }
.item-content,
.description,
.title,
html,
body {
font-weight: normal; }
@media (prefers-color-scheme: masto-dark) {
html,
body {
background-color: #282c37;
font-family: 'Roboto', roboto, Arial, sans-serif;
color: #ffffff;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: #2b90d9; }
.meta {
background-color: #39404d; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #ffffff; }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(40, 44, 55, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(40, 44, 55, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #626d80; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: #9baec8;
font-size: 0.9rem; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #ffffff;
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #ffffff;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; } }

View File

@ -1,163 +0,0 @@
html,
body {
background-color: #282c37;
font-family: 'Roboto', roboto, Arial, sans-serif;
color: #ffffff;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: #2b90d9; }
.meta {
background-color: #39404d; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #ffffff; }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(40, 44, 55, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(40, 44, 55, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #626d80; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: #9baec8;
font-size: 0.9rem; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #ffffff;
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #ffffff;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; }

View File

@ -1,170 +0,0 @@
html,
body {
background-color: #ffffff;
font-family: 'Roboto', roboto, Arial, sans-serif;
color: #282c37;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: #2b90d9; }
.meta {
background-color: #ecf0f4; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #282c37; }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(255, 255, 255, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(255, 255, 255, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #8494ab; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: #90a1ba;
font-size: 0.9rem; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #282c37;
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #282c37;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #8494ab;
color: #ffffff;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; }
.item-content,
.description,
.title,
html,
body {
font-weight: normal; }

View File

@ -1,351 +0,0 @@
html,
body {
background-color: rgb(249, 249, 249);
font-family: 'Roboto', roboto, Arial, sans-serif;
color: #282c37;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: rgb(68, 164, 193); }
a[rel = "tag"] {
color: rgb(255, 145, 86); }
.meta {
background-color: #ecf0f4; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #282c37; }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(255, 255, 255, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(255, 255, 255, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #8494ab; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: #90a1ba;
font-size: 0.9rem; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #282c37;
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.u-url,
.mention{
color: #86b300; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #282c37;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #8494ab;
color: #ffffff;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; }
.item-content,
.description,
.title,
html,
body {
font-weight: normal; }
@media (prefers-color-scheme: misskey-dark) {
html,
body {
background-color: #232323;
font-family: 'Roboto', roboto, Arial, sans-serif;
color: #dadada;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: rgb(134, 179, 0); }
a[rel = "tag"] {
color: rgb(76, 184, 212); }
.meta {
background-color: #39404d; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: rgb(199, 209, 216); }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(45, 45, 45, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(45, 45, 45, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #626d80; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: #9baec8;
font-size: 0.9rem;
opacity: .5; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #dadada;
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.u-url,
.mention{
color: #86b300; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.1);
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; } }

View File

@ -1,171 +0,0 @@
html,
body {
background-color: #232323;
font-family: 'Roboto', roboto, Arial, sans-serif;
color: #dadada;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: rgb(134, 179, 0); }
a[rel = "tag"] {
color: rgb(76, 184, 212); }
.meta {
background-color: #39404d; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: rgb(199, 209, 216); }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(45, 45, 45, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(45, 45, 45, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #626d80; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: #9baec8;
font-size: 0.9rem;
opacity: .5; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #dadada;
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.u-url,
.mention{
color: #86b300; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.1);
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; }

View File

@ -1,177 +0,0 @@
html,
body {
background-color: rgb(249, 249, 249);
font-family: 'Roboto', roboto, Arial, sans-serif;
color: #282c37;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: rgb(68, 164, 193); }
a[rel = "tag"] {
color: rgb(255, 145, 86); }
.meta {
background-color: #ecf0f4; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #282c37; }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(255, 255, 255, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(255, 255, 255, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #8494ab; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: #90a1ba;
font-size: 0.9rem; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #282c37;
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.u-url,
.mention{
color: #86b300; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #282c37;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #8494ab;
color: #ffffff;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; }
.item-content,
.description,
.title,
html,
body {
font-weight: normal; }

View File

@ -1,163 +0,0 @@
html,
body {
background-color: rgba(15, 22, 30, 1);
font-family: 'Roboto', roboto, Arial, sans-serif;
color: rgba(185, 185, 186, 1);
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: #e2b188; }
.meta {
background-color: #39404d; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: rgba(185, 185, 186, 1); }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(40, 44, 55, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(40, 44, 55, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #626d80; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: rgba(185, 185, 186, 0.5);
font-size: 0.9rem; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: rgba(185, 185, 186, 1);
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: rgba(185, 185, 186, 1);
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; }

View File

@ -1,118 +0,0 @@
/*
* Based on .css file from https://joinmastodon.org (by Gargron and latrani)
*/
@import url(https://fonts.googleapis.com/css?family=Quando|Judson|Montserrat:500|Roboto:400,500);
a, abbr, acronym, address, applet, article, aside, audio, b, big, blockquote,
body, canvas, caption, center, cite, code, dd, del, details, dfn, div, dl,
dt, em, embed, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4,
h5, h6, header, hgroup, html, i, iframe, img, ins, kbd, label, legend, li,
mark, menu, nav, object, ol, output, p, pre, q, ruby, s, samp, section, small,
span, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead,
time, tr, tt, u, ul, var, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline
}
article, aside, details, figcaption, figure, footer, header, hgroup,
menu, nav, section {
display: block
}
a {
outline: 0
}
label, h3 {
color: #607ea7;
margin-bottom: 26px;
font-size: 16px;
line-height: 24px
}
body {
text-rendering: optimizelegibility;
-webkit-font-feature-settings: "kern";
font-feature-settings: "kern";
-webkit-text-size-adjust: none;
-ms-text-size-adjust: none;
text-size-adjust: none;
box-sizing: border-box;
font-family: Roboto, sans-serif;
background-color: #000000;
color: #5f6b84;
font-size: 13px;
line-height: 18px;
font-weight: 400;
margin:1em
}
h1 {
font-family: Montserrat, sans-serif;
font-size: 26px;
margin-bottom: 20px
}
input[type="text"], input[type="number"], select {
outline: 0;
box-sizing: border-box;
border-radius: 4px;
display: block;
width: 100%;
border: none;
padding: 10px;
padding-right: 30px;
font-family: inherit;
background: #0e1013;
color: #9baec8;
font-size: 14px;
margin: 0
}
h4 {
font-family: Montserrat, sans-serif;
font-size: 16px;
line-height: 24px;
margin-bottom: 20px;
color: #9baec8
}
img {
width: 16px;
height: 16px;
opacity: .5;
-webkit-transition: opacity .25s linear;
transition: opacity .25s linear
}
div {
max-width: 800px;
margin: 0 auto
}
.iframe-contain {
display:block;
text-align:center;
}
button, a {
display: inline-block;
text-align: center;
font-size: 16px;
text-decoration: none;
line-height: 36px;
padding: 4px 16px;
background: transparent;
border: 1px solid #9baec8;
border-radius: 4px;
padding: 3px 15px;
color: #9baec8;
cursor:pointer;
}
button:hover, a:hover {
background-color: #394150;
}

View File

@ -1,76 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1">
<title>Fedifeed - embeddable ActivityPub feeds</title>
<link rel="stylesheet" href="./css/stylesheet.css">
<script src="./js/script.js" defer></script>
</head>
<body>
<br>
<div>
<h1>Fedifeed</h1>
<h4>Embedded ActivityPub feeds for blogs, websites, etc.</h4>
<a href="https://github.com/SamTherapy/fedifeed" class="cta button alt">Fork on Github <img
class="link-logo after" src="github-logo.svg" alt="Github Logo" data-reactid="19"></a><br>
<br>
<hr><br>
<form action="javascript:genUrl()">
<label>Instance URL:<input required type="text" id="urlin" placeholder="mastodon.social"
oninvalid="this.setCustomValidity('Insert your instance URL. Example: mastodon.social')"
oninput="this.setCustomValidity('')"></label>
<br>
<label>Username:<input required type="text" id="usernamein" placeholder="gargron"
oninvalid="this.setCustomValidity('Insert your username. Example: gargron')"
oninput="this.setCustomValidity('')"></label>
<br>
<label>Width (px):<input required type="number" id="width" value="400"
oninvalid="this.setCustomValidity('Insert width of generated feed. Default: 400')"
oninput="this.setCustomValidity('')"></label>
<br>
<label>Height (px):<input required type="number" id="height" value="800"
oninvalid="this.setCustomValidity('Insert height of generated feed. Default: 800')"
oninput="this.setCustomValidity('')"></label>
<br>
<label>UI Scale (percent):<input required type="number" id="size" value="100"
oninvalid="this.setCustomValidity('Insert UI scale. Default: 100')"
oninput="this.setCustomValidity('')"></label>
<br>
<label>Theme:
<select id="theme">
<option value="masto-dark">masto-dark</option>
<option value="masto-light">masto-light</option>
<option value="masto-auto">masto-auto (based on css prefers-color-scheme)</option>
<option value="misskey-dark">misskey-dark</option>
<option value="misskey-light">misskey-light</option>
<option value="misskey-auto">misskey-auto (based on css prefers-color-scheme)</option>
<option value="pleroma">pleroma</option>
</select>
</label>
<br>
<label>Show Header?<input id="header" type="checkbox" checked="checked"></label>
<br>
<label>Hide replies?<input type="checkbox" id="hidereplies" checked="checked"></label>
<br>
<label>Hide boosts?<input type="checkbox" id="hideboosts" checked="checked"></label>
<br>
<br>
<button value="generate">Generate</button>
</form>
<br><br>
<label>Use this markup in your HTML: <br><textarea id="result"
placeholder="result will go here"></textarea></label>
<br><br>
<h3>Live Preview:</h3>
<span class="iframe-contain">
<iframe id="frame" allowfullscreen sandbox="allow-top-navigation allow-scripts" width="400" height="800"
src="/api/v1/feed?userurl=https%3A%2F%2Fmastodon.social%2Fusers%2Fgargron&replies=false&boosts=true">></iframe>
</span>
<br>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -1,24 +0,0 @@
window.genUrl = function genUrl() {
function val(id) {
return document.getElementById(id).value;
}
let user = val("usernamein");
let instance = "https://" + val("urlin");
let showBoosts = (!document.getElementById("hideboosts").checked).toString();
let showReplies = (!document.getElementById("hidereplies").checked).toString();
let showHeader = document.getElementById("header").checked.toString();
let portStr = (window.location.port && window.location.port != 80) ? (":" + window.location.port) : "";
let iframeUrl = window.location.protocol + "//" + window.location.hostname + portStr
+ "/api/v1/feed?user=" + encodeURIComponent(user) + "&instance=" + encodeURIComponent(instance) + "&instance_type=" + "&theme=" + val("theme") + "&size=" + val("size")
+ "&header=" + showHeader + "&replies=" + showReplies + "&boosts=" + showBoosts;
document.getElementById("result").value = "<iframe allowfullscreen sandbox=\"allow-top-navigation allow-scripts\" width=\"" + val("width") + "\" height=\"" + val("height") + "\" src=\"" + iframeUrl + "\"></iframe>";
let iframe = document.getElementById("frame");
iframe.src = iframeUrl;
iframe.width = val("width");
iframe.height = val("height");
};

View File

@ -1,163 +0,0 @@
html,
body {
background-color: #282c37;
font-family: 'Roboto', roboto, Arial, sans-serif;
color: #ffffff;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: #2b90d9; }
.meta {
background-color: #39404d; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #ffffff; }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(40, 44, 55, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(40, 44, 55, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #626d80; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: #9baec8;
font-size: 0.9rem; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #ffffff;
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #ffffff;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #626d80;
color: #282c37;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; }

View File

@ -1,170 +0,0 @@
html,
body {
background-color: #ffffff;
font-family: 'Roboto', roboto, Arial, sans-serif;
color: #282c37;
font-weight: lighter;
overflow-x: hidden;
font-size: 100%;
word-break: break-word; }
* {
margin: 0;
padding: 0; }
a,
a * {
color: #2b90d9; }
.meta {
background-color: #ecf0f4; }
.header {
display: flex;
background-size: cover;
min-height: 8rem;
color: #282c37; }
.header .header-left, .header .header-right {
margin: 0; }
.header .header-left {
min-width: 8rem;
position: relative;
text-align: center;
background: rgba(255, 255, 255, 0.3); }
.header .header-left .avatar {
width: 6rem;
height: 6rem;
position: relative;
top: calc(50% - 3rem); }
.header .header-right {
flex-grow: 1;
font-size: 0.9rem;
padding: 0.9rem;
background: rgba(255, 255, 255, 0.85); }
.header .header-title {
font-size: 1.3rem; }
.item {
padding: 1rem;
border-top: solid 1px #8494ab; }
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight: lighter; }
.item-content *, .cw {
margin: 1rem 0;
line-height: 1.4rem; }
.item-title,
.date,
.author-fullname {
color: #90a1ba;
font-size: 0.9rem; }
.date {
margin: 1rem 0 0 0;
text-decoration: none;
display: block; }
.date:hover {
text-decoration: underline; }
.item-title {
margin-bottom: 0.7rem; }
.author {
display: flex;
margin-bottom: 1rem; }
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around; }
.author-info .author-displayname {
font-size: 1.2rem;
color: #282c37;
text-decoration: none;
display: block;
font-weight: bolder; }
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%; }
.avatar.circular {
border-radius: 100%; }
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap: wrap;
flex-direction: row;
overflow: hidden; }
.enclosure {
display: flex;
flex: 1 1 auto;
width: 50%;
border: none;
max-height: 12rem; }
a.enclosure {
cursor: zoom-in; }
.enclosure > * {
flex: 1 1 auto;
width: 100%;
height: 100%;
object-fit: cover; }
.meta .title {
font-weight: bold; }
.hidden {
display: none; }
.button {
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background: #2b90d9;
color: #282c37;
font-weight: 400;
cursor: pointer;
text-transform: uppercase;
user-select: none; }
label.button {
padding: 0.25rem 0.5rem;
margin: 0.4rem;
background: #8494ab;
color: #ffffff;
font-size: 0.8rem; }
input[type=checkbox] {
position: absolute;
left: -9999px; }
input[type=checkbox]:checked ~ label::after {
content: " Less"; }
input[type=checkbox]:not(:checked) ~ label::after {
content: " More"; }
input[type=checkbox]:not(:checked) ~ div {
display: none; }
.item-content,
.description,
.title,
html,
body {
font-weight: normal; }

View File

@ -1,5 +0,0 @@
@import 'masto-light.scss';
@media (prefers-color-scheme: masto-dark) {
@import 'masto-dark.scss';
}

View File

@ -1,196 +0,0 @@
$bg: #fff !default;
$bg2: darken($bg, 6) !default;
$fg: #000 !default;
$dim: lighten($fg, 50) !default;
$dimmer: darken($bg2, 10) !default;
$link: #09c !default;
html,
body {
background-color: $bg;
font-family: 'Roboto', roboto, Arial, sans-serif;
color: $fg;
font-weight: lighter;
overflow-x:hidden;
font-size:100%;
word-break: break-word;
}
* {
margin: 0;
padding: 0;
}
a,
a * {
color: $link;
}
.meta {
//padding: 1rem;
background-color: $bg2;
}
.header{
display:flex;
background-size:cover;
min-height:8rem;
color:$fg;
.header-left,.header-right{
margin:0;
}
.header-left{
min-width:8rem;
position:relative;
text-align:center;
background:transparentize($bg,0.7);
.avatar{
width: 6rem;
height: 6rem;
position:relative;
top:calc(50% - 3rem);
}
}
.header-right{
flex-grow:1;
font-size:0.9rem;
padding:0.9rem;
background:transparentize($bg,0.15);
}
.header-title{
font-size:1.3rem;
}
}
.item {
padding: 1rem;
border-top: solid 1px $dimmer;
}
.item-content,
.cw,
.title {
font-size: 1.1rem;
font-weight:lighter;
}
.item-content *,.cw{
margin: 1rem 0;
line-height:1.4rem;
}
.item-title,
.date,
.author-fullname {
color: $dim;
font-size: 0.9rem;
}
.date{
margin: 1rem 0 0 0;
text-decoration: none;
display:block;
}
.date:hover{
text-decoration: underline;
}
.item-title{
margin-bottom:0.7rem;
}
.author {
display: flex;
margin-bottom: 1rem;
}
.author-info {
margin: 0 1rem;
display: flex;
flex-direction: column;
justify-content: space-around;
.author-displayname {
font-size: 1.2rem;
color: $fg;
text-decoration: none;
display: block;
font-weight: bolder;
}
}
.avatar {
width: 3rem;
height: 3rem;
border: none;
border-radius: 10%;
&.circular{
border-radius: 100%;
}
}
.enclosures {
padding: 0.5em 0;
display: flex;
flex-wrap:wrap;
flex-direction: row;
overflow: hidden;
}
.enclosure{
display:flex;
flex: 1 1 auto;
width:50%;
border: none;
max-height: 12rem;
}
a.enclosure{
cursor: zoom-in;
}
.enclosure>*{
flex: 1 1 auto;
width:100%;
height:100%;
object-fit: cover;
}
.meta .title{
font-weight:bold;
}
.hidden{
display:none;
}
.button{
padding: 0.5rem 1rem;
border: none;
margin: 1rem;
border-radius: 0.5rem;
display: inline-block;
text-decoration: none;
background:$link;
color:$fg;
font-weight:400;
cursor: pointer;
text-transform: uppercase;
user-select: none;
}
label.button{
padding: 0.25rem 0.5rem;
margin:0.4rem;
background:$dimmer;
color:$bg;
font-size:0.8rem;
}
// checkbox hack stuff
input[type=checkbox] {
position: absolute;
left: -9999px;
}
input[type=checkbox]:checked ~ label::after{
content:" Less";
}
input[type=checkbox]:not(:checked) ~ label::after{
content:" More";
}
input[type=checkbox]:not(:checked) ~ div{
display:none;
}

View File

@ -1,10 +0,0 @@
@import 'mastodon-vars.scss';
$bg: $darkest;
$bg2: mix($darkest,$lighter,85%);
$fg: $white;
$dim: $lighter;
$dimmer: mix($darkest,$lighter,50%);
$link: $vibrant;
@import 'masto-base.scss';

View File

@ -1,18 +0,0 @@
@import 'mastodon-vars.scss';
$bg: $white ;
$bg2: mix($lightest,$white);
$fg: $darkest;
$dim: mix($lighter,$darkest,90%);
$dimmer: mix($lighter,$darkest,80%);
$link: $vibrant;
@import 'masto-base.scss';
.item-content,
.description,
.title,
html,
body {
font-weight:normal;
}

View File

@ -1,8 +0,0 @@
$darkest: #282c37 !default; // darkest
$lightest: #d9e1e8 !default; // lightest
$lighter: #9baec8 !default; // lighter
$vibrant: #2b90d9 !default; // vibrant
$white: #ffffff !default; // white
$error: #df405a !default; // error red
$succ: #79bd9a !default; // succ green
$black: #000000 !default; // black

View File

@ -1,47 +0,0 @@
<body class="embed">
<div class="activity-stream activity-stream-headless">
<div class="entry entry-reblog h-cite">
<div class="pre-header">
<div class="pre-header__icon">
<i class="fa fa-retweet fa-fw"></i>
</div>
<span>
<a class="status__display-name muted" href="https://octodon.social/@fenwick67"><strong class="emojify">fenwick67 <img draggable="false" class="emojione" alt="🦆" src="/emoji/1f986.svg"></strong>
</a>boosted
</span>
</div>
<div class="detailed-status masto-light">
<a class="detailed-status__display-name p-author h-card" target="_blank" rel="noopener" href="https://social.tchncs.de/@muninnherself"><div>
<div class="avatar">
<img alt="" class="u-photo" src="https://assets.octodon.social/accounts/avatars/000/018/289/original/eb6b32e85f8606b4.jpg" width="48" height="48">
</div>
</div>
<span class="display-name">
<strong class="p-name emojify">Jack Fraser</strong>
<span>@muninnherself@social.tchncs.de</span>
</span>
</a><div class="status__content p-name emojify"><div class="e-content" style="display: block; direction: ltr" lang="es"><p><a href="https://social.tchncs.de/tags/dailymegalith">#<span>DailyMegalith</span></a> Corrimony chambered cairn <a href="https://social.tchncs.de/tags/highland">#<span>Highland</span></a> <a href="https://social.tchncs.de/tags/scotland">#<span>Scotland</span></a> (2009) <a href="https://social.tchncs.de/media/MxqONSPOUvoExt4uVPM"><span class="invisible">https://</span><span class="ellipsis">social.tchncs.de/media/MxqONSP</span><span class="invisible">OUvoExt4uVPM</span></a></p></div></div>
<div class="detailed-status__attachments">
<div class="status__attachments__inner">
<div class="media-item">
<a style="background-image: url(https://assets.octodon.social/media_attachments/files/000/110/813/original/cbc5fbacac3f24d1.jpg)" target="_blank" rel="noopener" class="u-photo" href="https://social.tchncs.de/system/media_attachments/files/000/103/988/original/cbc5fbacac3f24d1.jpg"></a></div>
</div>
</div>
<div class="detailed-status__meta">
<data class="dt-published" value="2017-04-29T19:52:16+00:00"></data>
<a class="detailed-status__datetime u-url u-uid" target="_blank" rel="noopener" href="https://social.tchncs.de/users/muninnherself/updates/69203"><span><time datetime="2017-04-29T19:52:16Z" data-local="time" data-format="%b %d, %Y, %H:%M" title="April 29, 2017 at 2:52pm CST" data-localized="true">Apr 29, 2017, 14:52</time></span>
</a>·
<span><i class="fa fa-retweet"></i><span>1</span></span>
·
<span><i class="fa fa-star"></i><span>1</span></span>
</div>
</div>
</div>
</div>
</body>

View File

@ -1,534 +0,0 @@
<html>
<head>
<meta charset="UTF-8"></meta>
<style type="text/css"></style>
<link rel="stylesheet" href="/masto-dark.css"></link>
</head>
<body>
<div class="meta">
<div class="header" style="">
<a class="header-left" target="_top" href="https://octodon.social/@fenwick67">
<img class="avatar circular" src="https://assets.octodon.social/accounts/avatars/000/008/871/original/d5281ad9c6c7401d.jpg"></img>
</a>
<div class="description header-right">
<a target="_top" href="https://octodon.social/@fenwick67">
fenwick 🦆
</a>
<br>
Engineer, Developer, Person. http://fenwick.pizza
</div>
</div>
</div>
<div class="container">
<div class="item">
<div class="item-title"> fenwick67 shared a status by cypnk@mastodon.social </div>
<div class="author">
<a target="_top" class="avatar" href="https://mastodon.social/users/cypnk">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/020/009/original/086ced36687bf000.png"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://mastodon.social/users/cypnk"> r҉ustic cy͠be̸rpu̵nk🤠🤖 </a>
<div class="author-fullname"> cypnk@mastodon.social </div>
</div>
</div>
<div class="item-content">
<p>So curl parrot.live is a thing</p><p>( Via <a target="_top"href="https://twitter.com/darksim905/status/977256948918874112" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="ellipsis">twitter.com/darksim905/status/</span><span class="invisible">977256948918874112</span></a> )</p>
</div>
<div class="enclosures">
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/460/576/original/a3f046541a1be4cb.mp4" >
<video autoplay loop muted src="https://assets.octodon.social/media_attachments/files/001/460/576/original/a3f046541a1be4cb.mp4"/>
</a>
</div>
<div class="date">16 hours ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by LinuxSocist@icosahedron.website </div>
<div class="author">
<a target="_top" class="avatar" href="https://icosahedron.website/users/LinuxSocist">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/002/386/original/cd9c7aa648d840c6.png"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://icosahedron.website/users/LinuxSocist"> Linux Socialist </a>
<div class="author-fullname"> LinuxSocist@icosahedron.website </div>
</div>
</div>
<div class="item-content">
<p>'Why we choose Godot Engine Rock Milk'<br><a target="_top"href="https://medium.com/@rockmilkgames/why-godot-engine-e0d4736d6eb0" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="ellipsis">medium.com/@rockmilkgames/why-</span><span class="invisible">godot-engine-e0d4736d6eb0</span></a></p>
</div>
<div class="date">16 hours ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by meirlbot@mastodon.social </div>
<div class="author">
<a target="_top" class="avatar" href="https://mastodon.social/users/meirlbot">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/091/213/original/b214dff45bb239f3.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://mastodon.social/users/meirlbot"> me irl </a>
<div class="author-fullname"> meirlbot@mastodon.social </div>
</div>
</div>
<div class="item-content">
<p>me irl <a target="_top"href="https://redd.it/86nbzr" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="">redd.it/86nbzr</span><span class="invisible"></span></a></p>
</div>
<div class="enclosures">
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/460/499/original/3231efe4233d15bd.png" >
<img src="https://assets.octodon.social/media_attachments/files/001/460/499/original/3231efe4233d15bd.png"/>
</a>
</div>
<div class="date">16 hours ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by natecull@mastodon.social </div>
<div class="author">
<a target="_top" class="avatar" href="https://mastodon.social/users/natecull">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/004/022/original/5e674cac327b3746.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://mastodon.social/users/natecull"> Nate Cull </a>
<div class="author-fullname"> natecull@mastodon.social </div>
</div>
</div>
<div class="item-content">
<p>Medium needs to stop doing this, or people need to stop using Medium.</p><p>It's a website that hosts blogs.</p><p>That you read.</p><p>it doesn't need your Fooglebaceook account.</p>
</div>
<div class="enclosures">
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/459/532/original/6ae62ea552e0115b.png" >
<img src="https://assets.octodon.social/media_attachments/files/001/459/532/original/6ae62ea552e0115b.png"/>
</a>
</div>
<div class="date">16 hours ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by tom@slime.global </div>
<div class="author">
<a target="_top" class="avatar" href="https://slime.global/users/tom">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/005/490/original/a9f04627c77b06db.gif"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://slime.global/users/tom"> switched-on tom </a>
<div class="author-fullname"> tom@slime.global </div>
</div>
</div>
<div class="item-content">
<p>fuck you</p>
</div>
<div class="enclosures">
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/456/443/original/d4af7e0451af8676.mp4" >
<video autoplay loop muted src="https://assets.octodon.social/media_attachments/files/001/456/443/original/d4af7e0451af8676.mp4"/>
</a>
</div>
<div class="date">17 hours ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by mcmoots@a.weirder.earth </div>
<div class="author">
<a target="_top" class="avatar" href="https://a.weirder.earth/users/mcmoots">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/016/718/original/ca9a8d20edf9f2de.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://a.weirder.earth/users/mcmoots"> 👀🌲 </a>
<div class="author-fullname"> mcmoots@a.weirder.earth </div>
</div>
</div>
<div class="item-content">
<p>From yesterday. Even with a surprise snow it's still the most wonderful time of the year.</p>
</div>
<div class="enclosures">
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/460/171/original/fcad285b55062f29.jpg" >
<img src="https://assets.octodon.social/media_attachments/files/001/460/171/original/fcad285b55062f29.jpg"/>
</a>
</div>
<div class="date">18 hours ago</div>
</div>
<div class="item">
<div class="author">
<a target="_top" class="avatar" href="https://octodon.social/users/fenwick67">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/008/871/original/d5281ad9c6c7401d.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://octodon.social/users/fenwick67"> fenwick 🦆 </a>
<div class="author-fullname"> fenwick67@octodon.social </div>
</div>
</div>
<div class="item-content">
<p><span class="h-card"><a target="_top"href="https://kitty.town/@GinnyMcQueen" class="u-url mention">@<span>GinnyMcQueen</span></a></span> these are so geometric I thought it was some plastic thing when I scrolled past</p>
</div>
<div class="date">18 hours ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by fillertrack@slime.global </div>
<div class="author">
<a target="_top" class="avatar" href="https://slime.global/users/fillertrack">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/007/118/original/9e846c957d91a7a4.png"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://slime.global/users/fillertrack"> 🐦birdtom🐦 </a>
<div class="author-fullname"> fillertrack@slime.global </div>
</div>
</div>
<div class="item-content">
<p>I am become death, destroyer of worlds.</p>
</div>
<div class="enclosures">
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/456/618/original/c7ab2c504af72a36.mp4" >
<video autoplay loop muted src="https://assets.octodon.social/media_attachments/files/001/456/618/original/c7ab2c504af72a36.mp4"/>
</a>
</div>
<div class="date">20 hours ago</div>
</div>
<div class="item">
<div class="author">
<a target="_top" class="avatar" href="https://octodon.social/users/fenwick67">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/008/871/original/d5281ad9c6c7401d.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://octodon.social/users/fenwick67"> fenwick 🦆 </a>
<div class="author-fullname"> fenwick67@octodon.social </div>
</div>
</div>
<div class="item-content">
<p><span class="h-card"><a target="_top"href="https://cybre.space/@zigg" class="u-url mention">@<span>zigg</span></a></span> node&apos;s FS module on Windows is buggy enough that I recommend using the graceful-fs module in its place when you can</p>
</div>
<div class="date">1 day ago</div>
</div>
<div class="item">
<div class="author">
<a target="_top" class="avatar" href="https://octodon.social/users/fenwick67">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/008/871/original/d5281ad9c6c7401d.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://octodon.social/users/fenwick67"> fenwick 🦆 </a>
<div class="author-fullname"> fenwick67@octodon.social </div>
</div>
</div>
<div class="item-content">
<p><span class="h-card"><a target="_top"href="https://octodon.social/@kingu_platypus_gidora" class="u-url mention">@<span>kingu_platypus_gidora</span></a></span> me tbh</p>
</div>
<div class="date">1 day ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by kingu_platypus_gidora </div>
<div class="author">
<a target="_top" class="avatar" href="https://octodon.social/users/kingu_platypus_gidora">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/001/586/original/751443ed5e9bea89.gif"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://octodon.social/users/kingu_platypus_gidora"> Anarkingu Gidora </a>
<div class="author-fullname"> kingu_platypus_gidora@octodon.social </div>
</div>
</div>
<div class="item-content">
<p>RT <span class="h-card"><a target="_top"href="https://octodon.social/@kingu_platypus_gidora" class="u-url mention">@<span>kingu_platypus_gidora</span></a></span> .</p>
</div>
<div class="enclosures">
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/457/875/original/f2b73debb45d360b.jpg" >
<img src="https://assets.octodon.social/media_attachments/files/001/457/875/original/f2b73debb45d360b.jpg"/>
</a>
</div>
<div class="date">1 day ago</div>
</div>
<div class="item">
<div class="author">
<a target="_top" class="avatar" href="https://octodon.social/users/fenwick67">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/008/871/original/d5281ad9c6c7401d.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://octodon.social/users/fenwick67"> fenwick 🦆 </a>
<div class="author-fullname"> fenwick67@octodon.social </div>
</div>
</div>
<div class="item-content">
<p><span class="h-card"><a target="_top"href="https://meow.social/@Mycroft" class="u-url mention">@<span>Mycroft</span></a></span> the starter set is legit, it&apos;s easy to pick up and a surprising amount of content. Also, the SRD is free to download and there are free adventures on DM&apos;s guild.</p>
</div>
<div class="date">1 day ago</div>
</div>
<div class="item">
<div class="author">
<a target="_top" class="avatar" href="https://octodon.social/users/fenwick67">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/008/871/original/d5281ad9c6c7401d.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://octodon.social/users/fenwick67"> fenwick 🦆 </a>
<div class="author-fullname"> fenwick67@octodon.social </div>
</div>
</div>
<div class="item-content">
<p><span class="h-card"><a target="_top"href="https://niu.moe/@phenethylamine" class="u-url mention">@<span>phenethylamine</span></a></span> vlc?</p>
</div>
<div class="date">1 day ago</div>
</div>
<div class="item">
<div class="author">
<a target="_top" class="avatar" href="https://octodon.social/users/fenwick67">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/008/871/original/d5281ad9c6c7401d.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://octodon.social/users/fenwick67"> fenwick 🦆 </a>
<div class="author-fullname"> fenwick67@octodon.social </div>
</div>
</div>
<div class="item-content">
<p><span class="h-card"><a target="_top"href="https://octodon.social/@Shalazah" class="u-url mention">@<span>Shalazah</span></a></span> welcome y&apos;all</p>
</div>
<div class="date">1 day ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by plsburydoughboy@kitty.town </div>
<div class="author">
<a target="_top" class="avatar" href="https://kitty.town/users/plsburydoughboy">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/075/768/original/90d34987b9fdd5b8.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://kitty.town/users/plsburydoughboy"> pls pet the kitty db </a>
<div class="author-fullname"> plsburydoughboy@kitty.town </div>
</div>
</div>
<div class="item-content">
<p>Marvel: “Infinity War is the most ambitious crossover event in history.”</p><p>Me, fighting off the bad vibes of the world:</p>
</div>
<div class="enclosures">
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/455/106/original/3a7f27a898dfad51.jpg" >
<img src="https://assets.octodon.social/media_attachments/files/001/455/106/original/3a7f27a898dfad51.jpg"/>
</a>
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/455/107/original/b2c15e091ae118b0.jpg" >
<img src="https://assets.octodon.social/media_attachments/files/001/455/107/original/b2c15e091ae118b0.jpg"/>
</a>
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/455/108/original/87d8b73ad85faf44.jpg" >
<img src="https://assets.octodon.social/media_attachments/files/001/455/108/original/87d8b73ad85faf44.jpg"/>
</a>
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/455/109/original/a248e41cfee2a4de.jpg" >
<img src="https://assets.octodon.social/media_attachments/files/001/455/109/original/a248e41cfee2a4de.jpg"/>
</a>
</div>
<div class="date">1 day ago</div>
</div>
<div class="item">
<div class="author">
<a target="_top" class="avatar" href="https://octodon.social/users/fenwick67">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/008/871/original/d5281ad9c6c7401d.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://octodon.social/users/fenwick67"> fenwick 🦆 </a>
<div class="author-fullname"> fenwick67@octodon.social </div>
</div>
</div>
<div class="item-content">
<p><span class="h-card"><a target="_top"href="https://mastodon.social/@idesofmerch" class="u-url mention">@<span>idesofmerch</span></a></span> a radar chart would work great for this imo</p>
</div>
<div class="date">1 day ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by weird_hell@cybre.space </div>
<div class="author">
<a target="_top" class="avatar" href="https://cybre.space/users/weird_hell">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/064/532/original/bc18522f40c53be1.png"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://cybre.space/users/weird_hell"> Display Neam </a>
<div class="author-fullname"> weird_hell@cybre.space </div>
</div>
</div>
<div class="item-content">
<p>if you can't be normal, stop trying to be normal.</p><p>Be weird. Go hard. Don't follow the advice.</p>
</div>
<div class="date">2 days ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by irisjaycomics@mastodon.social </div>
<div class="author">
<a target="_top" class="avatar" href="https://mastodon.social/users/irisjaycomics">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/003/021/original/5af47bfdcd870f0f.jpg"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://mastodon.social/users/irisjaycomics"> ✨Iris Jay✨ </a>
<div class="author-fullname"> irisjaycomics@mastodon.social </div>
</div>
</div>
<div class="item-content">
<p>crossedwires.irisjay.net/?comic=02-106 NEW CROSSED WIRES UPDATE IS LIVE! Its showdown time and nobodys playing fair. <a target="_top"href="https://mastodon.social/tags/cyberpunk" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>cyberpunk</span></a> <a target="_top"href="https://mastodon.social/tags/webcomic" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>webcomic</span></a> <a target="_top"href="https://mastodon.social/tags/queercomics" class="mention hashtag" rel="nofollow noopener" target="_blank">#<span>queercomics</span></a> </p><p>Read from the beginning here: <a target="_top"href="http://crossedwires.irisjay.net/?comic=001" rel="nofollow noopener" target="_blank"><span class="invisible">http://</span><span class="ellipsis">crossedwires.irisjay.net/?comi</span><span class="invisible">c=001</span></a> Buy the book here: <a target="_top"href="http://oreillyjay.tictail.com/product/crossed-wires-volume-1" rel="nofollow noopener" target="_blank"><span class="invisible">http://</span><span class="ellipsis">oreillyjay.tictail.com/product</span><span class="invisible">/crossed-wires-volume-1</span></a> … Send me a tip here: <a target="_top"href="http://ko-fi.com/irisjay" rel="nofollow noopener" target="_blank"><span class="invisible">http://</span><span class="">ko-fi.com/irisjay</span><span class="invisible"></span></a></p>
</div>
<div class="enclosures">
<a target="_top" class="enclosure" href="https://assets.octodon.social/media_attachments/files/001/444/174/original/8c0612168aa67f3b.jpg" >
<img src="https://assets.octodon.social/media_attachments/files/001/444/174/original/8c0612168aa67f3b.jpg"/>
</a>
</div>
<div class="date">2 days ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by omanreagan@scholar.social </div>
<div class="author">
<a target="_top" class="avatar" href="https://scholar.social/users/omanreagan">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/061/431/original/fc6afa77dfda97a6.png"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://scholar.social/users/omanreagan"> Michael 🚀 </a>
<div class="author-fullname"> omanreagan@scholar.social </div>
</div>
</div>
<div class="item-content">
<p>Most importantly, stop putting institutional events on Facebook, stop using it at universities, stop making participation in Facebook mandatory through your institutional, organization, and activist roles. You can be online, and social, and connected without supporting Facebook.</p>
</div>
<div class="date">2 days ago</div>
</div>
<div class="item">
<div class="item-title"> fenwick67 shared a status by elomatreb@glitch.social </div>
<div class="author">
<a target="_top" class="avatar" href="https://glitch.social/users/elomatreb">
<img class="avatar" src="https://assets.octodon.social/accounts/avatars/000/076/355/original/0d8540c1ddb5b8f0.png"/>
</a>
<div class="author-info">
<a target="_top" class="author-displayname" href="https://glitch.social/users/elomatreb"> elomatreb 🐟 </a>
<div class="author-fullname"> elomatreb@glitch.social </div>
</div>
</div>
<div class="item-content">
<p>Decades of programming language research destroyed in one sick own by a rotating coyote</p>
</div>
<div class="date">2 days ago</div>
</div>
</div>
</body>
</html>

View File

@ -1,721 +0,0 @@
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:mastodon="http://mastodon.social/schema/1.0">
<id>https://octodon.social/users/fenwick67.atom</id>
<title>fenwick 🦆</title>
<subtitle>Engineer, Developer, Person. http://fenwick.pizza</subtitle>
<updated>2018-03-23T15:09:56Z</updated>
<logo>https://assets.octodon.social/accounts/avatars/000/008/871/original/d5281ad9c6c7401d.jpg</logo>
<author>
<id>https://octodon.social/users/fenwick67</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://octodon.social/users/fenwick67</uri>
<name>fenwick67</name>
<email>fenwick67@octodon.social</email>
<summary type="html">&lt;p&gt;Engineer, Developer, Person. &lt;a href="http://fenwick.pizza" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;http://&lt;/span&gt;&lt;span class=""&gt;fenwick.pizza&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67"/>
<link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/008/871/original/d5281ad9c6c7401d.jpg"/>
<poco:preferredUsername>fenwick67</poco:preferredUsername>
<poco:displayName>fenwick 🦆</poco:displayName>
<poco:note>Engineer, Developer, Person. http://fenwick.pizza</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67.atom"/>
<link rel="next" type="application/atom+xml" href="https://octodon.social/users/fenwick67.atom?max_id=400111"/>
<link rel="hub" href="https://octodon.social/api/push"/>
<link rel="salmon" href="https://octodon.social/api/salmon/8871"/>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99736382143914398/activity</id>
<published>2018-03-24T01:53:36Z</published>
<updated>2018-03-24T01:53:36Z</updated>
<title>fenwick67 shared a status by cypnk@mastodon.social</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://mastodon.social/users/cypnk/statuses/99736359953171849</id>
<published>2018-03-24T01:48:12Z</published>
<updated>2018-03-24T01:48:12Z</updated>
<title>New status by cypnk@mastodon.social</title>
<author>
<id>https://mastodon.social/users/cypnk</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://mastodon.social/users/cypnk</uri>
<name>cypnk</name>
<email>cypnk@mastodon.social</email>
<summary type="html">&lt;p&gt;Coffee, Code, Cabins&lt;br&gt;New York 🇺🇲&lt;/p&gt;&lt;p&gt;Tor: &lt;a href="http://zgmlocci2uheaw6y.onion" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;http://&lt;/span&gt;&lt;span class=""&gt;zgmlocci2uheaw6y.onion&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://mastodon.social/@cypnk"/>
<link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/020/009/original/086ced36687bf000.png"/>
<link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/020/009/original/485fa1ad392dd656.jpg"/>
<poco:preferredUsername>cypnk</poco:preferredUsername>
<poco:displayName>r҉ustic cy͠be̸rpu̵nk🤠🤖</poco:displayName>
<poco:note>Coffee, Code, CabinsNew York 🇺🇲Tor: http://zgmlocci2uheaw6y.onion</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="en">&lt;p&gt;So curl parrot.live is a thing&lt;/p&gt;&lt;p&gt;( Via &lt;a href="https://twitter.com/darksim905/status/977256948918874112" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class="ellipsis"&gt;twitter.com/darksim905/status/&lt;/span&gt;&lt;span class="invisible"&gt;977256948918874112&lt;/span&gt;&lt;/a&gt; )&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<link rel="enclosure" type="video/mp4" length="587982" href="https://assets.octodon.social/media_attachments/files/001/460/576/original/a3f046541a1be4cb.mp4"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://mastodon.social/@cypnk/99736359953171849"/>
<ostatus:conversation ref="tag:mastodon.social,2018-03-24:objectId=27426557:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99736382143914398/activity"/>
<content type="html" xml:lang="">&lt;p&gt;So curl parrot.live is a thing&lt;/p&gt;&lt;p&gt;( Via &lt;a href="https://twitter.com/darksim905/status/977256948918874112" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class="ellipsis"&gt;twitter.com/darksim905/status/&lt;/span&gt;&lt;span class="invisible"&gt;977256948918874112&lt;/span&gt;&lt;/a&gt; )&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99736382143914398"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/404069.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-24:objectId=6288327:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99736372019184621/activity</id>
<published>2018-03-24T01:51:02Z</published>
<updated>2018-03-24T01:51:02Z</updated>
<title>fenwick67 shared a status by LinuxSocist@icosahedron.website</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://icosahedron.website/users/LinuxSocist/statuses/99736289786218826</id>
<published>2018-03-24T01:30:11Z</published>
<updated>2018-03-24T01:30:11Z</updated>
<title>New status by LinuxSocist@icosahedron.website</title>
<author>
<id>https://icosahedron.website/users/LinuxSocist</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://icosahedron.website/users/LinuxSocist</uri>
<name>LinuxSocist</name>
<email>LinuxSocist@icosahedron.website</email>
<summary type="html">&lt;p&gt;If you can't hack it then you don't own it.&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://icosahedron.website/@LinuxSocist"/>
<link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/002/386/original/cd9c7aa648d840c6.png"/>
<link rel="header" type="image/png" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/002/386/original/7d1ccd7f07d99e51.png"/>
<poco:preferredUsername>LinuxSocist</poco:preferredUsername>
<poco:displayName>Linux Socialist</poco:displayName>
<poco:note>If you can't hack it then you don't own it.</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="">&lt;p&gt;'Why we choose Godot Engine Rock Milk'&lt;br&gt;&lt;a href="https://medium.com/@rockmilkgames/why-godot-engine-e0d4736d6eb0" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class="ellipsis"&gt;medium.com/@rockmilkgames/why-&lt;/span&gt;&lt;span class="invisible"&gt;godot-engine-e0d4736d6eb0&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://icosahedron.website/@LinuxSocist/99736289786218826"/>
<ostatus:conversation ref="tag:icosahedron.website,2018-03-24:objectId=4008292:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99736372019184621/activity"/>
<content type="html" xml:lang="">&lt;p&gt;'Why we choose Godot Engine Rock Milk'&lt;br&gt;&lt;a href="https://medium.com/@rockmilkgames/why-godot-engine-e0d4736d6eb0" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class="ellipsis"&gt;medium.com/@rockmilkgames/why-&lt;/span&gt;&lt;span class="invisible"&gt;godot-engine-e0d4736d6eb0&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99736372019184621"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/404064.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-24:objectId=6288255:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99736293961915027/activity</id>
<published>2018-03-24T01:31:11Z</published>
<updated>2018-03-24T01:31:11Z</updated>
<title>fenwick67 shared a status by meirlbot@mastodon.social</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://mastodon.social/users/meirlbot/statuses/99736260594446646</id>
<published>2018-03-24T01:22:45Z</published>
<updated>2018-03-24T01:22:45Z</updated>
<title>New status by meirlbot@mastodon.social</title>
<author>
<id>https://mastodon.social/users/meirlbot</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://mastodon.social/users/meirlbot</uri>
<name>meirlbot</name>
<email>meirlbot@mastodon.social</email>
<summary type="html">&lt;p&gt;i'm a bot by &lt;span class="h-card"&gt;&lt;a href="https://ultrix.me/@corbin" class="u-url mention" rel="nofollow noopener" target="_blank"&gt;@&lt;span&gt;corbin&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; that mirrors the latest posts from /r/me_irl&lt;/p&gt;&lt;p&gt;twitter: &lt;a href="https://twitter.com/itmeirl" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;twitter.com/itmeirl&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://mastodon.social/@meirlbot"/>
<link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/091/213/original/b214dff45bb239f3.jpg"/>
<link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/091/213/original/30ab34776dc153a1.jpg"/>
<poco:preferredUsername>meirlbot</poco:preferredUsername>
<poco:displayName>me irl</poco:displayName>
<poco:note>i'm a bot by @corbin that mirrors the latest posts from /r/me_irltwitter: https://twitter.com/itmeirl</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="">&lt;p&gt;me irl &lt;a href="https://redd.it/86nbzr" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;redd.it/86nbzr&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<link rel="enclosure" type="image/png" length="298179" href="https://assets.octodon.social/media_attachments/files/001/460/499/original/3231efe4233d15bd.png"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://mastodon.social/@meirlbot/99736260594446646"/>
<ostatus:conversation ref="tag:mastodon.social,2018-03-24:objectId=27425100:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99736293961915027/activity"/>
<content type="html" xml:lang="">&lt;p&gt;me irl &lt;a href="https://redd.it/86nbzr" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;redd.it/86nbzr&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99736293961915027"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/404044.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-24:objectId=6287883:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99736270823277858/activity</id>
<published>2018-03-24T01:25:18Z</published>
<updated>2018-03-24T01:25:18Z</updated>
<title>fenwick67 shared a status by natecull@mastodon.social</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://mastodon.social/users/natecull/statuses/99735315450345700</id>
<published>2018-03-23T21:22:24Z</published>
<updated>2018-03-23T21:22:24Z</updated>
<title>New status by natecull@mastodon.social</title>
<author>
<id>https://mastodon.social/users/natecull</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://mastodon.social/users/natecull</uri>
<name>natecull</name>
<email>natecull@mastodon.social</email>
<summary type="html">&lt;p&gt;and we're all gonna shine a light together&lt;/p&gt;&lt;p&gt; &lt;a href="http://natecull.org/wordpress/tomorrow/" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;http://&lt;/span&gt;&lt;span class="ellipsis"&gt;natecull.org/wordpress/tomorro&lt;/span&gt;&lt;span class="invisible"&gt;w/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://mastodon.social/@natecull"/>
<link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/004/022/original/5e674cac327b3746.jpg"/>
<poco:preferredUsername>natecull</poco:preferredUsername>
<poco:displayName>Nate Cull</poco:displayName>
<poco:note>and we're all gonna shine a light together http://natecull.org/wordpress/tomorrow/</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="en">&lt;p&gt;Medium needs to stop doing this, or people need to stop using Medium.&lt;/p&gt;&lt;p&gt;It's a website that hosts blogs.&lt;/p&gt;&lt;p&gt;That you read.&lt;/p&gt;&lt;p&gt;it doesn't need your Fooglebaceook account.&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<link rel="enclosure" type="image/png" length="132769" href="https://assets.octodon.social/media_attachments/files/001/459/532/original/6ae62ea552e0115b.png"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://mastodon.social/@natecull/99735315450345700"/>
<ostatus:conversation ref="tag:mastodon.social,2018-03-23:objectId=27410361:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99736270823277858/activity"/>
<content type="html" xml:lang="">&lt;p&gt;Medium needs to stop doing this, or people need to stop using Medium.&lt;/p&gt;&lt;p&gt;It's a website that hosts blogs.&lt;/p&gt;&lt;p&gt;That you read.&lt;/p&gt;&lt;p&gt;it doesn't need your Fooglebaceook account.&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99736270823277858"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/404039.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-24:objectId=6287739:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99736154791289301/activity</id>
<published>2018-03-24T00:55:47Z</published>
<updated>2018-03-24T00:55:47Z</updated>
<title>fenwick67 shared a status by tom@slime.global</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://slime.global/users/tom/statuses/99732325744900240</id>
<published>2018-03-23T08:42:08Z</published>
<updated>2018-03-23T08:42:08Z</updated>
<title>New status by tom@slime.global</title>
<author>
<id>https://slime.global/users/tom</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://slime.global/users/tom</uri>
<name>tom</name>
<email>tom@slime.global</email>
<summary type="html">&lt;p&gt;systems engineer by day, instance admin by night! &lt;/p&gt;&lt;p&gt;also makes music &amp;amp; takes photos. &lt;/p&gt;&lt;p&gt;nb, they/them ❤️ &lt;a href="https://tom.ovh" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;tom.ovh&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt; &lt;a href="https://ko-fi.com/itstom" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;ko-fi.com/itstom&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt; (EN/DE OK)&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://slime.global/@tom"/>
<link rel="avatar" type="image/gif" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/005/490/original/a9f04627c77b06db.gif"/>
<link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/005/490/original/96143b7dd2e2b8a6.jpg"/>
<poco:preferredUsername>tom</poco:preferredUsername>
<poco:displayName>switched-on tom</poco:displayName>
<poco:note>systems engineer by day, instance admin by night! also makes music &amp;amp; takes photos. nb, they/them ❤️ https://tom.ovh https://ko-fi.com/itstom (EN/DE OK)</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="">&lt;p&gt;fuck you&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<link rel="enclosure" type="video/mp4" length="273939" href="https://assets.octodon.social/media_attachments/files/001/456/443/original/d4af7e0451af8676.mp4"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://slime.global/@tom/99732325744900240"/>
<thr:in-reply-to ref="https://slime.global/users/tom/statuses/99732195259645456" href="https://slime.global/@tom/99732195259645456"/>
<ostatus:conversation ref="tag:slime.global,2018-03-23:objectId=1669703:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99736154791289301/activity"/>
<content type="html" xml:lang="">&lt;p&gt;fuck you&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99736154791289301"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/404008.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-24:objectId=6286988:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99735931584316464/activity</id>
<published>2018-03-23T23:59:02Z</published>
<updated>2018-03-23T23:59:02Z</updated>
<title>fenwick67 shared a status by mcmoots@a.weirder.earth</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://a.weirder.earth/users/mcmoots/statuses/99735929849758025</id>
<published>2018-03-23T23:58:41Z</published>
<updated>2018-03-23T23:58:41Z</updated>
<title>New status by mcmoots@a.weirder.earth</title>
<author>
<id>https://a.weirder.earth/users/mcmoots</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://a.weirder.earth/users/mcmoots</uri>
<name>mcmoots</name>
<email>mcmoots@a.weirder.earth</email>
<summary type="html">&lt;p&gt;your favorite non-masculine pronouns are fine&lt;/p&gt;&lt;p&gt;🌲🌿🍄&lt;br&gt;🌋🏔&lt;br&gt;🥗🥘&lt;br&gt;🍸🍷🍺 &lt;br&gt;🍩 🥧&lt;br&gt;😻&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://a.weirder.earth/@mcmoots"/>
<link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/016/718/original/ca9a8d20edf9f2de.jpg"/>
<poco:preferredUsername>mcmoots</poco:preferredUsername>
<poco:displayName>👀🌲</poco:displayName>
<poco:note>your favorite non-masculine pronouns are fine🌲🌿🍄🌋🏔🥗🥘🍸🍷🍺 🍩 🥧😻</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="en">&lt;p&gt;From yesterday. Even with a surprise snow it's still the most wonderful time of the year.&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<link rel="enclosure" type="image/jpeg" length="397459" href="https://assets.octodon.social/media_attachments/files/001/460/171/original/fcad285b55062f29.jpg"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://a.weirder.earth/@mcmoots/99735929849758025"/>
<ostatus:conversation ref="tag:a.weirder.earth,2018-03-23:objectId=1180128:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99735931584316464/activity"/>
<content type="html" xml:lang="">&lt;p&gt;From yesterday. Even with a surprise snow it's still the most wonderful time of the year.&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99735931584316464"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/403924.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-23:objectId=6285649:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99735917404431053</id>
<published>2018-03-23T23:55:25Z</published>
<updated>2018-03-23T23:55:25Z</updated>
<title>New status by fenwick67</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99735917404431053"/>
<content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://kitty.town/@GinnyMcQueen" class="u-url mention"&gt;@&lt;span&gt;GinnyMcQueen&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; these are so geometric I thought it was some plastic thing when I scrolled past&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://kitty.town/users/GinnyMcQueen"/>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99735917404431053"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/403911.atom"/>
<thr:in-reply-to ref="https://kitty.town/users/GinnyMcQueen/statuses/99735901170047043" href="https://kitty.town/@GinnyMcQueen/99735901170047043"/>
<ostatus:conversation ref="tag:kitty.town,2018-03-23:objectId=2280854:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99735390633117557/activity</id>
<published>2018-03-23T21:41:27Z</published>
<updated>2018-03-23T21:41:27Z</updated>
<title>fenwick67 shared a status by fillertrack@slime.global</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://slime.global/users/fillertrack/statuses/99732555261994849</id>
<published>2018-03-23T09:40:25Z</published>
<updated>2018-03-23T09:40:25Z</updated>
<title>New status by fillertrack@slime.global</title>
<author>
<id>https://slime.global/users/fillertrack</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://slime.global/users/fillertrack</uri>
<name>fillertrack</name>
<email>fillertrack@slime.global</email>
<summary type="html">&lt;p&gt;Queer socialist grackle. Want to make video games and mixtapes. They/Them&lt;/p&gt;&lt;p&gt;Donations appreciated&lt;br&gt;ko-fi.com/fillertrack&lt;br&gt;paypal.me/imack666&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://slime.global/@fillertrack"/>
<link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/007/118/original/9e846c957d91a7a4.png"/>
<link rel="header" type="image/png" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/007/118/original/6788c670b2ca4571.png"/>
<poco:preferredUsername>fillertrack</poco:preferredUsername>
<poco:displayName>🐦birdtom🐦</poco:displayName>
<poco:note>Queer socialist grackle. Want to make video games and mixtapes. They/ThemDonations appreciatedko-fi.com/fillertrackpaypal.me/imack666</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="en">&lt;p&gt;I am become death, destroyer of worlds.&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<link rel="enclosure" type="video/mp4" length="41718" href="https://assets.octodon.social/media_attachments/files/001/456/618/original/c7ab2c504af72a36.mp4"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://slime.global/@fillertrack/99732555261994849"/>
<ostatus:conversation ref="tag:slime.global,2018-03-23:objectId=1670016:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99735390633117557/activity"/>
<content type="html" xml:lang="">&lt;p&gt;I am become death, destroyer of worlds.&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99735390633117557"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/403655.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-23:objectId=6282158:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99734417810440700</id>
<published>2018-03-23T17:34:03Z</published>
<updated>2018-03-23T17:34:03Z</updated>
<title>New status by fenwick67</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99734417810440700"/>
<content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://cybre.space/@zigg" class="u-url mention"&gt;@&lt;span&gt;zigg&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; node&amp;apos;s FS module on Windows is buggy enough that I recommend using the graceful-fs module in its place when you can&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://cybre.space/users/zigg"/>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99734417810440700"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/403137.atom"/>
<thr:in-reply-to ref="https://cybre.space/users/zigg/statuses/99734402832717239" href="https://cybre.space/@zigg/99734402832717239"/>
<ostatus:conversation ref="tag:cybre.space,2018-03-23:objectId=5381860:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99733847193567183</id>
<published>2018-03-23T15:08:56Z</published>
<updated>2018-03-23T15:08:56Z</updated>
<title>New status by fenwick67</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99733847193567183"/>
<content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://octodon.social/@kingu_platypus_gidora" class="u-url mention"&gt;@&lt;span&gt;kingu_platypus_gidora&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; me tbh&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://octodon.social/users/kingu_platypus_gidora"/>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99733847193567183"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/402782.atom"/>
<thr:in-reply-to ref="https://octodon.social/users/kingu_platypus_gidora/statuses/99733830894126614" href="https://octodon.social/@kingu_platypus_gidora/99733830894126614"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-23:objectId=6268551:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99733846304708662/activity</id>
<published>2018-03-23T15:08:43Z</published>
<updated>2018-03-23T15:08:43Z</updated>
<title>fenwick67 shared a status by kingu_platypus_gidora</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://octodon.social/users/kingu_platypus_gidora/statuses/99733830894126614</id>
<published>2018-03-23T15:04:48Z</published>
<updated>2018-03-23T15:04:48Z</updated>
<title>New status by kingu_platypus_gidora</title>
<author>
<id>https://octodon.social/users/kingu_platypus_gidora</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://octodon.social/users/kingu_platypus_gidora</uri>
<name>kingu_platypus_gidora</name>
<email>kingu_platypus_gidora@octodon.social</email>
<summary type="html">&lt;p&gt;Hello World! I am Kingu&lt;br /&gt;D*: &lt;a href="https://diasp.org/people/37b279f2a9f2348d" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class="ellipsis"&gt;diasp.org/people/37b279f2a9f23&lt;/span&gt;&lt;span class="invisible"&gt;48d&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Music: &lt;a href="https://kingu.reactoweb.com/" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;kingu.reactoweb.com/&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://octodon.social/@kingu_platypus_gidora"/>
<link rel="avatar" type="image/gif" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/001/586/original/751443ed5e9bea89.gif"/>
<link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/001/586/original/488457a59ee3a63f.jpg"/>
<poco:preferredUsername>kingu_platypus_gidora</poco:preferredUsername>
<poco:displayName>Anarkingu Gidora</poco:displayName>
<poco:note>Hello World! I am Kingu
D*: https://diasp.org/people/37b279f2a9f2348d
Music: https://kingu.reactoweb.com/</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/kingu_platypus_gidora/statuses/99733830894126614"/>
<content type="html" xml:lang="en">&lt;p&gt;.&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<link rel="enclosure" type="image/jpeg" length="32544" href="https://assets.octodon.social/media_attachments/files/001/457/875/original/f2b73debb45d360b.jpg"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@kingu_platypus_gidora/99733830894126614"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-23:objectId=6268551:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99733846304708662/activity"/>
<content type="html" xml:lang="">&lt;p&gt;RT &lt;span class="h-card"&gt;&lt;a href="https://octodon.social/@kingu_platypus_gidora" class="u-url mention"&gt;@&lt;span&gt;kingu_platypus_gidora&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; .&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99733846304708662"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/402781.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-23:objectId=6268669:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99730862747105610</id>
<published>2018-03-23T02:29:57Z</published>
<updated>2018-03-23T02:29:57Z</updated>
<title>New status by fenwick67</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99730862747105610"/>
<content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://meow.social/@Mycroft" class="u-url mention"&gt;@&lt;span&gt;Mycroft&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; the starter set is legit, it&amp;apos;s easy to pick up and a surprising amount of content. Also, the SRD is free to download and there are free adventures on DM&amp;apos;s guild.&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://meow.social/users/Mycroft"/>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99730862747105610"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/402147.atom"/>
<thr:in-reply-to ref="https://meow.social/users/Mycroft/statuses/99730814417520421" href="https://meow.social/@Mycroft/99730814417520421"/>
<ostatus:conversation ref="tag:meow.social,2018-03-23:objectId=1635630:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99730686004948111</id>
<published>2018-03-23T01:45:00Z</published>
<updated>2018-03-23T01:45:00Z</updated>
<title>New status by fenwick67</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99730686004948111"/>
<content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://niu.moe/@phenethylamine" class="u-url mention"&gt;@&lt;span&gt;phenethylamine&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; vlc?&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://niu.moe/users/phenethylamine"/>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99730686004948111"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/402067.atom"/>
<thr:in-reply-to ref="https://niu.moe/users/phenethylamine/statuses/99730658198254244" href="https://niu.moe/@phenethylamine/99730658198254244"/>
<ostatus:conversation ref="tag:niu.moe,2018-03-23:objectId=6679592:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99730669809908537</id>
<published>2018-03-23T01:40:53Z</published>
<updated>2018-03-23T01:40:53Z</updated>
<title>New status by fenwick67</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99730669809908537"/>
<content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://octodon.social/@Shalazah" class="u-url mention"&gt;@&lt;span&gt;Shalazah&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; welcome y&amp;apos;all&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://octodon.social/users/Shalazah"/>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99730669809908537"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/402059.atom"/>
<thr:in-reply-to ref="https://octodon.social/users/Shalazah/statuses/99730456201572202" href="https://octodon.social/@Shalazah/99730456201572202"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-23:objectId=6250411:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99730661494096566/activity</id>
<published>2018-03-23T01:38:46Z</published>
<updated>2018-03-23T01:38:46Z</updated>
<title>fenwick67 shared a status by plsburydoughboy@kitty.town</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://kitty.town/users/plsburydoughboy/statuses/99730600493978927</id>
<published>2018-03-23T01:23:25Z</published>
<updated>2018-03-23T01:23:25Z</updated>
<title>New status by plsburydoughboy@kitty.town</title>
<author>
<id>https://kitty.town/users/plsburydoughboy</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://kitty.town/users/plsburydoughboy</uri>
<name>plsburydoughboy</name>
<email>plsburydoughboy@kitty.town</email>
<summary type="html">&lt;p&gt;&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://kitty.town/@plsburydoughboy"/>
<link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/075/768/original/90d34987b9fdd5b8.jpg"/>
<link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/075/768/original/94c2812f09205c54.jpg"/>
<poco:preferredUsername>plsburydoughboy</poco:preferredUsername>
<poco:displayName>pls pet the kitty db</poco:displayName>
<poco:note></poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="en">&lt;p&gt;Marvel: “Infinity War is the most ambitious crossover event in history.”&lt;/p&gt;&lt;p&gt;Me, fighting off the bad vibes of the world:&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<link rel="enclosure" type="image/jpeg" length="73798" href="https://assets.octodon.social/media_attachments/files/001/455/106/original/3a7f27a898dfad51.jpg"/>
<link rel="enclosure" type="image/jpeg" length="56100" href="https://assets.octodon.social/media_attachments/files/001/455/107/original/b2c15e091ae118b0.jpg"/>
<link rel="enclosure" type="image/jpeg" length="54462" href="https://assets.octodon.social/media_attachments/files/001/455/108/original/87d8b73ad85faf44.jpg"/>
<link rel="enclosure" type="image/jpeg" length="70995" href="https://assets.octodon.social/media_attachments/files/001/455/109/original/a248e41cfee2a4de.jpg"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://kitty.town/@plsburydoughboy/99730600493978927"/>
<ostatus:conversation ref="tag:kitty.town,2018-03-23:objectId=2272083:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99730661494096566/activity"/>
<content type="html" xml:lang="">&lt;p&gt;Marvel: “Infinity War is the most ambitious crossover event in history.”&lt;/p&gt;&lt;p&gt;Me, fighting off the bad vibes of the world:&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99730661494096566"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/402054.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-23:objectId=6251655:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99729911231380605</id>
<published>2018-03-22T22:27:58Z</published>
<updated>2018-03-22T22:27:58Z</updated>
<title>New status by fenwick67</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99729911231380605"/>
<content type="html" xml:lang="en">&lt;p&gt;&lt;span class="h-card"&gt;&lt;a href="https://mastodon.social/@idesofmerch" class="u-url mention"&gt;@&lt;span&gt;idesofmerch&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; a radar chart would work great for this imo&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/person" href="https://mastodon.social/users/idesofmerch"/>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99729911231380605"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/401762.atom"/>
<thr:in-reply-to ref="https://mastodon.social/users/idesofmerch/statuses/99729118882454675" href="https://mastodon.social/@idesofmerch/99729118882454675"/>
<ostatus:conversation ref="tag:mastodon.social,2018-03-22:objectId=27292083:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99728007954983808/activity</id>
<published>2018-03-22T14:23:57Z</published>
<updated>2018-03-22T14:23:57Z</updated>
<title>fenwick67 shared a status by weird_hell@cybre.space</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://cybre.space/users/weird_hell/statuses/99725634875265024</id>
<published>2018-03-22T04:20:27Z</published>
<updated>2018-03-22T04:20:27Z</updated>
<title>New status by weird_hell@cybre.space</title>
<author>
<id>https://cybre.space/users/weird_hell</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://cybre.space/users/weird_hell</uri>
<name>weird_hell</name>
<email>weird_hell@cybre.space</email>
<summary type="html">&lt;p&gt;A robot that builds and maintains other, less complex robots.&lt;/p&gt;&lt;p&gt;Enby / bi/pan as hell / Some days really appreciates your food CWs. &amp;lt;3&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://cybre.space/@weird_hell"/>
<link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/064/532/original/bc18522f40c53be1.png"/>
<link rel="header" type="image/png" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/064/532/original/b530a373fc50e742.png"/>
<poco:preferredUsername>weird_hell</poco:preferredUsername>
<poco:displayName>Display Neam</poco:displayName>
<poco:note>A robot that builds and maintains other, less complex robots.Enby / bi/pan as hell / Some days really appreciates your food CWs. &amp;lt;3</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="en">&lt;p&gt;if you can't be normal, stop trying to be normal.&lt;/p&gt;&lt;p&gt;Be weird. Go hard. Don't follow the advice.&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://cybre.space/@weird_hell/99725634875265024"/>
<ostatus:conversation ref="tag:cybre.space,2018-03-22:objectId=5342800:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99728007954983808/activity"/>
<content type="html" xml:lang="">&lt;p&gt;if you can't be normal, stop trying to be normal.&lt;/p&gt;&lt;p&gt;Be weird. Go hard. Don't follow the advice.&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99728007954983808"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/401069.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-22:objectId=6232877:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99727127483386833/activity</id>
<published>2018-03-22T10:40:02Z</published>
<updated>2018-03-22T10:40:02Z</updated>
<title>fenwick67 shared a status by irisjaycomics@mastodon.social</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://mastodon.social/users/irisjaycomics/statuses/99718925908910667</id>
<published>2018-03-20T23:54:19Z</published>
<updated>2018-03-20T23:54:19Z</updated>
<title>New status by irisjaycomics@mastodon.social</title>
<author>
<id>https://mastodon.social/users/irisjaycomics</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://mastodon.social/users/irisjaycomics</uri>
<name>irisjaycomics</name>
<email>irisjaycomics@mastodon.social</email>
<summary type="html">&lt;p&gt;She/they. Comics: Crossed Wires, Epiphany, Golden Trick (writer). &lt;a href="http://irisjay.net" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;http://&lt;/span&gt;&lt;span class=""&gt;irisjay.net&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;. Icon by @skollirubedo.&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://mastodon.social/@irisjaycomics"/>
<link rel="avatar" type="image/jpeg" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/003/021/original/5af47bfdcd870f0f.jpg"/>
<link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/003/021/original/7909c6cf96e18beb.jpeg"/>
<poco:preferredUsername>irisjaycomics</poco:preferredUsername>
<poco:displayName>✨Iris Jay✨</poco:displayName>
<poco:note>She/they. Comics: Crossed Wires, Epiphany, Golden Trick (writer). http://irisjay.net. Icon by @skollirubedo.</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="en">&lt;p&gt;crossedwires.irisjay.net/?comic=02-106 NEW CROSSED WIRES UPDATE IS LIVE! Its showdown time and nobodys playing fair. &lt;a href="https://mastodon.social/tags/cyberpunk" class="mention hashtag" rel="nofollow noopener" target="_blank"&gt;#&lt;span&gt;cyberpunk&lt;/span&gt;&lt;/a&gt; &lt;a href="https://mastodon.social/tags/webcomic" class="mention hashtag" rel="nofollow noopener" target="_blank"&gt;#&lt;span&gt;webcomic&lt;/span&gt;&lt;/a&gt; &lt;a href="https://mastodon.social/tags/queercomics" class="mention hashtag" rel="nofollow noopener" target="_blank"&gt;#&lt;span&gt;queercomics&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Read from the beginning here: &lt;a href="http://crossedwires.irisjay.net/?comic=001" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;http://&lt;/span&gt;&lt;span class="ellipsis"&gt;crossedwires.irisjay.net/?comi&lt;/span&gt;&lt;span class="invisible"&gt;c=001&lt;/span&gt;&lt;/a&gt; Buy the book here: &lt;a href="http://oreillyjay.tictail.com/product/crossed-wires-volume-1" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;http://&lt;/span&gt;&lt;span class="ellipsis"&gt;oreillyjay.tictail.com/product&lt;/span&gt;&lt;span class="invisible"&gt;/crossed-wires-volume-1&lt;/span&gt;&lt;/a&gt; … Send me a tip here: &lt;a href="http://ko-fi.com/irisjay" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;http://&lt;/span&gt;&lt;span class=""&gt;ko-fi.com/irisjay&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<category term="cyberpunk"/>
<category term="webcomic"/>
<category term="queercomics"/>
<link rel="enclosure" type="image/jpeg" length="318770" href="https://assets.octodon.social/media_attachments/files/001/444/174/original/8c0612168aa67f3b.jpg"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://mastodon.social/@irisjaycomics/99718925908910667"/>
<ostatus:conversation ref="tag:mastodon.social,2018-03-20:objectId=27105506:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99727127483386833/activity"/>
<content type="html" xml:lang="">&lt;p&gt;crossedwires.irisjay.net/?comic=02-106 NEW CROSSED WIRES UPDATE IS LIVE! Its showdown time and nobodys playing fair. &lt;a href="https://mastodon.social/tags/cyberpunk" class="mention hashtag" rel="nofollow noopener" target="_blank"&gt;#&lt;span&gt;cyberpunk&lt;/span&gt;&lt;/a&gt; &lt;a href="https://mastodon.social/tags/webcomic" class="mention hashtag" rel="nofollow noopener" target="_blank"&gt;#&lt;span&gt;webcomic&lt;/span&gt;&lt;/a&gt; &lt;a href="https://mastodon.social/tags/queercomics" class="mention hashtag" rel="nofollow noopener" target="_blank"&gt;#&lt;span&gt;queercomics&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Read from the beginning here: &lt;a href="http://crossedwires.irisjay.net/?comic=001" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;http://&lt;/span&gt;&lt;span class="ellipsis"&gt;crossedwires.irisjay.net/?comi&lt;/span&gt;&lt;span class="invisible"&gt;c=001&lt;/span&gt;&lt;/a&gt; Buy the book here: &lt;a href="http://oreillyjay.tictail.com/product/crossed-wires-volume-1" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;http://&lt;/span&gt;&lt;span class="ellipsis"&gt;oreillyjay.tictail.com/product&lt;/span&gt;&lt;span class="invisible"&gt;/crossed-wires-volume-1&lt;/span&gt;&lt;/a&gt; … Send me a tip here: &lt;a href="http://ko-fi.com/irisjay" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;http://&lt;/span&gt;&lt;span class=""&gt;ko-fi.com/irisjay&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99727127483386833"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/400867.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-22:objectId=6227034:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99724279300280892/activity</id>
<published>2018-03-21T22:35:42Z</published>
<updated>2018-03-21T22:35:42Z</updated>
<title>fenwick67 shared a status by omanreagan@scholar.social</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://scholar.social/users/omanreagan/statuses/99723766503256517</id>
<published>2018-03-21T20:25:48Z</published>
<updated>2018-03-21T20:25:48Z</updated>
<title>New status by omanreagan@scholar.social</title>
<author>
<id>https://scholar.social/users/omanreagan</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://scholar.social/users/omanreagan</uri>
<name>omanreagan</name>
<email>omanreagan@scholar.social</email>
<summary type="html">&lt;p&gt;Anthropologist. PhDing: exploration beyond Sol system, SETI, imagination, interstellar futures, sci-fi. [he/him, they/them] &lt;a href="https://www.patreon.com/omanreagan" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://www.&lt;/span&gt;&lt;span class=""&gt;patreon.com/omanreagan&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://scholar.social/@omanreagan"/>
<link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/061/431/original/fc6afa77dfda97a6.png"/>
<link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/061/431/original/bdb680f32974ecd0.jpg"/>
<poco:preferredUsername>omanreagan</poco:preferredUsername>
<poco:displayName>Michael 🚀</poco:displayName>
<poco:note>Anthropologist. PhDing: exploration beyond Sol system, SETI, imagination, interstellar futures, sci-fi. [he/him, they/them] https://www.patreon.com/omanreagan</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/comment</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="en">&lt;p&gt;Most importantly, stop putting institutional events on Facebook, stop using it at universities, stop making participation in Facebook mandatory through your institutional, organization, and activist roles. You can be online, and social, and connected without supporting Facebook.&lt;/p&gt;</content>
<mastodon:scope>unlisted</mastodon:scope>
<link rel="alternate" type="text/html" href="https://scholar.social/@omanreagan/99723766503256517"/>
<thr:in-reply-to ref="https://scholar.social/users/omanreagan/statuses/99723719599246271" href="https://scholar.social/@omanreagan/99723719599246271"/>
<ostatus:conversation ref="tag:scholar.social,2018-03-21:objectId=1388298:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99724279300280892/activity"/>
<content type="html" xml:lang="">&lt;p&gt;Most importantly, stop putting institutional events on Facebook, stop using it at universities, stop making participation in Facebook mandatory through your institutional, organization, and activist roles. You can be online, and social, and connected without supporting Facebook.&lt;/p&gt;</content>
<mastodon:scope>unlisted</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99724279300280892"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/400244.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-21:objectId=6213207:objectType=Conversation"/>
</entry>
<entry>
<id>https://octodon.social/users/fenwick67/statuses/99723825992791716/activity</id>
<published>2018-03-21T20:40:25Z</published>
<updated>2018-03-21T20:40:25Z</updated>
<title>fenwick67 shared a status by elomatreb@glitch.social</title>
<activity:object-type>http://activitystrea.ms/schema/1.0/activity</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/share</activity:verb>
<activity:object>
<id>https://glitch.social/users/elomatreb/statuses/99723784825017673</id>
<published>2018-03-21T20:29:58Z</published>
<updated>2018-03-21T20:29:58Z</updated>
<title>New status by elomatreb@glitch.social</title>
<author>
<id>https://glitch.social/users/elomatreb</id>
<activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
<uri>https://glitch.social/users/elomatreb</uri>
<name>elomatreb</name>
<email>elomatreb@glitch.social</email>
<summary type="html">&lt;p&gt;German, English&lt;/p&gt;&lt;p&gt;Ruby, High Voltage electronics, [Shockingly] bad at computers. Lives in northern Germany.&lt;/p&gt;&lt;p&gt;&lt;a href="https://ole.bertr.am/" rel="nofollow noopener" target="_blank"&gt;&lt;span class="invisible"&gt;https://&lt;/span&gt;&lt;span class=""&gt;ole.bertr.am/&lt;/span&gt;&lt;span class="invisible"&gt;&lt;/span&gt;&lt;/a&gt; - Previously &lt;span class="h-card"&gt;&lt;a href="https://anti.energy/@elomatreb" class="u-url mention" rel="nofollow noopener" target="_blank"&gt;@&lt;span&gt;elomatreb&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</summary>
<link rel="alternate" type="text/html" href="https://glitch.social/@elomatreb"/>
<link rel="avatar" type="image/png" media:width="120" media:height="120" href="https://assets.octodon.social/accounts/avatars/000/076/355/original/0d8540c1ddb5b8f0.png"/>
<link rel="header" type="image/jpeg" media:width="700" media:height="335" href="https://assets.octodon.social/accounts/headers/000/076/355/original/913bfe0ea3e805cb.jpg"/>
<poco:preferredUsername>elomatreb</poco:preferredUsername>
<poco:displayName>elomatreb 🐟</poco:displayName>
<poco:note>German, EnglishRuby, High Voltage electronics, [Shockingly] bad at computers. Lives in northern Germany.https://ole.bertr.am/ - Previously @elomatreb</poco:note>
<mastodon:scope>public</mastodon:scope>
</author>
<activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<content type="html" xml:lang="en">&lt;p&gt;Decades of programming language research destroyed in one sick own by a rotating coyote&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://glitch.social/@elomatreb/99723784825017673"/>
<ostatus:conversation ref="tag:glitch.social,2018-03-21:objectId=4167153:objectType=Conversation"/>
</activity:object>
<link rel="alternate" type="application/activity+json" href="https://octodon.social/users/fenwick67/statuses/99723825992791716/activity"/>
<content type="html" xml:lang="">&lt;p&gt;Decades of programming language research destroyed in one sick own by a rotating coyote&lt;/p&gt;</content>
<link rel="mentioned" ostatus:object-type="http://activitystrea.ms/schema/1.0/collection" href="http://activityschema.org/collection/public"/>
<mastodon:scope>public</mastodon:scope>
<link rel="alternate" type="text/html" href="https://octodon.social/@fenwick67/99723825992791716"/>
<link rel="self" type="application/atom+xml" href="https://octodon.social/users/fenwick67/updates/400111.atom"/>
<ostatus:conversation ref="tag:octodon.social,2018-03-21:objectId=6210577:objectType=Conversation"/>
</entry>
</feed>

View File

@ -1,14 +0,0 @@
// do a test
import { createReadStream, writeFileSync } from "fs";
import convert from "../lib/convert.js";
let r = createReadStream("./test/sample.atom");
convert(r,function(er,data){
if (er){return console.log("error: ",er);}
console.log("ok");
writeFileSync("./test/result.html",data,"utf8");
});

1664
yarn.lock

File diff suppressed because it is too large Load Diff