3 Commits

Author SHA1 Message Date
hikari fcf4e09750 chore: add words to cspell config
Node.js CI / CI (pull_request) Failing after 29s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m1s
2026-04-28 12:20:48 -07:00
hikari 7e2f53d9d1 chore: add anonymous testimonial 2026-04-28 12:20:48 -07:00
hikari fbd45b1c01 chore: add 13 new testimonials and remove duplicate 2026-04-28 12:19:40 -07:00
4 changed files with 165 additions and 151 deletions
-6
View File
@@ -22,7 +22,6 @@
"caelia", "caelia",
"Calenelle", "Calenelle",
"callista", "callista",
"Chronara",
"cashapp", "cashapp",
"catz", "catz",
"codeofdreams", "codeofdreams",
@@ -33,7 +32,6 @@
"Deepgram", "Deepgram",
"Eclaire", "Eclaire",
"Eirene", "Eirene",
"Ephemere",
"Elaria", "Elaria",
"Elowyn", "Elowyn",
"Elunara", "Elunara",
@@ -63,7 +61,6 @@
"manuarora", "manuarora",
"maribelle", "maribelle",
"minjo", "minjo",
"Minori",
"modeling", "modeling",
"maylin", "maylin",
"Meliora", "Meliora",
@@ -90,7 +87,6 @@
"Ranjan", "Ranjan",
"Rennemeyer", "Rennemeyer",
"Rion", "Rion",
"Rondelle",
"roseaboveit", "roseaboveit",
"rosalia", "rosalia",
"ruus", "ruus",
@@ -107,7 +103,6 @@
"Sylvara", "Sylvara",
"Takada", "Takada",
"Taryne", "Taryne",
"Tatsumi",
"Technomancer", "Technomancer",
"Tessara", "Tessara",
"TTRPG", "TTRPG",
@@ -119,7 +114,6 @@
"Urmatan", "Urmatan",
"Umbrelle", "Umbrelle",
"Vajda", "Vajda",
"Valerium",
"Veluna", "Veluna",
"verena", "verena",
"vitalia", "vitalia",
+24 -2
View File
@@ -45,7 +45,18 @@ projects:
- Naomi Public License - Naomi Public License
tags: tags:
- community - community
- guid: cordelia-taryne
name: Cordelia Taryne
description: A user-installable Discord app that allows you to ask questions, generate
alt text for images, evaluate code, and more.
webpageUrl:
url: https://cordelia.nhcarrigan.com/
repositoryUrl:
url: https://git.nhcarrigan.com/nhcarrigan/cordelia-taryne
licenses:
- Naomi Public License
tags:
- community
- guid: gwen-abalise - guid: gwen-abalise
name: Gwen Abalise name: Gwen Abalise
description: A ticketing system for Discord servers. description: A ticketing system for Discord servers.
@@ -57,7 +68,18 @@ projects:
- Naomi Public License - Naomi Public License
tags: tags:
- community - community
- guid: maylin-taryne
name: Maylin Taryne
description: A helpful and supportive Discord bot that allows you to have conversations
with a virtual friend in private messages.
webpageUrl:
url: https://maylin.nhcarrigan.com/
repositoryUrl:
url: https://git.nhcarrigan.com/nhcarrigan/maylin-taryne
licenses:
- Naomi Public License
tags:
- community
- guid: melody-iuvo - guid: melody-iuvo
name: Melody Iuvo name: Melody Iuvo
description: A user-installable task management application for Discord. description: A user-installable task management application for Discord.
+81 -142
View File
@@ -1,4 +1,4 @@
- avatar: null - avatar: 'https://cdn.nhcarrigan.com/new-avatars/rosalia.png'
category: websites category: websites
description: >- description: >-
Our global logging server, which pipes logs from all of our apps into a Our global logging server, which pipes logs from all of our apps into a
@@ -16,7 +16,7 @@
premium: true premium: true
url: 'https://trans.nhcarrigan.com' url: 'https://trans.nhcarrigan.com'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/aria.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/aria.png'
category: community category: community
description: >- description: >-
A user-installable bot that allows you to translate any message into your A user-installable bot that allows you to translate any message into your
@@ -25,7 +25,7 @@
premium: true premium: true
url: 'https://aria.nhcarrigan.com/' url: 'https://aria.nhcarrigan.com/'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/becca.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/becca.png'
category: community category: community
description: >- description: >-
A user-installable Discord app that facilitates a solo Dungeons and Dragons A user-installable Discord app that facilitates a solo Dungeons and Dragons
@@ -34,23 +34,39 @@
premium: true premium: true
url: 'https://becca.nhcarrigan.com' url: 'https://becca.nhcarrigan.com'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/new-avatars/cordelia.png'
- avatar: 'https://cdn.nhcarrigan.com/avatars/gwen.png' category: community
description: >-
A user-installable Discord app that allows you to ask questions, generate
alt text for images, evaluate code, and more.
name: Cordelia Taryne
premium: true
url: 'https://cordelia.nhcarrigan.com/'
wip: false
- avatar: 'https://cdn.nhcarrigan.com/new-avatars/gwen.png'
category: community category: community
description: A ticketing system for Discord servers. description: A ticketing system for Discord servers.
name: Gwen Abalise name: Gwen Abalise
premium: true premium: true
url: 'https://gwen.nhcarrigan.com/' url: 'https://gwen.nhcarrigan.com/'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/new-avatars/maylin.png'
- avatar: 'https://cdn.nhcarrigan.com/avatars/melody.png' category: community
description: >-
A helpful and supportive Discord bot that allows you to have conversations
with a virtual friend in private messages.
name: Maylin Taryne
premium: true
url: 'https://maylin.nhcarrigan.com/'
wip: false
- avatar: 'https://cdn.nhcarrigan.com/new-avatars/melody.png'
category: community category: community
description: A user-installable task management application for Discord. description: A user-installable task management application for Discord.
name: Melody Iuvo name: Melody Iuvo
premium: true premium: true
url: 'https://melody.nhcarrigan.com/' url: 'https://melody.nhcarrigan.com/'
wip: false wip: false
- avatar: null - avatar: 'https://cdn.nhcarrigan.com/new-avatars/beccalia.png'
category: apps category: apps
description: >- description: >-
Originally planned as the story of Becca and Rosalia growing up, this game Originally planned as the story of Becca and Rosalia growing up, this game
@@ -59,7 +75,7 @@
premium: false premium: false
url: 'https://beccalia.nhcarrigan.com/origins' url: 'https://beccalia.nhcarrigan.com/origins'
wip: false wip: false
- avatar: null - avatar: 'https://cdn.nhcarrigan.com/new-avatars/beccalia.png'
category: apps category: apps
description: >- description: >-
An introductory story that sets the stage for the Beccalia universe, An introductory story that sets the stage for the Beccalia universe,
@@ -91,7 +107,7 @@
premium: false premium: false
url: 'https://blog.nhcarrigan.com' url: 'https://blog.nhcarrigan.com'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/nymira.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/nymira.png'
category: websites category: websites
description: >- description: >-
A service that allows you to claim a custom <username>.naomi.party username A service that allows you to claim a custom <username>.naomi.party username
@@ -116,7 +132,7 @@
premium: false premium: false
url: 'https://git.nhcarrigan.com' url: 'https://git.nhcarrigan.com'
wip: false wip: false
- avatar: null - avatar: 'https://cdn.nhcarrigan.com/new-avatars/hikari.png'
category: websites category: websites
description: This dashboard! description: This dashboard!
name: Hikari name: Hikari
@@ -139,7 +155,7 @@
premium: false premium: false
url: 'https://mommy.nhcarrigan.com' url: 'https://mommy.nhcarrigan.com'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/lucinda.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/lucinda.png'
category: websites category: websites
description: A kanban-style task management site. description: A kanban-style task management site.
name: Lucinda name: Lucinda
@@ -153,14 +169,14 @@
premium: false premium: false
url: 'https://nhcarrigan.com' url: 'https://nhcarrigan.com'
wip: false wip: false
- avatar: null - avatar: 'https://cdn.nhcarrigan.com/new-avatars/vitalia.png'
category: websites category: websites
description: A full-featured nutrition tracker with community-driven nutrient data. description: A full-featured nutrition tracker with community-driven nutrient data.
name: Vitalia name: Vitalia
premium: true premium: true
url: 'https://vitalia.nhcarrigan.com' url: 'https://vitalia.nhcarrigan.com'
wip: true wip: true
- avatar: null - avatar: 'https://cdn.nhcarrigan.com/new-avatars/octavia.png'
category: apps category: apps
description: >- description: >-
Linux-native music player application with a focus on handling large Linux-native music player application with a focus on handling large
@@ -169,7 +185,7 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/maribelle.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/maribelle.png'
category: community category: community
description: >- description: >-
A Discord bot that allows you to configure daily progress huddle reminders A Discord bot that allows you to configure daily progress huddle reminders
@@ -178,7 +194,7 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/sorielle.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/sorielle.png'
category: community category: community
description: >- description: >-
A Discord bot that allows servers to specify a venting channel for automatic A Discord bot that allows servers to specify a venting channel for automatic
@@ -187,21 +203,21 @@
premium: true premium: true
url: 'https://sorielle.nhcarrigan.com' url: 'https://sorielle.nhcarrigan.com'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/verena.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/verena.png'
category: community category: community
description: A Discord bot that allows identity and age verification. description: A Discord bot that allows identity and age verification.
name: Verena name: Verena
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: null - avatar: 'https://cdn.nhcarrigan.com/new-avatars/thalassa.png'
category: apps category: apps
description: A rich presence application for Linux. description: A rich presence application for Linux.
name: Thalassa name: Thalassa
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/aeris.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/aeris.png'
category: websites category: websites
description: >- description: >-
An authentication service featuring magic links and support for multiple An authentication service featuring magic links and support for multiple
@@ -210,7 +226,7 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/liora.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/liora.png'
category: community category: community
description: >- description: >-
A Discord bot that allows your server members to specify 'highlight' words, A Discord bot that allows your server members to specify 'highlight' words,
@@ -219,14 +235,14 @@
premium: true premium: true
url: https://liora.nhcarrigan.com url: https://liora.nhcarrigan.com
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/thessalia.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/thessalia.png'
category: community category: community
description: An RPG game on Discord description: An RPG game on Discord
name: Thessalia name: Thessalia
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/callista.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/callista.png'
category: community category: community
description: >- description: >-
A user-installable Discord bot that allows you to bookmark messages and save A user-installable Discord bot that allows you to bookmark messages and save
@@ -235,28 +251,28 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/isolda.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/isolda.png'
category: apps category: apps
description: 'Modern, sleek email client for the web or desktop' description: 'Modern, sleek email client for the web or desktop'
name: Isolda name: Isolda
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/meliora.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/meliora.png'
category: websites category: websites
description: 'Embeddable chat widget, comment section, and full support flow utility.' description: 'Embeddable chat widget, comment section, and full support flow utility.'
name: Meliora name: Meliora
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/aurelia.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/aurelia.png'
category: websites category: websites
description: Blogging platform with markdown editor description: Blogging platform with markdown editor
name: Aurelia name: Aurelia
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/eirene.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/eirene.png'
category: community category: community
description: >- description: >-
Website and Discord activity that allows you to participate in code Website and Discord activity that allows you to participate in code
@@ -265,28 +281,28 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/amirei.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/amirei.png'
category: websites category: websites
description: A quick social link aggregator for 'link in bio' pages. description: A quick social link aggregator for 'link in bio' pages.
name: Amirei name: Amirei
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/zephra.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/zephra.png'
category: websites category: websites
description: Micro-blogging social media platform. description: Micro-blogging social media platform.
name: Zephra name: Zephra
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/oriana.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/oriana.png'
category: websites category: websites
description: Uptime monitoring tool with status pages description: Uptime monitoring tool with status pages
name: Oriana name: Oriana
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/lyra.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/lyra.png'
category: websites category: websites
description: >- description: >-
A web-based API mocking tool, allowing you to create temporary endpoints for A web-based API mocking tool, allowing you to create temporary endpoints for
@@ -295,14 +311,14 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/selene.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/selene.png'
category: apps category: apps
description: A local-only privacy-focused REST API client. description: A local-only privacy-focused REST API client.
name: Selene name: Selene
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/sybil.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/sybil.png'
category: community category: community
description: >- description: >-
A Discord bot that syndicates forum threads to an indexable website and A Discord bot that syndicates forum threads to an indexable website and
@@ -311,14 +327,14 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/calenelle.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/calenelle.png'
category: websites category: websites
description: A group coordination app with event scheduling and such. description: A group coordination app with event scheduling and such.
name: Calenelle name: Calenelle
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/rowena.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/rowena.png'
category: websites category: websites
description: >- description: >-
Web app that allows you to create and share forms, and track responses in a Web app that allows you to create and share forms, and track responses in a
@@ -327,7 +343,7 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/alouette.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/alouette.png'
category: websites category: websites
description: >- description: >-
A web server that allows you to set up arbitrary webhooks and format them to A web server that allows you to set up arbitrary webhooks and format them to
@@ -336,7 +352,7 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/clarion.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/clarion.png'
category: community category: community
description: >- description: >-
A Discord bot with dashboard that allows server mangers to post and edit A Discord bot with dashboard that allows server mangers to post and edit
@@ -345,14 +361,14 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: null - avatar: 'https://cdn.nhcarrigan.com/new-avatars/elowyn.png'
category: websites category: websites
description: A quick website that helps you format text. description: A quick website that helps you format text.
name: Elowyn name: Elowyn
premium: false premium: false
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/evangeline.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/evangeline.png'
category: community category: community
description: >- description: >-
A Discord bot that allows you to configure canned replies, retrieve them A Discord bot that allows you to configure canned replies, retrieve them
@@ -361,49 +377,49 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/theodora.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/theodora.png'
category: community category: community
description: A Discord bot that generates 100 days of code reminders. description: A Discord bot that generates 100 days of code reminders.
name: Theodora name: Theodora
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/vivienne.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/vivienne.png'
category: websites category: websites
description: An RSS feed reader/management site. description: An RSS feed reader/management site.
name: Vivienne name: Vivienne
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/veluna.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/veluna.png'
category: community category: community
description: Discord bot that allows you to receive and answer anonymous questions. description: Discord bot that allows you to receive and answer anonymous questions.
name: Veluna name: Veluna
premium: false premium: false
url: https://veluna.nhcarrigan.com url: https://veluna.nhcarrigan.com
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/elysium.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/elysium.png'
category: apps category: apps
description: Idle RPG in the browser. description: Idle RPG in the browser.
name: Elysium name: Elysium
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/chibika.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/chibika.png'
category: community category: community
description: A Discord bot that generates ascii anime girls. description: A Discord bot that generates ascii anime girls.
name: Chibika name: Chibika
premium: true premium: true
url: 'https://chibika.nhcarrigan.com' url: 'https://chibika.nhcarrigan.com'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/elaria.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/elaria.png'
category: websites category: websites
description: Meeting schedule coordination tool. description: Meeting schedule coordination tool.
name: Elaria name: Elaria
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/elunara.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/elunara.png'
category: community category: community
description: >- description: >-
Discord bot that allows users to proxy messages so they correctly appear as Discord bot that allows users to proxy messages so they correctly appear as
@@ -412,7 +428,7 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/aureline.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/aureline.png'
category: websites category: websites
description: >- description: >-
Web app that allows you to create/upload digital badges and certifications Web app that allows you to create/upload digital badges and certifications
@@ -421,21 +437,21 @@
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/lynira.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/lynira.png'
category: apps category: apps
description: Link shortener managed via a Discord bot. description: Link shortener managed via a Discord bot.
name: Lynira name: Lynira
premium: true premium: true
url: 'https://lynira.link' url: 'https://lynira.link'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/altaria.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/altaria.png'
category: community category: community
description: A Discord bot that reminds you to provide alt-text for images. description: A Discord bot that reminds you to provide alt-text for images.
name: Altaria name: Altaria
premium: false premium: false
url: 'https://altaria.nhcarrigan.com' url: 'https://altaria.nhcarrigan.com'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/pavelle.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/pavelle.png'
category: community category: community
description: >- description: >-
Discord bot that allows you to throw things (like cake) at your fellow Discord bot that allows you to throw things (like cake) at your fellow
@@ -444,7 +460,7 @@
premium: true premium: true
url: 'https://pavelle.nhcarrigan.com' url: 'https://pavelle.nhcarrigan.com'
wip: false wip: false
- avatar: null - avatar: 'https://cdn.nhcarrigan.com/new-avatars/amari.png'
category: community category: community
description: >- description: >-
Naomi's virtual personal assistant who helps out with automation around our Naomi's virtual personal assistant who helps out with automation around our
@@ -453,28 +469,28 @@
premium: false premium: false
url: 'https://amari.nhcarrigan.com' url: 'https://amari.nhcarrigan.com'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/serenya.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/serenya.png'
category: community category: community
description: Discord bot that allows you to force yourself to take a break. description: Discord bot that allows you to force yourself to take a break.
name: Serenya name: Serenya
premium: false premium: false
url: 'https://serenya.nhcarrigan.com' url: 'https://serenya.nhcarrigan.com'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/caelia.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/caelia.png'
category: community category: community
description: Discord bot that gently reminds you to use inclusive language. description: Discord bot that gently reminds you to use inclusive language.
name: Caelia name: Caelia
premium: false premium: false
url: 'https://caelia.nhcarrigan.com' url: 'https://caelia.nhcarrigan.com'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/tessara.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/tessara.png'
category: community category: community
description: A Discord bot that allows you to collect and use trading cards that are actually conversation starters. description: A Discord bot that allows you to collect and use trading cards that are actually conversation starters.
name: Tessara name: Tessara
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/hacksmiths.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/hacksmiths.png'
category: websites category: websites
description: Online programming-themed party game. description: Online programming-themed party game.
name: Hacksmiths name: Hacksmiths
@@ -495,14 +511,14 @@
premium: false premium: false
url: 'https://marketplace.visualstudio.com/items?itemName=nhcarrigan.naomis-themes' url: 'https://marketplace.visualstudio.com/items?itemName=nhcarrigan.naomis-themes'
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/meridia.png' - avatar: 'https://cdn.nhcarrigan.com/new-avatars/meridia.png'
category: apps category: apps
description: Our custom metrics and analytics server. description: Our custom metrics and analytics server.
name: Meridia name: Meridia
premium: false premium: false
url: null url: null
wip: true wip: true
- avatar: null - avatar: 'https://cdn.nhcarrigan.com/new-avatars/a4p.png'
category: community category: community
description: A custom Discord bot for the Artists4Palestine charity initiative. description: A custom Discord bot for the Artists4Palestine charity initiative.
name: Artists4Palestine Bot name: Artists4Palestine Bot
@@ -523,7 +539,7 @@
premium: false premium: false
url: "https://www.npmjs.com/package/@nhcarrigan/eslint-config" url: "https://www.npmjs.com/package/@nhcarrigan/eslint-config"
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/celestine.png' - avatar: "https://cdn.nhcarrigan.com/new-avatars/celestine.png"
category: community category: community
description: A powerful moderation bot for Discord. description: A powerful moderation bot for Discord.
name: Celestine name: Celestine
@@ -586,7 +602,7 @@
premium: false premium: false
url: "https://git.nhcarrigan.com/nhcarrigan/scripts" url: "https://git.nhcarrigan.com/nhcarrigan/scripts"
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/umbrelle.png' - avatar: "https://cdn.nhcarrigan.com/new-avatars/umbrelle.png"
category: community category: community
description: A Discord bot that allows you to set up a honeypot channel for catching compromised accounts. description: A Discord bot that allows you to set up a honeypot channel for catching compromised accounts.
name: Umbrelle name: Umbrelle
@@ -607,129 +623,52 @@
premium: false premium: false
url: "https://www.npmjs.com/package/@nhcarrigan/discord-analytics" url: "https://www.npmjs.com/package/@nhcarrigan/discord-analytics"
wip: false wip: false
- avatar: null - avatar: "https://cdn.nhcarrigan.com/new-avatars/keiko.png"
category: community category: community
description: Naomi's personal AI-powered research assistant. description: Naomi's personal AI-powered research assistant.
name: Keiko name: Keiko
premium: false premium: false
url: "https://keiko.nhcarrigan.com" url: "https://keiko.nhcarrigan.com"
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/sylvara.png' - avatar: https://cdn.nhcarrigan.com/new-avatars/sylvara.png
category: community category: community
description: A Discord bot that allows you to make your message sound more professional. description: A Discord bot that allows you to make your message sound more professional.
name: Sylvara name: Sylvara
premium: true premium: true
url: null url: null
wip: true wip: true
- avatar: 'https://cdn.nhcarrigan.com/avatars/nomena.png' - avatar: "https://cdn.nhcarrigan.com/new-avatars/nomena.png"
category: community category: community
description: Naomi's personal AI-powered project name/avatar generator. description: Naomi's personal AI-powered project name/avatar generator.
name: Nomena name: Nomena
premium: false premium: false
url: null url: null
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/eclaire.png' - avatar: "https://cdn.nhcarrigan.com/new-avatars/eclaire.png"
category: websites category: websites
description: A website that allows you to speak into your microphone and have your words translated into another language. description: A website that allows you to speak into your microphone and have your words translated into another language.
name: Eclaire name: Eclaire
premium: false premium: false
url: "https://eclaire.nhcarrigan.com" url: "https://eclaire.nhcarrigan.com"
wip: false wip: false
- avatar: null - avatar: "https://cdn.nhcarrigan.com/new-avatars/vivicrea.png"
category: community category: community
description: Discord bot to generate art of Naomi description: Discord bot to generate art of Naomi
name: Vivicrea name: Vivicrea
premium: false premium: false
url: null url: null
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/tyche.png' - avatar: "https://cdn.nhcarrigan.com/new-avatars/tyche.png"
category: community category: community
description: Discord bot that allows you to roll TTRPG dice. description: Discord bot that allows you to roll TTRPG dice.
name: Tyche name: Tyche
premium: false premium: false
url: "https://tyche.nhcarrigan.com" url: "https://tyche.nhcarrigan.com"
wip: false wip: false
- avatar: 'https://cdn.nhcarrigan.com/avatars/saisoku.png' - avatar: "https://cdn.nhcarrigan.com/new-avatars/saisoku.png"
category: community category: community
description: A Discord bot that encourages (or bullies) you to complete important tasks. description: A Discord bot that encourages (or bullies) you to complete important tasks.
name: Saisoku name: Saisoku
premium: true premium: true
url: "https://saisoku.nhcarrigan.com" url: "https://saisoku.nhcarrigan.com"
wip: false
- avatar: null
category: community
description: Discord bot that monitors boost status in the Caylus Crew server.
name: Valerium
premium: false
url: null
wip: false
- avatar: null
category: apps
description: App for running one-off or occasionally recurring scripts across various platforms.
name: Ephemere
premium: false
url: null
wip: false
- avatar: null
category: websites
description: A fun site about the fantasy version of Naomi, and the characters around her.
name: Lore
premium: false
url: null
wip: false
- avatar: null
category: apps
description: A cute desktop wrapper for Claude Code with an anime girl.
name: Hikari Desktop
premium: false
url: null
wip: false
- avatar: null
category: community
description: Discord bot to facilitate breakout sessions and coffee chats.
name: Rondelle
premium: false
url: null
wip: false
- avatar: null
category: apps
description: A 100% local meeting transcription and summarisation tool.
name: Chronara
premium: false
url: null
wip: false
- avatar: null
category: websites
description: A collection of silly fun static pages.
name: Silly Sites
premium: false
url: null
wip: false
- avatar: null
category: websites
description: Naomi's personal library tracking app.
name: Library
premium: false
url: 'https://library.nhcarrigan.com'
wip: false
- avatar: null
category: community
description: A community bot and archival tool.
name: Minori
premium: false
url: null
wip: true
- avatar: null
category: apps
description: Desktop app for generating Naomi art.
name: Tatsumi
premium: false
url: null
wip: false
- avatar: null
category: websites
description: Naomi's personality configuration and profile.
name: Personality
premium: false
url: 'https://personality.nhcarrigan.com'
wip: false wip: false
+60 -1
View File
@@ -14,6 +14,28 @@ import type { Projects } from "../src/interfaces/projects.js";
import type { Resume } from "../src/interfaces/resume.js"; import type { Resume } from "../src/interfaces/resume.js";
import type { Testimonials } from "../src/interfaces/testimonials.js"; import type { Testimonials } from "../src/interfaces/testimonials.js";
const checkUrl = async(url: string): Promise<boolean> => {
try {
const response = await fetch(url, {
headers: { origin: url },
method: "HEAD",
});
if (response.status === 429) {
// Try again after few seconds
console.log(`Rate limited on ${url}, trying again...`);
await new Promise((resolve) => {
// eslint-disable-next-line no-promise-executor-return --- HUH???
return setTimeout(resolve, 5000);
});
return checkUrl(url);
}
return response.ok;
} catch (error) {
console.error(`Error checking URL ${url}:`, error);
return false;
}
};
describe("project data", () => { describe("project data", () => {
it("should match the interface", async() => { it("should match the interface", async() => {
expect.hasAssertions(); expect.hasAssertions();
@@ -68,15 +90,29 @@ describe("project data", () => {
project.name ?? "unknown" project.name ?? "unknown"
}`, }`,
).toBe("string"); ).toBe("string");
await expect(
checkUrl(project.avatar),
`Project avatar should be reachable for project: ${
project.name ?? "unknown"
}`,
).resolves.toBeTruthy();
} }
if (project.url) { // We explicitly skip the VSCode url because it blocks our request.
if (project.url
&& !project.url.startsWith("https://marketplace.visualstudio.com")) {
expect( expect(
typeof project.url, typeof project.url,
`Project url should be a string for project: ${ `Project url should be a string for project: ${
project.name ?? "unknown" project.name ?? "unknown"
}`, }`,
).toBe("string"); ).toBe("string");
await expect(
checkUrl(project.url),
`Project url should be reachable for project: ${
project.name ?? "unknown"
}`,
).resolves.toBeTruthy();
} }
} }
}); });
@@ -407,6 +443,13 @@ describe("donate data", () => {
method.name ?? "unknown method" method.name ?? "unknown method"
}`, }`,
).toBe("string"); ).toBe("string");
await expect(
checkUrl(method.url),
`Donation method url should be reachable for ${
method.name ?? "unknown method"
}`,
).resolves.toBeTruthy();
} }
}); });
}); });
@@ -458,6 +501,10 @@ describe("funding data", () => {
typeof parsed.entity.webpageUrl.url, typeof parsed.entity.webpageUrl.url,
`Funding entity webpageUrl.url should be a string`, `Funding entity webpageUrl.url should be a string`,
).toBe("string"); ).toBe("string");
await expect(
checkUrl(parsed.entity.webpageUrl.url),
`Funding entity webpageUrl.url should be reachable`,
).resolves.toBeTruthy();
if (parsed.entity.webpageUrl.wellKnown) { if (parsed.entity.webpageUrl.wellKnown) {
expect( expect(
@@ -504,6 +551,12 @@ describe("funding data", () => {
project.name ?? "unknown" project.name ?? "unknown"
}`, }`,
).toBe("string"); ).toBe("string");
await expect(
checkUrl(project.webpageUrl.url),
`Funding project webpageUrl.url should be reachable for project: ${
project.name ?? "unknown"
}`,
).resolves.toBeTruthy();
if (project.webpageUrl.wellKnown) { if (project.webpageUrl.wellKnown) {
expect( expect(
typeof project.webpageUrl.wellKnown, typeof project.webpageUrl.wellKnown,
@@ -524,6 +577,12 @@ describe("funding data", () => {
project.name ?? "unknown" project.name ?? "unknown"
}`, }`,
).toBe("string"); ).toBe("string");
await expect(
checkUrl(project.repositoryUrl.url),
`Funding project repositoryUrl.url should be reachable for project: ${
project.name ?? "unknown"
}`,
).resolves.toBeTruthy();
if (project.repositoryUrl.wellKnown) { if (project.repositoryUrl.wellKnown) {
expect( expect(
typeof project.repositoryUrl.wellKnown, typeof project.repositoryUrl.wellKnown,