on master help sign in
rebase
commit6274b9b5313edf9e74fba05c33318497f7933fca authorckipp01 <ckipp@pm.me> dateSat 14 Sep 2019, 20:11 (7 years ago) parent5fa39be
4 files changed+355−208
README.md+18−3 links/main.css+3−2 scripts/portal.js+58−30 scripts/sites.js+276−173
README.md+18−3
@@ -9,11 +9,26 @@ This [webring](https://wiki.xxiivv.com/webring) is an attempt to inspire artists
99```
1010
11111) Add the webring icon to your website html.
12−2) Add your website information to the [sites.js](https://github.com/XXIIVV/webring/edit/master/scripts/sites.js) file. The `url` and `contact` keys are required, but you can also include `title`, `type`, `author`, `rss`, and `feed`. The title must be alphanumeric.
12+2) Add your website information to the [sites.js](https://github.com/XXIIVV/webring/edit/master/scripts/sites.js) file. See all options below, and be mindful of what's required for each part of the webring.
13133) Submit a Pull Request with **the location of the webring icon** on your site. Pull requests with blank descriptions will be rejected.
1414
1515Alternatively, if you your website has a dark background, use `icon.white.svg`. If your website is complaining about *https*, go ahead and host the icon yourself.
1616
17+Only the `url`, `contact`, and `langs` keys are required to join the webring. Below you can find a list of all the available keys for the various areas of the webring.
18+```javascript
19+ {
20+ author: <string used in the Hallway REQUIRED FOR HALLWAY>',
21+ contact: <string used to contact if necessary REQUIRED FOR ALL>,
22+ feed: <string url used Hallway REQUIRED FOR HALLWAY>,
23+ langs: <array of iso language codes represented languages in your site ex. ['en'] REQUIRED FOR ALL>,
24+ rss: <string url for rss feed>,
25+ title: <string (must be alphanumeric) used for the Portal>,
26+ type: <string used for the Portal>,
27+ url: <string url used for Portal REQUIRED FOR ALL>,
28+ wiki: <string url used for the Wiki REQUIRED FOR WIKI>
29+ }
30+```
31+
1732### Webring criteria
1833
1934**Single page websites, websites acting only as portals to other social platforms, or websites with violent, racist, sexist or speciesist content will be rejected**.
@@ -34,7 +49,7 @@ Instead of linking to the directory, you can also link to the next link in the r
3449
3550[The Hallway](https://webring.xxiivv.com/hallway.html) is a decentralized forum using [twtxt](https://twtxt.readthedocs.io/en/stable/user/twtxtfile.html) feeds.
3651
37−To join, create a `.txt` file on your site, add its URL to [your webring entry](https://github.com/XXIIVV/Webring/blob/master/scripts/sites.js) as `feed:`, and fill in your desired name for `author:`. The content of the file should be a dateISO string, a tab(or 3 spaces) and a message:
52+To join, create a `.txt` file on your site, add its URL to [your webring entry](https://github.com/XXIIVV/Webring/blob/master/scripts/sites.js) as `feed`, and fill in your desired name in the `author` key. The content of the file should be a dateISO string, a tab(or 3 spaces) and a message:
3853
3954```
40552016-02-04T13:30:00+01:00 You can really go crazy here! ┐(゚∀゚)┌
@@ -49,7 +64,7 @@ You don't need to allow all origins nor allow any other methods rather than GET,
4964
5065[The Wiki](https://webring.xxiivv.com/wiki.html) is a decentralized encyclopedia using [ndtl](https://wiki.xxiivv.com/Indental) feeds.
5166
52−To join, create a `.ndtl` file on your site, and add its URL to [your webring entry](https://github.com/XXIIVV/Webring/blob/master/scripts/sites.js) as `wiki:`.
67+To join, create a `.ndtl` file on your site, and add its URL to [your webring entry](https://github.com/XXIIVV/Webring/blob/master/scripts/sites.js) using the `wiki` key.
5368
5469## Webring CLI
5570
links/main.css+3−2
@@ -16,7 +16,7 @@ body #portal #icon { display: block; width: 30px; height: 30px; background-image
1616body #portal ul { columns:1; }
1717body #portal ul li { display:block; padding-left:5px; text-overflow: ellipsis; text-transform: lowercase;}
1818body #portal ul li:before { content: attr(id) ")"; }
19−body #portal ul li[data-type]::after { content:"<" attr(data-type) ">"; color:#555; }
19+body #portal ul li::after { content:"<" attr(data-type) attr(data-lang) ">"; color:#555; }
2020body #portal ul li a { line-height: 20px; padding:0px 5px; text-decoration: none;}
2121body #portal ul li a:visited { color:#ccc; text-decoration: none;}
2222body #portal a:active,
@@ -25,7 +25,8 @@ body #portal a:hover { text-decoration: underline; }
2525
2626body #portal nav { display: flex; flex-direction: row; margin-bottom: 15px }
2727body #portal nav a { margin: 0 5px; color: gray }
28−body #portal nav a.current { color: white }
28+body #portal nav a.currentType,
29+body #portal nav a.currentLang { color: white }
2930
3031body aside { min-width: 200px; padding: 0 15px; line-height: 16px; display: none; }
3132body aside ul { margin-bottom: 15px; }
scripts/portal.js+58−30
@@ -7,22 +7,27 @@ function Portal (sites) {
77
88 // Templates
99
10− function _readme () {
11− return '<p class="readme">This webring is an attempt to inspire artists & developers to build their own website and share traffic among each other. The ring welcomes personalized websites such as <b>diaries, wikis & portfolios</b>.</p><p>To add yourself to the ring, submit a <a href="https://github.com/XXIIVV/webring/edit/master/scripts/sites.js" target="_blank">Pull Request</a>.<br />If you found a broken link, please <a href="https://github.com/XXIIVV/webring/issues/new" target="_blank">report it</a>.</p>'
12− }
13−
14− function _buttons () {
15− return '<p class="buttons"><a href="#random" onClick="portal.reload()">Random</a> | <a href="https://github.com/XXIIVV/webring">Information</a> <a id="icon" href="#random" onClick="portal.reload()"></a> | <a href="hallway.html">The Hallway</a> | <a href="wiki.html">The Wiki</a> | <a id="opml">OPML</a></p>'
16− }
10+ const _readme = '<p class="readme">This webring is an attempt to inspire artists & developers to build their own website and share traffic among each other. The ring welcomes personalized websites such as <b>diaries, wikis & portfolios</b>.</p><p>To add yourself to the ring, submit a <a href="https://github.com/XXIIVV/webring/edit/master/scripts/sites.js" target="_blank">Pull Request</a>.<br />If you found a broken link, please <a href="https://github.com/XXIIVV/webring/issues/new" target="_blank">report it</a>.</p>'
11+ const _buttons = '<p class="buttons"><a href="#random" onClick="portal.reload()">Random</a> | <a href="https://github.com/XXIIVV/webring">Information</a> <a id="icon" href="#random" onClick="portal.reload()"></a> | <a href="hallway.html">The Hallway</a> | <a href="wiki.html">The Wiki</a> | <a id="opml">OPML</a></p>'
1712
1813 function _directory (sites) {
1914 const siteTypesArray = [...new Set(sites.map(site => site.type).filter(Boolean))]
15+ const siteLangsArray = [...new Set(sites
16+ .map(site => site.langs)
17+ .reduce((flattened, langs) => flattened.concat(langs), [])
18+ .sort())]
19+
2020 const siteTypes = siteTypesArray.reduce((output, siteType) =>
21− `${output}<a data-type="${siteType}" href="#" onclick="toggleType(event)">&lt;${siteType}&gt;</a>`,
22− '<a class="current" href="#" onclick="toggleType(event)">&lt;all&gt;</a>')
21+ `${output}<a data-type="${siteType}" href="#" onclick="filterSites(event)">&lt;${siteType}&gt;</a>`,
22+ '<a class="currentType" data-type="all" href="#" onclick="filterSites(event)">&lt;all&gt;</a>')
23+
24+ const siteLangs = siteLangsArray.reduce((output, siteLang) =>
25+ `${output}<a data-lang="${siteLang}" href="#" onclick="filterSites(event)">&lt;${siteLang}&gt;</a>`,
26+ '<a class="currentLang" data-lang="all" href="#" onclick="filterSites(event)">&lt;all&gt;</a>')
27+
2328 const listItems = sites.reduce((acc, site, id) =>
24− `${acc}<li ${_type(site)} id='${id}'><a href='${site.url}'>${_name(site)}</a></li>`, '')
25− return `<nav>${siteTypes}</nav><main><ul>${listItems}</ul></main><footer>${_readme()}${_buttons()}</footer>`
29+ `${acc}<li ${_type(site)} ${_lang(site)} id='${id}'><a href='${site.url}'>${_name(site)}</a></li>`, '')
30+ return `<nav>${siteTypes}</nav><nav>${siteLangs}</nav><main><ul>${listItems}</ul></main><footer>${_readme}${_buttons}</footer>`
2631 }
2732
2833 function _name (site) {
@@ -30,10 +35,15 @@ function Portal (sites) {
3035 }
3136
3237 function _type (site) {
33− return site.type ? `data-type="${site.type}"` : ''
38+ return site.type ? `data-type="${site.type} "` : ''
39+ }
40+
41+ function _lang (site) {
42+ const langs = site.langs.reduce((langs, lang) => `${langs} ${lang}`, '')
43+ return `data-lang="${langs.trim()}"`
3444 }
3545
36− function _redirect (site) {
46+ function _redirectView (site) {
3747 return `<main><p>Redirecting to <a href="${site.url}">${site.url}</a></p></main>
3848 <footer><p class='buttons'><a href='#' onClick="portal.reload('')">Directory</a> | <a href='#${site.url}' onClick="portal.reload()">Skip</a> | <a href='#random' onClick="portal.reload()">Random</a> | <a href='https://github.com/XXIIVV/webring'>Information</a> <a id='icon' href='#random' onClick="portal.reload()"></a></p>`
3949 }
@@ -47,7 +57,7 @@ function Portal (sites) {
4757 this.start = function () {
4858 if (window.location.hash && window.location.hash.length > 4) {
4959 const site = this.next()
50− this.el.innerHTML = _redirect(site)
60+ this.el.innerHTML = _redirectView(site)
5161 setTimeout(() => { window.location = site.url }, 3000)
5262 } else {
5363 this.el.innerHTML = _directory(this.sites)
@@ -62,30 +72,48 @@ function Portal (sites) {
6272 setTimeout(() => { window.location.href = target }, 3000)
6373 }
6474
65− this.locate = function () {
75+ this.sitesMatchingLangs = this.sites
76+ .filter(site => site.langs)
77+ .filter(site => site.langs.some(lang => navigator.languages.includes(lang)))
78+
79+ this.next = function () {
6680 const hash = window.location.hash.replace('#', '').trim()
6781
6882 if (hash === 'random') {
69− return Math.floor(Math.random() * this.sites.length)
83+ return this.sitesMatchingLangs[Math.floor(Math.random() * this.sitesMatchingLangs.length)]
7084 } else {
71− const id = sites.findIndex(site => site.url.indexOf(hash) > -1)
72− return id > -1 ? parseInt(id) : -1
85+ return sites.find(site => site.url.includes(hash))
86+ ? sites.find(site => site.url.includes(hash))
87+ : this.sitesMatchingLangs[Math.floor(Math.random() * this.sitesMatchingLangs.length)]
7388 }
7489 }
75−
76− this.next = function (loc = this.locate()) {
77− return loc === this.sites.length - 1 ? this.sites[0] : this.sites[loc + 1]
78− }
7990}
8091
81−function toggleType (e) {
92+function filterSites (e) {
8293 e.preventDefault()
8394 const navLink = e.target
84− const selectedType = navLink.dataset.type
85− document.querySelector('nav a.current').classList.remove('current')
86− navLink.classList.add('current')
87− document.querySelectorAll('main li').forEach(el => { el.style.display = 'block' })
88− if (selectedType) {
89− document.querySelectorAll(`main li:not([data-type='${selectedType}'])`).forEach(el => { el.style.display = 'none' })
90− }
95+ const currentFilter = navLink.dataset.lang ? 'Lang' : 'Type'
96+
97+ document.querySelector(`nav a.current${currentFilter}`).classList.remove(`current${currentFilter}`)
98+ navLink.classList.add(`current${currentFilter}`)
99+
100+ const typeFilter = document.querySelector('nav a.currentType').dataset.type
101+ const langFilter = document.querySelector('nav a.currentLang').dataset.lang
102+
103+ const sites = document.querySelectorAll('main li')
104+ sites.forEach(el => { el.style.display = 'block' })
105+
106+ sites.forEach(el => {
107+ if (typeFilter !== 'all') {
108+ if (el.dataset.type) {
109+ if (el.dataset.type.trim() !== typeFilter) el.style.display = 'none'
110+ } else {
111+ el.style.display = 'none'
112+ }
113+ }
114+
115+ if (langFilter !== 'all') {
116+ if (!el.dataset.lang.includes(langFilter)) el.style.display = 'none'
117+ }
118+ })
91119}
scripts/sites.js+276−173
@@ -5,646 +5,749 @@
55
66const sites = [
77 {
8− url: 'https://wiki.xxiivv.com',
9− title: 'xxiivv',
10− type: 'wiki',
118 author: 'neauoire',
129 contact: 'aliceffekt@gmail.com',
13− rss: 'https://wiki.xxiivv.com/links/rss.xml',
1410 feed: 'https://wiki.xxiivv.com/twtxt.txt',
11+ langs: ['en'],
12+ rss: 'https://wiki.xxiivv.com/links/rss.xml',
13+ title: 'xxiivv',
14+ type: 'wiki',
15+ url: 'https://wiki.xxiivv.com',
1516 wiki: 'https://wiki.xxiivv.com/scripts/database/glossary.ndtl'
1617 },
1718
1819 {
20+ langs: ['en'],
1921 url: 'http://estevancarlos.com'
2022 },
2123
2224 {
23− url: 'https://electro.pizza',
25+ author: 'rho',
26+ feed: 'https://electro.pizza/twtxt.txt',
27+ langs: ['en'],
2428 title: 'electro pizza',
2529 type: 'blog',
26− author: 'rho',
2730 rss: 'https://electro.pizza/feed.xml',
28− feed: 'https://electro.pizza/twtxt.txt'
31+ url: 'https://electro.pizza'
2932 },
3033
3134 {
32− url: 'https://avanier.now.sh',
33− title: 'Arachne',
34− type: 'wiki',
3535 author: 'joshavanier',
3636 contact: 'joshavanier@protonmail.com',
37− feed: 'https://avanier.now.sh/tw.txt'
37+ feed: 'https://avanier.now.sh/tw.txt',
38+ langs: ['en'],
39+ title: 'Arachne',
40+ type: 'wiki',
41+ url: 'https://avanier.now.sh'
3842 },
3943
4044 {
41− url: 'http://kaemura.com',
42− title: 'kaemura.com',
43− type: 'blog',
4445 author: 'kaemura',
4546 contact: 'chimera1190@gmail.com',
46− feed: 'https://kaemura.com/twttxt.txt'
47+ feed: 'https://kaemura.com/twttxt.txt',
48+ langs: ['en'],
49+ title: 'kaemura.com',
50+ type: 'blog',
51+ url: 'http://kaemura.com'
4752 },
4853
4954 {
50− url: 'https://liamcooke.com',
51− title: 'liamcooke.com',
5255 author: 'slisne',
5356 contact: '@slisne@merveilles.town',
57+ feed: 'https://liamcooke.com/merveilles/tw.txt',
58+ langs: ['en'],
59+ title: 'liamcooke.com',
5460 rss: 'https://liamcooke.com/feed.xml',
55− wiki: 'https://liamcooke.com/merveilles/wiki.ndtl',
56− feed: 'https://liamcooke.com/merveilles/tw.txt'
61+ url: 'https://liamcooke.com',
62+ wiki: 'https://liamcooke.com/merveilles/wiki.ndtl'
5763 },
5864
5965 {
60− url: 'https://electricgecko.de',
61− title: 'electricgecko',
62− type: 'blog',
6366 author: 'electricgecko',
6467 contact: 'desk@electricgecko.de',
65− rss: 'https://electricgecko.de/feed'
68+ langs: ['de', 'en'],
69+ title: 'electricgecko',
70+ rss: 'https://electricgecko.de/feed',
71+ type: 'blog',
72+ url: 'https://electricgecko.de'
6673 },
6774
6875 {
76+ langs: ['en'],
6977 url: 'https://wichniow.ski'
7078 },
7179
7280 {
81+ langs: ['en'],
7382 url: 'https://hraew.autophagy.io'
7483 },
7584
7685 {
86+ langs: ['en'],
7787 url: 'http://evenunto.net'
7888 },
7989
8090 {
91+ langs: ['en'],
8192 url: 'https://anxl.faith'
8293 },
8394
8495 {
85− url: 'https://xvw.github.io',
86− title: 'xvw.github.io',
87− type: 'blog',
8896 author: 'xvw',
8997 contact: 'xaviervdw@gmail.com',
90− rss: 'https://xvw.github.io/atom.xml'
98+ langs: ['fr'],
99+ rss: 'https://xvw.github.io/atom.xml',
100+ title: 'xvw.github.io',
101+ type: 'blog',
102+ url: 'https://xvw.github.io'
91103 },
92104
93105 {
106+ langs: ['en', 'el'],
94107 url: 'https://heracl.es'
95108 },
96109
97110 {
111+ langs: ['en'],
98112 url: 'http://luminghao.com'
99113 },
100114
101115 {
116+ langs: ['en'],
102117 url: 'https://turelio.github.io'
103118 },
104119
105120 {
106− url: 'https://shards.lectronice.com',
107− title: 'shards',
108− type: 'blog',
109121 author: 'lectronice',
110122 contact: 'i.love.spam@lectronice.com',
111− feed: 'https://lectronice.com/hallway/twtxt.txt'
123+ feed: 'https://lectronice.com/hallway/twtxt.txt',
124+ langs: ['en'],
125+ title: 'shards',
126+ type: 'blog',
127+ url: 'https://shards.lectronice.com'
112128 },
113129
114130 {
131+ langs: ['en'],
115132 url: 'https://craze.co.uk'
116133 },
117134
118135 {
136+ langs: ['en'],
119137 url: 'https://shaneckel.com'
120138 },
121139
122140 {
123− url: 'https://cblgh.org',
124− title: 'cblgh.org',
125141 author: 'cblgh',
126142 contact: 'cabal://cblgh.org',
127− feed: 'https://cblgh.org/twtxt.txt'
143+ feed: 'https://cblgh.org/twtxt.txt',
144+ langs: ['en'],
145+ title: 'cblgh.org',
146+ url: 'https://cblgh.org'
128147 },
129148
130149 {
131− url: 'https://ellugar.co',
132− title: 'ellugar',
133− type: 'wiki',
134150 author: 'afk',
135151 contact: 'afk@ellugar.co',
136− rss: 'http://feeds.ellugar.co/ellugar-logs'
152+ langs: ['en'],
153+ rss: 'http://feeds.ellugar.co/ellugar-logs',
154+ title: 'ellugar',
155+ type: 'wiki',
156+ url: 'https://ellugar.co'
137157 },
138158
139159 {
140− url: 'http://chigby.org',
160+ author: 'Cameron Higby-Naquin',
161+ contact: 'me@chigby.org',
162+ langs: ['en'],
141163 title: 'chigby.org',
142164 type: 'portfolio',
143− contact: 'me@chigby.org',
144− author: 'Cameron Higby-Naquin'
165+ url: 'http://chigby.org'
145166 },
146167
147168 {
169+ langs: ['en'],
148170 url: 'https://longest.voyage'
149171 },
150172
151173 {
174+ langs: ['en'],
152175 url: 'https://palomakop.tv'
153176 },
154177
155178 {
179+ langs: ['en'],
156180 url: 'https://v-os.ca'
157181 },
158182
159183 {
184+ langs: ['en'],
160185 url: 'https://jmandel.xyz'
161186 },
162187
163188 {
189+ langs: ['en'],
164190 url: 'https://systems.ws'
165191 },
166192
167193 {
168− url: 'https://2d4.dev',
169− title: '2d4.dev',
170194 author: 'jda0',
171195 contact: 'hi@2d4.dev',
172196 feed: 'https://2d4.dev/tw.txt',
197+ langs: ['en'],
198+ title: '2d4.dev',
199+ url: 'https://2d4.dev',
173200 wiki: 'https://2d4.dev/wiki.ndtl'
174201 },
175202
176203 {
204+ langs: ['en'],
177205 url: 'https://nathanwentworth.co'
178206 },
179207
180208 {
209+ langs: ['en'],
181210 url: 'https://uonai.space'
182211 },
183212
184213 {
214+ langs: ['en'],
185215 url: 'http://controls.ee'
186216 },
187217
188218 {
219+ langs: ['en'],
189220 url: 'https://wasin.io'
190221 },
191222
192223 {
224+ langs: ['en'],
193225 url: 'https://inns.studio'
194226 },
195227
196228 {
229+ langs: ['en'],
197230 url: 'http://kokorobot.ca'
198231 },
199232
200233 {
201− url: 'https://ameyama.com',
202− title: 'ameyama',
203− type: 'blog',
204234 author: 'jrc03c',
205235 contact: 'josh@ameyama.com',
236+ langs: ['en'],
237+ title: 'ameyama',
238+ type: 'blog',
206239 rss: 'https://ameyama.com/blog/rss.xml',
240+ url: 'https://ameyama.com',
207241 wiki: 'https://ameyama.com/data/wiki.ndtl'
208242 },
209243
210244 {
211− url: 'https://wake.st',
212− title: 'wake.st',
213245 author: 'wakest',
214246 contact: '@liaizon@wake.st',
215− feed: 'https://wake.st/twtxt.txt'
247+ feed: 'https://wake.st/twtxt.txt',
248+ langs: ['en'],
249+ title: 'wake.st',
250+ url: 'https://wake.st'
216251 },
217252
218253 {
254+ langs: ['en'],
219255 url: 'https://xarene.la'
220256 },
221257
222258 {
259+ langs: ['en'],
223260 url: 'https://alex.zyzhang.me'
224261 },
225262
226263 {
264+ langs: ['en'],
227265 url: 'http://bildwissenschaft.vortok.info'
228266 },
229267
230268 {
269+ langs: ['en'],
231270 url: 'https://jakofranko.github.com'
232271 },
233272
234273 {
274+ langs: ['en'],
235275 url: 'https://aeriform.io'
236276 },
237277
238278 {
279+ langs: ['en', 'de'],
239280 url: 'http://blog.lucasdidthis.com'
240281 },
241282
242283 {
243− url: 'http://npisanti.com',
244− title: 'npisanti.com',
245284 author: 'npisanti',
246285 contact: 'nicola@npisanti.com',
247− rss: 'http://npisanti.com/journal/rss.xml'
286+ langs: ['en'],
287+ rss: 'http://npisanti.com/journal/rss.xml',
288+ title: 'npisanti.com',
289+ url: 'http://npisanti.com'
248290 },
249291
250292 {
293+ langs: ['en'],
251294 url: 'https://underscorediscovery.ca'
252295 },
253296
254297 {
255− url: 'https://drisc.io',
256− title: 'drisc.io',
257− type: 'wiki',
258298 author: 'drisc',
259299 contact: 'cory@drisc.io',
260− feed: 'https://drisc.io/hallway/twtxt.txt'
300+ feed: 'https://drisc.io/hallway/twtxt.txt',
301+ langs: ['en'],
302+ title: 'drisc.io',
303+ type: 'wiki',
304+ url: 'https://drisc.io'
261305 },
262306
263307 {
264− url: 'https://neufv.systems',
265− author: 'neufv'
308+ author: 'neufv',
309+ langs: ['en'],
310+ url: 'https://neufv.systems'
266311 },
267312
268313 {
314+ langs: ['en'],
269315 url: 'https://ricky.codes'
270316 },
271317
272318 {
273− url: 'https://maxdeviant.com',
319+ author: 'Marshall Bowers',
320+ contact: 'elliott.codes@gmail.com',
321+ langs: ['en'],
274322 title: 'maxdeviant.com',
275323 type: 'hybrid',
276− author: 'Marshall Bowers',
277− contact: 'elliott.codes@gmail.com'
324+ url: 'https://maxdeviant.com'
278325 },
279326
280327 {
328+ langs: ['en'],
281329 url: 'https://tynandebold.com'
282330 },
283331
284332 {
333+ langs: ['en'],
285334 url: 'http://gytis.co'
286335 },
287336
288337 {
338+ langs: ['en'],
289339 url: 'https://nomand.co'
290340 },
291341
292342 {
343+ langs: ['en'],
293344 url: 'http://memoriata.com'
294345 },
295346
296347 {
348+ langs: ['en'],
297349 url: 'https://mmm.s-ol.nu'
298350 },
299351
300352 {
353+ langs: ['en'],
301354 url: 'https://chad.is'
302355 },
303356
304357 {
358+ langs: ['en'],
305359 url: 'https://smidgeo.com/bots'
306360 },
307361
308362 {
363+ langs: ['en', 'ru'],
309364 url: 'https://iko.soy'
310365 },
311366
312367 {
368+ langs: ['en'],
313369 url: 'http://atelieroilandsugar.com'
314370 },
315371
316372 {
373+ langs: ['en'],
317374 url: 'https://magoz.is'
318375 },
319376
320377 {
321− url: 'https://szymonkaliski.com',
322378 author: 'Szymon Kaliski',
379+ langs: ['en'],
380+ rss: 'https://szymonkaliski.com/feed.xml',
323381 type: 'hybrid',
324− rss: 'https://szymonkaliski.com/feed.xml'
382+ url: 'https://szymonkaliski.com'
325383 },
326384
327385 {
328− url: 'https://phse.net',
329− title: 'phse.net',
330− type: 'blog',
331386 author: 'setphen',
387+ feed: 'https://phse.net/twtxt/merv.txt',
388+ langs: ['en'],
332389 rss: 'https://phse.net/post/index.xml',
333− feed: 'https://phse.net/twtxt/merv.txt'
390+ title: 'phse.net',
391+ type: 'blog',
392+ url: 'https://phse.net'
334393 },
335394
336395 {
396+ langs: ['en'],
337397 url: 'https://rosano.ca'
338398 },
339399
340400 {
401+ langs: ['en'],
341402 url: 'https://soyboysky.github.io'
342403 },
343404
344405 {
406+ langs: ['en'],
345407 url: 'https://gndclouds.cc'
346408 },
347409
348410 {
411+ langs: ['en', 'fr'],
349412 url: 'https://xuv.be'
350413 },
351414
352415 {
416+ langs: ['en', 'zh'],
353417 url: 'https://dsdshcym.github.io'
354418 },
355419
356420 {
357− url: 'https://wiki.chronica.xyz',
358− title: 'chronica',
359− type: 'wiki',
360421 author: 'ckipp',
361422 contact: 'ckipp@pm.me',
362423 feed: 'https://chronica.xyz/hallway.txt',
424+ langs: ['en'],
425+ title: 'chronica',
426+ type: 'wiki',
427+ url: 'https://wiki.chronica.xyz',
363428 wiki: 'https://chronica.xyz/glossary.ndtl'
364429 },
365430
366431 {
432+ langs: ['en'],
367433 url: 'https://boffosocko.com'
368434 },
369435
370436 {
371− url: 'https://hex22.org',
372− title: 'hex22',
373437 author: 'kodedninja',
374438 contact: 'karamanhunor@pm.me',
375− feed: 'https://t.seed.hex22.org/twtxt.txt'
439+ feed: 'https://t.seed.hex22.org/twtxt.txt',
440+ langs: ['en'],
441+ title: 'hex22',
442+ url: 'https://hex22.org'
376443 },
377444
378445 {
446+ langs: ['en'],
379447 url: 'https://patrikarvidsson.com'
380448 },
381449
382450 {
451+ langs: ['en'],
383452 url: 'https://sophieleetmaa.com'
384453 },
385454
386455 {
456+ langs: ['en'],
387457 url: 'https://xinniw.github.io'
388458 },
389459
390460 {
391− url: 'https://mboxed.github.io/sodatsu',
392− title: 'sodatsu',
393− type: 'wiki',
394461 author: 'm',
395462 contact: 'mboxxed@gmail.com',
396− feed: 'https://mboxed.github.io/sodatsu/tw.txt'
463+ feed: 'https://mboxed.github.io/sodatsu/tw.txt',
464+ langs: ['en'],
465+ title: 'sodatsu',
466+ type: 'wiki',
467+ url: 'https://mboxed.github.io/sodatsu'
397468 },
398469
399470 {
471+ langs: ['en'],
400472 url: 'https://letters.vexingworkshop.com'
401473 },
402474
403475 {
404− url: 'https://tom.org.nz',
405− title: 'Tom Hackshaw',
406− type: 'portfolio',
407476 author: 'tomupom',
408477 contact: 'tom@tomhackshaw.com',
478+ langs: ['en'],
479+ title: 'Tom Hackshaw',
480+ type: 'portfolio',
481+ url: 'https://tom.org.nz',
409482 wiki: 'https://a.tom.org.nz/glossary.ndtl'
410483 },
411484
412485 {
486+ langs: ['en'],
413487 url: 'https://teknari.com'
414488 },
415489
416490 {
417− url: 'https://colectivo-de-livecoders.gitlab.io',
491+ author: 'clic',
492+ contact: 'https://t.me/clic_laplata',
493+ langs: ['es'],
418494 title: 'Colectivo de Livecoders',
419495 type: 'blog',
420− author: 'clic',
421− contact: 'https://t.me/clic_laplata'
496+ url: 'https://colectivo-de-livecoders.gitlab.io'
422497 },
423498
424499 {
425− url: 'https://www.madewithtea.com',
500+ langs: ['es'],
426501 title: 'madewithtea.com',
427− type: 'blog'
502+ type: 'blog',
503+ url: 'https://www.madewithtea.com'
428504 },
429505
430506 {
431− url: 'https://amorris.ca',
432− title: 'amorris',
433507 author: 'amorris',
434− type: 'blog',
435508 feed: 'https://feed.amorris.ca/hallway.txt',
509+ langs: ['en'],
510+ title: 'amorris',
511+ type: 'blog',
512+ url: 'https://amorris.ca',
436513 wiki: 'https://wiki.amorris.ca/glossary.ndtl'
437514 },
438515
439516 {
440− url: 'http://www.miha-co.ca',
517+ langs: ['en'],
441518 title: 'miha-co',
442− type: 'portfolio'
519+ type: 'portfolio',
520+ url: 'http://www.miha-co.ca'
443521 },
444522
445523 {
446− url: 'https://buzzert.net',
447− title: 'buzzert.net',
448524 author: 'buzzert',
449− type: 'blog'
525+ langs: ['en'],
526+ title: 'buzzert.net',
527+ type: 'blog',
528+ url: 'https://buzzert.net'
450529 },
451530
452531 {
453− url: 'https://notes.stuartpb.com/',
454− title: 'notes.stuartpb.com',
455− type: 'wiki',
456532 author: 'stuartpb',
457533 contact: 's@stuartpb.com',
458− feed: 'https://twtxt.stuartpb.com/xxiivv.txt'
534+ feed: 'https://twtxt.stuartpb.com/xxiivv.txt',
535+ langs: ['en'],
536+ title: 'notes.stuartpb.com',
537+ type: 'wiki',
538+ url: 'https://notes.stuartpb.com/'
459539 },
460540
461541 {
462− url: 'https://xxiii.co',
463− title: 'xxiii',
464− type: 'portfolio',
465542 author: 'serocell',
466543 contact: 'psignal@s900.net',
544+ feed: 'https://xxiii.co/twtxt.txt',
545+ langs: ['en'],
467546 rss: 'https://serocell.com/feeds/serocell.xml',
468− feed: 'https://xxiii.co/twtxt.txt'
547+ title: 'xxiii',
548+ type: 'portfolio',
549+ url: 'https://xxiii.co'
469550 },
470551
471552 {
472− url: 'https://kor.nz',
473− title: 'kor',
474− type: 'wiki',
475553 author: 'kormyen',
476554 contact: 'h@kor.nz',
477555 feed: 'https://kor.nz/twtxt.txt',
556+ langs: ['en'],
557+ title: 'kor',
558+ type: 'wiki',
559+ url: 'https://kor.nz',
478560 wiki: 'https://kor.nz/db/glossary.ndtl'
479561 },
480562
481563 {
482− url: 'https://lublin.se',
483564 author: 'quite',
484565 contact: 'quite@hack.org',
485− feed: 'https://lublin.se/twtxt.txt'
566+ feed: 'https://lublin.se/twtxt.txt',
567+ langs: ['en'],
568+ url: 'https://lublin.se'
486569 },
487570
488571 {
489− url: 'https://zanneth.com',
490− title: 'zanneth.com',
491572 author: 'zanneth',
573+ contact: 'root@zanneth.com',
574+ langs: ['en'],
575+ title: 'zanneth.com',
492576 type: 'blog',
493− contact: 'root@zanneth.com'
577+ url: 'https://zanneth.com'
494578 },
495579
496580 {
497− url: 'https://eli.li',
498− title: 'eli.li',
499581 author: 'eli_oat',
500− type: 'blog',
501582 contact: 'hi@eli.li',
583+ feed: 'https://txt.eli.li/twtxt/twtxt.txt',
584+ langs: ['en'],
502585 rss: 'https://eli.li/feed.rss',
503− feed: 'https://txt.eli.li/twtxt/twtxt.txt'
586+ title: 'eli.li',
587+ type: 'blog',
588+ url: 'https://eli.li'
504589 },
505590
506591 {
507− url: 'https://gueorgui.net',
508− title: 'Gueorgui Tcherednitchenko',
509592 author: 'gueorgui',
593+ contact: 'hello@gueorgui.net',
594+ langs: ['en'],
595+ title: 'Gueorgui Tcherednitchenko',
510596 type: 'portfolio',
511− contact: 'hello@gueorgui.net'
597+ url: 'https://gueorgui.net'
512598 },
513599
514600 {
515− url: 'https://www.gkbrk.com',
516− title: 'Leo',
517601 author: 'Leo',
518− type: 'blog',
519602 contact: 'webring@gkbrk.com',
603+ feed: 'https://www.gkbrk.com/twtxt.txt',
604+ langs: ['en'],
520605 rss: 'https://www.gkbrk.com/feed.xml',
521− feed: 'https://www.gkbrk.com/twtxt.txt'
606+ title: 'Leo',
607+ type: 'blog',
608+ url: 'https://www.gkbrk.com'
522609 },
523610
524611 {
525− url: 'https://www.tatecarson.com',
612+ author: 'Tate Carson',
613+ contact: 'tatecarson@gmail.com',
614+ langs: ['en'],
526615 title: 'Tate Carson',
527616 type: 'portfolio',
528− author: 'Tate Carson',
529− contact: 'tatecarson@gmail.com'
617+ url: 'https://www.tatecarson.com'
530618 },
531619
532620 {
533− url: 'https://azlen.me',
534− title: 'azlen.me',
535621 author: 'azlen',
536− type: 'wiki',
537622 contact: 'webring@azlen.me',
538623 feed: 'https://azlen.me/twtxt.txt',
624+ langs: ['en'],
625+ title: 'azlen.me',
626+ type: 'wiki',
627+ url: 'https://azlen.me',
539628 wiki: 'https://azlen.me/glossary.ndtl'
540629 },
541630
542631 {
543− url: 'https://opinionatedguide.github.io/',
544− title: 'OpGuides',
545632 author: 'vega',
546633 contact: 'vegac@protonmail.com',
547− feed: 'https://opinionatedguide.github.io/twtxt.txt'
634+ feed: 'https://opinionatedguide.github.io/twtxt.txt',
635+ langs: ['en'],
636+ title: 'OpGuides',
637+ url: 'https://opinionatedguide.github.io/'
548638 },
549639
550640 {
551− url: 'https://chrismaughan.com/',
552− title: 'CMaughan',
553641 author: 'cmaughan',
554642 contact: 'mornymorny@gmail.com',
555− feed: 'https://chrismaughan.com/twtxt.txt'
643+ feed: 'https://chrismaughan.com/twtxt.txt',
644+ langs: ['en'],
645+ title: 'CMaughan',
646+ url: 'https://chrismaughan.com/'
556647 },
557648
558649 {
559− url: 'https://oddworlds.org/',
650+ author: 'RaelZero',
651+ contact: 'gaz.gong@gmail.com',
560652 title: 'oddworlds soliloquy',
653+ langs: ['en', 'es'],
561654 type: 'blog',
562− author: 'RaelZero',
563− contact: 'gaz.gong@gmail.com'
655+ url: 'https://oddworlds.org/'
564656 },
565657
566658 {
567− url: 'https://fundor333.com/',
568− title: 'Fundor333',
569− type: 'blog',
570659 author: 'Fundor 333',
571660 contact: 'blog@fundor333.com',
572− feed: 'https://fundor333.com/twtxt.txt'
661+ feed: 'https://fundor333.com/twtxt.txt',
662+ langs: ['en'],
663+ title: 'Fundor333',
664+ type: 'blog',
665+ url: 'https://fundor333.com/'
573666 },
574667
575668 {
576− url: 'https://cass.si/',
577− contact: 'm@cass.si'
669+ contact: 'm@cass.si',
670+ langs: ['en'],
671+ url: 'https://cass.si/'
578672 },
579673
580674 {
581− url: 'https://dotcomboom.somnolescent.net/',
582− title: 'dotcomboom.somnolescent.net',
583675 author: 'dcb',
584676 contact: 'dotcomboom@somnolescent.net',
585− feed: 'https://dotcomboom.somnolescent.net/twtxt.txt'
677+ feed: 'https://dotcomboom.somnolescent.net/twtxt.txt',
678+ langs: ['en'],
679+ title: 'dotcomboom.somnolescent.net',
680+ url: 'https://dotcomboom.somnolescent.net/'
586681 },
587682
588683 {
589− url: 'https://cadmican.neocities.org/',
590− title: 'cadmican',
684+ author: 'Nihiltarier',
591685 contact: 'arachi@airmail.cc',
592− author: 'Nihiltarier'
686+ langs: ['en'],
687+ title: 'cadmican',
688+ url: 'https://cadmican.neocities.org/'
593689 },
594690
595691 {
596− url: 'https://jskjott.com',
597− title: 'jskjott',
692+ author: 'Jonathan Skjøtt',
598693 contact: 'jonathan@jskjott.com',
599− author: 'Jonathan Skjøtt'
694+ langs: ['en'],
695+ title: 'jskjott',
696+ url: 'https://jskjott.com'
600697 },
601698
602699 {
603− url: 'https://sixey.es/',
604− title: 'sixey.es',
605− contact: 'elmusho@gmail.com',
606700 author: 'sixeyes',
607− type: 'portfolio'
701+ contact: 'elmusho@gmail.com',
702+ langs: ['en'],
703+ title: 'sixey.es',
704+ type: 'portfolio',
705+ url: 'https://sixey.es/'
608706 },
609707
610708 {
611− url: 'https://tilde.town/~dustin/',
612− title: '0xdstn',
613− contact: '0xdstn@protonmail.com',
614709 author: '0xdstn',
615− type: 'wiki'
710+ contact: '0xdstn@protonmail.com',
711+ langs: ['en'],
712+ title: '0xdstn',
713+ type: 'wiki',
714+ url: 'https://tilde.town/~dustin/'
616715 },
617−
618− {
619− url: 'https://jameschip.io/',
620− title: 'James Chip',
621− contact: 'henderson.j@protonmail.com',
716+
717+ {
622718 author: 'James',
623− rss: 'https://jameschip.io/index.xml'
719+ contact: 'henderson.j@protonmail.com',
720+ langs: ['en'],
721+ rss: 'https://jameschip.io/index.xml',
722+ title: 'James Chip',
723+ url: 'https://jameschip.io/'
624724 },
625725
626− {
627− url: 'https://dym.sh',
628− type: 'hybrid',
726+ {
629727 author: 'DYM',
630728 contact: 're@dym.sh',
631− rss: 'https://dym.sh/rss.xml'
729+ langs: ['en', 'ru'],
730+ rss: 'https://dym.sh/rss.xml',
731+ type: 'hybrid',
732+ url: 'https://dym.sh'
632733 },
633734
634735 {
635− url: 'https://patrick-is.cool/',
636736 author: 'Patrick Monaghan',
637737 contact: '0x5f.manpat@gmail.com',
638− type: 'portfolio'
738+ langs: ['en'],
739+ type: 'portfolio',
740+ url: 'https://patrick-is.cool/'
639741 },
640742
641743 {
642− url: 'https://icyphox.sh',
643− type: 'hybrid',
644744 author: 'icyphox',
645745 contact: 'x@icyphox.sh',
746+ feed: 'https://icyphox.sh/twtxt.txt',
747+ langs: ['en'],
646748 rss: 'https://icyphox.sh/blog/feed.xml',
647− feed: 'https://icyphox.sh/twtxt.txt'
749+ type: 'hybrid',
750+ url: 'https://icyphox.sh'
648751 }
649752
650753]