8 Commits

Author SHA1 Message Date
nerdychara f58a9d62c5 remove mention of fork and update url instructions
Node.js CI / Lint and Test (pull_request) Failing after 35s
2025-11-13 09:05:44 -05:00
nerdychara 73beb11b3b chore: audit contributing docs
Node.js CI / Lint and Test (pull_request) Failing after 35s
2025-11-12 20:15:50 -08:00
naomi 0daef2fdc6 feat: increase font size
Node.js CI / Lint and Test (push) Failing after 35s
2025-11-10 09:50:11 -08:00
naomi 1ad784344c feat: add new projects to documentation
Node.js CI / Lint and Test (push) Failing after 34s
2025-10-31 21:27:00 -07:00
naomi cee172a5d6 feat: port over random docs that can be public now
Node.js CI / Lint and Test (push) Successful in 1m41s
2025-10-29 20:11:13 -07:00
naomi 2d3d684894 feat: migrate mentorship wiki 2025-10-29 19:53:22 -07:00
naomi 4298548347 feat: nav styling
Node.js CI / Lint and Test (push) Successful in 1m41s
2025-10-29 18:59:00 -07:00
naomi b754503317 feat: document all products, write tests (#12)
Node.js CI / Lint and Test (push) Successful in 1m43s
### Explanation

_No response_

### Issue

_No response_

### Attestations

- [x] I have read and agree to the [Code of Conduct](https://docs.nhcarrigan.com/community/coc/)
- [x] I have read and agree to the [Community Guidelines](https://docs.nhcarrigan.com/community/guide/).
- [x] My contribution complies with the [Contributor Covenant](https://docs.nhcarrigan.com/dev/covenant/).

### Dependencies

- [x] I have pinned the dependencies to a specific patch version.

### Style

- [x] I have run the linter and resolved any errors.
- [x] My pull request uses an appropriate title, matching the conventional commit standards.
- [x] My scope of feat/fix/chore/etc. correctly matches the nature of changes in my pull request.

### Tests

- [x] My contribution adds new code, and I have added tests to cover it.
- [x] My contribution modifies existing code, and I have updated the tests to reflect these changes.
- [x] All new and existing tests pass locally with my changes.
- [x] Code coverage remains at or above the configured threshold.

### Documentation

_No response_

### Versioning

_No response_

Reviewed-on: #12
Co-authored-by: Naomi Carrigan <commits@nhcarrigan.com>
Co-committed-by: Naomi Carrigan <commits@nhcarrigan.com>
2025-10-29 18:55:38 -07:00
92 changed files with 12599 additions and 1651 deletions
+34 -1
View File
@@ -32,15 +32,26 @@
"Ghostty", "Ghostty",
"Amberol", "Amberol",
"Musicolet", "Musicolet",
"wifi" "wifi",
"neopronouns",
"linters",
"misgendered"
], ],
"words": [ "words": [
"Abalise", "Abalise",
"Aeris",
"Alouette",
"Amari",
"Amirei",
"atproto", "atproto",
"Aurelia",
"Aureline",
"bannable", "bannable",
"Becca", "Becca",
"Beccalia", "Beccalia",
"Caelia", "Caelia",
"Calenelle",
"Callista",
"CCPA", "CCPA",
"Celestine", "Celestine",
"Čeština", "Čeština",
@@ -48,6 +59,10 @@
"Chibika", "Chibika",
"CPACC", "CPACC",
"Dansk", "Dansk",
"Eirene",
"Elaria",
"Elowyn",
"Elunara",
"equivalencies", "equivalencies",
"escalatory", "escalatory",
"excludable", "excludable",
@@ -58,16 +73,26 @@
"Gitea", "Gitea",
"Hikari", "Hikari",
"incentivising", "incentivising",
"Isolda",
"Italiano", "Italiano",
"ITAR", "ITAR",
"Iuvo", "Iuvo",
"Jessara",
"KADOKAWA",
"LGBTQ", "LGBTQ",
"Lietuvių", "Lietuvių",
"Liora",
"Lyria", "Lyria",
"Maribelle",
"Meliora",
"Meridia",
"minimis",
"Mommy", "Mommy",
"NAMI", "NAMI",
"Nederlands", "Nederlands",
"Nymira",
"OFAC", "OFAC",
"Oriana",
"Pavelle", "Pavelle",
"PIPEDA", "PIPEDA",
"Polski", "Polski",
@@ -83,10 +108,18 @@
"Suomi", "Suomi",
"Svenska", "Svenska",
"Taryne", "Taryne",
"Tessara",
"Thalassa",
"Thessalia",
"Türkçe", "Türkçe",
"Umbrelle", "Umbrelle",
"Veluna",
"Verena",
"Vitalia",
"Vivienne",
"vtubing", "vtubing",
"WCAG", "WCAG",
"Zephra",
"zirs", "zirs",
"Ελληνικά", "Ελληνικά",
"Български", "Български",
+8 -8
View File
@@ -33,14 +33,14 @@ export default defineConfig({
label: "Edit this page on Naomi's Self-hosted Git instance", label: "Edit this page on Naomi's Self-hosted Git instance",
}, },
lastUpdated: true, lastUpdated: true,
social: { social: [
github: "https://git.nhcarrigan.com", { icon: 'github', label: 'GitHub', href: 'https://git.nhcarrigan.com' },
discourse: "https://forum.nhcarrigan.com", { icon: 'discord', label: 'Discord', href: 'https://chat.nhcarrigan.com' },
mastodon: "https://fedi.nhcarrigan.com/@naomi", { icon: 'blueSky', label: 'Bluesky', href: 'https://bsky.app/profile/nhcarrigan.com' },
matrix: "https://matrix.nhcarrigan.com", { icon: 'linkedin', label: 'LinkedIn', href: 'https://www.linkedin.com/company/nhcarrigan/' },
rss: "https://irc.nhcarrigan.com", { icon: 'twitter', label: 'Twitter', href: 'https://x.com/nhcarrigan1' },
email: "mailto:contact@nhcarrigan.com", { icon: 'email', label: 'Email', href: 'mailto:contact@nhcarrigan.com' },
}, ],
logo: { logo: {
src: "./public/logo.png", src: "./public/logo.png",
alt: "NHCarrigan Logo", alt: "NHCarrigan Logo",
+10 -9
View File
@@ -9,18 +9,19 @@
"build": "astro build", "build": "astro build",
"preview": "astro preview", "preview": "astro preview",
"astro": "astro", "astro": "astro",
"scan": "SONAR_TOKEN='op://Environment Variables - Development/SonarCloud/docs' op run -- sonar-scanner -Dsonar.organization=nhcarrigan -Dsonar.projectKey=nhcarrigan_docs -Dsonar.sources=. -Dsonar.host.url=https://sonarcloud.io", "test": "vitest --run"
"test": "echo 'No tests yet!' && exit 0"
}, },
"dependencies": { "dependencies": {
"@astrojs/check": "^0.9.4", "@astrojs/check": "0.9.5",
"@astrojs/starlight": "^0.32.0", "@astrojs/starlight": "0.36.1",
"astro": "^5.3.0", "astro": "5.15.2",
"astro-mermaid": "1.0.4", "astro-mermaid": "1.1.0",
"mermaid": "11.11.0", "mermaid": "11.12.1",
"typescript": "^5.7.3" "typescript": "5.9.3"
}, },
"devDependencies": { "devDependencies": {
"cspell": "8.17.3" "cspell": "9.2.2",
"gray-matter": "4.0.3",
"vitest": "4.0.5"
} }
} }
+1920 -1271
View File
File diff suppressed because it is too large Load Diff
+359 -19
View File
@@ -1,6 +1,7 @@
export const navigation = [ export const navigation = [
{ {
label: "About Us", label: "About Us",
collapsed: true,
items: [ items: [
{ {
label: "Mission Statement", label: "Mission Statement",
@@ -26,10 +27,11 @@ export const navigation = [
label: "Mentorship Programme Terms and Conditions", label: "Mentorship Programme Terms and Conditions",
link: "/about/mentorship", link: "/about/mentorship",
}, },
], ].sort((a, b) => a.label.localeCompare(b.label)),
}, },
{ {
label: "Legal Information", label: "Legal Information",
collapsed: true,
items: [ items: [
{ {
label: "Limitation of Liability and Indemnification Policy", label: "Limitation of Liability and Indemnification Policy",
@@ -44,7 +46,7 @@ export const navigation = [
link: "/legal/privacy", link: "/legal/privacy",
}, },
{ {
label: "Naomi's Public License", label: "Naomi's Public Licence",
link: "/legal/license", link: "/legal/license",
}, },
{ {
@@ -90,11 +92,12 @@ export const navigation = [
{ {
label: "Crisis and Mental Health Management Policy", label: "Crisis and Mental Health Management Policy",
link: "/legal/crisis-mental-health", link: "/legal/crisis-mental-health",
} },
], ].sort((a, b) => a.label.localeCompare(b.label)),
}, },
{ {
label: "Community Policies", label: "Community Policies",
collapsed: true,
items: [ items: [
{ {
label: "Community Code of Conduct", label: "Community Code of Conduct",
@@ -120,13 +123,14 @@ export const navigation = [
label: "Community Feedback and Participation Policy", label: "Community Feedback and Participation Policy",
link: "/community/feedback", link: "/community/feedback",
}, },
], ].sort((a, b) => a.label.localeCompare(b.label)),
}, },
{ {
label: "Development Documentation", label: "Development Documentation",
collapsed: true,
items: [ items: [
{ {
label: "Contributing Guide", label: "Contributing Documentation",
link: "/dev/contributing", link: "/dev/contributing",
}, },
{ {
@@ -150,13 +154,68 @@ export const navigation = [
link: "/dev/servers", link: "/dev/servers",
}, },
{ {
label: "VTubing Setup", label: "Naomi's VTubing Setup",
link: "/dev/vtubing", link: "/dev/vtubing",
}, },
], {
label: "Security Hall of Fame",
link: "/dev/hall-of-fame",
}
].sort((a, b) => a.label.localeCompare(b.label)),
},
{
label: "Mentorship Programme",
collapsed: true,
items: [
{
label: "00. Frequently Asked Questions",
link: "/mentorship/00-faq",
},
{
label: "01. Onboarding",
link: "/mentorship/01-onboarding",
},
{
label: "02. Goal Setting",
link: "/mentorship/02-goal-setting",
},
{
label: "03. Project Planning",
link: "/mentorship/03-project-plan",
},
{
label: "04. User Stories",
link: "/mentorship/04-user-stories",
},
{
label: "05. Technical Breakdown",
link: "/mentorship/05-technical-breakdown",
},
{
label: "06. Priority and Effort",
link: "/mentorship/06-priority-and-effort",
},
{
label: "07. Writing Code",
link: "/mentorship/07-writing-code",
},
{
label: "08. Final Polish",
link: "/mentorship/08-final-polish",
},
{
label: "09. Career Prep",
link: "/mentorship/09-career-prep",
},
{
label: "10. Graduation",
link: "/mentorship/10-graduation",
},
].sort((a, b) => a.label.localeCompare(b.label)),
}, },
{ {
label: "Project Documentation", label: "Project Documentation",
collapsed: true,
items: [ items: [
{ {
label: "ESLint Config", label: "ESLint Config",
@@ -176,7 +235,7 @@ export const navigation = [
{ {
label: "Naomi's Blog", label: "Naomi's Blog",
link: "/projects/blog", link: "/projects/blog",
badge: { text: "v0.1.0", variant: "caution" }, badge: { text: "v1.0.0", variant: "tip" },
}, },
{ {
label: "Celestine", label: "Celestine",
@@ -196,7 +255,7 @@ export const navigation = [
{ {
label: "Hikari", label: "Hikari",
link: "/projects/hikari", link: "/projects/hikari",
badge: { text: "v0.0.0", variant: "danger" }, badge: { text: "v0.0.0", variant: "caution" },
}, },
{ {
label: "Maylin Taryne", label: "Maylin Taryne",
@@ -211,15 +270,15 @@ export const navigation = [
{ {
label: "Mommy Bot", label: "Mommy Bot",
link: "/projects/mommy-bot", link: "/projects/mommy-bot",
badge: { text: "v0.0.0", variant: "danger" }, badge: { text: "v0.0.0", variant: "caution" },
}, },
{ {
label: "Mommy", label: "Mommy",
link: "/projects/mommy", link: "/projects/mommy",
badge: { text: "v0.0.0", variant: "danger" }, badge: { text: "v0.0.0", variant: "caution" },
}, },
{ {
label: "NHCarrigan Portfolio", label: "Portfolio",
link: "/projects/portfolio", link: "/projects/portfolio",
badge: { text: "unversioned", variant: "success" }, badge: { text: "unversioned", variant: "success" },
}, },
@@ -299,14 +358,285 @@ export const navigation = [
badge: { text: "v1.0.0", variant: "tip" }, badge: { text: "v1.0.0", variant: "tip" },
}, },
{ {
label: "Documentation Site", label: "NHCarrigan Documentation",
link: "/projects/docs", link: "/projects/docs",
badge: { text: "v1.0.0", variant: "tip" }, badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Data API",
link: "/projects/data-api",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Nymira",
link: "/projects/nymira",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Vitalia",
link: "/projects/vitalia",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Octavia",
link: "/projects/octavia",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Maribelle",
link: "/projects/maribelle",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Verena",
link: "/projects/verena",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Thalassa",
link: "/projects/thalassa",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Aeris",
link: "/projects/aeris",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Thessalia",
link: "/projects/thessalia",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Isolda",
link: "/projects/isolda",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Meliora",
link: "/projects/meliora",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Aurelia",
link: "/projects/aurelia",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Eirene",
link: "/projects/eirene",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Amirei",
link: "/projects/amirei",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Zephra",
link: "/projects/zephra",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Oriana",
link: "/projects/oriana",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Lyra",
link: "/projects/lyra",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Selene",
link: "/projects/selene",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Sybil",
link: "/projects/sybil",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Calenelle",
link: "/projects/calenelle",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Rowena",
link: "/projects/rowena",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Alouette",
link: "/projects/alouette",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Clarion",
link: "/projects/clarion",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Elowyn",
link: "/projects/elowyn",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Evangeline",
link: "/projects/evangeline",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Theodora",
link: "/projects/theodora",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Vivienne",
link: "/projects/vivienne",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Elysium",
link: "/projects/elysium",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Elaria",
link: "/projects/elaria",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Elunara",
link: "/projects/elunara",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Aureline",
link: "/projects/aureline",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Tessara",
link: "/projects/tessara",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Hacksmiths",
link: "/projects/hacksmiths",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Meridia",
link: "/projects/meridia",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Lucinda",
link: "/projects/lucinda",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Liora",
link: "/projects/liora",
badge: { text: "1.0.0", variant: "tip" },
},
{
label: "Beccalia: Origins",
link: "/projects/beccalia-origins",
badge: { text: "v0.0.0", variant: "caution" },
},
{
label: "Beccalia: Prologue",
link: "/projects/beccalia-prologue",
badge: { text: "v1.0.1", variant: "tip" },
},
{
label: "Life of a Naomi",
link: "/projects/life-of-a-naomi",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Ruu's Goblin Quest",
link: "/projects/ruus-goblin-quest",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Naomi's Adventure I: An Isekai Story",
link: "/projects/naomis-adventure-i",
badge: { text: "unreleased", variant: "danger" },
},
{
label: "Amari",
link: "/projects/amari",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Artists4Palestine Bot",
link: "/projects/a4p-bot",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Naomi's VSCode Themes",
link: "/projects/vscode-themes",
badge: { text: "v2.2.0", variant: "tip" },
},
{
label: "Boost Monitor",
link: "/projects/boost-monitor",
badge: { text: "v1.0.1", variant: "tip" },
},
{
label: "TypeScript Config",
link: "/projects/typescript-config",
badge: { text: "v4.0.0", variant: "tip" },
},
{
label: "Discord Analytics",
link: "/projects/discord-analytics",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Eclaire",
link: "/projects/eclaire",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "freeCodeCamp Review Generator",
link: "/projects/freecodecamp-review-generator",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Keiko",
link: "/projects/keiko",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Meeting Minutes",
link: "/projects/meeting-minutes",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Nomena",
link: "/projects/nomena",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Scripts",
link: "/projects/scripts",
badge: { text: "v1.0.0", variant: "tip" },
},
{
label: "Sylvara",
link: "/projects/sylvara",
badge: { text: "unreleased", variant: "danger" },
} }
].sort((a, b) => a.label.localeCompare(b.label)), ].sort((a, b) => a.label.localeCompare(b.label)),
}, },
{ {
label: "Staff Guidelines", label: "Staff Guidelines",
collapsed: true,
items: [ items: [
{ {
label: "Staff Handbook", label: "Staff Handbook",
@@ -334,6 +664,7 @@ export const navigation = [
}, },
{ {
label: "Additional Trainings", label: "Additional Trainings",
collapsed: true,
items: [ items: [
{ {
label: "Accessibility Coordination Training for Staff", label: "Accessibility Coordination Training for Staff",
@@ -386,23 +717,32 @@ export const navigation = [
{ {
label: "Technical Contributor Training for Staff", label: "Technical Contributor Training for Staff",
link: "/staff/training/technical-contributor", link: "/staff/training/technical-contributor",
} },
] ].sort((a, b) => a.label.localeCompare(b.label)),
}, },
{ {
label: "Staff Policy Self-Assessment", label: "Staff Policy Self-Assessment",
link: "/staff/policy-self-assessment", link: "/staff/policy-self-assessment",
} },
], ].sort((a, b) => a.label.localeCompare(b.label)),
}, },
{ {
label: "Miscellaneous Documents", label: "Miscellaneous Documents",
collapsed: true,
items: [ items: [
{ {
label: "Managing Local Music", label: "Managing Local Music",
link: "/misc/music", link: "/misc/music",
}, },
], {
label: "Templates",
link: "/misc/templates",
},
{
label: "AI Prompts",
link: "/misc/prompts",
}
].sort((a, b) => a.label.localeCompare(b.label)),
}, },
{ {
label: "Sitemap", label: "Sitemap",
+3 -7
View File
@@ -20,19 +20,15 @@ Upon successful enrolment, the Mentee receives the following benefits:
Participants will have access to private Discord channels exclusively for Mentees. These channels get priority response times from the NHCarrigan team. All participants must adhere to our [Code of Conduct](/community/coc). Participants will have access to private Discord channels exclusively for Mentees. These channels get priority response times from the NHCarrigan team. All participants must adhere to our [Code of Conduct](/community/coc).
### 2.3 Group Meetings ### 2.3 Flagship Project
If the Programme enrols five (5) or more participants within a given month, all Mentees will be invited to a weekly monthly group meeting. This meeting will provide opportunities for group discussions, shared experiences, and networking.
### 2.4 Flagship Project
Participants will gain maintainer-level access to a repository under our [Mentorship GitHub organisation](https://github.com/nhcarrigan-mentorship), which they will use to build their flagship project under the tutelage of our team. Participants will gain maintainer-level access to a repository under our [Mentorship GitHub organisation](https://github.com/nhcarrigan-mentorship), which they will use to build their flagship project under the tutelage of our team.
### 2.5 Career Prep and Resume Building ### 2.4 Career Prep and Resume Building
Participants will have the opportunity to build their resumes through an internship with NHCarrigan. This includes eligibility for project contributions and collaboration with the NHCarrigan team. Participants will have the opportunity to build their resumes through an internship with NHCarrigan. This includes eligibility for project contributions and collaboration with the NHCarrigan team.
### 2.6 Ongoing Support and Resources ### 2.5 Ongoing Support and Resources
Mentees will receive continuous resume reviews, personalized learning roadmaps, and dedicated guidance for the duration of their membership. Additional resources and Programme updates will be provided as part of this lifetime membership support. Mentees will receive continuous resume reviews, personalized learning roadmaps, and dedicated guidance for the duration of their membership. Additional resources and Programme updates will be provided as part of this lifetime membership support.
+1 -1
View File
@@ -616,7 +616,7 @@ Community Leaders possess both the authority and obligation to:
#### 10.3.2 Discretionary Enforcement #### 10.3.2 Discretionary Enforcement
While this Code provides comprehensive guidance, Community Leaders retain discretion to: While this Code provides comprehensive guidance, Community Leaders retain discretion to:
- Address situations not explicitly covered by written policies - Address situations not explicitly covered by written policies
- Apply contextual judgment in complex or unusual circumstances - Apply contextual judgement in complex or unusual circumstances
- Implement innovative solutions to emerging community challenges - Implement innovative solutions to emerging community challenges
- Prioritise community safety and well-being over rigid rule application - Prioritise community safety and well-being over rigid rule application
+35 -68
View File
@@ -24,8 +24,8 @@ In case of any discrepancy between this document and project-specific guidelines
All commits must be cryptographically signed using either GPG or SSH. This requirement serves to verify the authenticity and integrity of your contributions. All commits must be cryptographically signed using either GPG or SSH. This requirement serves to verify the authenticity and integrity of your contributions.
- For GPG signing, ensure your GPG key is associated with your GitHub or Codeberg account. - For GPG signing, ensure your GPG key is associated with your Github or NHCarrigan Git account.
- For SSH signing, use a key linked to your GitHub or Codeberg account. - For SSH signing, use a key linked to your Github or NHCarrigan Git account.
By signing your commit, you are certifying that: By signing your commit, you are certifying that:
@@ -95,76 +95,43 @@ To work with secrets locally, you must set up the 1Password CLI (Command Line In
## 3. Setting Up Your Development Environment ## 3. Setting Up Your Development Environment
### 3.1 Forking the Repository ### 3.1 Gaining a contributor account
1. Navigate to the original repository on Codeberg. 1. Navigate to our [contributor form](https://forms.nhcarrigan.com/form/c0_N5hb-VcmC2ClzaGOvDxVirMN_coiWG7eoPhDPsZ0).
2. Click the "Fork" button in the upper right corner of the page. 2. Fill out the web form.
3. Select your account as the destination for the fork. 3. Wait for Naomi to approve your account.
4. Wait for Codeberg to create a copy of the repository in your account.
### 3.2 Cloning Your Fork ### 3.2 Cloning A Project
1. Go to your forked repository on Codeberg. 1. Go to repository on NHCarrigan's Git instance.
2. Click the "Code" button and copy the URL (HTTPS or SSH, depending on your setup). 2. Click the "Code" button and copy the HTTPS URL.
3. Open your terminal or command prompt. 3. Open your terminal or command prompt.
4. Navigate to the directory where you want to store the project. 4. Navigate to the directory where you want to store the project.
5. Run the following command, replacing `<url>` with the URL you copied: 5. Run the following command, replacing `<url>` with the URL you copied:
``` ```bash
git clone <url> git clone <url>
``` ```
6. Enter your GitHub credentials if prompted. 6. Enter your Git credentials if prompted.
### 3.3 Setting Up the Upstream Remote ### 3.3 Keeping Your Clone Up-to-Date
Adding the original repository as an upstream remote allows you to easily keep your fork up-to-date. Regularly update your clone to incorporate changes from the upstream repository:
1. Change into the project directory: 1. Check out the main branch:
``` ```bash
cd <project-name>
```
2. Add the upstream remote:
```
git remote add upstream <original-repository-url>
```
Replace `<original-repository-url>` with the **git** URL of the original repository.
3. Verify the new remote:
```
git remote -v
```
You should see entries for both `origin` (your fork) and `upstream`.
### 3.4 Keeping Your Fork Up-to-Date
Regularly update your fork to incorporate changes from the upstream repository:
1. Fetch the branches and commits from the upstream repository:
```
git fetch upstream
```
2. Check out your fork's local main branch:
```
git checkout main git checkout main
``` ```
3. Merge changes from upstream/main into your local main branch: 2. Pull changes from upstream to your local clone:
``` ```bash
git merge upstream/main git pull
``` ```
### 3.5 Troubleshooting ### 3.4 Troubleshooting
If you encounter any issues during setup: If you encounter any issues during setup:
@@ -172,7 +139,7 @@ If you encounter any issues during setup:
2. Search for similar issues in the project's issue tracker. 2. Search for similar issues in the project's issue tracker.
3. If the problem persists, open a new issue with detailed information about the problem and steps to reproduce it. 3. If the problem persists, open a new issue with detailed information about the problem and steps to reproduce it.
You can also reach out to us on our forum: https://forum.nhcarrigan.com You can also reach out to us on our Discord: https://chat.nhcarrigan.com/
## 4. Claiming an Issue ## 4. Claiming an Issue
@@ -206,10 +173,10 @@ We encourage collaboration and pair programming on complex issues!
### 4.5 Working on the Issue ### 4.5 Working on the Issue
1. Once assigned, create a new branch in your fork for this specific issue. 1. Once assigned, create a new branch in the project for this specific issue.
2. Use a descriptive branch name, e.g., `fix/issue-123-button-alignment`. 2. Use a descriptive branch name, e.g., `fix/issue-123-button-alignment`.
3. Make your changes, committing regularly with clear, concise commit messages. 3. Make your changes, committing regularly with clear, concise commit messages.
4. Push your changes to your fork. 4. Push your changes to your branch.
5. Open a pull request when ready for review (see Pull Request Guidelines in section [X]). 5. Open a pull request when ready for review (see Pull Request Guidelines in section [X]).
### 4.6 Keeping the Community Updated ### 4.6 Keeping the Community Updated
@@ -245,16 +212,16 @@ Pay attention to issue labels for additional context:
## 5. Working on Your Issue ## 5. Working on Your Issue
### 5.1 Updating Your Fork ### 5.1 Updating Your Clone
Before starting work, ensure your forked version is up to date with the original repository. If you've set up the `upstream` remote as mentioned in Section 3, follow these steps: Before starting work, ensure your clone is up to date with the original repository.
1. Open your terminal and navigate to your project's root directory. 1. Open your terminal and navigate to your project's root directory.
2. Run the following commands: 2. Run the following commands:
```bash ```bash
git fetch upstream git checkout main
git merge upstream/main git pull
``` ```
### 5.2 Creating a New Branch ### 5.2 Creating a New Branch
@@ -282,7 +249,7 @@ Always create a new branch for your work:
1. Make your code changes, following the project's coding standards and guidelines. 1. Make your code changes, following the project's coding standards and guidelines.
2. Regularly commit your changes with clear, concise messages. 2. Regularly commit your changes with clear, concise messages.
3. Push your changes to your fork periodically: 3. Push your changes to your branch periodically:
```bash ```bash
git push origin <branchname> git push origin <branchname>
@@ -321,7 +288,7 @@ When you're ready to commit your changes:
Example: Example:
``` ```md
feat: add user authentication system feat: add user authentication system
Implement JWT-based authentication for API endpoints. Implement JWT-based authentication for API endpoints.
@@ -363,24 +330,24 @@ If you're unsure about any part of the process or need help, don't hesitate to a
### 6.1 Pushing Your Changes ### 6.1 Pushing Your Changes
1. Push your changes to your forked repository: 1. Push your changes to the repository:
```bash ```bash
git push -u origin <branchname> git push -u origin <branchname>
``` ```
- `-u` sets the upstream, linking your local branch to the remote branch - `-u` sets the upstream, linking your local branch to the remote branch
- `origin` specifies your forked repository as the destination - `origin` specifies the project repository as the destination
- `<branchname>` is the name of your local branch - `<branchname>` is the name of your local branch
2. Ensure the push is successful and your changes appear in your forked repository on Codeberg. 2. Ensure the push is successful and your changes appear in the repository on NHCarrigan's Git instance.
### 6.2 Creating the Pull Request ### 6.2 Creating the Pull Request
1. Navigate to your forked repository on Codeberg. 1. Navigate to the repository on NHCarrigan's Git instance.
2. You should see a prompt to create a pull request for your recently pushed branch. If not, click on the "Pull requests" tab and then the "New pull request" button. 2. You should see a prompt to create a pull request for your recently pushed branch. If not, click on the "Pull requests" tab and then the "New pull request" button.
3. Ensure the base repository is the original project repository and the base branch is `main`. 3. Ensure the base repository is the original project repository and the base branch is `main`.
4. Select your fork as the head repository and your recently pushed branch as the compare branch. 4. Select the project as the head repository and your recently pushed branch as the compare branch.
### 6.3 Filling Out the Pull Request ### 6.3 Filling Out the Pull Request
@@ -409,7 +376,7 @@ If you need to make changes to your pull request:
1. Make the required changes in your local branch. 1. Make the required changes in your local branch.
2. Commit the changes. 2. Commit the changes.
3. Push the new commits to your fork: 3. Push the new commits to your branch:
```bash ```bash
git push origin <branchname> git push origin <branchname>
@@ -427,7 +394,7 @@ If you need to make changes to your pull request:
### 6.8 Merging and Closing ### 6.8 Merging and Closing
- Once your pull request is approved, a maintainer will merge it into the main project. - Once your pull request is approved, a maintainer will merge it into the main project.
- After merging, you can delete your branch from your fork if you won't be using it anymore. - After merging, you can delete your branch from the repository if you won't be using it anymore.
- Celebrate your contribution to the project! - Celebrate your contribution to the project!
## 7. Pull Request Reviews ## 7. Pull Request Reviews
+1 -1
View File
@@ -1,5 +1,5 @@
--- ---
title: nhcarrigan Contributor Covenant title: Contributor Covenant
--- ---
Copyright (C) 2024 nhcarrigan and its contributors. Copyright (C) 2024 nhcarrigan and its contributors.
+2 -2
View File
@@ -1,5 +1,5 @@
--- ---
title: Labels title: "Issue/PR Labels"
--- ---
We use very specific labels to help categorise our issues. This page explains what each label means. We use very specific labels to help categorise our issues. This page explains what each label means.
@@ -52,7 +52,7 @@ Staff members working on these issues must adhere to all relevant confidentialit
### 1.4 Disclaimer ### 1.4 Disclaimer
Labels are assigned based on the project maintainers' best judgment but may not guarantee the exact level of difficulty or access requirements for every contributor. Contributors should use their discretion and communicate with project maintainers if they have any doubts about their ability to address an issue or comply with any associated legal requirements. Labels are assigned based on the project maintainers' best judgement but may not guarantee the exact level of difficulty or access requirements for every contributor. Contributors should use their discretion and communicate with project maintainers if they have any doubts about their ability to address an issue or comply with any associated legal requirements.
## 2. Aspect Labels ## 2. Aspect Labels
+1 -13
View File
@@ -6,19 +6,7 @@ hero:
tagline: tagline:
This site contains all of the documentation related to NHCarrigan, its Policies, and its Projects. This site contains all of the documentation related to NHCarrigan, its Policies, and its Projects.
actions: actions:
- text: Mission Statement - text: Let's Go!
link: /about/mission/ link: /about/mission/
variant: secondary variant: secondary
- text: Code of Conduct
link: /community/coc/
variant: secondary
- text: Contributing Guide
link: /dev/contributing/
variant: secondary
- text: Software License
link: /legal/license/
variant: secondary
- text: Contact Us
link: /about/contact/
variant: secondary
--- ---
@@ -184,7 +184,7 @@ This policy applies to all forms of support exchange within our community platfo
**What Peer Support IS:** **What Peer Support IS:**
- Sharing personal experiences and what has worked for you - Sharing personal experiences and what has worked for you
- Listening with empathy and without judgment - Listening with empathy and without judgement
- Providing resources and information from your own knowledge - Providing resources and information from your own knowledge
- Offering practical assistance within your capacity and expertise - Offering practical assistance within your capacity and expertise
- Being present and available when you can be - Being present and available when you can be
+1 -1
View File
@@ -426,7 +426,7 @@ Supplementing automated systems, we maintain manual review procedures including:
**(a)** **High-Risk Transactions**: Manual review of all high-risk transactions and relationships; **(a)** **High-Risk Transactions**: Manual review of all high-risk transactions and relationships;
**(b)** **Complex Cases**: Human review of complex compliance cases requiring judgment and analysis; **(b)** **Complex Cases**: Human review of complex compliance cases requiring judgement and analysis;
**(c)** **Exception Handling**: Manual processing of cases requiring special consideration or exceptions; **(c)** **Exception Handling**: Manual processing of cases requiring special consideration or exceptions;
+47
View File
@@ -0,0 +1,47 @@
---
title: 00. Frequently Asked Questions
---
This page outlines some of the frequently asked questions we see.
## Does the mentorship programme cost anything?
Nope! We offer this programme entirely for free. You *may* have to pay for things like hosting to deploy your app, but you will do that directly - we do not collect any tuition or academic fees.
That being said, if you would like to [donate so we can continue offering this free programme](https://donate.nhcarrigan.com/) we would greatly appreciate it!
## Why does Naomi take so long to respond?
We do our best to respond as quickly as possible. Please understand that Naomi does this completely for free, and works multiple paid jobs to cover her expenses.
As such, this means she is very busy and can be slow to respond. If we have not responded to you within 3 days, please feel free to ping us with a gentle reminder. Repeatedly pinging us with a greater frequency than every three days may result in sanctions.
Thank you for your patience and understanding.
## What if I change my mind?
You are welcome to leave the mentorship programme at any time! We are not going to hold you hostage, or charge you fines. We only ask that you let us know you wish to drop out and why, so we can track feedback and graduation rates.
We promise not to pressure you to stay, regardless of the reason you choose to drop out.
## I do not want to drop out, but I have a life situation going on...
Totally acceptable! We do not have activity requirements. If you need to take a break to address other circumstances, just let us know (so we don't ping you with reminders)!
## Will you kick us out at all?
Yes, but expulsion is done only under specific circumstances:
1. You completely ghost us - you have not communicated the need for a break, and are not responding to our messages. If you disappear for two weeks or more without informing us, we will have to remove you to make room for someone who is ready to commit.
2. You violate our [Code of Conduct](https://docs.nhcarrigan.com/community/coc/). Sorry, but our rules foster a safe and inclusive learning environment, and if you choose not to obey them we cannot have you in our community spaces.
3. You engage in malicious behaviour. If you intentionally push malware or viruses to your repository, or you design a project that actively harms people, we will not support that and you will be expelled.
## What if I have a question not covered here?
Ping us in #mentee-chat! We are always happy to answer questions!
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
@@ -0,0 +1,31 @@
---
title: 01. Onboarding
---
Once your application has been reviewed and accepted, you will receive an email confirmation. You MUST reply to this confirmation with your GitHub username.
:::caution
If you do not respond to the confirmation email with your GitHub username, we will not be able to complete your onboarding.
:::
## Discord
You will need to join our [Discord community](https://chat.nhcarrigan.com/). This is where the bulk of our planning, coaching, and conversation will happen.
When you join, ping Naomi in the general chat channel and request the mentorship role. She will grant you this role, which allows you to access the necessary channels.
## GitHub
:::caution
The repository we provide you is ONLY for your flagship project. You should NOT commit any other code, such as practise projects or leetcode solutions. This is the repository you will be listing on your resume for job applications, so you want it to be you at your best!
:::
You will receive an invite to a dedicated repository under this organisation to hold the code for your flagship project. You will need to accept this invite within 7 days, or it will expire.
You will have maintainer access to your repository, so you can configure various settings like workflows and branch protections. You will not have access to destructive settings.
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
@@ -0,0 +1,36 @@
---
title: 02. Goal Setting
---
After your onboarding is complete, you will need to begin your goal-setting. Create a thread in the #goal-setting forum on our Discord, and name it as follows:
```markdown
<full name> - Goals
```
In your initial post, you will want to outline the following information:
- The type of role you want for your career (e.g. full-stack dev, front-end dev, mobile dev, game dev)
- Your current learning state (what languages you know, what projects you have built)
- Your interests outside of coding (hobbies, passions, etc)
Our team will use this information as the starting point for your road map. We may ask some follow up questions.
## Road Map
To finalise your goal setting conversation, we will provide a 12-week road map to outline your learning and completion of your flagship project. We will ask for your confirmation of the road map.
Be sure to take the time to read it thoroughly, and assess whether it seems achievable, aligns with your goals for the programme, and incorporates your interests.
:::note
Plans must be solid, but reactions flexible.
:::
The 12-week road map is not set in stone - we will adapt to changes in your situation, timeline requirements, etc. It merely gives us the scaffolding we need to best guide your journey.
Once you sign off on the road map, we will be ready to move to the project planning stage.
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
@@ -0,0 +1,30 @@
---
title: 03. Project Planning
---
Once your goals are set, we will begin iterating on your flagship project. Create a post in the #project-plan forum channel, using the same naming convention:
```markdown
<full name> - Project Plan
```
In your post, you want to provide as much detail as you have about your project idea. If you do not have an idea yet, that is okay! Create your post with something like "I need help brainstorming a project idea". We will gladly work with you to find a project that furthers your goals and aligns with your interests.
Once your post is created, our team will work with you to flesh out and polish the idea into something refined and ready for work. You should end up with a project plan like:
```markdown
A life task tracker app thats open source and self-hosted as well as a live version hosted on my website with user auth and such. Could have kanban boards and different views and such, and have tasks that depend on other tasks just like on a github projects board.
Could also link rewards to tasks / projects. e.g. Car Maintenance project with sub tasks of cleaning car, changing oil, buying car charger for cig lighter port etc, and then could link to an item that you will buy for yourself as a reward for when the entire project is complete, and itll have a link to that item when you mark the project as complete
At the end I could sneak some gamification elements in as an opt-in thing where you can level up and such by completing tasks / projects/ completing life goals).
```
Our team will give the final sign-off on your project plan, and you will be ready to start writing user stories!
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
@@ -0,0 +1,27 @@
---
title: 04. User Stories
---
Creating user stories is a crucial step in planning your project. This helps you visualise and understand your application's requirements, broken down into digestible isolated chunks so you can maintain a smaller scope of work for each task.
Based on your project plan, you will want to create an *individual issue* on your GitHub repository for *each user story*. So, if you have 30 stories, you should have 30 issues.
## What is a user story?
A user story is an application requirement that is written from the perspective of an end user. Here are some examples:
- As an unauthenticated user, I can see a button to go through the login or registration flows.
- As an authenticated user, I can fill out a form to schedule an appointment and select from available dates and times listed on a calendar.
- As an administrator, I can review posts for their content and remove the ones that violate our policies.
## Why separate issues? Can I not use a single issue with a list?
Maintaining separate issues, or tickets, allows you to link each user story to a specific pull request. This is a common workflow, and ensures that your changes remain within the scope of a specific story.
Once you have your user stories all logged as individual issues, ping Naomi in the #mentee-chat for a final review. If we sign off on your issues, we will move into the technical breakdown step.
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
@@ -0,0 +1,98 @@
---
title: 05. Technical Breakdown
---
Once your user stories are complete, Naomi will audit them. She may have some feedback, but generally she will sign off on them by editing the issue to include this template:
```markdown
## 🎯 Acceptance Criteria
- [ ] Criteria 1 (clear, testable condition)
- [ ] Criteria 2
- [ ] Criteria 3
---
## ⚙️ Technical Details
- Proposed implementation approach:
- [ ] e.g., API endpoint, UI component, database schema changes
- Data considerations:
- [ ] Models, validation, storage needs
- Security/permissions:
- [ ] Any auth or role checks?
---
## 🔗 Dependencies
- [ ] Related tickets or features
- [ ] External services or APIs
- [ ] Libraries or frameworks required
---
## 🧪 Testing Notes
- [ ] Unit tests to cover…
- [ ] Integration tests to cover…
- [ ] Manual QA steps…
---
## 📂 Additional Context
- Links to designs, diagrams, or docs
- Any constraints or assumptions
- Open questions / things to clarify
```
This template is specifically designed to help you understand how to break down your user story into actionable components. Which means your next task is to fill it out!
Take your time and be as detailed as possible. Remember, the more planning you do now, the less factoring you need later.
## Example
Say I have a user story "As a user, I should be able to add a game to my library". I would **edit the issue body to fill in the template** like so:
```markdown
🎯 Acceptance Criteria
- [ ] User can add game to library
- [ ] User can remove game from library
---
⚙️ Technical Details
- Proposed implementation approach:
- [ ] POST /library
- [ ] DELETE /library
- Data considerations:
- [ ] User model must have library property
- [ ] Library property must be array with game IDs
- [ ] Each ID points to a Game model record
- Security/permissions:
- [ ] Validate JWT to ensure authenticated user is correct
- [ ] Authenticated user can only add games to their own library
---
🔗 Dependencies
- [ ] #2 - Authentication is required to edit my library
- [ ] #5 - Profile UI necessary to get to this view
---
🧪 Testing Notes
- [ ] POST and DELETE routes should be tested with mock data
- [ ] UI should be tested to ensure functionality
---
📂 Additional Context
- Relational data model means using Mongo might not be the best choice. Should we re-evaluate?
- Consider a GET route for displaying the library.
```
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
@@ -0,0 +1,45 @@
---
title: 06. Priority and Effort
---
Your next step is to apply labels to your user stories that indicate the priority and effort level. These labels have NOT been created for you, so you will need to create the labels for your repository - we are not enforcing a specific naming convention, so use the labels that best align with your organisational style.
There are two things you want to have labelled on each issue: priority and effort.
## Priority
Assigning priority to your user stories is probably not what you might expect. You are not using something like "this is more fun to work on, so higher priority", or "this does not excite me so I will de-prioritise it".
Instead, you will look solely at what is blocking/blocked by each issue. For example, consider these three user stories:
1. As an unauthenticated user, I should be able to create an account or sign in to my existing account
2. As an authenticated user, I should be able to customise my profile
3. As an authenticated user, I should be able to create a new post
4. As a user, I should be able to view someone's profile.
If we look at what is blocking what, user story 1 blocks stories 2 and 3! You cannot be an authenticated user if we do not provide a way to register and sign in.
So issue 1 would be a high priority, because it blocks work on 2 and 3. But 2 and 3 do not block each other, so we could consider them both a medium priority. Issue 4 is blocked by issue 2, because it makes no sense to allow the viewing of profiles if there are no profiles to customise! Following our logic, then, issue 4 would be a low priority.
Again, how you choose to "name" and assign priorities is up to you - the general idea is that you should be able to look at your priority labels and quickly determine what needs to be done next (because it is the highest priority).
## Effort
The next set of labels you need to apply involve determining the amount of effort required to complete the user story. Now, every organisation handles this differently. You may have heard of "story points" before, which are a way of indicating effort levels.
How you choose to label and quantify effort is up to you. For this example, we will use a points system. Given our existing user stories above, we might assign the following points:
1. Five points (building out an entire authentication flow is very complex).
2. Three points
3. Three points
4. One point (showing a static page is less complex).
The purpose of applying these labels is to help you plan out the timeline of work. For example, if you have three high-priority tasks, but only have a few hours free on a Friday afternoon, you might consider completing the lowest-effort task because you have restricted time.
Once your priority and effort labels are applied, ping Naomi in the #mentee-chat again to discuss your decisions and categorisation. After we approve your labels, you are finally ready to start working on actual code!
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
@@ -0,0 +1,37 @@
---
title: 07. Writing Code
---
You are finally ready to start writing some code... But wait! We still have a couple of things to consider.
## Branching Strategy
As is common when you are working on a team professionally, you are **not** able to push directly to your `main` branch. Instead, you are required to create a dedicated branch for your work and make a pull request to bring your changes back into `main`.
Each branch should be scoped to a *single* user story. This ensures that your pull requests remain in a manageable state and are not too massive to review.
## Pull Request Reviews
Every pull request will require a review from Naomi. This ensures that we have eyes on all of the work you do, and can be in lockstep with you as you ship new features. We will review your code as if you were in a professional setting - so we will look at best practises, code quality, feature completeness, etc.
Much like in a professional role, each pull request review will likely involve a bit of back-and-forth communication. Remember that this is a marathon, not a sprint, and every review comment we make is designed to help you learn and improve your skills.
## Next Steps
You will want to start by scaffolding your project - add any tooling structure (e.g. a `package.json` file for Node.js projects) and configuration (e.g. `black` for a Python project).
Then configure a CI file to run on every pull request to ensure things like your `lint`, `build`, and `test` steps all pass.
Setting all of this up NOW ensures that any code you write meets your quality requirements right out of the gate, and saves you from having to fix issues across dozens of files if you were to set up your tooling later.
## Yay! It is Coding Time!
You did it. You can start writing some actual code! Remember to work on a dedicated branch for each user story.
Commit early, commit often, push every time. The last thing you want to do is lose your hard work!
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
@@ -0,0 +1,37 @@
---
title: 08. Final Polish
---
When you feel like your flagship project has reached a state where you can proudly show it off on your resume, ping Naomi yet again in the #mentee-chat.
## Code Cleanup
At this point, we will go through your project with a fine-toothed comb, adding new issues as we identify things that need to be resolved.
You'll need to circle back and address those issues - and we will rinse and repeat this cycle until your project is polished up and ready to go.
## Documentation
Then, we'll coach you on how to write documentation for your product. You will need to establish the standard documentation files:
- A [README.md](http://readme.md/), which provides a high-level overview of your project
- [CONTRIBUTING.md](http://contributing.md/), which has the instructions for someone looking to come help work on your project
- [LICENSE.md](http://license.md/), which determines what people can and cannot do with your software
We will also determine an approach for in-depth end user documentation.
## Hosting!
Finally, you need a live version of your application! Our team will help you figure out the best way to deploy your app, and which hosting providers will fit your needs.
:::caution
You definitely want to consult with us BEFORE deploying your application, as we can provide guidance such as free hosting options, deployment pipelines, etc.
:::
We will also help you set up a domain to point to your live project, if you are interested - note that domains generally cost money. So does hosting. We'll do our best to find free options for you, but that's not always viable.
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
@@ -0,0 +1,31 @@
---
title: 09. Career Prep
---
Hurray! You made it! It is now time to start your job hunt in earnest! There are a few things we will do to help you get ready for this process.
## Resume Review
We will work with you to get a polished resume/CV ready to hand out to potential employers. And your resume will definitely include your flagship project!
## LinkedIn Prep
We will help you curate your LinkedIn profile to help you stand out and position you for success.
## Application Assistance
We will gladly help you refine your job search and application process. We cannot, and will not, complete job applications for you - but will totally help you figure out what to say.
## Mock Interviews
Once you start landing interviews, we will do some mock interviews to best prepare you to succeed in the real thing!
## JOB!!!!!
We will continue to do all of this, and refine and iterate on your flagship project, until we have reached the magical combo that gets you employed! 🎉
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
@@ -0,0 +1,23 @@
---
title: 10. Graduation
---
Our mentorship programme is very flexible. There are no set deadlines, no requirements you must complete to "finish the programme", etc.
Instead, we focus on one thing and one thing only: reaching your career goals. As such, once you land your dev job, you have completed the mentorship programme!
:::tip
It is entirely possible that you land a job before you even complete your flagship project. That repository is yours to keep forever, so you will be able to continue working on it as you like. But when you land your job, regardless of where you are at in your roadmap, you will have successfully graduated from our programme!
:::
While we will gladly provide continued coaching, advice, and recommendations, we *will* remove you from the official programme once you are hired. This allows us to open up space for the next generation of developers looking to find their success just like you did!
We do maintain an alumni programme. You will still have access to post in the mentorship channels, but not to get help with your own plan - instead, you'll be helping coach and guide others! Succeeding as a developer requires leadership skills, and our hope with the alumni programme is to give you the space to develop those skills.
You will also go on our public list of alumni!
:::tip[Helpful Links]
- [Apply to join](https://forms.nhcarrigan.com/form/gNv4NYZmdiMWpkUcnknII2yYCvnYNGAmabG5O5He9Mo)
- [Discord](https://chat.nhcarrigan.com/)
- [Donate](https://donate.nhcarrigan.com/)
:::
+1 -1
View File
@@ -1,5 +1,5 @@
--- ---
title: Downloading and Editing Music title: Managing Local Music
--- ---
This serves as our documentation for how we manage our local music libraries on Linux. This serves as our documentation for how we manage our local music libraries on Linux.
+95
View File
@@ -0,0 +1,95 @@
---
title: AI Prompts
---
Here are various prompts we use throughout our workflows.
## Documentation Generation Prompt
Open Claude Code in your project directory, then provide this prompt:
```md
Please go through the entire `src` directory and use the codebase to generate documentation for me, given the following template:
---
title: <app name>
---
<app name> (hereinafter the "Application") is <description>
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
```
## Comprehension Question Generation Prompt
We use this for some of our client work, but this is great for creating questions to quiz yourself on any document you've read.
````md
You must create three comprehension check questions for the lecture script the user provides. Do not include any other information. Format the response as a code block so the user can easily copy the syntax.
Here is the format:
```
### Question 1:
Which of the following is a key characteristic of relational databases?
**A.** Flexible schema
**B.** Document-based structure
**C.** Key-value pairs
**D.** Structured data in tables
Hint: Think about how data is organized in relational databases.
Answer: **D.** Structured data in tables
### Question 2:
Which of the following is a key characteristic of relational databases?
**A.** Flexible schema
**B.** Document-based structure
**C.** Key-value pairs
**D.** Structured data in tables
Hint: Think about how data is organized in relational databases.
Answer: **D.** Structured data in tables
### Question 3:
Which of the following is a key characteristic of relational databases?
**A.** Flexible schema
**B.** Document-based structure
**C.** Key-value pairs
**D.** Structured data in tables
Hint: Think about how data is organized in relational databases.
Answer: **D.** Structured data in tables
```
````
+216
View File
@@ -0,0 +1,216 @@
---
title: Templates
---
This page documents various templates we have found useful.
## DMCA Takedown
```md
To whom it may concern:
We are writing to notify you of the copyright infringement and unlawful use of our copyrighted material that appear on the service for which you are the designated agent.
The infringing material, which we contend belong to us, includes our original visual assets.
The infringing material appears at the following location(s):
<url>
The original material is available at the following location(s):
<url>
This letter is the official notification under Section 512(c) of the Digital Millennium Copyright Act of 1998 ("DMCA") and we request the immediate removal of the aforementioned infringing materials from your servers.
We also request that you immediately notify the infringer of this notice and inform them to cease any further posting of the infringing material to your server in the future.
We are providing this notice in good faith and with the reasonable belief that we are the copyright holder of the material, and that the use of the described material in the manner complained is not authorised by us, our agents, or the law.
We swear, under penalty of perjury, that the information in this notification is accurate and that we are the owner of the copyrighted material involved.
If you have any questions, please feel free to reach out to us.
```
## LinkedIn Cold Outreach Response
```md
I would be more than happy to chat! Please fill out my meeting form so we can start the scheduling process!
https://forms.nhcarrigan.com/form/uUKZiJSDm6847iDOlpZkD5QF7cAjoTbTm0F4T0EdW0I
```
## LinkedIn Post-Event Recommendation
```md
I had the absolute pleasure of working with [Participant's Name] during our [event name], where [they] consistently impressed me with [their] dedication, technical growth, and collaborative spirit.
From the start, [Participant's Name] dove into the challenge with enthusiasm, applying [their] skills in [tech stack] to build real, impactful solutions. Whether working independently or as part of a team, [they] brought thoughtful ideas, clear communication, and a passion for learning that elevated everyone around [them].
The value of [Participant's Name]'s contributions are immeasurable. Throughout the event, they [explain loads of goals here].
By the end of the [event name], [Participant's Name] had delivered an outstanding project: [project name or brief description]. More than the final product, what stood out was [their] journey—embracing feedback, overcoming obstacles, and supporting others along the way.
I wholeheartedly recommend [Participant's Name] for any opportunity in tech. [They] bring not just technical ability, but the kind of energy and curiosity that makes any team stronger.
```
## LinkedIn Mentorship Recommendation
```md
I had the privilege of mentoring [Mentee's Name] through my 1:1 mentorship programme, and from our very first session, it was clear that [they] approached learning with curiosity, determination, and an eagerness to grow.
Over the course of the programme, [Mentee's Name] set clear goals and worked diligently toward them—building both technical skills in [specific tech stack, tools, or concepts] and the professional confidence to apply those skills in real-world scenarios. [They] embraced feedback, sought out challenges, and consistently demonstrated the resilience needed to push past obstacles.
What impressed me most was [their] commitment to personal and professional growth—not just in terms of technical ability, but also in communication, collaboration, and problem-solving. By the end of the mentorship, [Mentee's Name] had successfully delivered [describe final project or achievement], showing not only technical proficiency but also the ability to think critically and adapt to new situations.
I am confident that [Mentee's Name] will continue to excel in their career. They bring the kind of focus, curiosity, and dedication that make them a valuable asset to any team, and I am proud to have played a part in their journey.
```
## Form Submission Declined Email
```md
Hello,
Thank you for your submission to our <form> form.
We appreciate your interest in working with us. However, at this time we are not able to accept your submission.
Please note that due to the large volume of form submissions we process, we are unable to provide personalised feedback. Here are some common submission issues we see:
1. Low-effort Submission: Please ensure you are taking the time to provide detailed, well-thought responses. The more effort you put in, the more likely we will be able to accept it.
2. Invalid Discord ID: Many of our submissions require you to provide your unique Discord ID - this is a 16 to 19 digit number that uniquely identifies your Discord account. If this is incorrect, we are unable to accept a submission. If you need help finding yours, please refer to https://dis.gd/findid
3. Concerning Responses: If your responses to any of the form questions raise red flags, we decline your submission. Remember that you want to paint yourself in the best light here.
We encourage you to take the time to consider these common points of failure, and would welcome a resubmission from you at any time.
If you have any questions, please reach out in our Discord community: https://chat.nhcarrigan.com
```
## Volunteer Application Rejection
```md
Dear [Applicants Name],
Thank you so much for taking the time to apply for a volunteer role with NHCarrigan. We truly appreciate your interest in contributing your time and energy to our community.
After carefully reviewing your application, weve decided not to move forward with your candidacy for this volunteer position. Please dont take this as a reflection of your value or potential—our selection process is highly competitive, and we often have to make very difficult decisions.
We still encourage you to stay engaged with our community spaces, events, and projects. There are always opportunities to connect, learn, and grow together, and we would love to see you continue to participate.
Thank you again for your interest and enthusiasm. We wish you the very best in all your endeavors and hope our paths cross again in the future.
Warm regards,
Naomi Carrigan
CEO, NHCarrigan
```
## Meeting Request Confirmation
```md
Hey <name>,
Thank you for reaching out to schedule a meeting! I am excited to connect with you and get to know who you are.
You may use this link to schedule a slot on my calendar: <linky>
It looks like we share the <CYC|fCC|both|neither> communities, so you may choose that as your meeting location if you wish.
OR
It does not look like we share any Discord communities, so you will need to select NHCarrigan Discord as your meeting location.
Please note that if you choose to meet in the NHCarrigan Discord, you will need to join our Discord community at https://chat.nhcarrigan.com in order to meet with us. When it is time for your scheduled meeting, you will need to join the "waiting-room" voice channel. We will drag you into our private voice chat when we are ready to chat with you.
If you have any questions, please do not hesitate to reach out to us.
```
## Mentorship Application Acceptance
```md
Hey <name>,
It is my pleasure to inform you that you have been selected to participate in our mentorship programme! We are excited to support you and watch you learn and grow!
In order to participate, you will need to join our Discord community at https://chat.nhcarrigan.com - then, ping Naomi in the general chat to request your mentorship role and access to the channels.
You will receive further instructions once you have been granted the role.
Keep an eye on the Discord community for announcements and opportunities to collaborate!
Congratulations again!
```
## Discord Bot Donation Copy
These go in the bot SKUs:
### Subscription Name
```
Sponsor Naomi
```
### Subscription Description
```
**How Your Support Makes a Difference**
1. Creating Free Software
- Develop open-source tools accessible to everyone
- Design Discord bots for community management and safe spaces
- Create learning resources and accessibility-focused web applications
2. Building Inclusive Communities
- Manage welcoming online spaces where diverse voices are celebrated
- Organize virtual events, workshops, and mentorship programs
- Implement inclusive community guidelines
3. Guiding Others in Tech
- Provide mentorship to aspiring technologists from underrepresented groups
- Create educational content (tutorials, blog posts, videos)
- Offer career advice and emotional support
4. Your Contribution's Ripple Effect:
- Challenges the status quo of the tech industry
- Creates opportunities for underrepresented individuals in STEM
- Fosters innovation through diverse perspectives
- Builds a tech community that reflects and serves all of society
Every donation, regardless of size, contributes to this mission. Together, we're creating a more inclusive, accessible, and diverse future for technology.
Thank you for considering a donation and being part of this important journey.
```
### Benefit Name
```
Your donation:
```
### Benefit Description
```
Helps a transfemme technology witch create free software, build inclusive communities, and guide others on their journey in tech.
```
### Notes
- Use my avatar for subscription
- Use pentatrans for benefit
## Discord Server Intro
```md
Hello~! I'm Naomi, a 34 year old transfem software engineer and community manager based in Washington. All of my work (and therefore most of my life) is spent online, so I'm always looking for new spaces and people to vibe with. Remote work can feel dreadfully isolating, and this is my attempt to combat that feeling.
<insert bit about community here>
```
## Guild Wars 2 Recruitment Ad
This has to be sent in two chat messages because of the length.
```
Hiya friends~! Naomi's Newbies is a new guild that is really focused on helping newer players come to love the game, and supporting casual players who have busy schedules.
```
```
We have no activity requirement, no rep requirement, a Discord community, and more! If you are interested, please whisper me and I will gladly invite you!
```
+892
View File
@@ -0,0 +1,892 @@
---
title: Artists4Palestine Bot
---
Artists4Palestine Bot (hereinafter the "Application") is a Discord bot designed to facilitate the Art for Palestine charity event. The Application serves as an automated bridge between Airtable, Trello, and Discord to manage art commission requests, artist assignments, delivery tracking, and support tickets for the charity event.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### 1.1 Getting Started
The Art for Palestine Bot is available on the [Art for Palestine Discord server](https://discord.gg/kHNyb6Vyf8). Once you join the server, you will automatically be assigned the member role and can begin interacting with the bot's features.
### 1.2 Requesting Art Commissions
Art commission requests are submitted through an Airtable form (external to Discord). Once submitted, your request will automatically appear in the designated commission channel where artists can view and claim it. Your request should include:
- Your name
- Preferred contact method (Email, Discord, or Twitter)
- Your contact handle/username
- Description of the art you would like drawn
- Reference images (optional)
- Any additional notes or requirements
### 1.3 Artist Features
#### 1.3.1 Claiming Art Commissions
As an artist, you can claim art commissions by reacting to commission posts in the art commission channel (ID: `1172568787330019340`).
**Important Notes:**
- You can only claim up to 2 commissions at a time
- Claiming a commission creates a private thread for coordination
- The thread will include your mention and the requester's information
#### 1.3.2 Submitting Completed Artwork
Once you've completed the artwork:
1. Post the completed artwork as an image attachment in the private thread
2. The bot will automatically forward your submission to the distribution channel
3. Your thread will be archived
4. The commission will be removed from your active count
#### 1.3.3 Art Reminders
The bot sends automated reminders to help manage workload:
- **Unclaimed Art Reminders**: Sent Monday, Wednesday, and Friday at 9:00 AM
- **Unfinished Art Reminders**: Sent Saturday at 9:00 AM
### 1.4 Distribution Features
#### 1.4.1 Claiming Distributions
Distribution team members can claim distribution tasks by reacting to posts in the distribution channel (ID: `1173061747737903315`). Similar to art commissions:
- Maximum 2 concurrent distributions per member
- Creates a private coordination thread
- Includes recipient and artwork details
#### 1.4.2 Confirming Deliveries
To confirm a distribution:
1. Deliver the artwork to the recipient
2. Post a confirmation image in the private thread
3. The bot will close and archive the thread
#### 1.4.3 Distribution Reminders
- **Unclaimed Distribution Reminders**: Sent Monday, Wednesday, and Friday at 9:00 AM
- **Unfinished Distribution Reminders**: Sent Saturday at 9:00 AM
### 1.5 Support Ticket System
#### 1.5.1 Opening a Ticket
Users can open support tickets using the ticket button in the designated ticket channel:
1. Click the "Open Ticket" button
2. Fill out the modal form with your issue description
3. A private thread will be created for your ticket
4. Support team members will be notified
#### 1.5.2 Ticket Workflow
- **For Users**: Describe your issue in the private thread and wait for a support team member to claim it
- **For Support Team**: Click "Claim Ticket" to add your mention and take responsibility for the issue
- Conversations in the ticket thread are automatically logged
#### 1.5.3 Closing Tickets
Support team members can close tickets using the "Close Ticket" button:
- A log file of the entire conversation will be generated
- The log is sent to the ticket archive channel
- The thread is closed and archived
### 1.6 Moderation Commands
Moderation team members with the support role (ID: `1173582640843063366`) have access to these commands:
#### `!mute <user_id> <duration> <reason>`
Temporarily timeout a user.
**Parameters:**
- `user_id`: The Discord user ID to mute
- `duration`: Duration with unit (e.g., `30m`, `2h`, `1d`)
- Supported units: `s` (seconds), `m` (minutes), `h` (hours), `d` (days)
- `reason`: Explanation for the timeout
**Example:**
```
!mute 123456789012345678 1h Spam in general channel
```
#### `!unmute <user_id> <reason>`
Remove a timeout from a user.
**Parameters:**
- `user_id`: The Discord user ID to unmute
- `reason`: Explanation for removing the timeout
**Example:**
```
!unmute 123456789012345678 Appeal accepted
```
### 1.7 Palestine News Updates
The bot automatically fetches and posts news updates from Al Jazeera's Palestine live blog:
- Updates are checked every 10 minutes
- New articles are posted to the news channel
- Prevents duplicate posts using article ID tracking
### 1.8 Getting Help
If you encounter issues or have questions:
- Open a support ticket in the Discord server
- Report bugs on [GitHub Issues](https://github.com/naomi-lgbt/nodejs-typescript-template/issues)
- Contact via the [chat server](http://chat.nhcarrigan.com) or email at `contact@nhcarrigan.com`
---
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### 2.1 Prerequisites
Before running your own instance, ensure you have:
- **Node.js**: Version 22 (specified in `package.json`)
- **pnpm**: Version 10 (package manager)
- **Discord Bot Account**: With a bot token and appropriate permissions
- **Airtable Account**: With API access
- **Discord Webhooks**: Multiple webhooks configured for different channels
### 2.2 Required Discord Permissions
Your Discord bot requires the following Gateway Intents:
- `GuildMessages`: Access to guild message events
- `Guilds`: Access to guild/server data
- `GuildMessageReactions`: Access to message reaction events
- `MessageContent`: Privileged intent for full message content access
- `GuildMembers`: Access to member data
### 2.3 Environment Configuration
Create a `.env` file in the project root with the following variables:
```env
# Discord Bot Configuration
TOKEN=your_discord_bot_token
# Discord Webhooks
DEBUG=https://discord.com/api/webhooks/... # Debug/error logging
COMM=https://discord.com/api/webhooks/... # Commission notifications
DIST=https://discord.com/api/webhooks/... # Distribution notifications
NEWS=https://discord.com/api/webhooks/... # Palestine news updates
TICKET=https://discord.com/api/webhooks/... # Ticket logs
# Airtable Configuration
AIRTABLE_KEY=your_airtable_api_key
AIRTABLE_BASE_ID=your_base_id
AIRTABLE_TABLE_ID=your_table_name
# Server Configuration (optional)
NODE_ENV=production # Set to enable HTTPS server on port 10443
```
### 2.4 Hardcoded Configuration
Several IDs are hardcoded in the `src/config/` directory and must be updated for your server:
**File: `src/config/Tickets.ts`**
- `guildId`: Your Discord server ID
- `supportRole`: Your support team role ID
**File: `src/config/Webhooks.ts`**
- `artChannelId`: Channel for art commission posts
- `distributionChannelId`: Channel for distribution posts
**File: `src/config/Trello.ts`**
- Trello board, list, and label IDs (if using Trello integration)
### 2.5 Installation
1. Clone the repository:
```bash
git clone https://github.com/naomi-lgbt/nodejs-typescript-template.git
cd nodejs-typescript-template
```
2. Install dependencies:
```bash
pnpm install
```
3. Configure environment variables (see section 2.3)
4. Build the TypeScript code:
```bash
pnpm build
```
### 2.6 Running the Bot
Start the bot in production mode:
```bash
pnpm start
```
This will:
- Load environment variables from `.env`
- Execute the compiled JavaScript from `prod/index.js`
- Connect to Discord
- Initialize event listeners and scheduled tasks
- Start the HTTP server on port 10080 (HTTP) or 10443 (HTTPS if `NODE_ENV=production`)
### 2.7 Development Workflow
For development and testing:
**Linting:**
```bash
pnpm lint
```
Runs ESLint and Prettier to check code style and formatting.
**Testing:**
```bash
pnpm test
```
Runs Mocha test suite with TypeScript support (timeout: 10 seconds).
**Building:**
```bash
pnpm build
```
Compiles TypeScript files from `src/` to JavaScript in `prod/`.
### 2.8 Architecture Overview
#### 2.8.1 Project Structure
```
a4p-bot/
├── src/
│ ├── index.ts # Main entry point, bot initialization
│ ├── config/ # Configuration files (channels, webhooks, Trello)
│ ├── events/ # Discord event handlers
│ ├── modules/ # Core business logic
│ │ ├── buttons/ # Button interaction handlers
│ │ ├── messages/ # Message processing logic
│ │ ├── modals/ # Modal form handlers
│ │ └── reminders/ # Scheduled reminder tasks
│ ├── interface/ # TypeScript interfaces and types
│ ├── server/ # Express HTTP server
│ └── utils/ # Utility functions
├── prod/ # Compiled JavaScript output
├── logs/ # Ticket conversation logs (runtime)
└── .env # Environment variables (not committed)
```
#### 2.8.2 Core Components
**Discord Bot (src/index.ts:1)**
- Initializes Discord.js client with required intents
- Registers event listeners for messages, reactions, interactions, and member joins
- Creates webhook clients for different notification types
- Starts HTTP server for monitoring
**Event Handlers (src/events/)**
- `onReady.ts:1`: Initializes scheduled jobs, caches messages, sends startup notification
- `onMessageCreate.ts:1`: Handles commands (!mute, !unmute) and ticket message logging
- `onInteractionCreate.ts:1`: Routes button clicks and modal submissions
- `onReactionAdd.ts:1`: Manages art commission and distribution claims
- `onMemberAdd.ts:1`: Auto-assigns member role to new joiners
**Scheduled Tasks (node-schedule)**
- Runs every 60 minutes: Check Airtable for new form submissions
- Runs every 10 minutes: Fetch and post Palestine news updates
- Monday/Wednesday/Friday 9 AM: Send unclaimed art and distribution reminders
- Saturday 9 AM: Send unfinished art and distribution reminders
**Ticket System (src/modules/)**
- `buttons/ticketOpen.ts:1`: Opens modal form for ticket creation
- `modals/handleTicketModal.ts:1`: Creates private thread and initializes log file
- `buttons/ticketClaim.ts:1`: Adds support member's mention to thread
- `buttons/ticketClose.ts:1`: Generates log file, sends to archive, closes thread
- `logTicketMessage.ts:1`: Appends messages to log file in real-time
- `generateLogs.ts:1`: Reads log file and creates Discord attachment
**Airtable Integration (src/modules/checkAirtableRecords.ts:1)**
- Polls Airtable API for new form submissions
- Tracks latest record ID to avoid duplicate processing
- Extracts form fields (name, contact info, request details, reference images)
- Posts formatted messages to commission channel via webhook
**News Feed (src/utils/getNewsFeed.ts:1)**
- Fetches latest articles from Al Jazeera Palestine live blog via GraphQL
- Tracks last posted article ID to prevent duplicates
- Sends new updates to news webhook channel
#### 2.8.3 Data Flow
```
User Action (Discord) → Event Listener → Event Handler → Module Logic
External API / Webhook Call
Response/Notification
Logging (Winston + Debug Webhook)
```
```
Scheduled Task → External API (Airtable/Al Jazeera) → Parse Response
Send to Discord Webhook
Update Cache/State
```
### 2.9 Database
While Prisma ORM is installed as a dependency, the Application does not currently use a database. All state is managed in memory using cache objects attached to the extended Discord client:
- `bot.ticketLogs`: Maps channel IDs to log file message IDs
- `bot.lastArticle`: Tracks the most recent news article ID
Ticket conversation logs are temporarily stored as text files in the `logs/` directory and deleted after being sent to the archive channel.
### 2.10 API Integrations
#### 2.10.1 Airtable REST API
**Endpoint:** `https://api.airtable.com/v0/{BASE_ID}/{TABLE_ID}`
**Method:** GET
**Headers:**
```
Authorization: Bearer {AIRTABLE_KEY}
```
**Query Parameters:**
- `maxRecords=100`: Limit results
- `sort[0][field]=Created`: Sort by creation time
- `sort[0][direction]=desc`: Newest first
**Response Structure (src/interface/AirtableResponse.ts:1):**
```typescript
{
records: [{
id: string;
createdTime: string;
fields: {
Name: string;
"Contact Method": "Email" | "Discord" | "Twitter";
Handle: string;
"What would you like us to draw?": string;
"Anything Else?": string;
Reference?: { url: string }[];
}
}]
}
```
#### 2.10.2 Al Jazeera GraphQL API
**Endpoint:** `https://www.aljazeera.com/graphql` (inferred from code)
**Operations:**
- `SingleLiveBlogChildrensQuery`: Fetch live blog structure
- `LiveBlogUpdateQuery`: Fetch latest blog updates
The bot extracts article content and posts to the news webhook channel.
### 2.11 HTTP Server
The Application includes a minimal Express server (src/server/serve.ts:1):
**Endpoints:**
- `GET /` - Returns HTML landing page with project information
**Ports:**
- HTTP: 10080 (default)
- HTTPS: 10443 (when `NODE_ENV=production`)
Note: The server file includes a TODO comment suggesting deletion after Trello integration is complete.
### 2.12 Logging
The Application uses Winston for structured logging (src/utils/logHandler.ts:1):
**Log Levels:**
- `info`: General information (bot startup, scheduled task execution)
- `error`: Error conditions (API failures, Discord errors)
**Log Format:**
```
[TIMESTAMP] LEVEL: MESSAGE
```
**Log Destinations:**
- Console (stdout)
- Debug webhook (errors only)
### 2.13 Error Handling
All errors are caught and:
1. Logged to console via Winston
2. Sent to the debug webhook with error details
3. Presented to users with friendly messages (when applicable)
Example error flow (src/modules/checkAirtableRecords.ts):
```typescript
try {
// API call
} catch (error) {
logHandler.error("Error message", error);
debugHook.send({ content: "Error details" });
}
```
### 2.14 Performance Considerations
- **Message Caching**: Fetches messages in batches of 100 to reduce API calls
- **Duplicate Prevention**: Tracks latest Airtable record ID and news article ID
- **Rate Limiting**:
- Airtable: 60-minute polling interval
- News API: 10-minute polling interval
- **Concurrent Limits**: Artists/distributors limited to 2 active tasks each
### 2.15 Security Considerations
- **Environment Variables**: Sensitive tokens stored in `.env` (not committed)
- **Role Verification**: Commands require support role for execution (src/events/onMessageCreate.ts:1)
- **Webhook Validation**: Checks webhook existence before use (src/utils/isValidWebhook.ts:1)
- **Privileged Intents**: Requires approval from Discord for `MessageContent` intent
### 2.16 Troubleshooting
**Bot doesn't start:**
- Verify `TOKEN` is valid in `.env`
- Check Node.js version is 22
- Ensure all dependencies are installed: `pnpm install`
**Webhooks not working:**
- Verify webhook URLs are valid and accessible
- Check webhook permissions in Discord channel settings
- Use `isValidWebhook` utility for validation
**Airtable integration failing:**
- Verify `AIRTABLE_KEY`, `AIRTABLE_BASE_ID`, and `AIRTABLE_TABLE_ID`
- Check Airtable API permissions
- Review Airtable API rate limits
**Scheduled tasks not running:**
- Check server timezone matches expected cron schedule
- Review `onReady.ts` for cron expression syntax
- Check debug webhook for error messages
**Ticket logs not saving:**
- Verify write permissions for `logs/` directory
- Check disk space availability
- Review console for Winston logging errors
---
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### 3.1 Terms of Service
The Application is subject to our global Terms of Service, which can be found at:
https://docs.nhcarrigan.com/#/terms
### 3.2 Privacy Policy
The Application's privacy practices are governed by our global Privacy Policy, which can be found at:
https://docs.nhcarrigan.com/#/privacy
#### 3.2.1 Data Collection
The Application collects and temporarily stores the following data:
**Discord Data:**
- User IDs (for role assignment, moderation, and ticket management)
- Message content in ticket threads (logged to text files)
- Reaction events (for tracking commission/distribution claims)
- Member join events (for auto-role assignment)
**Airtable Data:**
- Form submission data (name, contact method, handle, art request details)
- Reference images (URLs only)
- Submission timestamps and record IDs
**Temporary Storage:**
- Ticket conversation logs (stored as text files, deleted after archival)
- In-memory cache for article IDs and ticket log mappings
**Data Retention:**
- Ticket logs: Deleted immediately after being sent to the archive channel
- Cached data: Cleared on bot restart
- Airtable record IDs: Stored in memory to prevent duplicate processing
**Third-Party Services:**
The Application integrates with:
- Discord (message delivery and bot functionality)
- Airtable (form submission retrieval)
- Al Jazeera (public news feed)
- Trello (configuration only, no active integration)
Users should review the privacy policies of these services for their data handling practices.
### 3.3 License
This software is licensed under our global software license:
https://docs.nhcarrigan.com/#/license
**Copyright:** Held by Naomi Carrigan
**License Type:** Proprietary (see link above for full terms)
### 3.4 Code of Conduct
All contributors and users must adhere to our Code of Conduct:
See: `CODE_OF_CONDUCT.md` in the repository root
### 3.5 Security Policy
Security vulnerabilities should be reported according to our Security Policy:
See: `SECURITY.md` in the repository root
For security concerns, please contact us through:
- Chat Server: http://chat.nhcarrigan.com
- Email: contact@nhcarrigan.com
### 3.6 Disclaimer
The Application is provided for the specific purpose of facilitating the Art for Palestine charity event. While we strive for reliability and accuracy, the Application is provided "as-is" without warranties of any kind.
**Moderation Actions:** The Application includes moderation features (mute/unmute). Server administrators and support team members are responsible for using these features in accordance with Discord's Terms of Service and Community Guidelines.
**External Content:** The Application fetches and displays news content from Al Jazeera. We do not control or endorse this content and are not responsible for its accuracy or appropriateness.
**Charity Event:** This Application is specifically designed for the Art for Palestine charity event. For questions about the event itself, please visit https://art4palestine.org or contact the event organizers.
---
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### 4.1 Contributing Guidelines
Our complete contributing guidelines can be found at:
https://docs.nhcarrigan.com/#/contributing
### 4.2 Getting Started with Development
1. **Fork the Repository**
```bash
# Visit GitHub and fork the repository to your account
```
2. **Clone Your Fork**
```bash
git clone https://github.com/YOUR_USERNAME/nodejs-typescript-template.git
cd nodejs-typescript-template
```
3. **Install Dependencies**
```bash
pnpm install
```
4. **Set Up Environment**
- Create a `.env` file (see section 2.3)
- Create a test Discord server and bot
- Configure test webhooks
5. **Create a Branch**
```bash
git checkout -b feature/your-feature-name
```
### 4.3 Code Style and Standards
The project enforces code style through automated tooling:
**ESLint Configuration:**
- Extends `@nhcarrigan/eslint-config`
- Maximum warnings allowed: 0 (all warnings treated as errors)
- Checks both `src/` and `test/` directories
**Prettier Configuration:**
- Extends `@nhcarrigan/prettier-config`
- Enforces consistent formatting
**TypeScript Configuration:**
- Extends `@nhcarrigan/typescript-config`
- Strict type checking enabled
- Root directory: `./src`
- Output directory: `./prod`
**Running Linters:**
```bash
pnpm lint
```
**Auto-Fixing Issues:**
```bash
# Fix ESLint issues
npx eslint src test --fix
# Fix Prettier issues
npx prettier src test --write
```
### 4.4 Writing Tests
The project uses Mocha and Chai for testing:
**Test Structure:**
- Test files: `test/**/*.spec.ts`
- Test style: TDD (Test-Driven Development)
- Timeout: 10 seconds per test
- Type: TypeScript (via ts-mocha)
**Running Tests:**
```bash
pnpm test
```
**Writing a Test:**
```typescript
import { expect } from "chai";
import { suite, test } from "mocha";
suite("Feature Name", () => {
test("should do something", () => {
// Arrange
const input = "test";
// Act
const result = myFunction(input);
// Assert
expect(result).to.equal("expected");
});
});
```
### 4.5 Documentation Standards
**JSDoc Comments:**
All functions, classes, and complex logic should include JSDoc comments:
```typescript
/**
* Brief description of the function.
*
* @param {Type} paramName - Parameter description
* @returns {Type} Return value description
*/
function myFunction(paramName: Type): Type {
// Implementation
}
```
**Inline Comments:**
Use inline comments for complex logic:
```typescript
// Explanation of why this approach is used
const result = complexOperation();
```
**Commit Messages:**
Follow conventional commit format:
- `feat: Add new feature`
- `fix: Resolve bug in ticket system`
- `docs: Update README`
- `chore: Update dependencies`
- `refactor: Restructure event handlers`
- `test: Add tests for webhook validation`
### 4.6 Pull Request Process
1. **Ensure All Checks Pass:**
- Run `pnpm lint` (must pass with 0 warnings)
- Run `pnpm test` (all tests must pass)
- Run `pnpm build` (must compile without errors)
2. **Create Pull Request:**
- Use a descriptive title
- Provide detailed description of changes
- Reference any related issues
- Include screenshots/videos for UI changes
3. **Code Review:**
- Address reviewer feedback
- Make requested changes
- Re-request review after updates
4. **Merge:**
- Maintainers will merge approved PRs
- Squash and merge is preferred for clean history
### 4.7 Areas for Contribution
The project welcomes contributions in these areas:
**Feature Enhancements:**
- Trello integration completion (see TODO in `src/server/serve.ts`)
- Database integration using Prisma (currently installed but unused)
- Additional moderation commands
- Enhanced reporting and analytics
**Bug Fixes:**
- Report bugs via GitHub Issues
- Include reproduction steps and environment details
- PRs to fix bugs are highly appreciated
**Documentation:**
- Improve code comments
- Expand user guides
- Add troubleshooting sections
- Create video tutorials
**Testing:**
- Increase test coverage
- Add integration tests
- Create test utilities
**Performance:**
- Optimize message caching
- Reduce webhook API calls
- Improve scheduled task efficiency
### 4.8 Development Environment Setup
**Recommended Tools:**
- **Editor:** VS Code (or any TypeScript-compatible editor)
- **Extensions:**
- ESLint
- Prettier
- TypeScript and JavaScript Language Features
- **Node Version Manager:** nvm (for managing Node.js versions)
- **Package Manager:** pnpm 10
**Discord Developer Portal Setup:**
1. Create a new application at https://discord.com/developers/applications
2. Create a bot user
3. Enable required privileged intents: `Message Content`, `Server Members`
4. Generate and save bot token
5. Invite bot to test server with required permissions
**Webhook Setup:**
1. Create test channels in your Discord server
2. Go to channel settings → Integrations → Webhooks
3. Create webhooks for: debug, comm, dist, news, ticket
4. Copy webhook URLs to `.env`
### 4.9 Debugging
**Console Logging:**
The project uses Winston for logging. To add debug logs:
```typescript
import { logHandler } from "./utils/logHandler.js";
logHandler.info("Informational message");
logHandler.error("Error message", error);
```
**Discord Debug Webhook:**
Error details are automatically sent to the debug webhook. Check this channel for runtime errors.
**VS Code Launch Configuration:**
Create `.vscode/launch.json`:
```json
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug Bot",
"runtimeArgs": ["-r", "dotenv/config"],
"program": "${workspaceFolder}/prod/index.js",
"preLaunchTask": "npm: build",
"outFiles": ["${workspaceFolder}/prod/**/*.js"]
}
]
}
```
### 4.10 Common Development Tasks
**Adding a New Command:**
1. Add handler logic to `src/events/onMessageCreate.ts`
2. Implement command functionality in `src/modules/`
3. Update user documentation (section 1)
4. Add tests in `test/`
**Adding a New Button:**
1. Create button handler in `src/modules/buttons/`
2. Export handler in button module
3. Register handler in `src/events/onInteractionCreate.ts`
4. Update user documentation
**Adding a New Event Listener:**
1. Create event handler in `src/events/`
2. Register listener in `src/index.ts`
3. Add error handling
4. Update technical documentation
**Modifying Configuration:**
1. Update relevant file in `src/config/`
2. Document changes in section 2.4
3. Update environment variable documentation if needed
### 4.11 Release Process
(For maintainers)
1. **Version Bump:**
- Update version in `package.json`
- Follow semantic versioning (MAJOR.MINOR.PATCH)
2. **Changelog:**
- Document all changes since last release
- Include breaking changes, features, and bug fixes
3. **Testing:**
- Run full test suite
- Test in staging environment
- Verify all integrations work
4. **Deployment:**
- Build production bundle: `pnpm build`
- Deploy to production server
- Monitor logs for issues
5. **Tag Release:**
```bash
git tag -a v2.0.0 -m "Release version 2.0.0"
git push origin v2.0.0
```
### 4.12 Contact for Contributors
If you have questions about contributing:
- **GitHub Issues:** https://github.com/naomi-lgbt/nodejs-typescript-template/issues
- **Chat Server:** http://chat.nhcarrigan.com
- **Email:** contact@nhcarrigan.com
We review pull requests as soon as possible and appreciate all contributions to the project.
---
**Document Version:** 1.0.0
**Last Updated:** 2025-10-29
**Maintained By:** Naomi Carrigan
+38
View File
@@ -0,0 +1,38 @@
---
title: Aeris
---
Aeris (hereinafter the "Application") is an authentication service featuring magic links and support for multiple social media platforms
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Alouette
---
Alouette (hereinafter the "Application") is a web server that allows you to set up arbitrary webhooks and format them to post on Discord.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+441
View File
@@ -0,0 +1,441 @@
---
title: Amari
---
Amari (hereinafter the "Application") is Naomi's Virtual Personal Assistant on Discord, designed to automate community management, content aggregation, mentorship program coordination, and integration with external services such as GitHub, RetroAchievements, and Baserow.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### 1.1 Interacting with Amari
#### 1.1.1 Direct Messages
When you send a Direct Message to Amari, the bot will automatically forward your message to Naomi and respond with an acknowledgment. This provides a direct communication channel to reach Naomi through the bot.
Implementation: `src/modules/respondToDm.ts:19`
#### 1.1.2 Mentions
Amari monitors messages in the Discord server for mentions of "Naomi" or "@NHCarrigan" (user or role). When detected, the bot forwards the message to Naomi for review, helping ensure important messages are not missed. To prevent spam, Amari will not forward mentions from channels that have been active in the last 10 minutes.
Implementation: `src/modules/respondToMention.ts:20`
### 1.2 Mentorship Program
#### 1.2.1 Joining the Program
When you receive the Mentorship role, Amari will automatically send a welcome message in the mentee chat channel with onboarding instructions, including:
- Accepting the GitHub repository invitation
- Reading the mentorship wiki
- Creating your initial goal post
Implementation: `src/modules/processMentorshipRole.ts:20`
#### 1.2.2 Forum Thread Management
Amari automatically manages thread tags in mentorship forums (Goals, Projects, Resume Reviews, and Discussions) to track whose turn it is to respond:
- When Naomi responds to your thread, the tag changes to "Waiting on Member"
- When you respond, the tag changes to "Waiting on Naomi"
Implementation: `src/modules/updateMentorshipThread.ts:43`
#### 1.2.3 Progress Reminders
Every weekday (Monday-Friday) at 9:00 AM, Amari posts progress reminders in configured channels. These reminders prompt you to share:
1. What you accomplished yesterday
2. What you're working on today
3. Any blockers or issues you need help with
Implementation: `src/modules/postProgressReminders.ts:16`
### 1.3 Content and News
#### 1.3.1 Tech News Feed
Amari automatically posts new articles from two sources every hour:
- **FreeCodeCamp News**: Articles are filtered for inappropriate content before posting
- **Hacker News**: Latest posts with comment links
Implementation: `src/modules/postNews.ts:40` and `src/modules/postNews.ts:95`
#### 1.3.2 RetroAchievements
If Naomi unlocks any RetroAchievements, Amari posts them to the gaming channel every 10 minutes. These posts include:
- Achievement title and description
- Game title and console
- Point value
- Badge images
Implementation: `src/modules/checkAchievements.ts:87`
### 1.4 Form Submissions
When you submit a form through the Baserow system, Amari posts a notification to the form submissions channel. Supported forms include:
- Sanction Appeals
- Commission Requests
- Contact Requests
- Event Requests
- Meeting Requests
- Mentorship Requests
- Staff Applications
- Testimonials
- ASCII Submissions
- Contributor Applications
- Guild Wars Officer/Leader Applications
- Product and Community Feedback
- Community Nominations
Implementation: `src/modules/processFormSubmission.ts:22` and `src/config/forms.ts:9`
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### 2.1 Prerequisites
- Node.js (compatible with the version specified in package.json)
- pnpm 10.15.0 or higher
- A Discord Bot Token
- GitHub App credentials (Client ID and Private Key)
- RetroAchievements API Key (optional, for achievements feature)
- Baserow webhook secret (optional, for form submissions)
### 2.2 Environment Variables
The following environment variables must be configured:
| Variable | Required | Description |
|----------|----------|-------------|
| `BOT_TOKEN` | Yes | Discord bot token |
| `GH_CLIENT_ID` | Yes | GitHub App client ID |
| `GH_PRIVATE_KEY` | Yes | GitHub App private key (with newlines as `\\n`) |
| `GH_WEBHOOK_SECRET` | No | Secret for validating GitHub webhook payloads |
| `RA_KEY` | No | RetroAchievements API key |
| `BASEROW_SECRET` | No | Secret for validating Baserow webhook payloads |
### 2.3 Installation
1. Clone the repository
2. Install dependencies:
```bash
pnpm install
```
3. Build the TypeScript code:
```bash
pnpm run build
```
4. Configure environment variables (see section 2.2)
5. Start the application:
```bash
pnpm start
```
Implementation: `src/index.ts:1`
### 2.4 Configuration
#### 2.4.1 Discord IDs
All Discord-specific IDs (channels, roles, users, guilds, tags) are configured in `src/config/ids.ts`. You will need to update these IDs to match your Discord server setup:
- **Channels**: Form submissions, gaming, general, mentee chat, forums, news
- **Roles**: Mentorship, nhcarrigan, representing
- **Users**: Amari (bot), Naomi, nhcarrigan
- **Tags**: Forum tags for tracking thread status
Implementation: `src/config/ids.ts:7`
#### 2.4.2 Form IDs
Form submission notifications are configured in `src/config/forms.ts`. Map Baserow table IDs to human-readable form names.
Implementation: `src/config/forms.ts:9`
#### 2.4.3 Progress Reminders
Progress reminder channels are configured in `src/config/progressReminders.ts`. Configure which channels should receive reminders, associated role IDs, and whether to create threads.
Implementation: `src/config/progressReminders.ts:1`
#### 2.4.4 DM Response
The automatic response sent when users DM the bot is configured in `src/config/responses.ts`.
Implementation: `src/config/responses.ts:1`
### 2.5 Architecture
#### 2.5.1 Core Components
The Application consists of several key components:
1. **Discord Bot** (`discord.js`): Handles all Discord interactions
2. **GitHub Integration** (`octokit`): Manages GitHub webhooks and API interactions
3. **Web Server** (`fastify`): Receives webhooks and serves health monitoring page
4. **Scheduled Jobs** (`node-schedule`): Executes periodic tasks (news, reminders, etc.)
5. **Analytics** (`@nhcarrigan/discord-analytics`): Tracks bot usage metrics
Main entry point: `src/index.ts:1`
#### 2.5.2 Event Handlers
The bot responds to the following Discord events:
- `ClientReady`: Initialize scheduled jobs and cache data (src/index.ts:65)
- `MessageCreate`: Handle guild messages and DMs (src/index.ts:89)
- `InteractionCreate`: Handle button interactions (src/index.ts:97)
- `UserUpdate`: Process guild tag changes (src/index.ts:117)
- `GuildMemberUpdate`: Process mentorship role assignments (src/index.ts:121)
- `GuildMemberAdd`: Log when mentees join (src/index.ts:125)
- `GuildMemberRemove`: Log when mentees leave (src/index.ts:129)
#### 2.5.3 Scheduled Tasks
The following tasks run on a schedule:
- **Hourly** (0 * * * *): Post news from FreeCodeCamp and Hacker News
- **Daily at Midnight** (0 0 * * *): Audit and cache guild tags
- **Weekdays at 9 AM** (0 9 * * 1-5): Post progress reminders
- **Every 10 minutes** (interval): Check RetroAchievements and clear recently active channels
Implementation: `src/index.ts:70-86`
#### 2.5.4 Web Server Endpoints
The Fastify web server provides the following endpoints:
- `GET /`: Health monitoring page with bot information
- `POST /github`: Webhook endpoint for GitHub events (issues, pull requests)
- `POST /form`: Webhook endpoint for Baserow form submissions
The server listens on port 7044.
Implementation: `src/server/serve.ts:61`
### 2.6 Content Filtering
FreeCodeCamp News posts are filtered for inappropriate content using a comprehensive regular expression that detects violations of the Code of Conduct. The regex is defined in `src/modules/postNews.ts:23` and checks for:
- Harassment, bullying, and discrimination
- Hate speech and slurs
- Explicit, violent, or illegal content
- Spam, scams, and fraud
- Drug-related content
- Violence and illegal activities
Posts matching these patterns are automatically rejected and not posted to Discord.
### 2.7 GitHub Integration
When GitHub webhooks are received:
1. **New Issues** (`opened` action): Amari automatically assigns Naomi to the issue
2. **New Pull Requests** (`opened` action): Amari automatically requests Naomi as a reviewer
Implementation: `src/modules/processGitHubEvent.ts:31`
### 2.8 Development
#### 2.8.1 Available Scripts
- `pnpm run build`: Compile TypeScript to JavaScript
- `pnpm start`: Start the production server (uses 1Password for environment variables)
- `pnpm run lint`: Run ESLint with zero warnings policy
- `pnpm test`: Run tests (currently placeholder)
#### 2.8.2 Code Structure
```
src/
├── config/ # Configuration files (IDs, forms, responses, reminders)
├── events/ # Discord event handlers
├── interfaces/ # TypeScript interfaces
├── modules/ # Core functionality modules
├── server/ # Fastify web server
├── utils/ # Utility functions
└── index.ts # Application entry point
```
#### 2.8.3 Dependencies
Key dependencies:
- `discord.js` v14.22.0: Discord API wrapper
- `fastify` v5.5.0: Web server framework
- `octokit` v5.0.3: GitHub API client
- `node-schedule` v2.1.1: Cron job scheduler
- `rss-parser` v3.13.0: RSS feed parser
- `@retroachievements/api` v2.6.0: RetroAchievements API client
- `@nhcarrigan/discord-analytics` v0.0.6: Analytics tracking
- `@nhcarrigan/logger` v1.1.1: Logging utility
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### 3.1 License
This software is licensed under Naomi's Public License. The full license text is available in the `LICENSE.md` file in the repository root.
Copyright held by Naomi Carrigan.
### 3.2 Code of Conduct
All users interacting with the Application, whether through Discord or by contributing to the codebase, must adhere to the Code of Conduct defined in `CODE_OF_CONDUCT.md`.
### 3.3 Content Filtering
The Application implements automated content filtering for RSS feeds to ensure posted content complies with the community's Code of Conduct. While this filtering attempts to catch policy violations, it may not be perfect. Users should report any inappropriate content that bypasses the filters.
### 3.4 Data Collection
The Application collects the following data for operational purposes:
- Discord user IDs and message content (forwarded to Naomi for mentions/DMs)
- GitHub usernames (for webhook processing)
- Form submission data (row IDs and table identifiers)
- Analytics metrics (event counts and associated metadata)
All data is processed in accordance with Naomi's privacy policies.
### 3.5 Third-Party Services
The Application integrates with several third-party services:
- **Discord**: Communication platform (Terms of Service apply)
- **GitHub**: Code hosting and webhook integration (Terms of Service apply)
- **RetroAchievements**: Gaming achievement tracking (Terms of Service apply)
- **Baserow**: Form submission processing (Terms of Service apply)
Users of the Application are subject to the terms of service of these platforms.
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### 4.1 Getting Started
Before contributing, please:
1. Read the `CONTRIBUTING.md` file for contribution guidelines
2. Review the `CODE_OF_CONDUCT.md` to understand community standards
3. Familiarize yourself with the codebase structure (see section 2.8.2)
### 4.2 Development Setup
1. Fork the repository
2. Clone your fork locally
3. Install dependencies: `pnpm install`
4. Create a feature branch: `git checkout -b feature/your-feature-name`
5. Make your changes
6. Run linting: `pnpm run lint`
7. Build the project: `pnpm run build`
8. Test your changes with a local instance
### 4.3 Code Standards
The project enforces the following standards:
- **TypeScript**: All code must be written in TypeScript
- **ESLint**: Code must pass linting with zero warnings (`@nhcarrigan/eslint-config`)
- **TypeScript Config**: Uses `@nhcarrigan/typescript-config`
- **File Headers**: All files must include copyright header with license and author information
Example header:
```typescript
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
```
### 4.4 Module Guidelines
When creating or modifying modules:
1. **Single Responsibility**: Each module should handle one specific feature
2. **Error Handling**: Use try-catch blocks and log errors with the logger utility
3. **Type Safety**: Define interfaces for all data structures
4. **Documentation**: Include JSDoc comments for all exported functions
5. **Testing**: Consider how your changes can be tested (when tests are implemented)
### 4.5 Adding New Features
When adding new features:
1. **Configuration**: Add any new IDs or configuration to appropriate config files
2. **Interfaces**: Define TypeScript interfaces in the `src/interfaces/` directory
3. **Modules**: Create new modules in `src/modules/` for self-contained functionality
4. **Events**: Add event handlers in `src/events/` if needed
5. **Server Routes**: Add new endpoints in `src/server/serve.ts` if needed
6. **Documentation**: Update this documentation file to reflect new features
### 4.6 Submitting Changes
1. Commit your changes with descriptive commit messages
2. Push to your fork
3. Create a Pull Request to the main repository
4. Amari will automatically request Naomi as a reviewer
5. Address any review feedback
6. Once approved, your changes will be merged
### 4.7 Key Files for Contributors
- `src/index.ts`: Main application entry point
- `src/config/ids.ts`: Discord server IDs configuration
- `src/interfaces/amari.ts`: Core application state interface
- `src/server/serve.ts`: Web server and webhook handlers
- `src/modules/`: Individual feature implementations
- `package.json`: Dependencies and scripts
### 4.8 Common Tasks
#### Adding a New Form Type
1. Add the table ID and name to `src/config/forms.ts`
2. The form notification will automatically work via `src/modules/processFormSubmission.ts`
#### Adding a New Scheduled Task
1. Add the schedule in `src/index.ts` within the `ClientReady` event handler
2. Use `node-schedule` cron syntax
3. Create a new module in `src/modules/` for the task logic
#### Adding a New Discord Event Handler
1. Create a handler module in `src/modules/` or `src/events/`
2. Register the event listener in `src/index.ts`
3. Use the `Amari` interface for accessing bot state
#### Modifying Webhook Endpoints
1. Update the route handler in `src/server/serve.ts`
2. Define interfaces for payloads in `src/interfaces/`
3. Ensure proper authentication checking with secrets
### 4.9 Support and Questions
If you have questions about contributing:
- Open a GitHub issue for bugs or feature requests
- Join the Discord server at https://chat.nhcarrigan.com for discussions
- Email contact@nhcarrigan.com for private inquiries
### 4.10 Analytics and Logging
The Application uses custom logging and analytics:
- **Logger**: Use `logger.log()`, `logger.error()`, `logger.metric()` from `src/utils/logger.ts`
- **Metrics**: Log user actions with `logger.metric()` for analytics tracking
- **Error Handling**: Always catch and log errors to help with debugging
Example:
```typescript
await logger.metric("processed_event", 1, { user: userId });
await logger.error("module name", error);
```
+38
View File
@@ -0,0 +1,38 @@
---
title: Amirei
---
Amirei (hereinafter the "Application") is a quick social link aggregator for 'link in bio' pages.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Aurelia
---
Aurelia (hereinafter the "Application") is a blogging platform with markdown editor
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Aureline
---
Aureline (hereinafter the "Application") is a web app that allows you to create/upload digital badges and certifications and grant them to users
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
@@ -0,0 +1,95 @@
---
title: "Beccalia: Origins"
---
Beccalia: Origins (hereinafter the "Game") is originally planned as the story of Becca and Rosalia growing up, this game was only released as a demo.
## 1. Player Documentation
This section is for players who are exploring or playing the Game.
### Controls
- **Keyboard / Gamepad:**
- Arrow keys / D-Pad: Move character
- Z / Enter / A: Confirm / Interact
- X / Esc / B: Cancel / Menu
- C / Space / Y: Open menu (if applicable)
- Shift / L / R: Dash (if enabled)
- **Touch UI (Mobile / Tablet):**
- Tap to move or interact
- On-screen buttons for menu and actions
### Troubleshooting
- Ensure your device meets RPG Maker MZ requirements.
- If the game crashes, try restarting the app or clearing temporary files.
- Ask us on discord if persistent issues occur.
---
## 2. Developer Documentation
This section is for those interested in running, modifying, or extending the Game.
### Engine & Dependencies
- **Engine:** RPG Maker MZ
- **Plugins Used:** none
- **Assets:** All original
### Setup Instructions
1. Open RPG Maker MZ.
2. Load the project folder `beccalia-origins`.
3. Use the "Playtest" button to run the Game locally.
4. To export, use the "Deployment" feature for target platforms.
### Directory Structure
- `data/` — database files (maps, events, actors, items, skills, etc.)
- `img/` — graphics (characters, tilesets, animations, pictures, etc.)
- `audio/` — music and sound effects
- `js/` — plugins and core scripts
- `www/` — exported HTML5 build (if deployed for web)
---
## 3. Legal Documentation
This section expands on legal or licensing information specific to the Game.
### Licensing
This Game is created using RPG Maker MZ. The game code and original content are the property of NHCarrigan. RPG Maker MZ runtime assets are licensed under the terms provided by KADOKAWA Corporation. All original graphics, music, and story content belong to NHCarrigan and are protected by copyright.
### Third-Party Notices
- Any third-party assets, music, or plugins included are credited in game.
## 4. Contributing Documentation
This section is for contributors or collaborators on the Game.
### How to Contribute
- Fork or copy the project folder.
- Submit patches or mods via Git.
- Include a changelog and clear notes on modifications.
### Coding Standards
- Plugins in `js/plugins/` should follow standard JS conventions.
- Comment custom scripts clearly for readability.
### Art & Audio Guidelines
- Maintain original resolutions where possible (48x48 tiles, etc.).
- Use consistent naming for files in `img/` and `audio/`.
### Contact
- For collaboration or questions, ask us on discord.
@@ -0,0 +1,95 @@
---
title: "Beccalia: Prologue"
---
Beccalia: Prologue (hereinafter the "Game") is an introductory story that sets the stage for the Beccalia universe, featuring Becca and Rosalia.
## 1. Player Documentation
This section is for players who are exploring or playing the Game.
### Controls
- **Keyboard / Gamepad:**
- Arrow keys / D-Pad: Move character
- Z / Enter / A: Confirm / Interact
- X / Esc / B: Cancel / Menu
- C / Space / Y: Open menu (if applicable)
- Shift / L / R: Dash (if enabled)
- **Touch UI (Mobile / Tablet):**
- Tap to move or interact
- On-screen buttons for menu and actions
### Troubleshooting
- Ensure your device meets RPG Maker MZ requirements.
- If the game crashes, try restarting the app or clearing temporary files.
- Ask us on discord if persistent issues occur.
---
## 2. Developer Documentation
This section is for those interested in running, modifying, or extending the Game.
### Engine & Dependencies
- **Engine:** RPG Maker MZ
- **Plugins Used:** none
- **Assets:** All original
### Setup Instructions
1. Open RPG Maker MZ.
2. Load the project folder `beccalia-prologue`.
3. Use the "Playtest" button to run the Game locally.
4. To export, use the "Deployment" feature for target platforms.
### Directory Structure
- `data/` — database files (maps, events, actors, items, skills, etc.)
- `img/` — graphics (characters, tilesets, animations, pictures, etc.)
- `audio/` — music and sound effects
- `js/` — plugins and core scripts
- `www/` — exported HTML5 build (if deployed for web)
---
## 3. Legal Documentation
This section expands on legal or licensing information specific to the Game.
### Licensing
This Game is created using RPG Maker MZ. The game code and original content are the property of NHCarrigan. RPG Maker MZ runtime assets are licensed under the terms provided by KADOKAWA Corporation. All original graphics, music, and story content belong to NHCarrigan and are protected by copyright.
### Third-Party Notices
- Any third-party assets, music, or plugins included are credited in game.
## 4. Contributing Documentation
This section is for contributors or collaborators on the Game.
### How to Contribute
- Fork or copy the project folder.
- Submit patches or mods via Git.
- Include a changelog and clear notes on modifications.
### Coding Standards
- Plugins in `js/plugins/` should follow standard JS conventions.
- Comment custom scripts clearly for readability.
### Art & Audio Guidelines
- Maintain original resolutions where possible (48x48 tiles, etc.).
- Use consistent naming for files in `img/` and `audio/`.
### Contact
- For collaboration or questions, ask us on discord.
+293
View File
@@ -0,0 +1,293 @@
---
title: Boost Monitor
---
Boost Monitor (hereinafter the "Application") is a Discord bot that automatically manages special roles for server boosters. The Application monitors server members and removes booster-exclusive roles (such as custom color roles) when a member stops boosting the server.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### Overview
The Discord Boost Monitor operates automatically in the background of your Discord server. It requires no direct user interaction once configured by server administrators.
### How It Works
1. **Automatic Monitoring**: The bot monitors all member updates in the Discord server
2. **Boost Detection**: When a member's boost status changes, the bot checks if they still have the server booster role
3. **Role Management**: If a member no longer has the booster role, the bot automatically removes any configured booster-exclusive roles (such as custom color roles)
### Key Features
- **Automated Role Removal**: No manual intervention needed when members stop boosting
- **Configurable Roles**: Server-specific booster and color role IDs can be configured
- **Status Monitoring**: Health check endpoint available at the bot's web interface
- **Debug Webhooks**: Sends status updates and error reports to configured Discord webhooks
### Accessing the Bot
The bot runs as a background service and does not have traditional user-facing commands. Server administrators can monitor its status through:
- **Web Interface**: HTTPS endpoint showing bot status and information
- **Debug Webhook**: Real-time updates sent to configured Discord webhook
- **Server Logs**: Winston-based logging for troubleshooting
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### Prerequisites
- **Node.js**: Version 22 or higher
- **pnpm**: Version 9 or higher
- **Discord Bot Token**: From the Discord Developer Portal
- **SSL Certificates**: For HTTPS server (Let's Encrypt or similar)
- **Sentry Account** (optional): For error tracking
### Installation
1. Clone the repository:
```bash
git clone https://github.com/nhcarrigan/oogie-woogie-boostie-woostie.git
cd oogie-woogie-boostie-woostie
```
2. Install dependencies:
```bash
pnpm install
```
3. Configure environment variables by creating a `.env` file:
```bash
cp sample.env .env
```
4. Edit `.env` with your configuration:
```env
DISCORD_TOKEN="your-discord-bot-token"
SENTRY_DSN="your-sentry-dsn"
DEBUG_HOOK="your-discord-webhook-url"
```
### Configuration
#### Role Configuration
Edit `src/config/roles.ts` to configure your server-specific role IDs:
- **colourRoles**: Array of role IDs that should be removed when a member stops boosting (src/config/roles.ts:1-10)
- **boosterRole**: The ID of your server's booster role (src/config/roles.ts:12)
Example:
```typescript
export const colourRoles = [
"883281643098484736", // Red role
"883283836887261204", // Blue role
// Add your color role IDs here
];
export const boosterRole = "712431541531181177"; // Your booster role ID
```
#### SSL Certificates
The bot expects SSL certificates at the following locations:
- Certificate: `/etc/letsencrypt/live/oogie.nhcarrigan.com/cert.pem`
- Private Key: `/etc/letsencrypt/live/oogie.nhcarrigan.com/privkey.pem`
Update the paths in `src/server/serve.ts:18-22` if your certificates are located elsewhere.
### Building and Running
1. Build the TypeScript code:
```bash
pnpm build
```
2. Start the bot:
```bash
pnpm start
```
3. For development with linting:
```bash
pnpm lint
```
### Architecture
#### Core Components
- **Main Entry Point** (`src/index.ts`): Initializes the Discord client, sets up event listeners, and starts the web server
- **Role Manager** (`src/modules/manageRoles.ts`): Core logic for detecting boost status and removing roles
- **Web Server** (`src/server/serve.ts`): Fastify-based HTTPS server for health monitoring
- **Error Handler** (`src/utils/errorHandler.ts`): Centralized error handling with Sentry integration and Discord webhook notifications
- **Log Handler** (`src/utils/logHandler.ts`): Winston-based logging with timestamps and color coding
#### Bot Intents
The bot requires the following Discord gateway intents (src/index.ts:22):
- `Guilds`: Access to guild information
- `GuildMembers`: Access to member updates (privileged intent)
Note: The `GuildMembers` intent must be enabled in your bot's Discord Developer Portal settings.
#### Event Flow
1. Bot connects to Discord and fetches guild members (src/index.ts:25-39)
2. Bot listens for `guildMemberUpdate` events (src/index.ts:42-44)
3. On member update, `manageRoles` function checks boost status (src/modules/manageRoles.ts:13-26)
4. If member is not boosting, configured color roles are removed
5. Errors are logged and sent to Sentry and debug webhook
#### Web Server
The Fastify server runs on port 3443 with HTTPS and provides:
- Health check endpoint at `/` (src/server/serve.ts:27-66)
- Simple HTML page with bot information and links
- Status notifications sent to debug webhook on startup
### Monitoring and Debugging
#### Sentry Integration
All errors are automatically captured and sent to Sentry (src/index.ts:9-17), providing:
- Stack trace rewriting for better debugging
- Full error context and stack traces
- 100% transaction sampling rate
#### Discord Webhooks
Debug webhooks are used for:
- Bot startup confirmation (src/index.ts:26-31)
- Member count logging (src/index.ts:35-39)
- Server startup notification (src/server/serve.ts:73-80)
- Error notifications with embeds (src/utils/errorHandler.ts:22-38)
#### Logging
Winston logger provides console output with:
- Timestamps in `YYYY-MM-DD HH:mm:ss` format
- Color-coded log levels
- NPM-style log levels (silly, verbose, info, warn, error)
### Deployment Considerations
1. **Privileged Intents**: Ensure `GuildMembers` intent is enabled in Discord Developer Portal
2. **SSL Certificates**: Keep certificates up-to-date (consider using certbot for Let's Encrypt)
3. **Environment Variables**: Secure your `.env` file and never commit it to version control
4. **Port Access**: Ensure port 3443 is accessible for health monitoring
5. **Process Management**: Consider using PM2 or systemd for process management
6. **Single Guild**: Bot is designed for single-guild operation (src/index.ts:33)
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### Software License
This Application is licensed under the global software license maintained by Naomi Carrigan. Full license details can be found at: https://docs.nhcarrigan.com/#/license
Copyright is held by Naomi Carrigan.
### Privacy Considerations
The Application processes the following Discord data:
- **Guild member information**: Required for detecting boost status changes
- **Role information**: Required for managing booster-exclusive roles
- **Member update events**: Monitored to detect boost status changes
This data is processed in real-time and is not permanently stored by the Application outside of:
- Error logs sent to Sentry
- Debug messages sent to Discord webhooks
- Console logs from Winston logger
For full privacy policy details, see: PRIVACY.md
### Terms of Service
The Application operates as an automated moderation tool for Discord servers. Server administrators are responsible for:
- Configuring appropriate role IDs
- Informing server members about automated role management
- Ensuring compliance with Discord's Terms of Service
For full terms of service, see: TERMS.md
### Security Policy
Security vulnerabilities should be reported according to the guidelines in: SECURITY.md
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### Getting Started
Full contributing guidelines are available at: https://docs.nhcarrigan.com/#/contributing
### Development Setup
1. Fork and clone the repository
2. Install dependencies with `pnpm install`
3. Create a `.env` file from `sample.env`
4. Make your changes in a feature branch
5. Run linting with `pnpm lint` before committing
6. Build the project with `pnpm build` to ensure TypeScript compiles
### Code Style
The project uses:
- **ESLint**: `@nhcarrigan/eslint-config` (max 0 warnings)
- **Prettier**: `@nhcarrigan/prettier-config`
- **TypeScript**: `@nhcarrigan/typescript-config`
Run `pnpm lint` to check code style before submitting PRs.
### Project Structure
```
src/
├── index.ts # Main entry point
├── config/
│ └── roles.ts # Role ID configuration
├── modules/
│ └── manageRoles.ts # Core role management logic
├── server/
│ └── serve.ts # Fastify web server
└── utils/
├── errorHandler.ts # Centralized error handling
└── logHandler.ts # Winston logging configuration
```
### Testing
Currently, the project does not have automated tests (package.json:11). When contributing new features, consider:
- Manual testing with a test Discord server
- Verifying role removal works correctly
- Testing error handling paths
- Checking webhook notifications
### Submitting Changes
1. Ensure code passes linting: `pnpm lint`
2. Build successfully: `pnpm build`
3. Review the Code of Conduct: CODE_OF_CONDUCT.md
4. Submit a Pull Request with:
- Clear description of changes
- Rationale for the changes
- Any testing performed
### Code of Conduct
All contributors must adhere to the Code of Conduct outlined in: CODE_OF_CONDUCT.md
### Reporting Issues
Bug reports and feature requests can be submitted at: https://github.com/nhcarrigan/oogie-woogie-boostie-woostie/issues
### Contact
For questions or support:
- **Chat Server**: http://chat.nhcarrigan.com
- **Email**: contact@nhcarrigan.com
+38
View File
@@ -0,0 +1,38 @@
---
title: Calenelle
---
Calenelle (hereinafter the "Application") is a group coordination app with event scheduling and such.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Clarion
---
Clarion (hereinafter the "Application") is a Discord bot with dashboard that allows server mangers to post and edit announcements, rules, and similar.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+662
View File
@@ -0,0 +1,662 @@
---
title: Data API
---
Data API (hereinafter the "Application") is a lightweight web API server designed to host and serve personal and professional data for the NHCarrigan ecosystem. The Application acts as a centralized headless CMS, providing structured data in both YAML and JSON formats to power multiple websites, applications, and Discord bots.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### 1.1 API Overview
The Data Server provides a RESTful API that serves various categories of data through simple HTTP GET requests. All endpoints support both YAML and JSON formats.
**Base URL**: The server runs on `https://data.nhcarrigan.com'.
**Root Endpoint**:
- `GET /` - Returns a welcome message: "Welcome to the NHCarrigan Data API!"
### 1.2 Available Endpoints
All data endpoints are available in two formats by changing the file extension:
#### Projects Data
- `GET /projects.json` - Returns project portfolio data in JSON format
- `GET /projects.yml` - Returns project portfolio data in YAML format
Contains information about development projects including:
- Project names and descriptions
- Project URLs and repository links
- Project categories (websites, community tools, Discord bots, etc.)
- Avatar images
- Status indicators (premium, work-in-progress)
#### Resume Data
- `GET /resume.json` - Returns resume data in JSON format
- `GET /resume.yml` - Returns resume data in YAML format
Contains comprehensive professional information:
- Employment history (current and prior positions)
- Volunteer experience
- Education credentials
- Professional certifications
- Notable projects
- Publications and articles
#### Testimonials
- `GET /testimonials.json` - Returns testimonials in JSON format
- `GET /testimonials.yml` - Returns testimonials in YAML format
Contains professional testimonials and recommendations with:
- Testimonial author names
- Testimonial content
- Date information
#### Donation Information
- `GET /donate.json` - Returns donation platform data in JSON format
- `GET /donate.yml` - Returns donation platform data in YAML format
Contains details about donation platforms:
- Platform names and URLs
- Icon references
- Color schemes
- Platform descriptions
#### Funding Information
- `GET /funding.json` - Returns comprehensive funding data in JSON format
- `GET /funding.yml` - Returns comprehensive funding data in YAML format
Contains detailed funding information:
- Entity details
- Project listings with unique identifiers
- Funding channel information
- Subscription plan details
- Financial history and records
### 1.3 CORS Support
The Application has CORS enabled for all origins, allowing consumption from any domain without cross-origin restrictions.
### 1.4 Content Types
The Application automatically sets appropriate Content-Type headers:
- JSON endpoints: `application/json`
- YAML endpoints: `text/yaml` or `application/x-yaml`
### 1.5 Rate Limiting
Currently, the Application does not implement rate limiting. Users should be respectful of the server resources and avoid excessive requests.
### 1.6 Data Freshness
Data is compiled from YAML source files during the build process. To receive updated data, the server must be rebuilt and restarted when source data changes.
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### 2.1 Prerequisites
Before running the Application, ensure you have the following installed:
- **Node.js**: Latest LTS version recommended
- **pnpm**: Version 10.17.0 (specified in package.json as packageManager)
- **1Password CLI** (optional): For secure environment variable management in production
### 2.2 Technology Stack
- **Runtime**: Node.js with ES modules
- **Language**: TypeScript 5.9.2
- **Web Framework**: Fastify 5.6.1
- **Data Format**: YAML (source) → JSON (runtime)
- **Testing**: Vitest 3.2.4
- **Linting**: ESLint 9.36.0
- **Package Manager**: pnpm 10.17.0
### 2.3 Installation
1. Clone the repository:
```bash
git clone <repository-url>
cd data
```
2. Install dependencies using pnpm:
```bash
pnpm install
```
### 2.4 Project Structure
```
/data/
├── src/ # TypeScript source code
│ ├── index.ts # Main entry point - Fastify server
│ ├── modules/
│ │ └── buildRoutes.ts # Dynamic route builder
│ ├── interfaces/ # TypeScript type definitions
│ │ ├── projects.ts
│ │ ├── resume.ts
│ │ ├── testimonials.ts
│ │ ├── donate.ts
│ │ └── funding.ts
│ └── utils/
│ └── logger.ts # Logger configuration
├── data/ # Data directory (YAML sources and JSON builds)
│ ├── projects.yml / .json
│ ├── resume.yml / .json
│ ├── testimonials.yml / .json
│ ├── donate.yml / .json
│ └── funding.yml / .json
├── test/
│ └── yaml.spec.ts # Comprehensive validation tests
├── prod/ # Compiled JavaScript output
├── build.js # YAML to JSON build script
├── tsconfig.json # TypeScript configuration
└── package.json # Project metadata and scripts
```
### 2.5 Configuration
The Application uses the following configuration points:
#### Server Port
- Default: Port 9999
- Location: `src/index.ts:34`
- Can be modified by editing the port number in the source code
#### Data Directory
- Location: `./data`
- Contains both source YAML files and built JSON files
- Referenced in: `src/modules/buildRoutes.ts`
#### CORS Settings
- Currently configured to allow all origins
- Location: `src/index.ts:30`
- Can be restricted by modifying the Fastify CORS configuration
### 2.6 Data Management
#### Adding New Data Endpoints
1. Create a new YAML file in the `/data` directory:
```bash
touch data/newdata.yml
```
2. Create a corresponding TypeScript interface in `src/interfaces/`:
```typescript
// src/interfaces/newdata.ts
export interface NewData {
// Define your data structure
}
```
3. The Application will automatically:
- Generate routes for `/newdata.yml` and `/newdata.json`
- Serve the content when the server restarts
#### Editing Existing Data
1. Edit the YAML files in the `/data` directory
2. Run the build command to convert YAML to JSON
3. Restart the server to serve updated data
The YAML files are the source of truth. Always edit YAML files, not JSON files, as JSON files are auto-generated.
### 2.7 Build Process
The build process consists of two steps:
1. **YAML to JSON Conversion**: `node build.js`
- Reads all YAML files from the data directory
- Generates corresponding JSON files
- Preserves the human-readable YAML as the source of truth
2. **TypeScript Compilation**: `tsc`
- Compiles TypeScript source code to JavaScript
- Outputs to the `/prod` directory
- Uses configuration from `tsconfig.json` (extends @nhcarrigan/typescript-config)
To run the complete build:
```bash
pnpm run build
```
### 2.8 Available Scripts
```bash
# Build (YAML → JSON + TypeScript compilation)
pnpm run build
# Start production server (with 1Password environment variables)
pnpm run start
# Run test suite
pnpm test
# Linting
pnpm run lint # Run all linters
pnpm run lint:ts # ESLint only
pnpm run lint:spelling # Spell check YAML files
pnpm run lint:yaml # YAML validation
```
### 2.9 Testing
The Application includes comprehensive test coverage using Vitest.
**Test File**: `test/yaml.spec.ts`
**What is tested**:
- Data structure validation against TypeScript interfaces
- URL reachability for all external links (with retry logic)
- Date format validation
- Required field presence
- Data type correctness
**Running tests**:
```bash
pnpm test
```
Tests have a 120-second timeout to accommodate URL validation checks, which may be rate-limited.
### 2.10 Development Workflow
1. **Make changes to data**:
- Edit YAML files in `/data` directory
- Use your preferred text editor
2. **Validate your changes**:
```bash
pnpm run lint:yaml # Validate YAML syntax
pnpm run lint:spelling # Check spelling
pnpm test # Run full test suite
```
3. **Build the application**:
```bash
pnpm run build
```
4. **Start the server locally**:
```bash
node ./prod/index.js
```
Or with 1Password environment variables:
```bash
pnpm run start
```
5. **Test endpoints**:
```bash
curl http://localhost:9999/projects.json
```
### 2.11 Deployment
#### Environment Variables
The production start script uses 1Password CLI for secure environment variable management:
```bash
op run --env-file ./prod.env -- node ./prod/index.js
```
Create a `prod.env` file with 1Password references for any required environment variables.
#### Production Considerations
1. **Reverse Proxy**: Consider running the Application behind a reverse proxy (nginx, Apache) for:
- SSL/TLS termination
- Rate limiting
- Caching
- Load balancing
2. **Process Management**: Use a process manager to ensure uptime:
- PM2
- systemd
- Docker with restart policies
3. **Monitoring**: Implement monitoring for:
- Server health
- Response times
- Error rates
4. **Backups**: Regularly backup the `/data` directory, as it contains the source YAML files.
### 2.12 Troubleshooting
#### Server won't start
- Verify port 9999 is not in use
- Check that dependencies are installed (`pnpm install`)
- Ensure the build completed successfully (`pnpm run build`)
#### Data not updating
- Verify you edited the YAML files, not JSON files
- Run `pnpm run build` to regenerate JSON
- Restart the server
#### Test failures
- **URL validation failures**: May be due to rate limiting; tests include retry logic
- **Data structure failures**: Ensure YAML structure matches TypeScript interfaces
- **Spelling failures**: Add custom words to cspell configuration if needed
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### 3.1 Data Usage and Privacy
#### Data Served by the Application
The Application serves public, non-sensitive data intended for public consumption. The data categories include:
- **Projects**: Public information about open-source projects and portfolio work
- **Resume**: Professional experience, education, and certifications
- **Testimonials**: Public testimonials and recommendations
- **Donation Information**: Public donation platform links
- **Funding Information**: Public funding channel and subscription information
#### No Personal User Data Collection
The Application itself does not collect, store, or process any personal data from users accessing the API. The server:
- Does not require authentication
- Does not track user requests
- Does not use cookies or similar tracking technologies
- Does not log IP addresses or personally identifiable information
#### CORS and Third-Party Access
By enabling CORS for all origins, the Application explicitly permits third-party websites and applications to access the served data. This is intentional and by design, as the data is meant for public consumption.
### 3.2 Data Accuracy and Updates
The data served by the Application is maintained on a best-effort basis. While efforts are made to ensure accuracy:
- Data may become outdated between updates
- URLs and external links may become invalid over time
- No guarantee of real-time data freshness is provided
Users consuming this data should:
- Implement appropriate error handling for unavailable resources
- Cache responses responsibly
- Not rely on the Application for time-sensitive or critical decisions
### 3.3 Service Availability
The Application is provided "as-is" without guarantees of:
- Continuous availability
- Specific uptime percentages
- Response time performance
- Data freshness
Users should not build critical systems that depend on the Application's availability without implementing appropriate fallbacks and error handling.
### 3.4 Intellectual Property
#### Data Content
The data served by the Application contains information about projects, professional experience, and other content that may be subject to intellectual property rights:
- Project names, descriptions, and logos may be trademarks
- Code and software referenced may be under various open-source licenses
- Testimonial content remains the intellectual property of the original authors
Users consuming this data should:
- Respect intellectual property rights
- Provide proper attribution when displaying data
- Review specific licenses for any referenced projects or software
#### Application Code
The Application's source code is licensed under the terms specified in the LICENSE.md file. Copyright is held by Naomi Carrigan.
### 3.5 Terms of Service
The general Terms of Service can be found at: https://docs.nhcarrigan.com/#/terms
#### Application-Specific Terms
Users of the Application agree to:
- Use the API in good faith and not for malicious purposes
- Not attempt to overwhelm the server with excessive requests
- Not attempt to exploit vulnerabilities or security weaknesses
- Respect the intended public use of the data
### 3.6 Privacy Policy
The general Privacy Policy can be found at: https://docs.nhcarrigan.com/#/privacy
#### Application-Specific Privacy Notes
As noted in section 3.1, the Application does not collect user data. The privacy policy primarily applies to:
- Contributors to the codebase (governed by GitHub's privacy policy)
- Data maintainers with access to the data repository
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### 4.1 General Contributing Guidelines
General contributing guidelines can be found at: https://docs.nhcarrigan.com/#/contributing
Please review these guidelines before contributing to the Application.
### 4.2 Code of Conduct
Before interacting with the project or community, please read the [Code of Conduct](CODE_OF_CONDUCT.md).
### 4.3 Ways to Contribute
#### 4.3.1 Data Contributions
If you have corrections or updates to the data served by the Application:
1. **Data corrections**: If you notice incorrect information, please open an issue
2. **Testimonials**: If you'd like to add a testimonial, please contact through the official channels
3. **Project updates**: For updates to project information, verify you have permission to modify the data
#### 4.3.2 Code Contributions
Contributors can help improve the Application in several ways:
**Features**:
- Enhanced API endpoints
- New data validation rules
- Performance optimizations
- Additional data format support
- API documentation improvements
**Bug Fixes**:
- Server stability issues
- Route handling bugs
- Build process errors
- Test failures
**Quality Improvements**:
- Code refactoring
- Test coverage expansion
- Documentation enhancements
- Type safety improvements
### 4.4 Development Setup
1. **Fork and clone** the repository
2. **Install dependencies**: `pnpm install`
3. **Create a branch** for your changes: `git checkout -b feature/your-feature-name`
4. **Make your changes** following the guidelines below
5. **Test your changes**: `pnpm test`
6. **Lint your code**: `pnpm run lint`
7. **Build the project**: `pnpm run build`
8. **Commit and push** your changes
9. **Open a Pull Request**
### 4.5 Code Style Guidelines
#### TypeScript
- Follow the ESLint configuration (`@nhcarrigan/eslint-config`)
- Use explicit type annotations for function parameters and return values
- Prefer interfaces over type aliases for object shapes
- Use ES modules (`import`/`export`) syntax
- Maintain strict type safety (no `any` types unless absolutely necessary)
**Example**:
```typescript
// Good
export const processData = (input: string): ProcessedData => {
// implementation
};
// Avoid
export const processData = (input) => {
// implementation
};
```
#### File Organization
- Place interfaces in `src/interfaces/`
- Place utility functions in `src/utils/`
- Place core logic in `src/modules/`
- Keep the main entry point (`src/index.ts`) minimal
#### Error Handling
- Use the custom logger from `@nhcarrigan/logger`
- Provide meaningful error messages
- Handle errors gracefully without crashing the server
### 4.6 Testing Guidelines
All contributions should maintain or improve test coverage.
#### Writing Tests
- Use Vitest test framework
- Place tests in the `/test` directory
- Use descriptive test names
**Example test structure**:
```typescript
describe("Feature Name", () => {
it("should do something specific", () => {
// Arrange
const input = setupTestData();
// Act
const result = performAction(input);
// Assert
expect(result).toBe(expectedValue);
});
});
```
#### Running Tests
Before submitting a PR:
```bash
pnpm test # Run all tests
```
### 4.7 Documentation Guidelines
When contributing documentation:
- Use clear, concise language
- Include code examples where helpful
- Update relevant sections when changing functionality
- Check spelling with `pnpm run lint:spelling`
### 4.8 Pull Request Process
1. **Ensure all checks pass**:
- All tests pass (`pnpm test`)
- Code lints without warnings (`pnpm run lint`)
- Build succeeds (`pnpm run build`)
2. **Write a clear PR description**:
- Describe what changes were made
- Explain why the changes were necessary
- Reference any related issues
3. **Respond to feedback**:
- Address review comments promptly
- Be open to suggestions and improvements
- Update the PR as requested
4. **Squash commits** if requested to maintain a clean git history
### 4.9 Adding New Data Categories
To add a new data category to the Application:
1. **Create the TypeScript interface**:
```typescript
// src/interfaces/newcategory.ts
export interface NewCategory {
id: string;
name: string;
// other fields
}
```
2. **Create the YAML data file**:
```yaml
# data/newcategory.yml
- id: example
name: Example Item
```
3. **Add tests**:
```typescript
// test/yaml.spec.ts
describe("New Category Data", () => {
it("should have valid structure", () => {
// validation tests
});
});
```
4. **Update documentation**:
- Add endpoint documentation to section 1.2
- Update project structure in section 2.4
5. **Test the changes**:
```bash
pnpm run build
node ./prod/index.js
curl http://localhost:9999/newcategory.json
```
### 4.10 Security Considerations
When contributing, keep security in mind:
- Never commit sensitive data (API keys, passwords, personal information)
- Validate all input data in tests
- Follow secure coding practices
- Report security vulnerabilities privately before opening public issues
### 4.11 Getting Help
If you need help contributing:
- Open a GitHub issue with your question
- Join the [Chat Server](http://chat.nhcarrigan.com)
- Email: `contact@nhcarrigan.com`
### 4.12 Recognition
All contributors will be recognized for their contributions. Significant contributions may be highlighted in release notes and project documentation.
---
**Last Updated**: 2025-10-29
**Application Version**: 1.0.0
**Maintained by**: NHCarrigan
@@ -0,0 +1,240 @@
---
title: Discord Analytics
---
Discord Analytics (hereinafter the "Application") is a TypeScript library package designed to integrate with Discord bots to provide automated analytics tracking and metrics collection. The Application pairs with the @nhcarrigan/logger tool to pipe Discord bot analytics and telemetry data.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### Overview
Discord Analytics is distributed as an npm package and is designed to be integrated into Discord.js-based bots. The package is available at [@nhcarrigan/discord-analytics](https://www.npmjs.com/package/@nhcarrigan/discord-analytics).
### Features
The Application provides the following capabilities:
- **Automated Daily Metrics Collection**: Runs a CRON job at midnight (system time) to collect:
- Total number of guilds (Discord servers) the bot is a member of
- Total member count across all guilds
- Approximate number of user installs for the application
- **Gateway Event Logging**: Allows logging of Discord gateway events with custom metadata for detailed analytics tracking
### Basic Usage
1. Install the package via npm:
```
npm install @nhcarrigan/discord-analytics
```
2. Import and initialize the DiscordAnalytics class with your Discord client and logger instance:
```typescript
import { DiscordAnalytics } from '@nhcarrigan/discord-analytics';
const analytics = new DiscordAnalytics(client, logger);
```
3. Start the automated metrics collection:
```typescript
analytics.startCron();
```
4. Log gateway events from your Discord event listeners:
```typescript
client.on(Events.MessageCreate, async (message) => {
await analytics.logGatewayEvent(Events.MessageCreate, {
channelId: message.channelId
});
});
```
5. Stop the CRON job when needed:
```typescript
analytics.stopCron();
```
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### Prerequisites
- Node.js (compatible with node-schedule 2.1.1)
- Discord.js v14.x or higher
- @nhcarrigan/logger v1.1.0-hotfix or higher
### Installation
The Application is installed as an npm package dependency:
```bash
npm install @nhcarrigan/discord-analytics
```
Or using pnpm:
```bash
pnpm add @nhcarrigan/discord-analytics
```
### Architecture
#### Core Components
The Application consists of a single main class located in `src/index.ts`:
**DiscordAnalytics Class** (src/index.ts:14-96)
The main class provides three public methods:
1. **`constructor(client: Client, logger: Logger)`** (src/index.ts:22-25)
- Initializes the analytics instance with a Discord.js client and logger
- Parameters:
- `client`: The Discord.js client instance to monitor
- `logger`: Instance of @nhcarrigan/logger for metric logging
2. **`startCron(): void`** (src/index.ts:33-65)
- Starts a CRON job scheduled to run at midnight daily (0 0 * * *)
- Collects and logs three metrics:
- `user_installs`: Approximate count of user installs
- `guilds`: Total number of guilds the bot is in
- `members`: Total member count across all guilds
- Includes error handling that logs failures via the logger
3. **`stopCron(): void`** (src/index.ts:70-76)
- Cancels the running CRON job if active
- Safely handles the case where no job is running
4. **`logGatewayEvent(event: Events, payload: Record<string, unknown>): Promise<void>`** (src/index.ts:85-95)
- Logs Discord gateway events as metrics
- Parameters:
- `event`: The Discord.js event type (e.g., Events.MessageCreate)
- `payload`: Custom metadata to attach to the metric
#### Dependencies
- **node-schedule** (2.1.1): Provides CRON job scheduling functionality
- **@nhcarrigan/logger** (peer dependency): Handles metric and error logging
- **discord.js** (peer dependency v14.x): Discord API wrapper
#### Build Process
The Application uses TypeScript and includes the following build scripts:
- `pnpm run lint`: Runs ESLint with zero warnings tolerance
- `pnpm run build`: Removes the `prod` directory and compiles TypeScript
- `pnpm prepublish`: Runs linting and build before publishing
The compiled output is located in the `prod` directory with `prod/index.js` as the main entry point.
### Configuration
The CRON schedule is hardcoded to run at midnight daily (system time). The schedule can be identified in the code at src/index.ts:37 as `"0 0 * * *"`.
### Data Collection
The Application collects the following metrics:
- **Guild Count**: Total number of Discord servers (src/index.ts:54)
- **Member Count**: Sum of all members across guilds (src/index.ts:55)
- **User Installs**: Approximate user installation count (src/index.ts:49-52)
- **Gateway Events**: Custom event tracking with metadata (src/index.ts:89-94)
All metrics are logged using the provided logger instance's `metric()` method.
### Error Handling
Errors during the CRON job execution are caught and logged via the logger's `error()` method (src/index.ts:57-62). The Application ensures errors are properly converted to Error instances before logging.
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### License
The Application is licensed under [Naomi's Public License](https://docs.nhcarrigan.com/#/license) (referenced as "global software license").
Copyright is held by Naomi Carrigan.
### Privacy Considerations
The Application collects the following data from Discord:
- Guild (server) identifiers and counts
- Member counts (aggregate numbers, not individual user data)
- User installation counts (approximate numbers from Discord API)
- Gateway event data with optional custom metadata
Users integrating this Application should ensure their privacy policies adequately disclose the collection and logging of this telemetry data.
### Third-Party Services
The Application interacts with:
- Discord API (via discord.js)
- The configured logging service (@nhcarrigan/logger)
Data is transmitted to whatever backend service is configured with the logger instance.
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### Contributing Guidelines
Full contributing guidelines can be found at: https://docs.nhcarrigan.com/#/contributing
### Code of Conduct
Before interacting with the community, please review the Code of Conduct at: https://docs.nhcarrigan.com/#/coc
### Development Setup
1. Clone the repository
2. Install dependencies:
```bash
pnpm install
```
3. Make your changes in the `src` directory
4. Run linting:
```bash
pnpm run lint
```
5. Build the project:
```bash
pnpm run build
```
### Code Style
The project uses:
- ESLint with @nhcarrigan/eslint-config (v5.2.0)
- TypeScript with @nhcarrigan/typescript-config (v4.0.0)
- Maximum warnings: 0 (strict mode)
### Pull Request Process
1. Create a Pull Request with your proposed changes
2. Ensure all linting passes
3. The maintainers will review as soon as possible
### Reporting Issues
If you have feedback or a bug report, please open a GitHub issue.
### Contact
The maintainers may be contacted through:
- [Chat Server](http://chat.nhcarrigan.com)
- Email: contact@nhcarrigan.com
### Current Version
Version: 0.0.6
Recent changes can be viewed in the git commit history.
+2 -2
View File
@@ -1,8 +1,8 @@
--- ---
title: NHCarrigan Documentation Site title: NHCarrigan Documentation
--- ---
NHCarrigan Documentation Site (hereinafter the "Application") is a comprehensive documentation website built with Astro and Starlight that serves as the central hub for all documentation related to NHCarrigan's projects, policies, and services. The site provides organized access to technical documentation, legal policies, community guidelines, and project-specific information across multiple categories including Discord bots, web applications, libraries, and development tools. The Application features a custom-themed interface with accessibility considerations, analytics integration, and environmental sustainability features. NHCarrigan Documentation (hereinafter the "Application") is a comprehensive documentation website built with Astro and Starlight that serves as the central hub for all documentation related to NHCarrigan's projects, policies, and services. The site provides organized access to technical documentation, legal policies, community guidelines, and project-specific information across multiple categories including Discord bots, web applications, libraries, and development tools. The Application features a custom-themed interface with accessibility considerations, analytics integration, and environmental sustainability features.
## 1. User Documentation ## 1. User Documentation
+363
View File
@@ -0,0 +1,363 @@
---
title: Eclaire
---
Eclaire (hereinafter the "Application") is a real-time speech-to-speech translation web application that captures live audio from a user's microphone, transcribes the speech using Deepgram's API, and translates the transcribed text into a target language.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### Getting Started
1. **Initial Setup**: Navigate to the Configuration page to set up your API credentials and language preferences.
2. **Configuration Options**:
- **Deepgram API Key**: Required for speech-to-text transcription. You must provide your own API key from [Deepgram](https://deepgram.com).
- **Translation Service API Key**: Required for text translation. A demo key is available with a 10 requests/minute rate limit, or you can provide your own key.
- **Source Language**: Select from 12 supported languages (English, German, Dutch, Swedish, Danish, Spanish, French, Portuguese, Italian, Turkish, Norwegian, Indonesian).
- **Target Language**: Select from 60+ supported languages for translation.
3. **Using the Translation Interface**:
- Navigate to the Agent page to begin translation.
- Click "Start" to begin capturing audio from your microphone.
- Speak clearly into your microphone in the configured source language.
- The application will display real-time transcription and translations.
- Click "Finalize" to manually end the current speech segment if needed.
- Click "Stop" to end the session.
### Features
- **Real-Time Transcription**: Powered by Deepgram's nova-3-general model with automatic punctuation
- **Multi-Language Translation**: Support for 60+ target languages via LibreTranslate
- **Conversation History**: View all transcriptions and translations in a message-based format
- **Connection Status**: Monitor your connection status and any errors
- **Cost Estimation**: Track estimated costs (approximately $0.32/hour)
### Audio Quality Settings
The application automatically enables:
- Echo cancellation
- Noise suppression
- Auto gain control
### Limitations
- Source language is limited to 12 languages supported by Deepgram
- Translation service demo key has a rate limit of 10 requests/minute
- Requires modern browser with microphone access
- WebSocket connection required for real-time functionality
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### Prerequisites
- Node.js (version compatible with Angular 19.1.4)
- pnpm package manager
- Modern web browser with WebRTC support
- Deepgram API key
- LibreTranslate API key (or access to a LibreTranslate instance)
### Installation
1. Clone the repository:
```bash
git clone <repository-url>
cd eclaire
```
2. Install dependencies:
```bash
npm install
```
3. Start the development server:
```bash
npm run dev
```
4. Build for production:
```bash
npm run build
```
### Technology Stack
**Frontend Framework:**
- Angular 19.1.4 with standalone components
- TypeScript 5.7.3
- RxJS 7.8.1 for reactive programming
- Angular Reactive Forms for configuration management
**External APIs:**
- Deepgram WebSocket API (nova-3-general model) for speech-to-text
- LibreTranslate API for text translation
**Audio Processing:**
- Web Audio API for microphone access
- ScriptProcessor for audio stream processing (4096 buffer size)
- 48kHz sample rate, mono channel, Int16 format
### Architecture
#### Components
1. **HomeComponent** (`src/app/home/home.component.ts`)
- Landing page with navigation links
- Entry point for users
2. **ConfigComponent** (`src/app/config/config.component.ts`)
- Configuration interface using reactive forms
- Manages API keys and language preferences
- Form validation for required fields
- Stores configuration in ConfigService
3. **AgentComponent** (`src/app/agent/agent.component.ts`)
- Main translation interface
- Manages WebSocket lifecycle
- Handles microphone capture and audio streaming
- Displays transcription and translation results
- Tracks connection status and errors
#### Services
1. **ConfigService** (`src/app/config.service.ts`)
- In-memory storage for application configuration
- Provides configuration access across components
- Stores: API keys, source language, target language
2. **SocketService** (`src/app/socket.service.ts`)
- Manages WebSocket connection to Deepgram
- Handles audio streaming in real-time
- Event-based architecture for message handling
- Supports keep-alive and finalization
- Configuration options:
- Model: nova-3-general
- Language: configurable source language
- Encoding: linear16
- Sample rate: 48000
- Channels: 1 (mono)
- Endpointing: 500ms
- Features: punctuate
#### Routing
- `/` - Redirects to home
- `/home` - Landing page
- `/config` - Configuration page
- `/agent` - Translation interface
### API Integration
#### Deepgram API
The application uses Deepgram's WebSocket API for real-time transcription:
```typescript
wss://api.deepgram.com/v1/listen
```
Query parameters:
- `model=nova-3-general`
- `language=<source-language>`
- `encoding=linear16`
- `sample_rate=48000`
- `channels=1`
- `endpointing=500`
- `punctuate=true`
Authentication: Bearer token (API key) in WebSocket URL
#### LibreTranslate API
The application uses the LibreTranslate API for text translation:
```typescript
https://trans.nhcarrigan.com/translate
```
POST request body:
```json
{
"q": "<text-to-translate>",
"source": "<source-language-code>",
"target": "<target-language-code>",
"api_key": "<api-key>"
}
```
### Development
#### Available Scripts
- `npm run dev` - Start development server
- `npm run lint` - Run ESLint with zero warnings policy
- `npm run build` - Build for production
#### Code Quality
- ESLint configuration from `@nhcarrigan/eslint-config`
- TypeScript configuration from `@nhcarrigan/typescript-config`
- Strict linting with `--max-warnings 0`
#### Testing
- Framework: Jasmine ~5.5.0
- Test Runner: Karma ~6.4.4
- Coverage reporting enabled
### Deployment Considerations
1. **Environment Variables**: API keys should be configurable per deployment environment
2. **CORS**: Ensure proper CORS configuration for LibreTranslate API
3. **HTTPS**: Required for microphone access in production
4. **WebSocket**: Ensure WebSocket connections are allowed through firewalls
5. **Browser Support**: Requires WebRTC and Web Audio API support
### Performance
- Audio streaming at 48kHz with 4096 sample buffer
- WebSocket for low-latency real-time communication
- Estimated cost: $0.32/hour for Deepgram usage
- Efficient audio processing with minimal overhead
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### License
This software is licensed under the [global software license](https://docs.nhcarrigan.com/#/license).
Copyright held by Naomi Carrigan.
### Privacy Policy
The Application's privacy practices are governed by the [global privacy policy](https://docs.nhcarrigan.com/#/privacy).
#### Application-Specific Privacy Considerations
1. **Audio Data**: The Application captures audio from your microphone and streams it to Deepgram's servers for transcription. Audio data is not stored locally by the Application.
2. **API Keys**: API keys are stored in-memory during your session and are not persisted to local storage or transmitted to any servers other than the respective API providers (Deepgram and LibreTranslate).
3. **Third-Party Services**:
- **Deepgram**: Audio data is transmitted to Deepgram for transcription. Refer to [Deepgram's privacy policy](https://deepgram.com/privacy) for information on their data handling practices.
- **LibreTranslate**: Transcribed text is transmitted to the LibreTranslate API for translation. The default instance is hosted at trans.nhcarrigan.com.
4. **Local Storage**: The Application does not persist any user data to browser storage.
### Terms of Service
The Application's usage is governed by the [global terms of service](https://docs.nhcarrigan.com/#/terms).
#### Application-Specific Terms
1. **API Usage**: Users are responsible for their own Deepgram API usage and associated costs. The Application provides cost estimates but does not guarantee accuracy.
2. **Demo API Key**: The translation service demo API key is provided for testing purposes only and has rate limits (10 requests/minute). It may be revoked or changed at any time.
3. **Service Availability**: The Application depends on third-party services (Deepgram and LibreTranslate). Service interruptions may occur due to factors outside of our control.
4. **Accuracy**: The Application provides translation services based on third-party APIs. Translation accuracy is not guaranteed and should not be relied upon for critical communications.
### Security Policy
For security concerns, please refer to the [SECURITY.md](SECURITY.md) file in the repository.
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### Contributing Guidelines
General contributing guidelines can be found at: https://docs.nhcarrigan.com/#/contributing
### Code of Conduct
Before interacting with our community, please read our [Code of Conduct](CODE_OF_CONDUCT.md).
### Development Setup
1. Fork the repository
2. Clone your fork: `git clone <your-fork-url>`
3. Install dependencies: `npm install`
4. Create a feature branch: `git checkout -b feature/your-feature-name`
5. Make your changes
6. Run linting: `npm run lint`
7. Commit your changes with clear commit messages
8. Push to your fork: `git push origin feature/your-feature-name`
9. Open a Pull Request
### Code Style
- Follow the ESLint configuration (`@nhcarrigan/eslint-config`)
- Use TypeScript with strict type checking
- Follow Angular style guide for component and service structure
- Use meaningful variable and function names
- Add comments for complex logic
### Component Guidelines
- Use standalone components (Angular 19+)
- Implement proper lifecycle hooks
- Use reactive programming patterns with RxJS
- Follow Angular dependency injection best practices
- Keep components focused on a single responsibility
### Service Guidelines
- Use `@Injectable({ providedIn: 'root' })` for singleton services
- Implement proper error handling
- Use TypeScript interfaces for type safety
- Document public methods with JSDoc comments
### Testing Guidelines
- Write unit tests for components and services
- Aim for high code coverage
- Test user interactions and edge cases
- Mock external dependencies (APIs, services)
### Pull Request Process
1. Ensure all tests pass
2. Ensure linting passes with zero warnings
3. Update documentation if needed
4. Provide a clear description of changes
5. Reference any related issues
6. Wait for review from maintainers
### Areas for Contribution
- **UI/UX Improvements**: Enhance the user interface and experience
- **Additional Languages**: Expand language support where possible
- **Performance Optimization**: Improve audio processing efficiency
- **Testing**: Increase test coverage
- **Documentation**: Improve user and technical documentation
- **Accessibility**: Enhance accessibility features
- **Error Handling**: Improve error messages and handling
- **Configuration**: Add more configuration options
### Reporting Issues
If you have feedback or a bug report, please feel free to open a GitHub issue with:
- Clear description of the issue
- Steps to reproduce (for bugs)
- Expected vs actual behavior
- Browser and OS information
- Screenshots if applicable
### Contact
We may be contacted through:
- [Chat Server](http://chat.nhcarrigan.com)
- Email: contact@nhcarrigan.com
---
**Version**: 1.1.0
**Last Updated**: 2025-10-31
**Author**: Naomi Carrigan
+38
View File
@@ -0,0 +1,38 @@
---
title: Eirene
---
Eirene (hereinafter the "Application") is a website and Discord activity that allows you to participate in code challenges competitively or collaboratively
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Elaria
---
Elaria (hereinafter the "Application") is a meeting schedule coordination tool.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Elowyn
---
Elowyn (hereinafter the "Application") is a quick website that helps you format text.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Elunara
---
Elunara (hereinafter the "Application") is a Discord bot that allows users to proxy messages so they correctly appear as composed by an alter.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Elysium
---
Elysium (hereinafter the "Application") is an idle RPG in the browser.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Evangeline
---
Evangeline (hereinafter the "Application") is a Discord bot that allows you to configure canned replies, retrieve them anywhere on discord, and easily copy + paste them into chat.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
@@ -0,0 +1,443 @@
---
title: freeCodeCamp Review Generator
---
freeCodeCamp Review Generator (hereinafter the "Application") is a command-line tool that aggregates all review lesson pages from freeCodeCamp's Full Stack Developer curriculum into a single, comprehensive PDF document for offline study and reference.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### Overview
The Application generates a compiled PDF document containing all review pages from freeCodeCamp's Full Stack Developer curriculum. The generated PDF includes:
- A custom cover page with generation date
- An automatically generated table of contents with links to each review section
- All review content organized according to the curriculum structure
- Custom headers and footers for easy navigation
- Page numbers and links to community resources
### Generated PDF Structure
The output PDF (`fcc-review-pages.pdf`) follows the freeCodeCamp curriculum structure:
1. **HTML Topics** - Reviews covering basic HTML, semantic HTML, forms and tables, and accessibility
2. **CSS Topics** - Reviews covering basic CSS, layout (Flexbox, Grid), styling, responsive design, animations, and more
3. **JavaScript Topics** - Reviews covering variables, functions, arrays, objects, DOM manipulation, asynchronous programming, and more
4. **Frontend Libraries** - Reviews covering React fundamentals, state management, routing, and frontend frameworks
5. **Python Topics** - Reviews covering Python basics, data structures, algorithms, and object-oriented programming
6. **Relational Databases** - Reviews covering SQL, Bash scripting, and Git
### What to Expect
Each review page in the generated PDF contains:
- **Topic headings** - Clear section markers for each subject
- **Code examples** - Syntax-highlighted code snippets demonstrating concepts
- **Explanations** - Detailed descriptions of programming concepts and best practices
- **Reference material** - Quick-reference information for common patterns and methods
### Output Format
- **File name**: `fcc-review-pages.pdf`
- **Page format**: Legal size (8.5" x 14")
- **Margins**: 0.75 inches on all sides
- **Header**: Displays "Naomi's freeCodeCamp Review"
- **Footer**: Contains page numbers and link to community Discord server
### Disclaimer
This is not an officially sanctioned freeCodeCamp document. The Application is maintained independently and the generated content reflects the curriculum state at the time of generation. For the most up-to-date information, always refer to the official freeCodeCamp website.
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### Prerequisites
- **Node.js**: Version 18.x or higher recommended
- **pnpm**: Package manager (version 10.18.0 or compatible)
- **Operating System**: Linux, macOS, or Windows
- **Disk Space**: Minimum 500MB for dependencies and output files
### Installation
1. Clone the repository:
```bash
git clone <repository-url>
cd fcc-review-generator
```
2. Install dependencies:
```bash
pnpm install
```
This will automatically install Chrome browser via Puppeteer (required for PDF generation).
### Directory Structure
```
fcc-review-generator/
├── content/ # Review lesson markdown files
│ └── review-*/ # Individual review topic directories
├── data/
│ └── order.json # Curriculum ordering configuration
├── src/
│ ├── config/
│ │ ├── options.ts # PDF generation options
│ │ └── text.ts # Cover page text template
│ └── index.ts # Main application entry point
├── package.json # Project dependencies and scripts
└── tsconfig.json # TypeScript configuration
```
### Configuration
#### Content Source
1. Copy review lesson markdown files from the freeCodeCamp repository to the `content/` directory
2. The Application recursively walks the directory tree, so nested folders are supported
3. Only `.md` files are processed; other files are ignored
#### Curriculum Ordering
1. Copy the Full Stack curriculum order from `/curriculum/structure/superblocks/fullstack.json` in the freeCodeCamp repository
2. Paste into `data/order.json` in this project
3. The Application uses this to sort review pages in the correct curriculum order
#### PDF Customization
Modify `src/config/options.ts` to customize:
- Page size and margins
- Header and footer templates
- Styling and formatting
Modify `src/config/text.ts` to customize:
- Cover page content
- Introduction text
- Disclaimer text
### Usage
Run the Application:
```bash
pnpm start
```
The Application will:
1. Read all markdown files from `content/` directory
2. Sort them according to `data/order.json`
3. Generate a table of contents
4. Compile all content into a single markdown file (`review.md`)
5. Convert the markdown to PDF (`fcc-review-pages.pdf`)
6. Clean up the temporary markdown file
### Output
- **Success**: Generates `fcc-review-pages.pdf` in the project root
- **Console**: Displays progress messages during execution
- **Errors**: Logged to console with descriptive messages
### Development
#### Build TypeScript
```bash
pnpm build
```
Compiles TypeScript files according to `tsconfig.json`.
#### Linting
```bash
pnpm lint
```
Runs ESLint with strict settings (max warnings: 0).
#### Testing
```bash
pnpm test
```
Currently outputs a placeholder message (no tests implemented).
### Technical Architecture
#### Core Components
1. **File Reader** (`readDirectoryRecursively`)
- Recursively scans the content directory
- Returns flat array of file paths
- Handles nested directory structures
2. **File Sorter** (`sortFiles`)
- Sorts files based on curriculum order from `order.json`
- Matches file directory names to curriculum block names
- Maintains proper curriculum sequence
3. **Content Processor** (`rollupFiles`)
- Extracts frontmatter metadata (title, ID, etc.)
- Strips frontmatter and freeCodeCamp-specific heading syntax
- Generates table of contents with anchor links
- Compiles all content into single markdown file
4. **PDF Generator** (`createPdf`)
- Uses `md-to-pdf` library (which uses Puppeteer/Chrome)
- Applies custom styling and layout options
- Generates headers, footers, and page numbers
- Writes final PDF to disk
#### Dependencies
- **md-to-pdf** (v5.2.4): Markdown to PDF conversion using headless Chrome
- **tsx** (v4.20.6): TypeScript execution for development
- **typescript** (v5.9.3): TypeScript compiler
- **eslint** (v9.37.0): Code quality and style enforcement
### Troubleshooting
#### Common Issues
**Issue**: Puppeteer/Chrome installation fails
- **Solution**: Ensure you have sufficient disk space and network connectivity. Run `pnpx puppeteer browsers install chrome` manually.
**Issue**: PDF generation fails with "Protocol error"
- **Solution**: Chrome may need additional system dependencies. On Linux, install required libraries for headless Chrome.
**Issue**: Files not appearing in correct order
- **Solution**: Verify `data/order.json` matches the structure of your content directory names.
**Issue**: Out of memory errors
- **Solution**: The Application processes all content in memory. For very large datasets, consider increasing Node.js memory limit: `NODE_OPTIONS="--max-old-space-size=4096" pnpm start`
### Performance Considerations
- File processing is sequential for consistent ordering
- PDF generation uses headless Chrome, which is memory-intensive
- Typical generation time: 10-30 seconds depending on content volume
- Temporary markdown file is automatically cleaned up after PDF generation
### System Requirements
- **Memory**: Minimum 2GB RAM (4GB recommended)
- **CPU**: Modern multi-core processor recommended
- **Network**: Required for initial dependency installation
- **Storage**: 500MB minimum for dependencies and output
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### License
This software is licensed under Naomi's Public License. The full license text can be found at:
- Local: [LICENSE.md](LICENSE.md)
- Online: https://docs.nhcarrigan.com/#/license
Copyright is held by Naomi Carrigan.
### Privacy Policy
The Application processes markdown files locally and does not collect, store, or transmit any personal data. For information about privacy practices related to the project infrastructure (repository hosting, issue tracking, etc.), please refer to:
- Local: [PRIVACY.md](PRIVACY.md)
- Online: https://docs.nhcarrigan.com/#/privacy
### Terms of Service
By using this Application, you agree to the Terms of Service. The full terms can be found at:
- Local: [TERMS.md](TERMS.md)
- Online: https://docs.nhcarrigan.com/#/terms
### Security Policy
If you discover a security vulnerability in the Application, please follow the responsible disclosure process outlined in our Security Policy:
- Local: [SECURITY.md](SECURITY.md)
- Online: https://docs.nhcarrigan.com/#/security
### Content Attribution
The review content processed by this Application originates from freeCodeCamp.org and is subject to freeCodeCamp's licensing terms. This tool is an unofficial aggregator and is not endorsed by or affiliated with freeCodeCamp.org.
Users of the generated PDF should respect freeCodeCamp's intellectual property rights and use the content for personal educational purposes only.
### Disclaimer of Warranty
THE APPLICATION IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. THE MAINTAINERS MAKE NO WARRANTY THAT:
- The generated PDF will be error-free or complete
- The content will be current or up-to-date with the latest freeCodeCamp curriculum
- The Application will function without interruption
Users should always refer to the official freeCodeCamp website for the most accurate and current curriculum information.
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### Getting Started
We welcome contributions to the freeCodeCamp Review Generator! Before contributing, please review:
1. **Contributing Guidelines**: https://docs.nhcarrigan.com/#/contributing
- Local reference: [CONTRIBUTING.md](CONTRIBUTING.md)
2. **Code of Conduct**: https://docs.nhcarrigan.com/#/coc
- Local reference: [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)
### Ways to Contribute
#### 1. Report Bugs
If you encounter a bug, please open a GitHub issue with:
- Clear description of the problem
- Steps to reproduce
- Expected vs. actual behavior
- Your environment (OS, Node.js version, pnpm version)
- Any relevant error messages or logs
#### 2. Suggest Enhancements
We appreciate feature requests and enhancement suggestions! Please open a GitHub issue describing:
- The problem you're trying to solve
- Your proposed solution
- Any alternative approaches you've considered
- How this would benefit other users
#### 3. Submit Pull Requests
Ready to contribute code? Follow these steps:
1. **Fork and Clone**
```bash
git clone <your-fork-url>
cd fcc-review-generator
```
2. **Create a Branch**
```bash
git checkout -b feature/your-feature-name
```
3. **Make Changes**
- Follow existing code style and patterns
- Update relevant documentation
- Ensure TypeScript types are correct
- Test your changes thoroughly
4. **Run Quality Checks**
```bash
pnpm lint # Check code style
pnpm build # Ensure TypeScript compiles
pnpm start # Test PDF generation
```
5. **Commit Changes**
```bash
git add .
git commit -m "feat: description of your changes"
```
Follow conventional commit message format:
- `feat:` for new features
- `fix:` for bug fixes
- `docs:` for documentation changes
- `refactor:` for code refactoring
- `chore:` for maintenance tasks
6. **Push and Create PR**
```bash
git push origin feature/your-feature-name
```
Then open a Pull Request on GitHub with a clear description of your changes.
### Code Style Guidelines
- **TypeScript**: Use strict type checking; avoid `any` types
- **Formatting**: Follow the ESLint configuration (`@nhcarrigan/eslint-config`)
- **Naming**: Use descriptive variable and function names
- **Comments**: Include JSDoc comments for exported functions
- **Error Handling**: Use try-catch blocks and provide meaningful error messages
### Project Conventions
#### Copyright Headers
All source files should include the copyright header:
```typescript
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
```
#### File Organization
- Place configuration in `src/config/`
- Keep utility functions modular and focused
- Use ES modules (import/export)
- Maintain clear separation of concerns
#### TypeScript Configuration
The project uses strict TypeScript settings:
- `strict: true`
- Target: ES2022
- Module: ESNext
- No implicit any types
### Testing
Currently, the project does not have an automated test suite. Contributions that add testing infrastructure are welcome! Potential testing improvements:
- Unit tests for file processing functions
- Integration tests for PDF generation
- Snapshot tests for output consistency
- CI/CD pipeline integration
### Development Workflow
1. **Install dependencies**: `pnpm install`
2. **Make changes** to source files in `src/`
3. **Test locally**: `pnpm start` to verify PDF generation
4. **Check for errors**: `pnpm lint` and `pnpm build`
5. **Commit and push** your changes
6. **Create Pull Request** for review
### Review Process
Pull requests will be reviewed by project maintainers. The review process includes:
- Code quality and style verification
- Functionality testing
- Documentation completeness
- Alignment with project goals
Please be patient during the review process and be open to feedback and requested changes.
### Communication
For questions, discussions, or help with contributions:
- **GitHub Issues**: For bug reports and feature requests
- **Pull Requests**: For code contributions and discussions
- **Discord**: Join the community at http://chat.nhcarrigan.com
- **Email**: contact@nhcarrigan.com for private inquiries
### Recognition
All contributors will be recognized for their contributions. Significant contributions may result in being listed in a CONTRIBUTORS file or project documentation.
### License for Contributions
By contributing to this project, you agree that your contributions will be licensed under the same license as the project (Naomi's Public License). You confirm that:
- You have the right to submit the contribution
- Your contribution is your original work or properly attributed
- You understand the contribution will be publicly available
---
Thank you for your interest in contributing to the freeCodeCamp Review Generator! Your contributions help make this tool better for everyone in the learning community.
+38
View File
@@ -0,0 +1,38 @@
---
title: Hacksmiths
---
Hacksmiths (hereinafter the "Application") is an online programming-themed party game.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Isolda
---
Isolda (hereinafter the "Application") is a modern, sleek email client for the web or desktop
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+473
View File
@@ -0,0 +1,473 @@
---
title: Keiko
---
Keiko (hereinafter the "Application") is a private Discord bot that serves as Naomi's personal AI assistant, providing intelligent conversational assistance powered by Anthropic's Claude AI with integrated web search capabilities.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### 1.1. Getting Started
Keiko is available through Discord and can be interacted with in multiple ways:
- **Direct Messages (DM)**: Send a direct message to Keiko to start a private conversation
- **Guild/Server Messages**: Mention @Keiko in a server where the bot is present
- **Thread Messages**: Participate in threads created by Keiko
### 1.2. Access Requirements
- **Primary User**: Naomi (User ID: 465650873650118659) has full access to all features
- **Subscribers**: Other users require an active Discord entitlement (premium subscription) to interact with Keiko
- **Unauthorized Users**: Will receive a prompt to purchase a premium subscription
### 1.3. Available Commands
#### `/dm`
Reopens or initiates a direct message conversation with Keiko.
**Usage**: `/dm`
**Example**:
```
/dm
```
#### `/clear`
Clears the conversation history in the current channel or thread. This inserts a marker message that prevents Keiko from accessing previous messages in the conversation context.
**Usage**: `/clear`
**Example**:
```
/clear
```
### 1.4. Conversational Features
#### Message Handling
- Keiko maintains conversation context by reading the last 20 messages in the channel/thread
- Responses are automatically chunked into 2000-character segments for readability
- Keiko will show typing indicators while processing your request
- Multiple message chunks are delivered with a 2.5-second delay between them
#### Web Search Integration
- Keiko can search the web to provide up-to-date information
- Web search is automatically invoked when needed (up to 5 searches per request)
- Citations and sources are included in responses when available
#### Cost Display
- Each response includes token usage statistics
- Input and output token counts are displayed
- Estimated API costs are shown for transparency
### 1.5. Keiko's Personality
Keiko is designed with a calm, demure, and reserved personality. She conducts herself like a butler - always polite, respectful, and ready to serve. Her primary role is to provide clinical and unbiased information in response to requests, with an emphasis on including sources and links to confirm claims.
### 1.6. Getting Help
If you encounter any issues or need support:
- Visit the community server: [chat.nhcarrigan.com](https://chat.nhcarrigan.com)
- Open an issue on the GitHub repository
- Contact via email: contact@nhcarrigan.com
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### 2.1. Prerequisites
Before setting up Keiko, ensure you have the following:
- **Node.js**: Latest LTS version recommended
- **npm**: Package manager (comes with Node.js)
- **Discord Bot**: A registered Discord application with bot token
- **Anthropic API Key**: Access to Claude AI API
- **1Password CLI** (optional): For secure environment variable management
### 2.2. Technology Stack
- **Runtime**: Node.js with ES Modules
- **Language**: TypeScript 5.9.3
- **Discord Framework**: discord.js v14.23.2
- **AI Integration**: @anthropic-ai/sdk v0.65.0
- **Web Server**: Fastify v5.6.1
- **Logging**: @nhcarrigan/logger v1.1.1
- **Analytics**: @nhcarrigan/discord-analytics v0.0.6
### 2.3. Installation
1. **Clone the repository**:
```bash
git clone <repository-url>
cd keiko
```
2. **Install dependencies**:
```bash
npm install
```
3. **Configure environment variables**:
Create a `prod.env` file in the root directory with the following variables:
```env
DISCORD_TOKEN=your_discord_bot_token
AI_TOKEN=your_anthropic_api_key
LOG_TOKEN=your_logging_token (optional)
```
Alternatively, you can set these as system environment variables.
### 2.4. Configuration
#### Discord Bot Setup
1. Create a Discord application at [Discord Developer Portal](https://discord.com/developers/applications)
2. Enable the following Gateway Intents:
- DirectMessages
- MessageContent
- GuildMessages
- Guilds
3. Generate a bot token and add it to your environment configuration
4. Invite the bot to your server with appropriate permissions
#### AI Configuration
The AI model configuration is set in the codebase (src/modules/makeAiRequest.ts:29):
- **Model**: claude-sonnet-4-5-20250929
- **Max Tokens**: 3000
- **Temperature**: 1
- **Web Search**: Enabled (max 5 uses per request)
#### Personality Customization
Edit `src/config/personality.ts` to customize Keiko's personality and behavior.
#### User Authorization
Update `src/utils/isNaomi.ts:15` to configure authorized user IDs and SKU IDs for subscription management.
### 2.5. Building the Application
Compile TypeScript to JavaScript:
```bash
npm run build
```
This will:
- Remove the existing `prod` directory
- Compile TypeScript files to the `prod` directory
### 2.6. Running the Application
#### With 1Password CLI:
```bash
npm start
```
This uses 1Password CLI to inject environment variables from `prod.env`.
#### Without 1Password CLI:
```bash
node prod/index.js
```
Ensure environment variables are set in your system before running.
### 2.7. Development
#### Linting
Run ESLint to check code quality:
```bash
npm run lint
```
#### Testing
Currently, tests are not implemented:
```bash
npm test
```
### 2.8. Project Structure
```
keiko/
├── src/
│ ├── commands/ # Slash command definitions
│ │ ├── clear.ts # Clear history command
│ │ └── dm.ts # DM command
│ ├── config/ # Configuration files
│ │ └── personality.ts # AI personality definition
│ ├── events/ # Discord event handlers
│ │ ├── handleDmMessage.ts
│ │ ├── handleGuildMessage.ts
│ │ ├── handleThreadMessage.ts
│ │ └── onMessage.ts
│ ├── modules/ # Core business logic
│ │ ├── clear.ts # Clear command logic
│ │ ├── dm.ts # DM command logic
│ │ ├── makeAiRequest.ts # AI request handler
│ │ └── sendAiResponse.ts # Response chunking
│ ├── server/ # Web server
│ │ └── serve.ts # Fastify health check server
│ ├── utils/ # Utility functions
│ │ ├── ai.ts # Anthropic client
│ │ ├── calculateCost.ts
│ │ ├── isNaomi.ts # Authorization
│ │ ├── logger.ts
│ │ ├── replyToError.ts
│ │ └── sleep.ts
│ └── index.ts # Main entry point
├── prod/ # Compiled JavaScript (generated)
├── package.json
├── tsconfig.json
├── prod.env # Environment variables
└── LICENSE.md
```
### 2.9. Monitoring and Health Checks
Keiko runs a Fastify web server on port 3333 that provides:
- Health check endpoint at `GET /`
- Basic bot information page
- Uptime monitoring capability
### 2.10. Error Handling
The application includes:
- Global unhandled rejection handler
- Global uncaught exception handler
- User-facing error messages with support links
- Comprehensive logging via @nhcarrigan/logger
### 2.11. Analytics
Discord analytics are tracked for:
- Direct messages
- Guild messages
- Thread messages
- Token usage and API costs per interaction
### 2.12. Deployment
**Recommended Environment**:
- Linux server (tested on Arch Linux 6.17.5-arch1-1)
- Node.js runtime
- Process manager (e.g., PM2, systemd)
**Deployment Steps**:
1. Clone and configure the repository
2. Build the application
3. Set up environment variables
4. Run with a process manager for reliability
5. Configure monitoring for the health check endpoint (port 3333)
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### 3.1. License
This software is licensed under [Naomi's Public License](https://docs.nhcarrigan.com/#/license).
Copyright held by Naomi Carrigan.
### 3.2. Privacy and Data Handling
#### Data Collection
Keiko collects and processes the following data:
- Discord user IDs for authorization
- Message content for conversation context (last 20 messages)
- Discord entitlement information for subscription management
- Analytics data (message counts, token usage, API costs)
#### Data Retention
- **Conversation History**: Stored temporarily in memory during active sessions
- **Message Context**: Fetched on-demand from Discord's API (last 20 messages)
- **No Persistent Storage**: Keiko does not maintain a traditional database
#### Third-Party Services
Keiko integrates with:
- **Discord**: For bot functionality and message delivery
- **Anthropic**: For AI-powered responses (Claude AI)
- **Web Search Services**: For retrieving up-to-date information
User messages and conversation context are sent to these services for processing.
### 3.3. Terms of Use
#### Authorized Use
- Keiko is a private assistant primarily designed for Naomi's personal use
- Subscription-based access is available for authorized users
- Unauthorized access attempts will be rejected
#### Service Availability
- The Application is provided "as is" without warranties
- Service availability is not guaranteed
- Features and functionality may change without notice
#### Acceptable Use
Users must:
- Comply with Discord's Terms of Service
- Use the bot for lawful purposes only
- Respect the bot's intended functionality
- Not attempt to abuse, exploit, or reverse engineer the service
### 3.4. API Usage and Costs
- AI interactions incur costs via the Anthropic API
- Token usage and costs are displayed transparently to users
- Excessive usage may be rate-limited or restricted
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### 4.1. How to Contribute
We welcome contributions to Keiko! Here's how you can help:
1. **Fork the repository** on GitHub
2. **Create a feature branch** for your changes
3. **Make your changes** following our coding standards
4. **Test your changes** thoroughly
5. **Submit a Pull Request** with a clear description of your changes
### 4.2. Contributing Guidelines
Please review our comprehensive contributing guidelines:
[Contributing Guidelines](https://docs.nhcarrigan.com/#/contributing)
### 4.3. Code of Conduct
Before interacting with our community, please read our Code of Conduct:
[Code of Conduct](https://docs.nhcarrigan.com/#/coc)
### 4.4. Development Setup
1. **Clone the repository**:
```bash
git clone <repository-url>
cd keiko
```
2. **Install dependencies**:
```bash
npm install
```
3. **Set up environment variables** (see Technical Documentation section)
4. **Run the linter**:
```bash
npm run lint
```
5. **Build the project**:
```bash
npm run build
```
### 4.5. Coding Standards
- **Language**: TypeScript
- **Module System**: ES Modules
- **Linting**: ESLint with @nhcarrigan/eslint-config
- **Type Checking**: Strict TypeScript configuration
- **Code Style**: Follow existing patterns in the codebase
### 4.6. Pull Request Guidelines
When submitting a Pull Request:
- **Clear Description**: Explain what your changes do and why
- **Reference Issues**: Link to any related issues
- **Test Your Changes**: Ensure the bot builds and runs correctly
- **Follow Conventions**: Match the existing code style
- **Small, Focused Changes**: Keep PRs focused on a single feature or fix
### 4.7. Areas for Contribution
Potential areas where contributions are welcome:
- **Testing**: Implement unit and integration tests
- **Documentation**: Improve or expand documentation
- **Features**: Add new commands or capabilities
- **Bug Fixes**: Fix reported issues
- **Performance**: Optimize existing functionality
- **Error Handling**: Improve error messages and handling
### 4.8. Reporting Issues
If you find a bug or have a feature request:
1. **Check existing issues** to avoid duplicates
2. **Create a detailed issue** with:
- Clear title
- Description of the problem or feature
- Steps to reproduce (for bugs)
- Expected vs actual behavior
- Environment details (if applicable)
### 4.9. Getting Help
Need help contributing?
- Join our community: [chat.nhcarrigan.com](https://chat.nhcarrigan.com)
- Email: contact@nhcarrigan.com
- Check the documentation: [docs.nhcarrigan.com](https://docs.nhcarrigan.com)
### 4.10. Recognition
Contributors will be:
- Acknowledged in Pull Request comments
- Listed in project contributors (if applicable)
- Appreciated for their time and effort!
## Appendix
### A.1. Key File References
- **Main Entry Point**: src/index.ts:1
- **AI Request Handler**: src/modules/makeAiRequest.ts:29
- **Authorization Logic**: src/utils/isNaomi.ts:15
- **Personality Configuration**: src/config/personality.ts:11
- **Message Router**: src/events/onMessage.ts:1
### A.2. Important Constants
- **Bot ID**: 1425897287065800785
- **Naomi's User ID**: 465650873650118659
- **SKU ID**: 1425905043244060762
- **Health Check Port**: 3333
- **Max Context Messages**: 20
- **Max AI Tokens**: 3000
- **Message Chunk Size**: 2000 characters
- **Chunk Delay**: 2.5 seconds
### A.3. External Resources
- **Community**: https://chat.nhcarrigan.com
- **Documentation**: https://docs.nhcarrigan.com
- **License**: https://docs.nhcarrigan.com/#/license
- **Contributing**: https://docs.nhcarrigan.com/#/contributing
- **Code of Conduct**: https://docs.nhcarrigan.com/#/coc
- **Contact Email**: contact@nhcarrigan.com
@@ -0,0 +1,95 @@
---
title: Life of a Naomi
---
Life of a Naomi (hereinafter the "Game") is a quick game that introduces who Naomi is, and provides a glimpse into her life.
## 1. Player Documentation
This section is for players who are exploring or playing the Game.
### Controls
- **Keyboard / Gamepad:**
- Arrow keys / D-Pad: Move character
- Z / Enter / A: Confirm / Interact
- X / Esc / B: Cancel / Menu
- C / Space / Y: Open menu (if applicable)
- Shift / L / R: Dash (if enabled)
- **Touch UI (Mobile / Tablet):**
- Tap to move or interact
- On-screen buttons for menu and actions
### Troubleshooting
- Ensure your device meets RPG Maker MZ requirements.
- If the game crashes, try restarting the app or clearing temporary files.
- Ask us on discord if persistent issues occur.
---
## 2. Developer Documentation
This section is for those interested in running, modifying, or extending the Game.
### Engine & Dependencies
- **Engine:** RPG Maker MZ
- **Plugins Used:** none
- **Assets:** All original
### Setup Instructions
1. Open RPG Maker MZ.
2. Load the project folder `life-of-a-naomi`.
3. Use the "Playtest" button to run the Game locally.
4. To export, use the "Deployment" feature for target platforms.
### Directory Structure
- `data/` — database files (maps, events, actors, items, skills, etc.)
- `img/` — graphics (characters, tilesets, animations, pictures, etc.)
- `audio/` — music and sound effects
- `js/` — plugins and core scripts
- `www/` — exported HTML5 build (if deployed for web)
---
## 3. Legal Documentation
This section expands on legal or licensing information specific to the Game.
### Licensing
This Game is created using RPG Maker MZ. The game code and original content are the property of NHCarrigan. RPG Maker MZ runtime assets are licensed under the terms provided by KADOKAWA Corporation. All original graphics, music, and story content belong to NHCarrigan and are protected by copyright.
### Third-Party Notices
- Any third-party assets, music, or plugins included are credited in game.
## 4. Contributing Documentation
This section is for contributors or collaborators on the Game.
### How to Contribute
- Fork or copy the project folder.
- Submit patches or mods via Git.
- Include a changelog and clear notes on modifications.
### Coding Standards
- Plugins in `js/plugins/` should follow standard JS conventions.
- Comment custom scripts clearly for readability.
### Art & Audio Guidelines
- Maintain original resolutions where possible (48x48 tiles, etc.).
- Use consistent naming for files in `img/` and `audio/`.
### Contact
- For collaboration or questions, ask us on discord.
+624
View File
@@ -0,0 +1,624 @@
---
title: Liora
---
Liora (hereinafter the "Application") is a Discord bot that provides a "highlight words" notification system for Discord servers. The Application monitors messages in Discord servers and sends direct messages (DMs) to users when specific words or phrases they've configured are mentioned, bringing IRC-style highlight/ping functionality to Discord.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### 1.1 Getting Started
To use Liora in your Discord server, you'll need to:
1. **Add the bot to your server**: Visit the [invite link](https://discord.com/oauth2/authorize?client_id=1391492296222179459)
2. **Subscribe to premium**: A server administrator must purchase a server subscription from the Discord store, unless your server is whitelisted
3. **Enable DMs**: Ensure you have direct messages enabled from server members to receive notifications
### 1.2 Available Commands
The Application provides the following slash commands:
#### `/about`
Displays information about Liora, including what it does and how to get help.
#### `/add <word>`
Adds a word or phrase to your highlight list for the current server.
- **Parameters**:
- `word` (required): The word or phrase to monitor
- **Limitations**: Maximum of 10 highlights per user per server
- **Behaviour**: Case-insensitive matching
**Example**: `/add typescript` will notify you whenever someone mentions "TypeScript", "typescript", or "TYPESCRIPT"
#### `/remove <word>`
Removes a word or phrase from your highlight list for the current server.
- **Parameters**:
- `word` (required): The word or phrase to remove from monitoring
**Example**: `/remove typescript`
#### `/list`
Displays all your configured highlight words for the current server.
#### `/dm`
Tests whether the bot can send you direct messages. Use this command if you're not receiving notifications to verify your DM settings are correct.
### 1.3 Notification Format
When a message contains one of your highlight words, you'll receive a DM containing:
- Which word(s) were matched
- The server name where the message was sent
- The display name of the user who sent the message
- A direct link to the original message
- Action buttons:
- **Jump to Message**: Opens the message in Discord
- **Discord Server**: Links to the support server
- **Forum**: Links to the support forum
### 1.4 Important Notes
- You will **not** receive notifications for messages you send yourself
- Highlight matching is **case-insensitive** (e.g., "discord" matches "Discord", "DISCORD", etc.)
- Highlights are **server-specific** - each server has its own separate list
- The bot requires the ability to send you DMs - check your privacy settings if notifications aren't working
### 1.5 Support and Feedback
If you need assistance or want to report a bug:
- **Discord Server**: [chat.nhcarrigan.com](https://chat.nhcarrigan.com)
- **Forum**: [forum.nhcarrigan.com](https://forum.nhcarrigan.com)
- **Email**: contact@nhcarrigan.com
- **GitHub Issues**: Open an issue on the repository
### 1.6 Subscription Information
The Application uses Discord's premium subscription system. Server administrators can purchase a subscription to enable the bot for all members. Two servers are currently whitelisted for free access (Naomi's server and FreeCodeCamp).
**Premium SKU ID**: 1396962587471515769
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### 2.1 System Requirements
- **Node.js**: v22 or higher
- **Package Manager**: pnpm 10.13.1 or higher
- **Database**: MongoDB instance
- **Discord**: Bot token from Discord Developer Portal
- **1Password CLI** (optional): For secure environment variable management
### 2.2 Technology Stack
#### Core Technologies
- **Runtime**: Node.js v22
- **Language**: TypeScript 5.8.3
- **Package Manager**: pnpm 10.13.1
#### Main Dependencies
- **discord.js** (v14.21.0): Discord API interaction and bot framework
- **@prisma/client** (v6.12.0): Database ORM for MongoDB
- **fastify** (v5.4.0): Lightweight HTTP server for health monitoring
- **@nhcarrigan/discord-analytics** (v0.0.6): Analytics tracking
- **@nhcarrigan/logger** (v1.1.1): Logging utility
#### Development Tools
- **ESLint** (v9.31.0): Code linting with @nhcarrigan/eslint-config
- **Prisma** (v6.12.0): Database schema management
- **TypeScript**: Type safety and compilation
### 2.3 Architecture Overview
The Application follows an event-driven architecture:
```
src/
├── index.ts # Application entry point
├── commands/ # Slash command handlers
│ ├── about.ts
│ ├── add.ts
│ ├── remove.ts
│ ├── list.ts
│ └── dm.ts
├── events/ # Discord event handlers
│ ├── interactionCreate.ts # Command routing
│ └── messageCreate.ts # Message monitoring (core logic)
├── interfaces/ # TypeScript type definitions
│ ├── liora.ts # Main bot interface
│ └── command.ts # Command type definition
├── utils/ # Utility functions
│ ├── checkEntitlement.ts # Subscription validation
│ ├── errorHandler.ts # Error logging with UUIDs
│ └── logger.ts # Logger configuration
├── modules/ # Business logic
│ └── sendUnentitledResponse.ts
├── config/ # Configuration
│ └── entitlements.ts # Whitelisted guild IDs
└── server/ # HTTP server
└── serve.ts # Health monitoring endpoint
```
#### Key Components
**Entry Point** (`src/index.ts`):
- Initializes Prisma database client
- Creates Discord bot with required intents (Guilds, GuildMessages, MessageContent)
- Sets up event listeners
- Starts analytics cron job
- Launches Fastify web server on port 5022
**Message Processing** (`src/events/messageCreate.ts`):
- Validates guild entitlement/subscription
- Queries database for all highlights in the server
- Performs case-insensitive matching against message content
- Sends DM notifications with formatted components
- Logs metrics for analytics
**Command Handlers**:
All commands use Discord's Components V2 API with ContainerBuilder and TextDisplayBuilder for rich formatting.
### 2.4 Database Schema
The Application uses MongoDB with Prisma ORM:
```prisma
model Highlights {
id String @id @default(auto()) @map("_id") @db.ObjectId
serverId String # Discord guild ID
userId String # Discord user ID
words String[] # Array of highlight words
@@unique([serverId, userId])
@@index([serverId])
}
```
- Each user can have one document per server
- The unique constraint ensures no duplicate user-server combinations
- The server ID is indexed for efficient queries when processing messages
### 2.5 Installation and Setup
#### Step 1: Clone the Repository
```bash
git clone https://git.nhcarrigan.com/nhcarrigan/liora.git
cd liora
```
#### Step 2: Install Dependencies
```bash
pnpm install
```
#### Step 3: Configure Environment Variables
Create a `prod.env` file with the following variables:
```env
DISCORD_TOKEN=your_discord_bot_token
MONGO_URI=your_mongodb_connection_string
LOG_TOKEN=your_logging_service_token
```
**Discord Bot Setup**:
1. Visit [Discord Developer Portal](https://discord.com/developers/applications)
2. Create a new application
3. Navigate to the "Bot" section and create a bot
4. Enable these Privileged Gateway Intents:
- Server Members Intent (GUILDS)
- Message Content Intent (MESSAGE_CONTENT)
5. Copy the bot token to your environment file
**MongoDB Setup**:
- Provide a MongoDB connection URI in the format: `mongodb://user:password@host:port/database`
- Alternatively, use MongoDB Atlas for a cloud-hosted solution
#### Step 4: Generate Prisma Client
```bash
pnpm run build
```
This command runs `prisma generate && tsc`, which:
- Generates the Prisma client from the schema
- Compiles TypeScript to the `./prod` directory
#### Step 5: Register Discord Commands
Use the `commandJson.js` file to register slash commands with Discord:
```bash
node commandJson.js
```
Then use the output to register commands via Discord's API or developer portal.
#### Step 6: Start the Application
**With 1Password CLI**:
```bash
pnpm run start
```
**Without 1Password CLI**:
```bash
node ./prod/index.js
```
The Application will:
- Connect to MongoDB
- Log in to Discord
- Start the web server on port 5022
- Begin monitoring messages
### 2.6 Development Workflow
#### Linting
```bash
pnpm run lint
```
Uses ESLint with @nhcarrigan/eslint-config.
#### Building
```bash
pnpm run build
```
Generates Prisma client and compiles TypeScript.
#### Running Tests
```bash
pnpm test
```
Currently returns a placeholder. Test implementation is pending.
### 2.7 Continuous Integration
The repository includes a Gitea Actions workflow (`.gitea/workflows/ci.yml`) that:
- Runs on push and pull requests to the main branch
- Executes linting with ESLint
- Verifies TypeScript compilation
- Runs tests
### 2.8 Configuration
#### Whitelisted Guilds
Two Discord servers have free access without subscriptions, configured in `src/config/entitlements.ts`. To modify:
1. Edit `src/config/entitlements.ts`
2. Add guild IDs to the whitelist array
3. Rebuild the application
#### Subscription SKU
The premium subscription SKU is defined in `src/utils/checkEntitlement.ts`. To use your own subscription:
1. Create a subscription in Discord's Developer Portal
2. Update the SKU ID in the entitlement check logic
3. Rebuild the application
### 2.9 Deployment
#### Web Server
The Application includes a Fastify web server that:
- Listens on port 5022
- Serves a landing page at `/`
- Provides information about the bot
- Includes an "Add to Discord" button
- Useful for health checks and monitoring
#### Production Deployment Checklist
1. Ensure all environment variables are configured
2. Build the application with `pnpm run build`
3. Set up process management (PM2, systemd, Docker, etc.)
4. Configure reverse proxy if exposing the web server
5. Set up MongoDB backups
6. Monitor logs via the configured logging service
7. Register Discord commands before starting the bot
#### Health Monitoring
The web server on port 5022 can be used for health checks. A simple GET request to `/` will return the landing page HTML if the service is running.
### 2.10 Analytics
The Application integrates with a custom analytics service (@nhcarrigan/discord-analytics):
- **Tracked Metrics**:
- `highlight_triggered`: Logged when a highlight word is matched
- Gateway events (connection, ready, etc.)
- **Metadata**: Includes server ID, user ID, and matched words
- **Authentication**: Requires LOG_TOKEN environment variable
### 2.11 API Endpoints
The Fastify web server exposes:
- `GET /`: Landing page with bot information and "Add to Discord" link
### 2.12 Security Considerations
- **Message Content Intent**: The bot requires access to read all message content in subscribed guilds. This is a privileged intent and should be handled responsibly.
- **Environment Variables**: Use secure methods to manage secrets (1Password CLI, environment variable management services, etc.)
- **DM Privacy**: The bot only sends DMs when highlights are triggered; it does not store message content
- **Entitlement Validation**: All commands and message processing verify subscription status to prevent unauthorized usage
### 2.13 Troubleshooting
#### Bot Not Responding to Commands
- Verify the bot has appropriate permissions in the server
- Check that commands are registered with Discord's API
- Ensure the bot is online and connected
#### DMs Not Being Sent
- Verify users have DMs enabled from server members
- Check that the bot has permission to send DMs
- Use the `/dm` command to test DM functionality
#### Database Connection Issues
- Verify MongoDB connection string format
- Ensure MongoDB instance is accessible from the application
- Check Prisma client is generated (`pnpm run build`)
#### Analytics Not Working
- Verify LOG_TOKEN is correctly configured
- Check analytics service is reachable
- Review application logs for errors
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### 3.1 License
This software is licensed under [Naomi's Public License](https://docs.nhcarrigan.com/#/license).
Copyright held by Naomi Carrigan.
### 3.2 Data Collection and Privacy
The Application collects and stores the following data:
- **Discord User IDs**: To identify which users should receive notifications
- **Discord Server IDs**: To associate highlights with specific servers
- **Highlight Words**: The words/phrases users choose to monitor
- **Analytics Metrics**: Anonymous usage statistics (highlight triggers, command usage)
**Data Usage**:
- User data is used solely to provide the highlight notification functionality
- Analytics data is used to improve the Application
- No message content is stored permanently
- Data is stored in a MongoDB database
**Data Retention**:
- Highlight data is retained until manually removed by users via the `/remove` command
- Users can view all their stored data via the `/list` command
**Third-Party Services**:
- Discord API: Required for bot functionality
- MongoDB: Database hosting
- Custom Analytics Service: Usage metrics tracking
### 3.3 Terms of Service
By using the Application, you agree to:
- Use the Application in accordance with Discord's Terms of Service
- Not abuse the highlight system to spam or harass other users
- Accept that the service is provided "as is" without warranties
- Understand that subscription fees are non-refundable per Discord's policies
### 3.4 Acceptable Use
Users must not:
- Use the Application to harass or spam other users
- Attempt to circumvent subscription requirements
- Exploit bugs or vulnerabilities in the Application
- Use the Application for any illegal purposes
### 3.5 Subscription Terms
- Subscriptions are managed through Discord's subscription system
- Pricing and billing are handled by Discord
- Subscriptions are server-specific (per-guild)
- Two servers are currently whitelisted for free access
- Subscription status is validated before processing commands and notifications
### 3.6 Liability
The Application maintainers are not liable for:
- Missed notifications due to Discord API issues or user configuration
- Data loss due to database failures or user error
- Service interruptions or downtime
- Actions taken by users based on notifications received
### 3.7 Contact for Legal Inquiries
For legal questions or concerns:
- **Email**: contact@nhcarrigan.com
- **Discord**: [chat.nhcarrigan.com](https://chat.nhcarrigan.com)
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### 4.1 Contributing Guidelines
Our comprehensive contributing guidelines can be found at: [https://docs.nhcarrigan.com/#/contributing](https://docs.nhcarrigan.com/#/contributing)
### 4.2 Code of Conduct
Before interacting with our community, please review our Code of Conduct: [https://docs.nhcarrigan.com/#/coc](https://docs.nhcarrigan.com/#/coc)
### 4.3 How to Contribute
#### Reporting Bugs
If you encounter a bug:
1. Check existing GitHub issues to avoid duplicates
2. Create a new issue with:
- Clear description of the bug
- Steps to reproduce
- Expected vs. actual behavior
- Environment details (Node.js version, OS, etc.)
- Error logs or screenshots if applicable
#### Suggesting Features
For feature requests:
1. Open a GitHub issue with the "feature request" label
2. Describe the feature and its use case
3. Explain why it would benefit users
4. Be open to discussion and feedback
#### Submitting Pull Requests
To contribute code:
1. **Fork the repository** on Gitea or GitHub
2. **Create a feature branch**: `git checkout -b feature/your-feature-name`
3. **Make your changes**:
- Follow the existing code style
- Add comments for complex logic
- Update documentation if needed
4. **Test your changes**:
- Ensure the application builds: `pnpm run build`
- Run linting: `pnpm run lint`
- Test functionality locally
5. **Commit your changes**:
- Use clear, descriptive commit messages
- Reference related issues if applicable
6. **Push to your fork**: `git push origin feature/your-feature-name`
7. **Open a Pull Request**:
- Describe what changes were made and why
- Link to related issues
- Wait for review and address feedback
### 4.4 Development Setup
Follow the steps in Section 2.5 (Installation and Setup) to set up your development environment.
**Additional Development Tips**:
- Use TypeScript strict mode for type safety
- Follow the ESLint configuration for consistent code style
- Test commands in a development Discord server before submitting
- Use meaningful variable and function names
- Add JSDoc comments for public functions and interfaces
### 4.5 Code Style Guidelines
The Application uses:
- **@nhcarrigan/eslint-config**: ESLint configuration for consistent style
- **@nhcarrigan/typescript-config**: TypeScript configuration
- **Prettier-compatible formatting**: Enforced via ESLint
Key conventions:
- **File naming**: camelCase for TypeScript files
- **Function naming**: camelCase for functions, PascalCase for classes/interfaces
- **Indentation**: 2 spaces
- **Quotes**: Double quotes for strings
- **Semicolons**: Required
- **Max line length**: Enforced by ESLint (exceptions allowed for long strings)
### 4.6 Project Structure Guidelines
When adding new features:
- **Commands**: Add to `src/commands/` directory
- **Events**: Add to `src/events/` directory
- **Utilities**: Add to `src/utils/` directory
- **Business Logic**: Add to `src/modules/` directory
- **Type Definitions**: Add to `src/interfaces/` directory
### 4.7 Testing Guidelines
Currently, the Application does not have automated tests. Contributions to add testing infrastructure are welcome!
**Manual Testing Checklist**:
- Test all commands in a Discord server
- Verify highlight matching works correctly
- Test edge cases (max highlights, special characters, etc.)
- Verify DM notifications are sent properly
- Test subscription validation
- Check error handling
### 4.8 Documentation Contributions
Documentation improvements are highly valued! You can contribute by:
- Fixing typos or unclear explanations
- Adding examples or use cases
- Improving setup instructions
- Translating documentation (if applicable)
- Adding diagrams or visual aids
### 4.9 Community Involvement
Join our community:
- **Discord Server**: [chat.nhcarrigan.com](https://chat.nhcarrigan.com) - Ask questions, discuss features
- **Forum**: [forum.nhcarrigan.com](https://forum.nhcarrigan.com) - Long-form discussions and support
- **GitHub Issues**: Track bugs and feature requests
### 4.10 Recognition
Contributors will be recognized in:
- Git commit history
- Release notes for significant contributions
- The community Discord server
### 4.11 Getting Help
If you need help while contributing:
- Ask in the Discord server (#development or #support channels)
- Post on the forum for detailed questions
- Comment on the relevant GitHub issue or pull request
- Email: contact@nhcarrigan.com
### 4.12 Release Process
The Application follows semantic versioning (SemVer):
- **Major versions** (X.0.0): Breaking changes
- **Minor versions** (0.X.0): New features, backward compatible
- **Patch versions** (0.0.X): Bug fixes, backward compatible
**Current Version**: v1.0.0 (as of latest commit: ba5987e)
Releases are managed by the maintainers. Contributors should focus on feature branches and pull requests rather than version bumping.
---
**Additional Resources**:
- **Live Bot**: [Add to Discord](https://discord.com/oauth2/authorize?client_id=1391492296222179459)
- **Source Code**: [Gitea Repository](https://git.nhcarrigan.com/nhcarrigan/liora)
- **Documentation Hub**: [docs.nhcarrigan.com](https://docs.nhcarrigan.com)
- **Support Server**: [chat.nhcarrigan.com](https://chat.nhcarrigan.com)
- **Support Forum**: [forum.nhcarrigan.com](https://forum.nhcarrigan.com)
- **Contact Email**: contact@nhcarrigan.com
+2 -2
View File
@@ -1,8 +1,8 @@
--- ---
title: "@nhcarrigan/logger" title: "Logger"
--- ---
@nhcarrigan/logger (hereinafter the "Application") is a custom logging utility that provides a wrapper around a custom alert monitoring server, enabling applications to pipe errors and log messages to a centralized alerting system. Logger (hereinafter the "Application") is a custom logging utility that provides a wrapper around a custom alert monitoring server, enabling applications to pipe errors and log messages to a centralized alerting system.
## 1. User Documentation ## 1. User Documentation
+38
View File
@@ -0,0 +1,38 @@
---
title: Lucinda
---
Lucinda (hereinafter the "Application") is a kanban-style task management site.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Lyra
---
Lyra (hereinafter the "Application") is a web-based API mocking tool, allowing you to create temporary endpoints for a front-end to hit, test webhook payloads, and more!
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Maribelle
---
Maribelle (hereinafter the "Application") is a Discord bot that allows you to configure daily progress huddle reminders for your server members.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
@@ -0,0 +1,422 @@
---
title: Meeting Minutes
---
Meeting Minutes (hereinafter the "Application") is a local, offline meeting recording, transcription, and summarization tool designed to protect user data privacy by processing all audio and text entirely on the user's machine without any external services or cloud processing.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### Overview
The Application automates the process of capturing, transcribing, and summarizing meeting audio. It operates entirely offline to ensure complete data privacy and confidentiality of your meeting discussions.
### Features
- **Audio Recording**: Captures meeting audio from your system's default audio input/output mix
- **Speech-to-Text Transcription**: Converts recorded audio to text using WhisperX (OpenAI's Whisper model)
- **AI Summarization**: Generates concise meeting summaries with key decisions, action items, and discussion points using a local LLM
- **Speaker Diarization** (Optional): Identifies and labels different speakers in the meeting
- **Complete Privacy**: All processing happens locally on your machine with no data transmission to external services
### How to Use
1. **Configure the meeting**: Edit the configuration section in `main.py`:
- `WHISPER_MODEL`: Speech recognition model size (default: "small.en")
- `DURATION`: Maximum recording duration in seconds (default: 36000 = 10 hours)
2. **Start recording**: Uncomment the `record_audio()` call in the main execution block to enable live recording, or place a pre-recorded `.wav` file in the project directory
3. **Run the application**: Execute `uvx python@3.12 main.py`
4. **Review output**: The Application generates:
- A JSON transcript file containing the full transcription with timestamps
- A text summary file containing the meeting summary, key decisions, action items, and discussion points
### Output Format
**Transcript** (`meeting_audio_[timestamp].json`): Contains:
- Full transcript text
- Segment-level timing information
- Speaker labels (if diarization is enabled)
**Summary** (`summary_[timestamp].txt`): Contains:
- Concise narrative summary of the meeting
- Key decisions made
- Action items identified
- Notable discussion points
### Keyboard Controls
- Press `q` during recording to stop early (when using the record_audio function)
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### System Requirements
- **Operating System**: Linux (default), Windows, or macOS with appropriate audio input configuration
- **Python**: Version 3.12 or compatible
- **Audio System**: PulseAudio (Linux) or equivalent audio framework
- **Disk Space**: Sufficient space for audio files and model storage (~2-5 GB for models)
- **Memory**: Minimum 8GB RAM recommended for local LLM processing
### Dependencies
The Application requires the following external tools:
1. **FFmpeg**: For audio recording and processing
2. **WhisperX**: For speech-to-text transcription
3. **Ollama**: For local LLM-based summarization with llama3:8b model
4. **uv**: Python package and environment manager
### Installation
#### Step 1: Install Ollama
Download and install Ollama from https://ollama.ai, then pull the required model:
```bash
ollama pull llama3:8b
```
#### Step 2: Install uv
Follow the installation instructions at https://docs.astral.sh/uv/
#### Step 3: Install WhisperX
```bash
uvx python@3.12 whisperx
```
#### Step 4: Install FFmpeg
**Linux (Debian/Ubuntu):**
```bash
sudo apt-get install ffmpeg
```
**macOS:**
```bash
brew install ffmpeg
```
**Windows:**
Download from https://ffmpeg.org/download.html
#### Step 5: Clone the Repository
```bash
git clone [repository-url]
cd meeting-minutes
```
### Configuration
Edit `main.py` to configure the Application (lines 5-13):
```python
TIMESTAMP = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") # Uncomment for dynamic timestamps
MEETING_FILE = f"meeting_audio_{TIMESTAMP}.wav"
WHISPER_MODEL = "small.en" # Options: tiny.en, base.en, small.en, medium.en, large
DURATION = 36000 # Recording duration in seconds
OUTPUT_TRANSCRIPT = f"meeting_audio_{TIMESTAMP}.json"
OUTPUT_SUMMARY = f"summary_{TIMESTAMP}.txt"
```
#### Audio Input Configuration
By default, the Application uses PulseAudio (Linux). For other platforms:
**macOS:**
```python
"-f", "avfoundation", # Replace line 19
"-i", ":0", # Replace line 20 (use appropriate device index)
```
**Windows:**
```python
"-f", "dshow", # Replace line 19
"-i", "audio=DEVICE_NAME", # Replace line 20 (use your audio device name)
```
List available devices:
```bash
ffmpeg -list_devices true -f [dshow|avfoundation] -i dummy
```
### Optional: Speaker Diarization
Speaker diarization allows the Application to identify and label different speakers in the meeting.
#### Setup
1. Create a Hugging Face account at https://huggingface.co
2. Accept terms for these models:
- https://huggingface.co/pyannote/segmentation-3.0
- https://huggingface.co/pyannote/speaker-diarization-3.1
3. Generate a Hugging Face token with read permissions
4. Add the token to the WhisperX command in `transcribe_audio()` function (main.py:27-37):
```python
subprocess.run([
"whisper",
MEETING_FILE,
"--device", "cpu",
"--language", "en",
"--model", WHISPER_MODEL,
"--output_format", "json",
"--output_dir", ".",
"--hf_token", "YOUR_HF_TOKEN_HERE", # Add this line
], check=True)
```
After the first successful run, you can remove the token from the code.
### Running the Application
#### With Live Recording
1. Uncomment line 84 in `main.py`:
```python
record_audio()
```
2. Run the application:
```bash
uvx python@3.12 main.py
```
#### With Pre-recorded Audio
1. Ensure line 84 remains commented out
2. Place your `.wav` file in the project directory
3. Update the `TIMESTAMP` variable to match your file name
4. Run:
```bash
uvx python@3.12 main.py
```
### Architecture
The Application follows a linear pipeline architecture:
```
Audio Input → Recording (FFmpeg) → Transcription (WhisperX) → Summarization (Ollama) → Cleanup
```
#### Component Details
**Recording Module** (`record_audio()` - main.py:15-25):
- Uses FFmpeg to capture system audio
- Supports configurable duration and audio quality
- Outputs WAV format for compatibility
**Transcription Module** (`transcribe_audio()` - main.py:27-37):
- Leverages WhisperX for accurate speech recognition
- Supports multiple model sizes (trade-off between speed and accuracy)
- Generates timestamped JSON transcripts
- Optional speaker diarization support
**Summarization Module** (`summarize_with_local_model()` - main.py:39-74):
- Uses Ollama with llama3:8b for local AI processing
- Extracts key decisions, action items, and discussion points
- Generates natural language summaries
- No external API calls or data transmission
**Cleanup Module** (`cleanup()` - main.py:76-81):
- Removes temporary audio and transcript files
- Retains only the final summary
### Customization
#### Changing the Whisper Model
Available models with trade-offs:
- `tiny.en`: Fastest, least accurate (~1GB RAM)
- `base.en`: Fast, moderate accuracy (~1GB RAM)
- `small.en`: Balanced (default) (~2GB RAM)
- `medium.en`: Slower, more accurate (~5GB RAM)
- `large`: Slowest, most accurate (~10GB RAM)
Change the model on line 10 of `main.py`.
#### Changing the LLM Model
To use a different Ollama model:
1. Pull the desired model: `ollama pull [model-name]`
2. Update line 63 in `main.py`:
```python
["ollama", "run", "[model-name]"],
```
Popular alternatives:
- `llama3.1:8b`: Newer version of llama3
- `mistral`: Smaller, faster model
- `mixtral`: More powerful model (requires more RAM)
#### Customizing the Summary Prompt
Modify the prompt in `summarize_with_local_model()` (lines 49-60) to adjust summary style and content.
### Troubleshooting
**Issue**: "ffmpeg: command not found"
**Solution**: Install FFmpeg for your operating system
**Issue**: "ollama: command not found"
**Solution**: Install Ollama and ensure it's in your system PATH
**Issue**: WhisperX fails to transcribe
**Solution**: Ensure the audio file is valid WAV format and the Whisper model is downloaded
**Issue**: Summarization takes too long
**Solution**: Use a smaller/faster Ollama model or switch to GPU processing
**Issue**: No audio captured during recording
**Solution**: Check your system's default audio input/output settings and adjust FFmpeg device parameters
### Performance Optimization
- **GPU Acceleration**: Change `--device` from "cpu" to "cuda" in the transcribe_audio() function if you have a compatible NVIDIA GPU
- **Smaller Models**: Use smaller Whisper models for faster processing
- **Parallel Processing**: For multiple meetings, run separate instances in different directories
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### Privacy Considerations
The Application is designed with privacy as a core principle:
- **No External Data Transmission**: All audio recording, transcription, and summarization occurs locally on the user's machine
- **No Cloud Services**: No APIs, cloud services, or external servers are contacted during operation
- **User Control**: Users have complete control over all recorded data, transcripts, and summaries
- **Data Retention**: The Application automatically cleans up temporary files, retaining only the user-requested summary
### User Responsibilities
Users of the Application must:
1. **Obtain Consent**: Ensure all meeting participants have consented to recording before using the Application
2. **Comply with Laws**: Follow all applicable local, state, and federal laws regarding audio recording and consent
3. **Protect Data**: Securely store and handle meeting summaries and transcripts containing sensitive or confidential information
4. **Respect Confidentiality**: Honor any confidentiality agreements or expectations of meeting participants
### Compliance Recommendations
- Check local "one-party" vs "all-party" consent laws before recording
- Announce at the beginning of meetings that recording is in progress
- Store output files in encrypted storage if they contain sensitive information
- Implement appropriate data retention policies for meeting summaries
### License
This software is licensed under the [global software license](https://docs.nhcarrigan.com/#/license).
Copyright held by Naomi Carrigan.
For additional legal documentation, refer to:
- [Terms of Service](TERMS.md)
- [Privacy Policy](PRIVACY.md)
- [Security Policy](SECURITY.md)
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### How to Contribute
We welcome contributions to the Meeting Minutes Application! Please review our [contributing guidelines](https://docs.nhcarrigan.com/#/contributing) before getting started.
### Contribution Process
1. **Fork the Repository**: Create your own fork of the project
2. **Create a Branch**: Make a feature branch for your changes
3. **Make Changes**: Implement your feature or bug fix
4. **Test Thoroughly**: Ensure your changes work as expected
5. **Submit a Pull Request**: Describe your changes and submit for review
### Code of Conduct
Before interacting with our community, please read our [Code of Conduct](CODE_OF_CONDUCT.md). We are committed to providing a welcoming and inclusive environment for all contributors.
### Development Setup
To set up a development environment:
1. Follow the installation instructions in Section 2
2. Create a test meeting audio file or use the sample files
3. Make changes to `main.py`
4. Test your changes with various audio inputs and configurations
### Contribution Ideas
We welcome contributions in the following areas:
**Features**:
- GUI interface for easier configuration and operation
- Support for additional audio formats (MP3, M4A, etc.)
- Real-time transcription display during recording
- Integration with calendar systems for automatic meeting detection
- Multi-language support beyond English
- Custom vocabulary support for domain-specific terminology
- Export to additional formats (PDF, Markdown, etc.)
- Meeting analytics and insights
**Improvements**:
- Better error handling and user feedback
- Configuration file support (YAML/JSON) instead of hardcoded values
- Automated testing suite
- Performance optimizations
- Documentation improvements
- Cross-platform compatibility testing
**Bug Fixes**:
- Any identified issues in audio recording, transcription, or summarization
- Platform-specific bugs
- Edge cases in file handling
### Testing Guidelines
When contributing, please test:
1. **Audio Recording**: Verify recording works with various audio sources
2. **Transcription**: Test with different accents, speaking speeds, and audio quality
3. **Summarization**: Ensure summaries are coherent and capture key information
4. **Cross-platform**: Test on different operating systems if possible
5. **Error Handling**: Test edge cases and error conditions
### Code Style
- Follow PEP 8 Python style guidelines
- Use meaningful variable and function names
- Add comments for complex logic
- Keep functions focused on single responsibilities
### Reporting Issues
If you encounter bugs or have feature requests:
1. Check existing GitHub issues to avoid duplicates
2. Open a new issue with a clear title and description
3. Include steps to reproduce (for bugs)
4. Provide system information (OS, Python version, etc.)
### Getting Help
If you need assistance:
- Open a GitHub issue with the "question" label
- Join our [Chat Server](http://chat.nhcarrigan.com)
- Email us at `contact@nhcarrigan.com`
### Recognition
All contributors will be acknowledged in the project. Thank you for helping make Meeting Minutes better!
+38
View File
@@ -0,0 +1,38 @@
---
title: Meliora
---
Meliora (hereinafter the "Application") is an embeddable chat widget, comment section, and full support flow utility.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Meridia
---
Meridia (hereinafter the "Application") is our custom metrics and analytics server.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
@@ -0,0 +1,38 @@
---
title: "Naomi's Adventure I: An Isekai Story"
---
Naomi's Adventure I: An Isekai Story (hereinafter the "Application") is an Isekai story, and our first paid game.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+781
View File
@@ -0,0 +1,781 @@
---
title: Nomena
---
Nomena (hereinafter the "Application") is a Discord bot that generates creative project ideas by providing AI-powered project names with explanations and custom anime mascot images. The Application leverages Claude AI for intelligent text generation and Google Gemini for custom avatar creation.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### 1.1 Overview
Nomena is a Discord bot designed to help generate creative project ideas. When mentioned in Discord, the bot generates fitting project names based on your description and creates a unique anime mascot image to serve as the project's avatar.
### 1.2 Access Requirements
Currently, the Application is configured for single-user access. Users must be authorized by the bot owner to interact with Nomena. If you attempt to use the bot without authorization, you will receive a message indicating that the bot can only generate project ideas for authorized users.
### 1.3 How to Use
#### Basic Usage
To generate a project idea, mention the bot in a Discord channel followed by your project description:
```
@Nomena <your project description>
```
**Example:**
```
@Nomena A web application for tracking daily water intake and sending reminders
```
#### What You'll Receive
After mentioning the bot, you will receive a response containing:
1. **Project Names**: 1-5 fitting project names generated based on your description
2. **Name Explanations**: Reasoning for why each name was chosen
3. **Project Description**: Your original input, echoed back for reference
4. **Mascot Image**: A full-body anime character image (3:4 aspect ratio, white background) attached as `avatar.png`
The bot will display a typing indicator while processing your request, which typically takes a few seconds.
#### Unique Names
The Application automatically checks against a database of existing project names to ensure that generated names are unique and don't conflict with previously created projects.
#### Image Generation Limitations
In rare cases, image generation may fail due to API limitations or content restrictions. When this occurs, you will still receive the project names and descriptions, with a message indicating that the image could not be generated.
### 1.4 Best Practices
- **Be Descriptive**: Provide clear, detailed descriptions of your project idea for better name suggestions
- **Include Context**: Mention the project's purpose, target audience, or key features
- **One Request at a Time**: Wait for the bot to respond before sending additional requests
- **Respect Rate Limits**: Avoid excessive requests in rapid succession
### 1.5 Example Interactions
**Request:**
```
@Nomena A mobile app for learning Japanese vocabulary through spaced repetition
```
**Response:**
```
Project Name: KanjiFlow, NihongoLoop, or MemoryMichi
Explanations:
- KanjiFlow: Combines "Kanji" (Japanese characters) with "Flow" (smooth progression)
- NihongoLoop: Uses "Nihongo" (Japanese language) with "Loop" (repetition)
- MemoryMichi: Blends "Memory" with "Michi" (path in Japanese)
Project Description: A mobile app for learning Japanese vocabulary through spaced repetition
[Attached: avatar.png - anime mascot image]
```
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### 2.1 System Requirements
- **Node.js**: Version 18.x or higher
- **Package Manager**: pnpm 10.19.0 (recommended) or npm
- **Operating System**: Linux, macOS, or Windows
- **API Keys**: Valid API keys for required services (see Environment Variables)
### 2.2 Technology Stack
The Application is built with the following technologies:
**Core Technologies:**
- **TypeScript** (v5.9.3): Type-safe JavaScript development
- **Discord.js** (v14.24.2): Discord bot framework and API wrapper
- **Anthropic SDK** (@anthropic-ai/sdk v0.68.0): Claude AI integration for text generation
- **Google GenAI** (@google/genai v1.28.0): Gemini AI integration for image generation
**Development Tools:**
- **ESLint** (v9.38.0): Code quality and linting
- **Custom Configurations**: @nhcarrigan/eslint-config, @nhcarrigan/typescript-config
**Utilities:**
- **@nhcarrigan/logger** (v1.1.1): Custom logging utility with Discord Analytics integration
- **@nhcarrigan/discord-analytics** (v0.0.6): Analytics tracking
### 2.3 Installation
1. **Clone the repository:**
```bash
git clone <repository-url>
cd nomena
```
2. **Install dependencies:**
```bash
pnpm install
```
Or using npm:
```bash
npm install
```
3. **Configure environment variables** (see section 2.4)
4. **Build the application:**
```bash
pnpm run build
```
### 2.4 Environment Variables
Create a `prod.env` file in the project root with the following variables:
```env
# Required: Anthropic API key for Claude AI
ANTHROPIC_API_KEY=your_anthropic_api_key_here
# Required: Google Gemini API key for image generation
GEMINI_API_KEY=your_gemini_api_key_here
# Required: Discord bot token
DISCORD_TOKEN=your_discord_bot_token_here
# Required: Logger token for Discord Analytics
LOG_TOKEN=your_log_token_here
```
**API Key Acquisition:**
- **Anthropic API Key**: Sign up at https://console.anthropic.com/
- **Gemini API Key**: Obtain from Google AI Studio at https://makersuite.google.com/
- **Discord Bot Token**: Create a bot at https://discord.com/developers/applications
- **Log Token**: Refer to @nhcarrigan/logger documentation
**All environment variables are required.** The Application will throw an error and refuse to start if any are missing.
### 2.5 Discord Bot Configuration
When creating your Discord bot at https://discord.com/developers/applications, ensure the following:
**Required Intents:**
- `Guilds`: Access to guild information
- `Guild Messages`: Receive messages in guilds
- `Message Content`: Read full message content (privileged intent)
**Bot Permissions:**
- Read Messages/View Channels
- Send Messages
- Attach Files
- Read Message History
**Note:** The Message Content intent is a privileged intent and must be enabled in the Discord Developer Portal.
### 2.6 Customization
#### User Access Control
By default, the bot is configured for single-user access. To modify access control, edit `src/index.ts:44`:
```typescript
if (message.author.id !== "YOUR_DISCORD_USER_ID") {
await message.reply("Sorry, I can only generate project ideas for authorized users.");
return;
}
```
You can:
- Replace the user ID with your own Discord user ID
- Remove the check entirely to allow all users
- Implement role-based access control
- Add a whitelist of authorized user IDs
#### Bot Mention ID
Update the bot mention ID in `src/index.ts:37` to match your bot's ID:
```typescript
if (!message.mentions.has("YOUR_BOT_ID", {
ignoreEveryone: true,
ignoreRepliedUser: true,
ignoreRoles: true,
})) {
return;
}
```
Find your bot's ID in the Discord Developer Portal.
#### AI Model Configuration
To modify the AI models used:
**Text Generation (src/classes/ai.ts:78):**
```typescript
model: "claude-sonnet-4-5-20250929" // Change to any available Claude model
```
**Image Generation (src/classes/ai.ts:100):**
```typescript
model: "gemini-2.5-flash-image" // Change to any available Gemini model
```
**Token Limits (src/classes/ai.ts:71):**
```typescript
max_tokens: 1000 // Adjust based on your needs
```
#### Project Name Uniqueness Check
The bot fetches existing project names from `https://data.nhcarrigan.com/projects.json`. To use your own data source, modify `src/classes/ai.ts:42-43`:
```typescript
const projectRequest = await fetch("YOUR_DATA_SOURCE_URL");
```
Ensure your data source returns an array of objects with a `name` property:
```json
[
{ "name": "ProjectOne" },
{ "name": "ProjectTwo" }
]
```
To disable the uniqueness check entirely, comment out or remove the fetch logic and modify the system prompt accordingly.
#### Image Generation Prompts
Customize the mascot generation prompt in `src/classes/ai.ts:95-97`:
```typescript
systemInstruction: `Your custom prompt here`
```
Adjust the aspect ratio in `src/classes/ai.ts:95`:
```typescript
imageConfig: { aspectRatio: "3:4" } // Options: "1:1", "16:9", "9:16", etc.
```
### 2.7 Running the Application
**Development Mode:**
```bash
pnpm run build && node prod/index.js
```
**Production Mode (with 1Password integration):**
```bash
pnpm start
```
This runs: `op run --env-file=prod.env -- node prod/index.js`
**Without 1Password:**
If you're not using 1Password for secret management, modify the `start` script in `package.json`:
```json
"start": "node prod/index.js"
```
Then ensure your environment variables are loaded through your preferred method (e.g., dotenv, system environment variables).
### 2.8 Development Workflow
**Code Linting:**
```bash
pnpm run lint
```
Note: The lint script uses `--max-warnings 0`, meaning any warnings will cause the command to fail.
**Build Process:**
```bash
pnpm run build
```
This compiles TypeScript files from `src/` to `prod/`.
**Testing:**
```bash
pnpm test
```
Note: Currently no tests are implemented. This command returns successfully with exit code 0.
### 2.9 Project Structure
```
nomena/
├── src/
│ ├── index.ts # Main entry point, Discord bot initialization
│ └── classes/
│ └── ai.ts # AI utility class for text and image generation
├── prod/ # Compiled JavaScript output (gitignored)
├── node_modules/ # Dependencies
├── prod.env # Environment variables (gitignored)
├── package.json # Project metadata and dependencies
├── tsconfig.json # TypeScript configuration
├── eslint.config.js # ESLint configuration
├── .gitignore # Git ignore rules
├── LICENSE.md # License information
├── CONTRIBUTING.md # Contributing guidelines
├── CODE_OF_CONDUCT.md # Code of conduct
├── PRIVACY.md # Privacy policy
├── SECURITY.md # Security policy
└── TERMS.md # Terms of service
```
### 2.10 Logging and Monitoring
The Application uses @nhcarrigan/logger for logging with Discord Analytics integration. Logs include:
- Bot startup events (debug level)
- Error tracking (when enabled in the logger)
- Custom analytics events (when configured)
To modify logging behavior, update the logger initialization in `src/index.ts:21`:
```typescript
const logger = new Logger("Nomena", process.env.LOG_TOKEN);
```
### 2.11 Troubleshooting
**Bot doesn't respond:**
- Verify the bot has the Message Content intent enabled
- Check that the bot mention ID in the code matches your bot's ID
- Ensure the bot has permission to read and send messages in the channel
**Environment variable errors:**
- Verify all four required environment variables are set
- Check for typos in variable names
- Ensure the `prod.env` file is in the project root
**Image generation failures:**
- Verify your Gemini API key is valid and has sufficient quota
- Check if the prompt violates content policies
- Review Google AI Studio logs for detailed error messages
**TypeScript compilation errors:**
- Ensure you're using Node.js 18.x or higher
- Delete `node_modules` and `prod` directories, then reinstall: `pnpm install && pnpm run build`
**Permission errors:**
- Verify bot permissions in Discord server settings
- Ensure the bot role has sufficient privileges
### 2.12 Production Deployment
**Recommended Setup:**
- Use a process manager (PM2, systemd, Docker)
- Implement log rotation
- Set up monitoring and alerting
- Use environment-specific configuration files
- Implement graceful shutdown handling
- Consider using a reverse proxy if exposing any HTTP endpoints
**Example PM2 Configuration:**
```json
{
"apps": [{
"name": "nomena",
"script": "prod/index.js",
"env_file": "prod.env",
"instances": 1,
"autorestart": true,
"watch": false,
"max_memory_restart": "1G"
}]
}
```
**Docker Deployment:**
While no Dockerfile is provided, a basic setup would include:
```dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN npm install -g pnpm && pnpm install --frozen-lockfile
COPY . .
RUN pnpm run build
CMD ["node", "prod/index.js"]
```
### 2.13 API Rate Limits and Costs
**Anthropic (Claude AI):**
- Free tier: Limited requests per month
- Paid tier: Pay-per-token pricing
- Token usage: ~100-500 tokens per request (depending on response length)
- Rate limits: Vary by tier
**Google Gemini:**
- Free tier: Limited image generations per day
- Paid tier: Pay-per-generation pricing
- Rate limits: Vary by model and tier
**Discord:**
- 50 requests per second per bot
- Additional limits on message size and file attachments
Monitor your usage to avoid unexpected costs or service interruptions.
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### 3.1 License
This Application is licensed under Naomi's Public License. The full license text is available at:
https://docs.nhcarrigan.com/#/license
Copyright is held by Naomi Carrigan.
### 3.2 Privacy Policy
The Application's privacy practices are governed by the global privacy policy available at:
https://docs.nhcarrigan.com/#/privacy
**Application-Specific Privacy Considerations:**
- **User Messages**: Discord messages mentioning the bot are processed to extract project descriptions
- **API Data**: Project descriptions are sent to third-party APIs (Anthropic and Google) for processing
- **Generated Content**: Project names and images are generated and stored temporarily in Discord
- **Logging**: Basic debug information is logged via Discord Analytics
- **User Identification**: Discord user IDs are checked for access control purposes
**Data Retention:**
- Messages are not stored beyond the request lifecycle
- Generated images are stored on Discord's servers as message attachments
- Logs may retain basic event information per the logger configuration
**Third-Party Services:**
- Anthropic (Claude AI): Processes project descriptions to generate names
- Google (Gemini AI): Processes project descriptions to generate images
- Discord Analytics: Receives basic logging information
Users should review the privacy policies of these third-party services.
### 3.3 Security Policy
The Application's security practices follow the global security policy available at:
https://docs.nhcarrigan.com/#/security
**Application-Specific Security Measures:**
- **Access Control**: User ID verification limits bot usage to authorized individuals
- **Environment Variables**: Sensitive API keys are stored in environment variables, not in code
- **Input Validation**: User input is sanitized before being sent to AI APIs
- **Error Handling**: Errors are caught and handled gracefully without exposing sensitive information
**Security Considerations for Self-Hosted Instances:**
- Keep dependencies updated to patch security vulnerabilities
- Protect your `prod.env` file and never commit it to version control
- Use strong, unique API keys
- Monitor API usage for unusual activity
- Implement rate limiting if exposing the bot publicly
- Review Discord permissions to follow the principle of least privilege
**Reporting Security Vulnerabilities:**
If you discover a security vulnerability, please report it following the guidelines at:
https://docs.nhcarrigan.com/#/security
### 3.4 Terms of Service
General terms of service can be found in the `TERMS.md` file in the repository.
**Application-Specific Terms:**
- The Application generates content using AI, which may occasionally produce unexpected or inappropriate results
- Generated project names are suggestions only and may not be suitable for all use cases
- Users are responsible for verifying that generated names are available for use (trademark searches, domain availability, etc.)
- The Application makes best efforts to generate unique names but does not guarantee uniqueness outside of the internal project database
- Generated images are created by AI and may not always match expectations or requirements
### 3.5 Content Policy
**Generated Content:**
- AI-generated names and images are provided "as-is"
- The Application attempts to filter inappropriate content through AI safety measures
- Users should review generated content before using it in production
**Image Generation:**
- Images are generated in an anime art style
- The system prompt instructs the AI to create appropriate content
- Image generation may fail if content policies are violated
### 3.6 Code of Conduct
Contributors and users are expected to follow the code of conduct available at:
https://docs.nhcarrigan.com/#/coc
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### 4.1 General Contributing Guidelines
General contributing guidelines can be found at:
https://docs.nhcarrigan.com/#/contributing
Please review these guidelines before contributing to the Application.
### 4.2 Development Setup
Follow the installation instructions in Section 2.3 (Installation) to set up your development environment.
**Additional Development Tools:**
- **ESLint**: Code is linted using @nhcarrigan/eslint-config
- **TypeScript**: Strong typing is enforced throughout the codebase
- **Code Style**: Follow the existing code style and conventions
### 4.3 Code Quality Standards
**Linting:**
- All code must pass `pnpm run lint` without warnings
- The project uses ESLint with maximum warnings set to 0
**TypeScript:**
- Use explicit types where appropriate
- Avoid `any` types unless absolutely necessary
- Document complex type definitions
**Comments and Documentation:**
- Use JSDoc comments for public methods and classes
- Include file headers with copyright, license, and author information
- Comment complex logic or non-obvious implementations
**Example File Header:**
```typescript
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
```
### 4.4 Contribution Workflow
1. **Fork the repository**
2. **Create a feature branch**: `git checkout -b feature/your-feature-name`
3. **Make your changes**
4. **Test your changes**: Build and run the application locally
5. **Lint your code**: `pnpm run lint`
6. **Commit your changes**: Follow conventional commit format
7. **Push to your fork**: `git push origin feature/your-feature-name`
8. **Open a pull request**
### 4.5 Pull Request Guidelines
**Before Submitting:**
- Ensure all code passes linting
- Test the application thoroughly
- Update documentation if necessary
- Keep commits atomic and well-described
**PR Description Should Include:**
- Summary of changes
- Motivation for the changes
- Any breaking changes
- Testing performed
- Screenshots (for UI changes, if applicable)
### 4.6 Areas for Contribution
**Feature Enhancements:**
- Multi-user support improvements
- Additional AI model options
- Customizable response formats
- Project name filtering options
- Image style customization
**Code Quality:**
- Adding unit tests
- Improving error handling
- Performance optimizations
- Code documentation
**Bug Fixes:**
- Reporting and fixing bugs
- Improving edge case handling
- Fixing typos or documentation errors
**Documentation:**
- Expanding user guides
- Adding code examples
- Improving setup instructions
- Creating video tutorials
### 4.7 Testing Guidelines
**Currently, the Application has no automated tests.** Contributors are encouraged to:
- Add unit tests for the `Ai` class (src/classes/ai.ts)
- Add integration tests for Discord bot functionality
- Test with various project descriptions and edge cases
- Verify image generation works with different prompts
**Recommended Testing Frameworks:**
- Jest for unit testing
- Discord.js test utilities for bot testing
### 4.8 Commit Message Format
Follow conventional commit format:
```
<type>(<scope>): <subject>
<body>
<footer>
```
**Types:**
- `feat`: New feature
- `fix`: Bug fix
- `docs`: Documentation changes
- `style`: Code style changes (formatting, etc.)
- `refactor`: Code refactoring
- `test`: Adding tests
- `chore`: Maintenance tasks
**Examples:**
```
feat(ai): add support for custom image aspect ratios
docs(readme): update installation instructions
fix(bot): handle missing image generation gracefully
```
### 4.9 Review Process
- Pull requests will be reviewed by project maintainers
- Feedback may be provided for changes or improvements
- Once approved, PRs will be merged by maintainers
- Contributors will be credited in release notes
### 4.10 Getting Help
If you need help contributing:
- Review existing issues and pull requests
- Check the documentation at https://docs.nhcarrigan.com/
- Open a discussion in the repository
- Reach out to maintainers
### 4.11 Code Organization
When adding new features, follow the existing structure:
```
src/
├── index.ts # Main entry point, keep minimal
├── classes/ # Utility classes
│ └── ai.ts # AI-related functionality
└── (future additions) # Commands, utilities, etc.
```
**Best Practices:**
- Keep `index.ts` focused on bot initialization and event handling
- Create separate classes for distinct functionality
- Use dependency injection where appropriate
- Avoid tight coupling between components
### 4.12 Dependencies
**Adding Dependencies:**
- Prefer well-maintained packages with active communities
- Check licenses for compatibility
- Keep dependencies minimal
- Document why dependencies are needed
**Updating Dependencies:**
- Test thoroughly after updates
- Check for breaking changes
- Update documentation if APIs change
---
## Appendix
### A. Frequently Asked Questions
**Q: Can I use this bot in my Discord server?**
A: The bot is currently configured for single-user access. You can fork the repository and run your own instance with modified access controls.
**Q: Why does the bot only respond to one user?**
A: This is a deliberate design choice for the official instance. Self-hosted instances can modify access controls in the code.
**Q: Can I change the art style of generated images?**
A: Yes, modify the system instruction in `src/classes/ai.ts:95-97` to specify different art styles.
**Q: How much does it cost to run?**
A: Costs depend on API usage. Both Anthropic and Google offer free tiers, but high-volume usage may incur costs.
**Q: Can I use a different AI model?**
A: Yes, modify the model names in the code. Ensure compatibility with the SDK methods used.
**Q: Why did image generation fail?**
A: Common reasons include API quota limits, content policy violations, or temporary service unavailability.
**Q: How do I get my Discord user ID?**
A: Enable Developer Mode in Discord settings, then right-click your username and select "Copy User ID".
**Q: Can I deploy this on a free tier service?**
A: Yes, the bot can run on services like Heroku (legacy), Railway, Render, or Fly.io, subject to their free tier limitations.
### B. Glossary
- **AI**: Artificial Intelligence
- **API**: Application Programming Interface
- **Bot**: Automated Discord application
- **Claude**: Anthropic's AI language model
- **Discord**: Communication platform
- **ESLint**: JavaScript linting tool
- **Gemini**: Google's AI model family
- **Intent**: Discord API permission flag
- **Mascot**: Representative character image
- **pnpm**: Fast, disk space efficient package manager
- **TypeScript**: Typed superset of JavaScript
### C. Version History
- **v1.0.0**: Initial release
- Claude AI integration for project name generation
- Google Gemini integration for mascot image generation
- Discord bot functionality
- Single-user access control
- Uniqueness checking against existing projects
### D. Credits
- **Author**: Naomi Carrigan
- **License**: Naomi's Public License
- **Dependencies**: See package.json for full list
- **Special Thanks**: Anthropic, Google, and Discord.js contributors
### E. Additional Resources
- **Anthropic Documentation**: https://docs.anthropic.com/
- **Google AI Documentation**: https://ai.google.dev/
- **Discord.js Guide**: https://discordjs.guide/
- **TypeScript Documentation**: https://www.typescriptlang.org/docs/
- **Author's Documentation Hub**: https://docs.nhcarrigan.com/
---
**Last Updated**: 2025-10-31
**Documentation Version**: 1.0.0
+38
View File
@@ -0,0 +1,38 @@
---
title: Nymira
---
Nymira (hereinafter the "Application") is a service that allows you to claim a custom <username>.naomi.party username for Bluesky.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Octavia
---
Octavia (hereinafter the "Application") is a Linux-native music player application with a focus on handling large libraries with minimal memory.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Oriana
---
Oriana (hereinafter the "Application") is an uptime monitoring tool with status pages
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+2 -19
View File
@@ -1,15 +1,10 @@
--- ---
title: NHCarrigan Portfolio title: Portfolio
--- ---
Portfolio (hereinafter the "Application") is a static HTML landing page that serves as the primary web presence for NHCarrigan, a software engineering and community management consulting firm. The Application provides information about the organization's services, contact methods, past clients, and founder, while serving as a gateway to the broader NHCarrigan ecosystem of tools and communities.
NHCarrigan Portfolio (hereinafter the "Application") is a static HTML landing page that serves as the primary web presence for NHCarrigan, a software engineering and community management consulting firm. The Application provides information about the organization's services, contact methods, past clients, and founder, while serving as a gateway to the broader NHCarrigan ecosystem of tools and communities.
## 1. User Documentation ## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application. This section is for those interacting with a live instance of the Application.
### Current Live Instance ### Current Live Instance
@@ -32,10 +27,6 @@ The Application is currently deployed and accessible at [nhcarrigan.com](https:/
## 2. Technical Documentation ## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application. This section is for those interested in running their own instance of the Application.
### Architecture ### Architecture
@@ -58,10 +49,6 @@ The Application is built as a simple static HTML website consisting of:
## 3. Legal Documentation ## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application. This section is for expansions to our legal policies specific to the Application.
### Current Legal Framework ### Current Legal Framework
@@ -75,10 +62,6 @@ The Application operates under NHCarrigan's standard legal documentation:
## 4. Contributing Documentation ## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase. This section is for documentation related to contributing to the Application's codebase.
### Current Contributing Guidelines ### Current Contributing Guidelines
+2 -2
View File
@@ -1,8 +1,8 @@
--- ---
title: Naomi's Resume title: Resume
--- ---
Naomi's Resume (hereinafter the "Application") is a static site generator that transforms a YAML or JSON resume source into a styled HTML resume website, along with downloadable formats. It is designed for easy customization and deployment, using TypeScript for parsing and rendering, and outputs a ready-to-host static site. Resume (hereinafter the "Application") is a static site generator that transforms a YAML or JSON resume source into a styled HTML resume website, along with downloadable formats. It is designed for easy customization and deployment, using TypeScript for parsing and rendering, and outputs a ready-to-host static site.
## 1. User Documentation ## 1. User Documentation
+38
View File
@@ -0,0 +1,38 @@
---
title: Rowena
---
Rowena (hereinafter the "Application") is a web app that allows you to create and share forms, and track responses in a user friendly table.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
@@ -0,0 +1,95 @@
---
title: Ruu's Goblin Quest
---
Ruu's Goblin Quest (hereinafter the "Game") is a game developed for our friend Ruu's game jam.
## 1. Player Documentation
This section is for players who are exploring or playing the Game.
### Controls
- **Keyboard / Gamepad:**
- Arrow keys / D-Pad: Move character
- Z / Enter / A: Confirm / Interact
- X / Esc / B: Cancel / Menu
- C / Space / Y: Open menu (if applicable)
- Shift / L / R: Dash (if enabled)
- **Touch UI (Mobile / Tablet):**
- Tap to move or interact
- On-screen buttons for menu and actions
### Troubleshooting
- Ensure your device meets RPG Maker MZ requirements.
- If the game crashes, try restarting the app or clearing temporary files.
- Ask us on discord if persistent issues occur.
---
## 2. Developer Documentation
This section is for those interested in running, modifying, or extending the Game.
### Engine & Dependencies
- **Engine:** RPG Maker MZ
- **Plugins Used:** none
- **Assets:** All original
### Setup Instructions
1. Open RPG Maker MZ.
2. Load the project folder `ruus-goblin-quest`.
3. Use the "Playtest" button to run the Game locally.
4. To export, use the "Deployment" feature for target platforms.
### Directory Structure
- `data/` — database files (maps, events, actors, items, skills, etc.)
- `img/` — graphics (characters, tilesets, animations, pictures, etc.)
- `audio/` — music and sound effects
- `js/` — plugins and core scripts
- `www/` — exported HTML5 build (if deployed for web)
---
## 3. Legal Documentation
This section expands on legal or licensing information specific to the Game.
### Licensing
This Game is created using RPG Maker MZ. The game code and original content are the property of NHCarrigan. RPG Maker MZ runtime assets are licensed under the terms provided by KADOKAWA Corporation. All original graphics, music, and story content belong to NHCarrigan and are protected by copyright.
### Third-Party Notices
- Any third-party assets, music, or plugins included are credited in game.
## 4. Contributing Documentation
This section is for contributors or collaborators on the Game.
### How to Contribute
- Fork or copy the project folder.
- Submit patches or mods via Git.
- Include a changelog and clear notes on modifications.
### Coding Standards
- Plugins in `js/plugins/` should follow standard JS conventions.
- Comment custom scripts clearly for readability.
### Art & Audio Guidelines
- Maintain original resolutions where possible (48x48 tiles, etc.).
- Use consistent naming for files in `img/` and `audio/`.
### Contact
- For collaboration or questions, ask us on discord.
+662
View File
@@ -0,0 +1,662 @@
---
title: Scripts
---
Scripts Collection (hereinafter the "Application") is a collection of TypeScript-based automation utilities for managing translations, auditing repositories, automating Discord tasks, and processing media files.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### Overview
The Scripts Collection provides standalone automation tools that can be executed individually as needed. Each script serves a specific purpose and operates independently.
### Available Scripts
#### 1.1 Crowdin Translation Management
**Purpose:** Manage translations and translation memory in Crowdin projects.
##### Write Data (`src/crowdin/writeData.ts`)
Fetches and persists Crowdin project data locally for use by other scripts.
**Usage:**
```bash
op run --env-file=.env -- tsx src/crowdin/writeData.ts
```
**What it does:**
- Retrieves all files from your Crowdin project
- Retrieves all translatable strings
- Saves data to `data/crowdin-files.json` and `data/crowdin-strings.json`
**Required environment variables:**
- `CROWDIN_PROJECT_ID` - Your Crowdin project identifier
- `CROWDIN_API_URL` - Crowdin API base URL
- `CROWDIN_TOKEN` - Your Crowdin API token
##### Clear Hidden Translations (`src/crowdin/clearHiddenTranslations.ts`)
Removes translations for strings that have been marked as hidden in Crowdin.
**Usage:**
```bash
op run --env-file=.env -- tsx src/crowdin/clearHiddenTranslations.ts
```
**What it does:**
- Reads cached string data from `data/crowdin-strings.json`
- Identifies strings marked as hidden
- Deletes existing translations for hidden strings across all languages
- Tracks processed strings in `data/crowdin-strings-hidden.txt` to avoid reprocessing
**Prerequisites:**
- Run `writeData.ts` first to cache the latest string data
- Same environment variables as above
##### Reapply Translations (`src/crowdin/reapplyTranslations.ts`)
Applies translation memory to project files using Crowdin's pre-translation feature.
**Usage:**
```bash
op run --env-file=.env -- tsx src/crowdin/reapplyTranslations.ts
```
**What it does:**
- Initiates pre-translation jobs for all files using translation memory
- Uses "perfect match only" strategy with auto-approval
- Skips already approved translations
- Polls every 5 seconds for completion status
- Displays progress for each file
**Prerequisites:**
- Run `writeData.ts` first to cache the latest file data
- Same environment variables as above
#### 1.2 GitHub Repository Auditing
##### Audit NPM Packages (`src/github/auditNpmPackages.ts`)
Scans GitHub organization repositories for known vulnerable npm packages.
**Usage:**
```bash
op run --env-file=.env -- tsx src/github/auditNpmPackages.ts
```
**What it does:**
- Fetches all repositories from the FreeCodeCamp GitHub organization
- Searches for 18 known vulnerable package versions in `package.json` files
- Generates a report of vulnerable dependencies
- Saves results to `data/npm-vulnerabilities.txt`
**Monitored vulnerable packages include:**
- ansi-regex (< 5.0.1)
- chalk (< 4.1.2)
- debug (< 4.3.1)
- color/color-string libraries (various versions)
- json-schema (< 0.4.0)
- And 13 others
**Required environment variables:**
- `GITHUB_TOKEN` - GitHub personal access token with repo read permissions
**Output format:**
```
Repository: <org>/<repo>
File: package.json
Vulnerable package: <package-name>@<version>
---
```
#### 1.3 Discord Automation
##### Create Conference Threads (`src/discord/cycThreads.ts`)
Automatically creates forum threads for conference presentations.
**Usage:**
```bash
op run --env-file=.env -- tsx src/discord/cycThreads.ts
```
**What it does:**
- Creates threads for 100+ conference talk entries
- Each thread is titled with speaker name and talk title
- Adds a welcome message to each thread
- Implements rate limiting with automatic retry on Discord API limits
**Required environment variables:**
- `DISCORD_TOKEN` - Discord bot token with thread creation permissions
**Target channel:** 1417221194536714393
**Note:** The conference data is currently hardcoded in the script and includes talks on web development, cloud technologies, AI/ML, architecture patterns, and more.
#### 1.4 Media File Processing
##### Add ID3 Tags (`src/music/id3v2.ts`)
Batch processes MP3 files to add metadata tags and album artwork.
**Usage:**
```bash
tsx src/music/id3v2.ts
```
**What it does:**
- Scans `/home/naomi/down` for MP3 files
- Extracts title from filename (removing special characters)
- Sets artist to "Neuro-sama"
- Adds album artwork from `/home/naomi/neuro.png`
- Displays progress bar during processing
**Required system dependencies:**
- `eyeD3` - Python-based MP3 tag editor
- `id3v2` - Command-line ID3 tag tool
**Note:** File paths are currently hardcoded and should be modified for your use case.
### General Usage Tips
1. **Environment Variables:** Most scripts require environment variables. Use 1Password CLI (`op run`) for secure credential management.
2. **Execution Pattern:**
```bash
# With environment variables
op run --env-file=.env --no-masking -- tsx src/path/to/script.ts
# Without environment variables
tsx src/path/to/script.ts
```
3. **Data Directory:** Scripts store cached data and results in the `data/` directory. Ensure this directory exists and is writable.
4. **Error Handling:** Scripts implement automatic retry logic for rate-limited API calls (429 errors) with a 5-second backoff.
5. **Progress Tracking:** Most scripts provide console output to track progress. Some use progress bars for visual feedback.
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### 2.1 System Requirements
**Runtime:**
- Node.js (compatible with v24.3.0 type definitions)
- pnpm 10.15.0 (package manager)
- TypeScript 5.9.2
**External Tools (for media processing):**
- eyeD3 (Python package)
- id3v2 (system package)
**Optional:**
- 1Password CLI (`op`) for secure environment variable management
### 2.2 Installation
1. **Clone the repository:**
```bash
git clone <repository-url>
cd scripts
```
2. **Install dependencies:**
```bash
pnpm install
```
3. **Create data directory:**
```bash
mkdir -p data
```
4. **Set up environment variables:**
Create a `.env` file with required credentials:
```env
# Crowdin (for translation scripts)
CROWDIN_PROJECT_ID=your_project_id
CROWDIN_API_URL=https://api.crowdin.com/api/v2
CROWDIN_TOKEN=your_api_token
# GitHub (for audit script)
GITHUB_TOKEN=your_github_token
# Discord (for thread creation script)
DISCORD_TOKEN=your_discord_bot_token
```
5. **Install external tools (for media processing):**
```bash
# On Ubuntu/Debian
sudo apt-get install id3v2
pip install eyeD3
# On macOS
brew install id3v2
pip install eyeD3
```
### 2.3 Configuration
**TypeScript Configuration (`tsconfig.json`):**
- Extends `@nhcarrigan/typescript-config`
- Source directory: `./src`
- Output directory: `./prod`
- ES Modules enabled
**ESLint Configuration (`eslint.config.js`):**
- Extends `@nhcarrigan/eslint-config`
- Console statements allowed
- Await in loops permitted (needed for sequential API calls)
- Relaxed unsafe assignment rules
**Modifying Target Locations:**
To adapt scripts for your use:
1. **Crowdin scripts:** Update environment variables in `.env`
2. **GitHub audit:** Modify organization name in `src/github/auditNpmPackages.ts:48`
3. **Discord threads:** Update channel ID and talk data in `src/discord/cycThreads.ts`
4. **Media processing:** Update file paths in `src/music/id3v2.ts:7-8`
### 2.4 Project Structure
```
scripts/
├── src/ # Source code
│ ├── crowdin/ # Crowdin automation
│ │ ├── interfaces/ # TypeScript type definitions
│ │ ├── utils/ # Helper functions
│ │ ├── writeData.ts
│ │ ├── clearHiddenTranslations.ts
│ │ └── reapplyTranslations.ts
│ ├── discord/ # Discord automation
│ │ └── cycThreads.ts
│ ├── github/ # GitHub utilities
│ │ └── auditNpmPackages.ts
│ ├── music/ # Media processing
│ │ └── id3v2.ts
│ ├── utils/ # Shared utilities
│ │ ├── sleep.ts
│ │ ├── backoffAndRetry.ts
│ │ └── serialiseJsonOrError.ts
│ └── index.ts # Usage instructions
├── data/ # Cached data and output
├── prod/ # Compiled JavaScript
├── package.json # Dependencies and scripts
├── tsconfig.json # TypeScript configuration
└── eslint.config.js # Linting rules
```
### 2.5 Development
**Build the project:**
```bash
pnpm build
```
**Run linting:**
```bash
pnpm lint
```
**Execute scripts:**
```bash
# With tsx (no compilation needed)
tsx src/path/to/script.ts
# Or compile first, then run
pnpm build
node prod/path/to/script.js
```
### 2.6 API Integration Details
**Crowdin API:**
- Base URL: `https://api.crowdin.com/api/v2`
- Authentication: Bearer token in Authorization header
- Pagination: 500 items per page (limit parameter)
- Rate limiting: Handled with automatic retry (5-second backoff)
**GitHub API:**
- Client: `@octokit/rest`
- Authentication: Personal access token
- Pagination: 100 repositories per page
- Permissions needed: `repo` (read access)
**Discord API:**
- REST endpoint: `https://discord.com/api/v10`
- Authentication: Bot token
- Rate limiting: Automatic retry with backoff on 429 responses
- Required intents: Message content, guild messages
### 2.7 Data Storage
**Generated files:**
- `data/crowdin-files.json` (~12MB) - Cached Crowdin file metadata
- `data/crowdin-strings.json` (~275MB) - Cached translatable strings
- `data/crowdin-strings-hidden.txt` (~1.3MB) - Processed hidden string IDs
- `data/npm-vulnerabilities.txt` (~2KB) - Audit results
**Data freshness:**
- Crowdin data should be refreshed before running dependent scripts
- GitHub audit data is generated per run
- Discord thread creation is one-time execution
### 2.8 Security Considerations
1. **Secrets Management:**
- Use 1Password CLI or similar tools for environment variable injection
- Never commit `.env` files to version control
- Rotate API tokens regularly
2. **API Token Permissions:**
- Crowdin: Project member with translation management access
- GitHub: Read-only repository access (minimal scope)
- Discord: Bot token with thread creation and message posting permissions
3. **Rate Limiting:**
- All scripts implement retry logic for rate limit responses
- 5-second backoff before retrying
- Recursive retry until success
4. **Input Validation:**
- API responses are typed with TypeScript interfaces
- Safe JSON parsing with error handling
- File existence checks before processing
### 2.9 Troubleshooting
**Common Issues:**
1. **"Cannot find module" errors:**
- Ensure `pnpm install` completed successfully
- Check Node.js version compatibility
2. **API authentication failures:**
- Verify environment variables are set correctly
- Check token permissions and expiration
- Ensure `op run` is used for secure variable injection
3. **Rate limit errors persisting:**
- Check API quota limits on your account
- Increase backoff delay in `src/utils/backoffAndRetry.ts`
4. **Large JSON files causing memory issues:**
- Increase Node.js memory limit: `NODE_OPTIONS=--max-old-space-size=4096`
- Process data in smaller batches
5. **Media processing failures:**
- Verify `eyeD3` and `id3v2` are installed and in PATH
- Check file permissions for input/output directories
- Ensure cover image exists at specified path
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### 3.1 License
The Application is distributed under **Naomi's Public License**. See `LICENSE.md` for full terms.
### 3.2 Privacy Policy
Usage of these scripts may involve processing data from third-party services. Refer to `PRIVACY.md` for our privacy practices regarding:
- API credentials and tokens
- Cached translation data
- Repository metadata
- Discord message content
### 3.3 Terms of Service
By using these scripts, you agree to:
- Comply with third-party API terms of service (Crowdin, GitHub, Discord)
- Use automation responsibly and within rate limits
- Not use the scripts for malicious purposes
- Maintain security of API credentials
See `TERMS.md` for complete terms.
### 3.4 Security Policy
To report security vulnerabilities in the Application itself, please refer to `SECURITY.md`.
**Third-Party Security:**
- The GitHub audit script identifies known vulnerable npm packages
- Keep dependencies updated regularly
- Review `pnpm audit` output periodically
### 3.5 Data Retention
**Local Data Storage:**
- Cached data in `data/` directory is stored indefinitely until manually deleted
- No data is transmitted to external services except through official APIs
- API tokens are loaded at runtime and not persisted to disk
**Third-Party Data:**
- Crowdin: Translation data is fetched and cached locally
- GitHub: Repository metadata is accessed read-only
- Discord: Messages are posted to threads as configured
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### 4.1 Contributing Guidelines
Please refer to `CONTRIBUTING.md` for detailed contribution guidelines. Key points:
**Code Style:**
- Follow ESLint configuration (`@nhcarrigan/eslint-config`)
- Use TypeScript with strict type checking
- Include JSDoc comments for exported functions
- Add copyright headers to new files
**Commit Messages:**
- Use conventional commit format
- Examples: `feat:`, `fix:`, `docs:`, `refactor:`
**Testing:**
- While formal tests are not currently required, manually test all changes
- Verify scripts work with environment variables
- Test error handling and edge cases
### 4.2 Adding New Scripts
To add a new automation script:
1. **Create script file:**
```bash
# Choose appropriate directory or create new one
touch src/<category>/<script-name>.ts
```
2. **Add copyright header:**
```typescript
/*
* Copyright (C) 2025 Naomi Carrigan
* Licensed under Naomi's Public License
*/
```
3. **Import shared utilities:**
```typescript
import { sleep } from "../utils/sleep.js";
import { backoffAndRetry } from "../utils/backoffAndRetry.js";
```
4. **Implement type safety:**
- Create interfaces in `<category>/interfaces/` if needed
- Use TypeScript types for all API responses
- Handle errors with try-catch blocks
5. **Add environment variable validation:**
```typescript
const token = process.env.SERVICE_TOKEN;
if (!token) {
console.error("Missing SERVICE_TOKEN environment variable");
process.exit(1);
}
```
6. **Document usage:**
- Add JSDoc comments to main functions
- Update this documentation file
- Include example usage in comments
7. **Test thoroughly:**
- Test with valid and invalid inputs
- Verify error handling
- Check rate limit handling
### 4.3 Code Organization
**Shared Utilities (`src/utils/`):**
Place reusable functions here:
- Async utilities (sleep, retry logic)
- Data transformation functions
- Error handling helpers
- Common type definitions
**Category-Specific Utilities:**
Place service-specific helpers in `<category>/utils/`:
- API client wrappers
- Data fetching functions
- Service-specific transformations
**Interfaces (`<category>/interfaces/`):**
Define TypeScript interfaces for:
- API request/response types
- Configuration objects
- Data models
### 4.4 Dependency Management
**Adding Dependencies:**
```bash
pnpm add <package-name>
pnpm add -D <dev-package-name>
```
**Updating Dependencies:**
```bash
pnpm update
pnpm audit
```
**Preferred Libraries:**
- API clients: Official SDKs when available (`@octokit/rest`, etc.)
- CLI interactions: `@inquirer/prompts`
- Progress visualization: `cli-progress`
- HTTP requests: Native `fetch` with `backoffAndRetry` wrapper
### 4.5 Documentation Standards
**Code Comments:**
- Use JSDoc for all exported functions
- Include `@param`, `@returns`, and `@throws` tags
- Add inline comments for complex logic
**Example:**
```typescript
/**
* Fetches all files from a Crowdin project with pagination.
* @param projectId - The Crowdin project identifier
* @returns Promise resolving to array of file objects
* @throws Error if API request fails after retries
*/
export async function getFiles(projectId: string): Promise<File[]> {
// Implementation
}
```
**README Updates:**
- Document new scripts in README.md
- Include usage examples
- List required environment variables
- Note any system dependencies
**Changelog:**
- Maintain a changelog for significant changes
- Use semantic versioning principles
- Document breaking changes prominently
### 4.6 Architecture Principles
**Script Independence:**
- Each script should be runnable standalone
- Avoid tight coupling between scripts
- Use data files for inter-script communication when needed
**Error Handling:**
- Always validate environment variables at startup
- Use try-catch blocks for external API calls
- Provide descriptive error messages
- Exit with non-zero code on failure
**API Best Practices:**
- Implement rate limit handling with exponential backoff
- Use pagination for large data sets
- Cache data locally when appropriate
- Respect API quotas and limits
**Type Safety:**
- Define interfaces for all external data
- Avoid `any` types when possible
- Use strict TypeScript configuration
- Validate data shapes at runtime when needed
### 4.7 Testing Approach
While formal unit tests are not currently implemented, contributors should:
1. **Manual Testing Checklist:**
- Run script with valid environment variables
- Test with missing environment variables
- Verify output files are created correctly
- Check error handling with invalid inputs
- Test rate limit retry logic (if applicable)
2. **Integration Testing:**
- Test against real APIs in development environments
- Verify data format compatibility
- Check for breaking changes in API responses
3. **Future Testing Goals:**
- Add unit tests for utility functions
- Mock API responses for integration tests
- Set up CI/CD pipeline for automated testing
- Implement test coverage reporting
### 4.8 Code of Conduct
All contributors must adhere to the Code of Conduct outlined in `CODE_OF_CONDUCT.md`. Key principles:
- Be respectful and inclusive
- Welcome newcomers and help them learn
- Focus on constructive feedback
- Respect differing opinions and experiences
### 4.9 Getting Help
**Resources:**
- Review existing scripts for examples
- Check JSDoc comments for function documentation
- Read official API documentation for services
- Consult TypeScript and ESLint documentation for style questions
**Contact:**
- Open an issue for bug reports or feature requests
- Submit pull requests for proposed changes
- Follow contribution guidelines for all submissions
---
**Document Version:** 1.0
**Last Updated:** 2025-10-31
**Maintained By:** Naomi Carrigan
+38
View File
@@ -0,0 +1,38 @@
---
title: Selene
---
Selene (hereinafter the "Application") is a local-only privacy-focused REST API client.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+619 -218
View File
@@ -2,254 +2,655 @@
title: Static Pages title: Static Pages
--- ---
Static Pages (hereinafter the "Application") is a collection of static HTML pages and related data/scripts for various small web utilities and content sections. The application provides interactive explorers for books and music libraries, product directories, games, chat services, testimonials, and other utility pages. It is designed to be easily synchronized to a production server using shell scripts and requires no backend or dynamic server-side logic. Static Pages (hereinafter the "Application") is a collection of static HTML pages that serve as the foundation for various web-based services and informational resources offered by Naomi Carrigan. The Application provides a lightweight, accessible platform for showcasing personal content, accepting donations, displaying testimonials, cataloguing personal collections, and managing product information.
## 1. User Documentation ## 1. User Documentation
The Application provides several interactive web utilities:
### Book Library
Visit at https://books.nhcarrigan.com
An interactive explorer for Naomi's book collection. Users can browse and search through the library of books with filtering capabilities by author. The interface displays book titles and authors extracted from digital book files.
### Music Library
Visit at https://music.nhcarrigan.com
An interactive explorer for Naomi's music collection. Similar to the book library, users can browse and search through songs with filtering by artist. The interface displays song titles and artists extracted from audio file metadata.
### Games
Visit at https://games.nhcarrigan.com
A landing page showcasing various games developed by NHCarrigan, including links to the Beccalia Series and other game projects.
### BlueSky Handle Generator
Visit at https://naomi.party
A service page for provisioning custom Bluesky handles under the naomi.party domain. Currently requires manual processing through the Discord support server.
### Testimonials
Visit at https://testimonials.nhcarrigan.com
A showcase page displaying testimonials from past clients about NHCarrigan's work and services.
### Link Redirector
Visit at https://nhcarrigan.link
A utility page that serves as a fallback for improperly configured subdomain redirects, providing users with support contact information.
This section is for those interacting with a live instance of the Application. This section is for those interacting with a live instance of the Application.
### User Manual ### 1.1 Available Pages
Visit at https://manual.nhcarrigan.com The Application consists of several distinct pages, each serving a specific purpose:
A brief description of what it is like to work with Naomi, and how to cultivate an environment where she can thrive. #### 1.1.1 Donation Page (`/donate`)
The donation page provides multiple avenues for supporting Naomi Carrigan's work, including:
- **OpenCollective**: Main financial ledger tracking all income and expenses
- **Patreon**: Monthly membership support
- **Ko-Fi**: Coffee donations and one-time contributions
- **PayPal**: Direct donation processing
- **CashApp**: Direct monetary transfers
- **GitHub Sponsors**: Platform-integrated sponsorship
- **Stripe**: Monthly recurring donations
- **Twitch**: Stream subscriptions
- **Throne**: Gift suggestion and purchase platform
- **Discord**: Community hub access
#### 1.1.2 Book Library (`/books`)
An interactive explorer displaying books that Naomi has read. Features include:
- Searchable database by author and title
- Filterable results with dynamic count display
- Alphabetically sorted table view
- JSON-backed data storage (`books.json`)
- Currently displays over 1,000 books
#### 1.1.3 Music Library (`/music`)
An interactive explorer for music that Naomi listens to. Features include:
- Search functionality for artists and titles
- Dynamic filtering with live count updates
- Tabular display with alternating row colors
- JSON-backed data storage (`songs.json`)
#### 1.1.4 Testimonials (`/testimonials`)
A comprehensive showcase of professional feedback and recommendations from:
- Past clients
- Colleagues
- Community members
- Internal team feedback (anonymized for privacy)
Features include:
- Print-optimized styling
- Chronologically organized testimonials
- Web form integration for new submissions
- Over 50 professional testimonials spanning multiple years (2023-2025)
#### 1.1.5 Link Redirector (`/link-redirector`)
A fallback page for improperly configured subdomain redirects, providing users with support contact information.
#### 1.1.6 Additional Pages
- **Chat** (`/chat`): Community communication hub
- **Mail** (`/mail`): Email-related services
- **Games** (`/games`): Gaming-related content
- **Manual** (`/manual`): User manuals and guides
- **Sitemap** (`/sitemap`): Site navigation structure
- **Bluesky** (`/bsky`): Bluesky social platform integration
### 1.2 Common Features
All pages share common functionality through a global header system:
- Consistent styling via CSS custom properties (variables)
- Responsive design for mobile and desktop
- Global navigation (loaded from `cdn.nhcarrigan.com/headers/index.js`)
- Consistent theming with foreground/background color variables
- Custom cursor styles
### 1.3 Accessibility
The Application is designed with accessibility in mind:
- Semantic HTML5 structure
- Proper heading hierarchy
- Descriptive page titles and meta descriptions
- Responsive viewport scaling
- UTF-8 character encoding
## 2. Technical Documentation ## 2. Technical Documentation
### System Requirements
- Unix-like operating system (Linux/macOS)
- Bash shell
- `rsync` for deployment
- `exiftool` for extracting book metadata
- `mid3v2` for extracting music metadata
- `jq` for JSON processing
- Access to Gitea API (for products functionality)
- Web server capable of serving static files
### Project Structure
```
├── books/ # Book library interface
│ ├── index.html # Main book explorer page
│ └── books.json # Generated book data
├── music/ # Music library interface
│ ├── index.html # Main music explorer page
│ └── songs.json # Generated music data
├── products/ # Product directory
│ ├── index.html # Product listing page
│ └── data.json # Generated product data
├── games/ # Games showcase
├── bsky/ # BlueSky handle service
├── testimonials/ # Client testimonials
├── link-redirector/ # Redirect fallback
├── mail/ # Mail service (manual sync)
├── manual/ # Manual/documentation
├── sitemap/ # Site navigation
├── books.sh # Book data generator script
├── songs.sh # Music data generator script
├── products.sh # Product data generator script
└── sync.sh # Deployment script
```
### Data Generation Scripts
**Book Library (`books.sh`)**
- Scans `/home/naomi/cloud/Books` directory for book files
- Extracts title and author metadata using `exiftool`
- Generates `books/books.json` with book data
- Handles files without metadata by using filenames
**Music Library (`songs.sh`)**
- Scans `/home/naomi/music` directory for audio files
- Extracts title and artist metadata using `mid3v2`
- Generates `music/songs.json` with song data
- Falls back to filename parsing for missing metadata
**Product Directory (`products.sh`)**
- Fetches repository data from Gitea API
- Organizes projects by category (public, games, private, archived)
- Generates `products/data.json` with project information
- Requires `GITEA_TOKEN` environment variable
### Deployment
The deployment process uses `sync.sh` which:
1. Syncs all directories to production server using `rsync`
2. Targets `prod:/home/nhcarrigan` for most content
3. Requires manual sync for `mail/index.html` to `mail:/home/user-data/www/default`
**Deployment Command:**
```bash
./sync.sh
```
### Running Your Own Instance
1. **Clone the repository**
2. **Install dependencies:**
```bash
# Ubuntu/Debian
sudo apt install exiftool python3-mutagen jq rsync
# macOS
brew install exiftool jq rsync
pip3 install mutagen
```
3. **Configure data sources:**
- Update paths in `books.sh` for your book collection
- Update paths in `songs.sh` for your music collection
- Set `GITEA_TOKEN` environment variable for products functionality
- Modify `products.sh` with your Gitea instance URL and organizations
4. **Generate data:**
```bash
./books.sh # Generate book library data
./songs.sh # Generate music library data
./products.sh # Generate product directory data
```
5. **Serve static files:**
```bash
# Simple Python server for testing
python3 -m http.server 8000
```
6. **Deploy to production:**
- Modify `sync.sh` with your server details
- Ensure SSH key authentication is configured
- Run `./sync.sh`
This section is for those interested in running their own instance of the Application. This section is for those interested in running their own instance of the Application.
### 2.1 Architecture
The Application is a pure static website with no backend dependencies:
- **Technology Stack**: HTML5, CSS3, Vanilla JavaScript
- **Data Storage**: JSON files for dynamic content
- **Styling**: Custom CSS with CSS custom properties
- **Scripts**: Vanilla JavaScript (no frameworks)
- **CDN Dependencies**: Global header/navigation system from `cdn.nhcarrigan.com`
### 2.2 File Structure
```
static-pages/
├── books/
│ ├── index.html
│ └── books.json
├── music/
│ ├── index.html
│ └── songs.json
├── testimonials/
│ └── index.html
├── donate/
│ └── index.html
├── products/
│ ├── index.html
│ └── data.json
├── link-redirector/
│ └── index.html
├── bsky/
├── chat/
├── games/
├── mail/
├── manual/
├── sitemap/
├── README.md
├── CONTRIBUTING.md
├── LICENSE.md
├── PRIVACY.md
├── TERMS.md
├── SECURITY.md
└── CODE_OF_CONDUCT.md
```
### 2.3 Dependencies
#### 2.3.1 External Dependencies
- **Global Header System**: `https://cdn.nhcarrigan.com/headers/index.js`
- Provides consistent navigation and styling across all pages
- Loaded asynchronously with defer attribute
- **Font Awesome**: Icon library (loaded via global header)
- **Custom Cursors**: `https://cdn.nhcarrigan.com/cursors/pointer.cur`
#### 2.3.2 Internal Dependencies
- JSON data files for dynamic content (books.json, songs.json, data.json)
### 2.4 Deployment
The Application can be deployed to any static web host:
#### 2.4.1 Prerequisites
- Web server capable of serving static files (Nginx, Apache, etc.)
- No server-side processing required
- No database required
#### 2.4.2 Installation Steps
1. Clone the repository:
```bash
git clone <repository-url>
cd static-pages
```
2. Configure your web server to serve the directory:
- Set document root to the static-pages directory
- Configure directory indexing if needed
- Ensure proper MIME types are set for .html, .json, .css files
3. (Optional) Update the global header CDN URL if hosting independently:
- Replace `cdn.nhcarrigan.com/headers/index.js` with your own header script
- Update custom cursor URLs if needed
#### 2.4.3 Web Server Configuration
**Nginx Example:**
```nginx
server {
listen 80;
server_name your-domain.com;
root /path/to/static-pages;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location ~* \.(json)$ {
add_header Content-Type application/json;
}
}
```
**Apache Example (.htaccess):**
```apache
DirectoryIndex index.html
Options -Indexes
<Files ~ "\\.json$">
Header set Content-Type "application/json"
</Files>
```
### 2.5 Data Management
#### 2.5.1 Books Library
Run `./books.sh` to update the book data. You may need to change the filepath the script reads from.
#### 2.5.2 Music Library
Run `./songs.sh` to update the music data. You may need to change the filepath the script reads from.
#### 2.5.3 Testimonials List
Run `./testimonials.sh` to update the testimonial data from our API.
### 2.6 Customization
#### 2.6.1 Styling
Each page uses CSS custom properties that can be overridden:
- `--foreground`: Primary foreground color
- `--background`: Primary background color
Global styles are loaded from the CDN header system. To customize:
1. Fork and host your own version of the header script
2. Update the script src in each HTML file
3. Modify CSS custom properties in your hosted version
#### 2.6.2 Adding New Pages
1. Create a new directory in the root
2. Add an `index.html` file
3. Include the global header script:
```html
<script
src="https://cdn.nhcarrigan.com/headers/index.js"
async
defer
></script>
```
4. Follow the existing HTML structure for consistency
### 2.7 System Requirements
**Client-Side:**
- Modern web browser with JavaScript enabled
- Support for ES6+ JavaScript features
- Support for CSS custom properties
**Server-Side:**
- Any static file web server (Nginx, Apache, Caddy, etc.)
- No specific server-side language requirements
- No database requirements
### 2.8 Version Control
The Application is managed using Git:
- Repository hosted on Gitea (https://git.nhcarrigan.com)
- GitHub integration available
- Standard Git workflows supported
### 2.9 Continuous Integration
CI/CD configuration files are located in `.gitea/workflows/`:
- `sonar.yml`: SonarQube code quality analysis
## 3. Legal Documentation ## 3. Legal Documentation
The Application operates under NHCarrigan's standard legal framework:
### License
This software is licensed under the [global software license](https://docs.nhcarrigan.com/#/license). Copyright is held by Naomi Carrigan.
### Privacy Policy
Privacy considerations for the Application are covered under the [global privacy policy](PRIVACY.md).
### Terms of Service
Terms of service for the Application are outlined in [TERMS.md](TERMS.md).
### Code of Conduct
All interactions with the Application's community and codebase are governed by the [Code of Conduct](https://docs.nhcarrigan.com/#/coc), referenced in [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).
### Security Policy
Security reporting and handling procedures are documented in [SECURITY.md](SECURITY.md).
### Data Handling
- **Book Library**: Processes local book file metadata only
- **Music Library**: Processes local music file metadata only
- **Product Directory**: Fetches public repository information from Gitea API
- **BlueSky Service**: Collects handle requests through Discord (manual process)
- **No personal data**: The Application does not collect or store personal user data directly
This section is for expansions to our legal policies specific to the Application. This section is for expansions to our legal policies specific to the Application.
### 3.1 License
The Application is licensed under the global software license maintained by Naomi Carrigan. Full license details are available at:
- **URL**: https://docs.nhcarrigan.com/#/license
- **Copyright**: All rights reserved by Naomi Carrigan
- **Reference**: See `LICENSE.md` in the repository root
### 3.2 Privacy Policy
User privacy is governed by the global privacy policy:
- **URL**: https://docs.nhcarrigan.com/#/privacy
- **Reference**: See `PRIVACY.md` in the repository root
- **Data Collection**: The Application itself does not collect user data; however, external links may have their own privacy policies
### 3.3 Terms of Service
Usage of the Application is subject to the global terms of service:
- **URL**: https://docs.nhcarrigan.com/#/terms
- **Reference**: See `TERMS.md` in the repository root
### 3.4 Security Policy
Security-related information and vulnerability reporting:
- **Reference**: See `SECURITY.md` in the repository root
- **Contact**: For security concerns, contact via the official channels listed in the security policy
### 3.5 Third-Party Services
The Application integrates with several third-party services:
#### 3.5.1 Donation Platforms
- OpenCollective
- Patreon
- Ko-Fi
- PayPal
- CashApp
- GitHub Sponsors
- Stripe
- Twitch
- Throne
- Discord
Each platform has its own terms of service and privacy policy that users should review before proceeding with transactions.
#### 3.5.2 Content Delivery Network (CDN)
- **Service**: cdn.nhcarrigan.com
- **Purpose**: Global header, navigation, and styling
- **Data Handling**: Standard CDN caching and delivery
### 3.6 User Responsibilities
Users of the Application agree to:
- Use the Application for lawful purposes only
- Respect intellectual property rights
- Not attempt to exploit, hack, or compromise the Application's security
- Follow the Code of Conduct when interacting with the community
### 3.7 Data Portability
All user-facing data in the Application is stored in JSON format and can be easily exported or migrated:
- Books data: `books/books.json`
- Music data: `music/songs.json`
- Products data: `products/data.json`
## 4. Contributing Documentation ## 4. Contributing Documentation
### Getting Started This section is for documentation related to contributing to the Application's codebase.
Contributors should review the [global contributing guidelines](https://docs.nhcarrigan.com/#/contributing) referenced in [CONTRIBUTING.md](CONTRIBUTING.md).
### Development Workflow ### 4.1 Getting Started
To contribute to the Application:
1. **Read the Contributing Guidelines**:
- Full guidelines: https://docs.nhcarrigan.com/#/contributing
- Repository reference: See `CONTRIBUTING.md`
2. **Review the Code of Conduct**:
- See `CODE_OF_CONDUCT.md` in the repository root
- Violations can be reported through official channels
3. **Set Up Development Environment**:
1. **Fork and Clone**
```bash ```bash
git clone https://github.com/your-username/Static Pages.git # Clone the repository
cd Static Pages git clone <repository-url>
cd static-pages
# No build tools required - edit HTML files directly
# Use any text editor or IDE
``` ```
2. **Set Up Development Environment** ### 4.2 Contribution Workflow
- Install required dependencies (see Technical Documentation)
- Configure data source paths for testing
- Set up environment variables if working with products functionality
3. **Making Changes** 1. **Fork the Repository**:
- **HTML Pages**: Edit individual `index.html` files in respective directories
- **Data Scripts**: Modify `*.sh` scripts for data generation logic - Fork on Gitea or GitHub
- **Deployment**: Update `sync.sh` for deployment configuration changes - Clone your fork locally
2. **Create a Feature Branch**:
4. **Testing Changes**
```bash ```bash
# Test data generation git checkout -b feature/your-feature-name
./books.sh
./songs.sh
./products.sh
# Test locally
python3 -m http.server 8000
``` ```
5. **Submitting Changes** 3. **Make Your Changes**:
- Create feature branch: `git checkout -b feature/your-feature`
- Commit changes with descriptive messages
- Push to your fork and create a Pull Request
- Ensure all data generation scripts work correctly
### Code Style Guidelines - Edit HTML, CSS, or JSON files as needed
- **HTML**: Use semantic HTML5 elements, include proper meta tags - Test locally by opening HTML files in a browser
- **Shell Scripts**: Follow bash best practices, include error handling - Ensure consistent styling and structure
- **JSON Data**: Ensure proper formatting and validation
- **Documentation**: Update relevant documentation for new features
### Areas for Contribution 4. **Commit Your Changes**:
- **UI/UX Improvements**: Enhance styling and user experience of static pages
- **Data Processing**: Improve metadata extraction and data generation scripts
- **New Features**: Add new utility pages or improve existing functionality
- **Documentation**: Expand user guides and technical documentation
- **Testing**: Add validation and testing for data generation processes
- **Accessibility**: Improve accessibility compliance across all pages
### Communication ```bash
- **Issues**: Report bugs and request features through GitHub Issues git add .
- **Support**: Join the [chat server](https://chat.nhcarrigan.com) for discussion git commit -m "feat: description of your changes"
- **Contact**: Reach out via email at `contact@nhcarrigan.com` ```
### Review Process 5. **Push to Your Fork**:
All Pull Requests are reviewed for:
- Code quality and adherence to project standards ```bash
- Functionality and testing git push origin feature/your-feature-name
```
6. **Open a Pull Request**:
- Navigate to the original repository
- Click "New Pull Request"
- Fill out the pull request template in `.gitea/pull_request_template.yml`
### 4.3 Coding Standards
#### 4.3.1 HTML Standards
- Use HTML5 semantic elements
- Include proper DOCTYPE declaration
- Set UTF-8 charset
- Include viewport meta tag for responsive design
- Use descriptive page titles and meta descriptions
#### 4.3.2 CSS Standards
- Use CSS custom properties for theming
- Maintain responsive design principles
- Use consistent class naming conventions
- Include print styles where appropriate
- Test cross-browser compatibility
#### 4.3.3 JavaScript Standards
- Use vanilla JavaScript (no frameworks)
- Follow ES6+ standards
- Use const/let instead of var
- Include error handling where appropriate
- Keep functions small and focused
- Comment complex logic
#### 4.3.4 JSON Data Standards
- Maintain consistent schema within each data file
- Use proper JSON formatting (validated)
- Include all required fields
- Use descriptive keys
### 4.4 Testing
Before submitting a pull request:
1. **Manual Testing**:
- Open each modified HTML file in multiple browsers
- Test on both desktop and mobile viewports
- Verify all links work correctly
- Ensure JSON data loads properly
2. **Validation**:
- Validate HTML using W3C validator
- Validate JSON syntax using a JSON validator
- Check CSS for syntax errors
3. **Cross-Browser Testing**:
- Test in Chrome/Chromium
- Test in Firefox
- Test in Safari (if available)
- Test in Edge
### 4.5 Issue Reporting
Use the issue templates in `.gitea/issue_template/`:
#### 4.5.1 Bug Reports
- Template: `bug_report.yaml`
- Include reproduction steps
- Provide browser and OS information
- Include screenshots if applicable
#### 4.5.2 Feature Proposals
- Template: `feature_proposal.yml`
- Describe the feature clearly
- Explain the use case
- Consider implementation impact
#### 4.5.3 Other Issues
- Template: `other.yml`
- For general inquiries or discussions
### 4.6 Pull Request Guidelines
- Fill out the pull request template completely
- Reference related issues using `#issue-number`
- Keep changes focused on a single feature or fix
- Update documentation if needed
- Respond to review feedback promptly
- Ensure CI checks pass (if applicable)
### 4.7 Communication Channels
- **GitHub Issues**: For bug reports and feature requests
- **Chat Server**: http://chat.nhcarrigan.com
- **Email**: contact@nhcarrigan.com
- **Pull Request Discussions**: For code-specific conversations
### 4.8 Areas for Contribution
#### 4.8.1 High Priority
- Accessibility improvements
- Cross-browser compatibility fixes
- Performance optimizations
- Documentation updates - Documentation updates
- Security considerations
- Compatibility with existing deployment process #### 4.8.2 Medium Priority
- New page additions
- Enhanced filtering/search features
- Visual design improvements
- Mobile experience enhancements
#### 4.8.3 Low Priority
- Additional data entries (books, music, etc.)
- Minor styling tweaks
- Code refactoring
### 4.9 Recognition
Contributors are recognized through:
- Git commit history
- Pull request acknowledgments
- Potential testimonial features for significant contributions
### 4.10 Development Tools
Recommended tools for contributing:
- **Editors**: VS Code, Sublime Text, Atom, or any text editor
- **Browser DevTools**: Chrome DevTools, Firefox Developer Tools
- **Validators**: W3C HTML Validator, JSONLint
- **Version Control**: Git (command line or GUI)
### 4.11 Local Development
To run locally:
1. **Simple HTTP Server (Python)**:
```bash
python -m http.server 8000
# Visit http://localhost:8000
```
2. **Simple HTTP Server (Node.js)**:
```bash
npx http-server -p 8000
# Visit http://localhost:8000
```
3. **VS Code Live Server Extension**:
- Install Live Server extension
- Right-click HTML file → "Open with Live Server"
### 4.12 Commit Message Guidelines
Follow conventional commit format:
- `feat:` New features
- `fix:` Bug fixes
- `docs:` Documentation changes
- `style:` Code formatting (no logic changes)
- `refactor:` Code refactoring
- `test:` Test additions or updates
- `chore:` Build process or tooling changes
Example:
```
feat: add search functionality to testimonials page
- Implement client-side search filtering
- Add search input with clear button
- Update styling for search controls
```
---
## Appendix A: Page-Specific Technical Details
### Books Page
- **Data Source**: `books/books.json`
- **JavaScript Functions**:
- `loadBooks(books)`: Initializes the book list
- `filterBooks(author, title)`: Filters books by author and/or title
- `updateTable(books)`: Renders the book table
- **Current Count**: 1,210 books
### Music Page
- **Data Source**: `music/songs.json`
- **JavaScript Functions**:
- `loadSongs(songs)`: Initializes the song list
- `filterSongs(artist, title)`: Filters songs by artist and/or title
- `updateTable(songs)`: Renders the song table
### Products Page
- **Data Source**: `products/data.json`
- **JavaScript Functions**:
- `loadProducts(products)`: Processes and displays products by category
- `titleCase(name)`: Converts kebab-case to Title Case
- **Categories**: public, private, games, archived
- **Current Count**: ~50 products
### Testimonials Page
- **Data Format**: Static HTML cards generated from source
- **Styling Features**:
- Screen-optimized and print-optimized views
- Responsive card layout
- Chronological ordering
- **Submission**: Via web form at `https://forms.nhcarrigan.com/form/M_GrmqASymmO744axMOmu2LaMAaT5F0LmdVcU2c8-gQ`
---
**Document Version**: 1.0
**Last Updated**: 2025-10-29
**Maintained By**: Naomi Carrigan
**Contact**: contact@nhcarrigan.com
+38
View File
@@ -0,0 +1,38 @@
---
title: Sybil
---
Sybil (hereinafter the "Application") is a Discord bot that syndicates forum threads to an indexable website and generates help articles based on resolved conversations.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Sylvara
---
Sylvara (hereinafter the "Application") is a micro-blogging social media platform.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Tessara
---
Tessara (hereinafter the "Application") is a Discord bot that allows you to collect and use trading cards that are actually conversation starters.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Thalassa
---
Thalassa (hereinafter the "Application") is a rich presence application for Linux.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Theodora
---
Theodora (hereinafter the "Application") is a Discord bot that generates 100 days of code reminders.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Thessalia
---
Thessalia (hereinafter the "Application") is an RPG game on Discord
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
@@ -0,0 +1,313 @@
---
title: TypeScript Config
---
TypeScript Config (hereinafter the "Application") is a shareable TypeScript compiler configuration package designed to enforce strict type checking and consistent coding standards across multiple TypeScript projects. The Application provides a pre-configured `tsconfig.json` that can be extended by other projects to maintain code quality and catch potential errors during development.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### 1.1 Overview
The Application is a published npm package (`@nhcarrigan/typescript-config`) that provides a standardized TypeScript configuration. It enforces strict typing rules and modern ECMAScript standards to improve code quality and maintainability.
### 1.2 Installation
To install the Application in your project, use the following command:
```bash
npm i @nhcarrigan/typescript-config typescript
```
Or with pnpm:
```bash
pnpm add @nhcarrigan/typescript-config typescript
```
### 1.3 Usage
After installation, extend the Application's configuration in your project's `tsconfig.json` file:
```json
{
"extends": "@nhcarrigan/typescript-config",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./prod"
}
}
```
**Important Notes:**
- You must specify `rootDir` and `outDir` in your project's `tsconfig.json` as these are not set by default in version 4.0.0 and above
- Set these directories to match your project's structure
- The Application is compatible with TypeScript 5 and above
### 1.4 Configuration Features
The Application provides the following compiler options:
#### Target and Module System
- **Target**: ES2022 - Compiles code to ECMAScript 2022 standard
- **Module**: ES2022 - Uses ES2022 module system
- **Module Resolution**: Node - Uses Node.js module resolution strategy
#### Type Safety
- **Strict Mode**: Enabled - Enforces all strict type-checking options
- **Exact Optional Property Types**: Enabled - Distinguishes between `undefined` and absent properties
- **No Unchecked Indexed Access**: Enabled - Adds `undefined` to index signature results
- **No Implicit Returns**: Enabled - Ensures functions return values consistently
#### Code Quality
- **No Unreachable Code**: Disallowed - Prevents dead code
- **No Unused Labels**: Disallowed - Prevents unused labels
- **No Fallthrough Cases in Switch**: Enabled - Requires explicit fallthrough in switch statements
- **No Implicit Override**: Enabled - Requires explicit `override` keyword
- **No Unused Locals**: Enabled - Reports unused local variables
- **No Unused Parameters**: Enabled - Reports unused function parameters
#### Interoperability
- **ES Module Interop**: Enabled - Improves compatibility with CommonJS modules
- **Skip Lib Check**: Enabled - Skips type checking of declaration files
- **Force Consistent Casing in Filenames**: Enabled - Ensures case-sensitive file imports
### 1.5 Package Information
- **Version**: 4.0.0
- **NPM Package**: [@nhcarrigan/typescript-config](https://www.npmjs.com/package/@nhcarrigan/typescript-config)
- **Author**: Naomi Carrigan
- **License**: [Global Software License](https://docs.nhcarrigan.com/#/license)
### 1.6 Support and Feedback
- **Issues**: Report bugs at [Codeberg Issues](https://codeberg.org/naomi-lgbt/typescript-config/issues)
- **Contact**: Available via [Chat Server](http://chat.nhcarrigan.com) or email at `contact@nhcarrigan.com`
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### 2.1 Project Structure
The Application has a minimal structure focused on distributing a TypeScript configuration:
```
typescript-config/
├── src/
│ └── index.ts # Test file for validating configuration
├── tsconfig.json # The main configuration file
├── package.json # Package metadata and dependencies
└── [documentation files] # README, LICENSE, CONTRIBUTING, etc.
```
### 2.2 Source Code
#### Configuration File (tsconfig.json:1)
The main configuration file exports the following compiler options:
```json
{
"compilerOptions": {
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "Node",
"allowUnreachableCode": false,
"allowUnusedLabels": false,
"exactOptionalPropertyTypes": true,
"noFallthroughCasesInSwitch": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noUncheckedIndexedAccess": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
```
#### Test File (src/index.ts:1)
The source directory contains a minimal test file used to validate that the configuration compiles correctly:
```typescript
(async () => {
console.log("just testing!");
})();
```
This file serves as a smoke test to ensure the TypeScript configuration is valid.
### 2.3 Development Setup
#### Prerequisites
- Node.js version 20
- pnpm version 9
- TypeScript >= 5.5.2 (peer dependency)
#### Local Development
1. Clone the repository:
```bash
git clone git@codeberg.org:naomi-lgbt/typescript-config.git
cd typescript-config
```
2. Install dependencies:
```bash
pnpm install
```
3. Run tests:
```bash
pnpm test
```
The test script runs the TypeScript compiler with specific `rootDir` and `outDir` settings to validate the configuration.
### 2.4 Build and Test Process
The Application uses a simple test script defined in package.json:6:
```bash
tsc --rootDir './src' --outDir './prod' && echo 'build appears valid!'
```
This command:
1. Compiles TypeScript files from the `src` directory
2. Outputs compiled JavaScript to the `prod` directory
3. Confirms successful compilation with a success message
### 2.5 Publishing
The Application is published to npm under the package name `@nhcarrigan/typescript-config`. The main entry point is the `tsconfig.json` file itself (as specified in package.json:5).
### 2.6 Version History
The current version is 4.0.0, which introduced breaking changes:
- Removed default `rootDir` and `outDir` settings
- Users must now explicitly set these in their project's `tsconfig.json`
- This change resolves incompatibilities with certain package managers
### 2.7 Design Decisions
The configuration emphasizes:
1. **Strict Type Checking**: All strict options are enabled to catch potential errors at compile time
2. **Modern JavaScript**: Targets ES2022 for modern language features
3. **Code Quality**: Enforces best practices like no unused variables, no unreachable code
4. **Flexibility**: Allows projects to specify their own directory structure (rootDir/outDir)
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### 3.1 License
The Application is licensed under the [Global Software License](https://docs.nhcarrigan.com/#/license). Copyright is held by Naomi Carrigan.
See LICENSE.md for full license details.
### 3.2 Terms of Service
Users of the Application are subject to the global Terms of Service available at [https://docs.nhcarrigan.com/#/terms](https://docs.nhcarrigan.com/#/terms).
See TERMS.md for reference.
### 3.3 Privacy Policy
The Application does not collect or transmit any user data. For general privacy policies, refer to [https://docs.nhcarrigan.com/#/privacy](https://docs.nhcarrigan.com/#/privacy).
See PRIVACY.md for reference.
### 3.4 Security Policy
Security vulnerabilities should be reported according to the guidelines at [https://docs.nhcarrigan.com/#/security](https://docs.nhcarrigan.com/#/security).
See SECURITY.md for reference.
### 3.5 Intellectual Property
The Application's configuration is an original work created by Naomi Carrigan. The specific combination of TypeScript compiler options represents curated decisions for code quality and safety.
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### 4.1 Contributing Guidelines
Comprehensive contributing guidelines are available at [https://docs.nhcarrigan.com/#/contributing](https://docs.nhcarrigan.com/#/contributing).
See CONTRIBUTING.md for reference.
### 4.2 Code of Conduct
Before interacting with the community, please review the Code of Conduct available in CODE_OF_CONDUCT.md.
### 4.3 How to Contribute
#### Reporting Issues
If you encounter bugs or have feature requests:
1. Check existing issues at [Codeberg Issues](https://codeberg.org/naomi-lgbt/typescript-config/issues)
2. Create a new issue with a clear description
3. Include TypeScript version and package manager information
#### Submitting Changes
1. Fork the repository
2. Create a feature branch
3. Make your changes to the configuration
4. Test that the configuration compiles correctly (`pnpm test`)
5. Submit a Pull Request with a clear description of changes
6. Await review from maintainers
#### Configuration Changes
When proposing changes to the TypeScript configuration:
- Explain the rationale for the change
- Document any breaking changes
- Consider backward compatibility
- Test with various TypeScript projects to ensure compatibility
### 4.4 Development Workflow
1. Clone the repository
2. Create a branch for your changes
3. Modify `tsconfig.json` as needed
4. Run `pnpm test` to validate changes
5. Update documentation if necessary
6. Commit with clear, descriptive messages
7. Submit a Pull Request
### 4.5 Testing Changes
To test configuration changes:
1. Make modifications to `tsconfig.json`
2. Run the test script: `pnpm test`
3. Test in a real project by linking locally:
```bash
# In this package directory
pnpm link
# In your test project
pnpm link @nhcarrigan/typescript-config
```
4. Verify the configuration works as expected
### 4.6 Repository Information
- **Repository**: [https://codeberg.org/naomi-lgbt/typescript-config](https://codeberg.org/naomi-lgbt/typescript-config)
- **Issue Tracker**: [https://codeberg.org/naomi-lgbt/typescript-config/issues](https://codeberg.org/naomi-lgbt/typescript-config/issues)
- **Git URL**: `git@codeberg.org:naomi-lgbt/typescript-config.git`
### 4.7 Contact
For questions about contributing:
- Join the [Chat Server](http://chat.nhcarrigan.com)
- Email: `contact@nhcarrigan.com`
+38
View File
@@ -0,0 +1,38 @@
---
title: Verena
---
Verena (hereinafter the "Application") is a Discord bot that allows identity and age verification.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Vitalia
---
Vitalia (hereinafter the "Application") is a full-featured nutrition tracker with community-driven nutrient data.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+38
View File
@@ -0,0 +1,38 @@
---
title: Vivienne
---
Vivienne (hereinafter the "Application") is an RSS feed reader/management site.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
+330
View File
@@ -0,0 +1,330 @@
---
title: Naomi's VSCode Themes
---
Naomi's VSCode Themes (hereinafter the "Application") is a Visual Studio Code extension that provides a curated collection of custom color themes designed to enhance the coding experience with aesthetically pleasing color schemes. The Application currently offers four distinct themes: Ocean Breeze, Sakura Dreams, Sakura Dreams (Dark), and Trans Pride.
## 1. User Documentation
This section is for those interacting with a live instance of the Application.
### 1.1 Overview
Naomi's Themes is a VSCode extension that provides custom color themes for your code editor. Each theme has been carefully crafted with specific color palettes to create visually appealing and comfortable coding environments.
### 1.2 Available Themes
The Application includes the following themes:
- **Ocean Breeze**: A dark theme featuring soothing teal and cyan colors reminiscent of ocean waves, designed for extended coding sessions with reduced eye strain
- **Sakura Dreams**: A light theme inspired by cherry blossoms with soft, pastel colors
- **Sakura Dreams (Dark)**: A dark variant of the Sakura Dreams theme, maintaining the cherry blossom aesthetic while providing a darker background
- **Trans Pride**: A light theme celebrating trans pride with a carefully selected color palette
### 1.3 Installation
1. Open Visual Studio Code
2. Navigate to the Extensions view (Ctrl+Shift+X / Cmd+Shift+X)
3. Search for "Naomi's Themes" by nhcarrigan
4. Click "Install"
### 1.4 Activating a Theme
After installation:
1. Open the Command Palette (Ctrl+Shift+P / Cmd+Shift+P)
2. Type "Preferences: Color Theme"
3. Select your desired theme from the list:
- Ocean Breeze
- Sakura Dreams
- Sakura Dreams (Dark)
- Trans Pride
### 1.5 Requirements
- Visual Studio Code version 1.96.4 or higher
### 1.6 Support and Feedback
If you encounter any issues or have feedback:
- Open an issue at: https://git.nhcarrigan.com/nhcarrigan/vscode-themes/issues
- Contact via Chat Server: http://chat.nhcarrigan.com
- Email: contact@nhcarrigan.com
## 2. Technical Documentation
This section is for those interested in running their own instance of the Application.
### 2.1 Architecture
The Application is structured as a standard VSCode extension with the following components:
- **Theme Definitions**: JSON files located in the `themes/` directory, each defining color schemes for UI elements and syntax highlighting
- **Extension Manifest**: `package.json` containing metadata and theme contributions
- **Assets**: `icon.png` for the extension icon
### 2.2 Project Structure
```
vscode-themes/
├── themes/
│ ├── ocean-breeze.json
│ ├── sakura-dreams.json
│ ├── sakura-dreams-dark.json
│ └── trans-pride.json
├── package.json
├── icon.png
├── README.md
├── LICENSE.md
├── CONTRIBUTING.md
├── CODE_OF_CONDUCT.md
├── PRIVACY.md
├── TERMS.md
└── SECURITY.md
```
### 2.3 Local Development Setup
#### Prerequisites
- Node.js and npm installed
- Visual Studio Code installed
- vsce (Visual Studio Code Extension Manager) installed globally
#### Setup Steps
1. Clone the repository:
```bash
git clone https://git.nhcarrigan.com/nhcarrigan/vscode-themes.git
cd vscode-themes
```
2. Install vsce if not already installed:
```bash
npm install -g @vscode/vsce
```
3. Package the extension:
```bash
npm run package
```
4. Install the packaged extension in VSCode:
- Open VSCode
- Go to Extensions view
- Click the "..." menu
- Select "Install from VSIX..."
- Choose the generated `.vsix` file
### 2.4 Creating a Theme
Each theme is defined in a JSON file with the following structure:
```json
{
"name": "Theme Name",
"type": "dark" or "light",
"colors": {
// UI element colors
},
"tokenColors": [
// Syntax highlighting rules
]
}
```
Key sections:
- **colors**: Defines colors for editor UI elements (background, foreground, sidebar, statusbar, etc.)
- **tokenColors**: Array of rules defining syntax highlighting colors based on TextMate scopes
For example, see `themes/ocean-breeze.json` at lines 1-373.
### 2.5 Building and Packaging
The package script is configured in `package.json` at lines 38-39:
```bash
npm run package
```
This command:
- Packages the extension into a `.vsix` file
- Sets the base content and images URLs to the repository
### 2.6 Publishing
The extension is published by nhcarrigan to the VSCode Marketplace. The publisher configuration is defined in `package.json` at line 10.
### 2.7 Version Management
Current version: 2.2.0 (as defined in `package.json` at line 5)
Version history (from git commits):
- 2.2.0: Current release
- 2.1.0: Added dark mode and updated source links
- 2.0.0: Major version update
## 3. Legal Documentation
This section is for expansions to our legal policies specific to the Application.
### 3.1 License
The Application is licensed under Naomi Carrigan's global software license, available at: https://docs.nhcarrigan.com/#/license
Copyright is held by Naomi Carrigan.
Reference: `LICENSE.md` at lines 1-5
### 3.2 Privacy Policy
The Application adheres to the privacy policy documented at: https://docs.nhcarrigan.com/#/privacy
As a VSCode theme extension, the Application:
- Does not collect any user data
- Does not transmit any information externally
- Operates entirely locally within VSCode
Reference: `PRIVACY.md` at lines 1-3
### 3.3 Terms of Service
The Application is governed by the Terms of Service available at: https://docs.nhcarrigan.com/#/terms
Reference: `TERMS.md` at lines 1-3
### 3.4 Security Policy
Security policies and vulnerability reporting procedures are documented in `SECURITY.md`.
### 3.5 Intellectual Property
All themes, color schemes, and design elements are copyright of Naomi Carrigan. The theme names "Ocean Breeze," "Sakura Dreams," and "Trans Pride" are part of this intellectual property.
## 4. Contributing Documentation
This section is for documentation related to contributing to the Application's codebase.
### 4.1 Contributing Guidelines
Complete contributing guidelines are available at: https://docs.nhcarrigan.com/#/contributing
Reference: `CONTRIBUTING.md` at lines 1-3
### 4.2 Code of Conduct
Before participating in the project, please review the Code of Conduct at: https://git.nhcarrigan.com/nhcarrigan/vscode-themes/src/branch/main/CODE_OF_CONDUCT.md
The project maintains a welcoming and inclusive environment for all contributors.
Reference: `README.md` at lines 13-15
### 4.3 How to Contribute
#### Reporting Issues
1. Check existing issues at: https://git.nhcarrigan.com/nhcarrigan/vscode-themes/issues
2. Create a new issue with:
- Clear description of the problem or suggestion
- Steps to reproduce (for bugs)
- Expected vs. actual behavior
- VSCode version and operating system
#### Submitting Pull Requests
1. Fork the repository
2. Create a feature branch from `main`
3. Make your changes:
- For new themes: Add a new JSON file in `themes/` directory
- For theme modifications: Edit the respective JSON file
- Update `package.json` if adding a new theme
4. Test your changes locally by packaging and installing the extension
5. Commit your changes with clear, descriptive commit messages
6. Submit a pull request to the `main` branch
7. Await review from the maintainers
#### Theme Contribution Guidelines
When contributing a new theme:
1. Ensure the theme has a unique name and aesthetic
2. Define both `colors` and `tokenColors` sections comprehensively
3. Test the theme with multiple programming languages
4. Ensure sufficient contrast for accessibility
5. Add the theme entry to `package.json` under `contributes.themes`
6. Specify the correct `uiTheme` base ("vs" for light, "vs-dark" for dark)
Example theme entry in `package.json`:
```json
{
"label": "Your Theme Name",
"uiTheme": "vs-dark",
"path": "./themes/your-theme-name.json"
}
```
Reference: `package.json` at lines 14-36
### 4.4 Development Standards
#### File Naming Conventions
- Theme files: Use kebab-case (e.g., `ocean-breeze.json`, `sakura-dreams-dark.json`)
- Theme files should be placed in the `themes/` directory
#### JSON Formatting
- Use 2-space indentation
- Ensure valid JSON syntax
- Include all required theme properties
#### Color Guidelines
- Use hex color codes (e.g., `#012a22`)
- Consider accessibility and contrast ratios
- Test colors in both day and night lighting conditions
- Document color inspiration or theme concept if applicable
### 4.5 Testing
Before submitting:
1. Package the extension locally using `npm run package`
2. Install the VSIX file in a clean VSCode instance
3. Test the theme with multiple file types:
- JavaScript/TypeScript
- Python
- Rust
- HTML/CSS
- Markdown
4. Verify UI elements (sidebar, statusbar, tabs, etc.) are properly styled
5. Check for color contrast issues
### 4.6 Release Process
Releases are managed by the project maintainer (Naomi Carrigan). The typical release process:
1. Update version in `package.json`
2. Commit version changes
3. Create a git tag for the version
4. Run `npm run package` to generate the VSIX file
5. Publish to VSCode Marketplace (maintainer only)
Recent release pattern (from git history):
- Version bumps follow semantic versioning
- Releases are tagged in git
- Each release includes descriptive commit messages
### 4.7 Community and Communication
- Issues and discussions: https://git.nhcarrigan.com/nhcarrigan/vscode-themes/issues
- Chat Server: http://chat.nhcarrigan.com
- Email: contact@nhcarrigan.com
- Homepage: https://nhcarrigan.com
### 4.8 Recognition
Contributors are valued members of the project. Significant contributions may be recognized in release notes or project documentation.
+38
View File
@@ -0,0 +1,38 @@
---
title: Zephra
---
Zephra (hereinafter the "Application") is a micro-blogging social media platform.
## 1. User Documentation
:::note
This section is coming soon!
:::
This section is for those interacting with a live instance of the Application.
## 2. Technical Documentation
:::note
This section is coming soon!
:::
This section is for those interested in running their own instance of the Application.
## 3. Legal Documentation
:::note
This section is coming soon!
:::
This section is for expansions to our legal policies specific to the Application.
## 4. Contributing Documentation
:::note
This section is coming soon!
:::
This section is for documentation related to contributing to the Application's codebase.
@@ -744,7 +744,7 @@ This self-assessment tool is designed to help you evaluate your understanding an
--- ---
**Question 103:** How do you balance individual staff judgment with consistent policy application across the team? **Question 103:** How do you balance individual staff judgement with consistent policy application across the team?
*Your Answer:* *Your Answer:*
@@ -234,7 +234,7 @@ Taking care of your mental health is really important. Have you considered reach
**DO:** **DO:**
- Stay calm and professional - Stay calm and professional
- Listen without judgment - Listen without judgement
- Acknowledge their feelings - Acknowledge their feelings
- Provide concrete resources - Provide concrete resources
- Encourage professional help - Encourage professional help
@@ -265,7 +265,7 @@ This training provides comprehensive guidance for staff members responsible for
#### 5.1.1 Unique Gaming Leadership Challenges #### 5.1.1 Unique Gaming Leadership Challenges
**Real-Time Decision Making:** **Real-Time Decision Making:**
- **Quick Judgment**: Making quick decisions during dynamic game situations - **Quick judgement**: Making quick decisions during dynamic game situations
- **Stress Management**: Managing stress during competitive or challenging activities - **Stress Management**: Managing stress during competitive or challenging activities
- **Multi-Tasking**: Coordinating multiple aspects of events or activities simultaneously - **Multi-Tasking**: Coordinating multiple aspects of events or activities simultaneously
- **Adaptive Leadership**: Adjusting leadership style based on activity type and participants - **Adaptive Leadership**: Adjusting leadership style based on activity type and participants
+1 -1
View File
@@ -2,7 +2,7 @@
--primary-color: #8F2447; --primary-color: #8F2447;
--background-color: #E1F6F9DC; --background-color: #E1F6F9DC;
--sl-color-text-accent: #8F2447; --sl-color-text-accent: #8F2447;
font-size: 18px; font-size: 18pt;
} }
html[data-theme="dark"] { html[data-theme="dark"] {
+79
View File
@@ -0,0 +1,79 @@
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import { readFile } from "node:fs/promises";
import { readdir } from "node:fs/promises";
import { join } from "node:path";
import { describe, expect, it } from "vitest";
import { navigation } from "../src/components/navigation.ts";
import matter from "gray-matter";
type Navigation = typeof navigation;
type NavigationItem = Array<{
label: string
link: string
items?: Array<{
label: string
link: string
}>
}>
const excludedFiles = ["intro.mdx", "projects/_template.md"];
// this should recursively walk the specified directory and return a list of all files, prefixing them with nested paths.
// For example, calling walkDirectory() should return "/about/contact.md", "/about/mission.md", "/about/sustainability.md", etc.
const walkDirectory = async (directory = join(__dirname, "..", "src", "content", "docs"), prefix = ""): Promise<Array<string>> => {
const filesAndDirectories = await readdir(directory, { withFileTypes: true });
const pages = [];
for (const fileOrDirectory of filesAndDirectories) {
if (fileOrDirectory.isDirectory()) {
pages.push(...(await walkDirectory(join(directory, fileOrDirectory.name), join(prefix, fileOrDirectory.name))));
} else {
pages.push(join(prefix, fileOrDirectory.name));
}
}
return pages;
}
const flattenNavigation = (navigation: Navigation | NavigationItem): Array<{ label: string; link: string }> => {
const items: Array<{ label: string; link: string }> = [];
for (const item of navigation) {
if ("items" in item && item.items) {
items.push(...flattenNavigation(item.items as NavigationItem));
} else {
items.push({ label: item.label, link: item.link });
}
}
return items;
}
describe("navigation", () => {
it("should include all pages", async () => {
expect.hasAssertions();
let pages = await walkDirectory();
pages = pages.filter((page) => !excludedFiles.includes(page));
const flattenedNavigation = flattenNavigation(navigation);
for (const page of pages) {
const pageName = page.split(".")[0];
const navItem = flattenedNavigation.find((item) => item.link === `/${pageName}`);
expect(navItem, `Navigation item not found for page ${page}`).toBeDefined();
}
});
it("should use page titles as navigation item labels", async () => {
expect.hasAssertions();
let pages = await walkDirectory();
pages = pages.filter((page) => !excludedFiles.includes(page));
const flattenedNavigation = flattenNavigation(navigation);
for (const page of pages) {
const pageName = page.split(".")[0];
const navItem = flattenedNavigation.find((item) => item.link === `/${pageName}`);
const pageContent = await readFile(join(__dirname, "..", "src", "content", "docs", page), "utf-8");
const { data } = matter(pageContent);
expect(navItem?.label, `Navigation item label for ${pageName} is not correct`).toBe(data.title);
}
});
});
+71
View File
@@ -0,0 +1,71 @@
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import { readFile } from "node:fs/promises";
import { readdir } from "node:fs/promises";
import { join } from "node:path";
import { describe, expect, it } from "vitest";
import matter from "gray-matter";
interface Project {
avatar?: string;
category: string;
description: string;
name: string;
premium: boolean;
url?: string;
wip: boolean;
}
const getProjects = async(): Promise<Array<Project>> => {
const request = await fetch("https://data.nhcarrigan.com/projects.json");
const data = await request.json();
return data as Array<Project>;
};
const projectNameMap: Record<string, string> = {
"Naomi's Blog": "blog",
"NHCarrigan Documentation": "docs",
"Naomi's VSCode Themes": "vscode-themes",
"Artists4Palestine Bot": "a4p-bot",
"ESLint Config": "eslint-config",
"Naomi's Adventure I: An Isekai Story": "naomis-adventure-i",
};
const excludedProjects = new Set<string>([
"Translation Service",
"Gitea"
]);
const convertTitleCaseToKebabCase = (string_: string): string => {
return string_.toLowerCase().replace(/\s+/g, "-").replaceAll(/[:']/g, "");
};
describe("projects documentation", () => {
it("should include all public projects", async() => {
expect.hasAssertions();
const projects = await getProjects();
const docs = await readdir(join(__dirname, "..", "src", "content", "docs", "projects"));
for (const project of projects) {
if (excludedProjects.has(project.name)) {
continue;
}
const page = docs.find((d) => {
return project.name in projectNameMap
? d.split(".")[0] === projectNameMap[project.name]
: d.split(".")[0] === convertTitleCaseToKebabCase(project.name);
});
expect(page, `Page not found for project ${project.name}`).toBeDefined();
const content = await readFile(join(__dirname, "..", "src", "content", "docs", "projects", page!), "utf-8");
const { data } = matter(content);
expect(data.title, `Title not found for project ${project.name}`).toBeDefined();
expect(data.title, `Title for project ${project.name} is not correct`).toBe(project.name);
if (project.wip) {
continue;
}
expect(content).not.toMatch(/:::note\nThis section is coming soon!\n:::/);
}
});
});