Compare commits

...

4 Commits

Author SHA1 Message Date
naomi 4afed2b3a3 feat: new seekrit
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m35s
2026-01-27 10:59:32 -08:00
naomi 890958257f chore: update sitemap 2026-01-27 10:59:30 -08:00
naomi 7596bd2bc4 feat: better sync UX 2026-01-27 10:59:29 -08:00
naomi 5ab6308645 feat: add secrets page 2026-01-27 10:59:22 -08:00
3 changed files with 925 additions and 8 deletions
+745
View File
@@ -0,0 +1,745 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Naomi's Secrets to Success™</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;600&family=UnifrakturMaguntia&family=MedievalSharp&display=swap');
body {
background-image:
radial-gradient(ellipse at top, rgba(139, 69, 19, 0.3), transparent 70%),
radial-gradient(ellipse at bottom, rgba(101, 67, 33, 0.4), transparent 70%),
linear-gradient(180deg, #2c1810 0%, #3d2817 50%, #2c1810 100%);
background-attachment: fixed;
color: #3a2317;
font-family: 'Cinzel', serif;
margin: 0;
padding: 20px;
min-height: 100vh;
overflow-x: hidden;
position: relative;
}
body::before {
content: "";
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><rect width="100" height="100" fill="%23f4e4c1" opacity="0.03"/><path d="M0 0L50 50L0 100M50 0L100 50L50 100" stroke="%23d4a574" stroke-width="0.5" opacity="0.1" fill="none"/></svg>');
pointer-events: none;
z-index: 1;
}
.container {
max-width: 900px;
margin: 0 auto;
position: relative;
z-index: 2;
}
.scroll-wrapper {
background:
linear-gradient(to right,
transparent 0%,
#f4e4c1 10%,
#f4e4c1 90%,
transparent 100%);
padding: 60px 80px;
position: relative;
box-shadow:
0 0 50px rgba(0, 0, 0, 0.5),
inset 0 0 100px rgba(139, 69, 19, 0.1);
border-left: 3px solid #8b4513;
border-right: 3px solid #8b4513;
}
.scroll-wrapper::before,
.scroll-wrapper::after {
content: "";
position: absolute;
left: 20px;
right: 20px;
height: 8px;
background: linear-gradient(90deg,
transparent 0%,
#8b4513 20%,
#654321 50%,
#8b4513 80%,
transparent 100%);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
}
.scroll-wrapper::before {
top: -4px;
transform: perspective(100px) rotateX(45deg);
}
.scroll-wrapper::after {
bottom: -4px;
transform: perspective(100px) rotateX(-45deg);
}
h1 {
font-family: 'UnifrakturMaguntia', cursive;
font-size: 3.5em;
text-align: center;
color: #8b0000;
text-shadow:
2px 2px 4px rgba(0, 0, 0, 0.5),
0 0 10px rgba(139, 0, 0, 0.3);
margin-bottom: 0.3em;
letter-spacing: 2px;
}
.subtitle {
text-align: center;
font-size: 1em;
color: #654321;
margin-bottom: 2em;
font-style: italic;
}
.warning {
text-align: center;
font-size: 1.1em;
color: #8b0000;
margin-bottom: 2em;
font-family: 'MedievalSharp', cursive;
text-transform: uppercase;
letter-spacing: 3px;
}
.secrets-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 25px;
margin-top: 2em;
}
.secret {
background:
linear-gradient(135deg, #f9f5e9 0%, #f4e4c1 100%);
border: 2px solid #8b4513;
border-radius: 3px;
padding: 20px;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
box-shadow:
3px 3px 10px rgba(0, 0, 0, 0.3),
inset 0 0 30px rgba(139, 69, 19, 0.05);
}
.secret::before {
content: "";
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
background: linear-gradient(45deg, #d4a574, #8b4513, #654321, #8b4513);
z-index: -1;
opacity: 0;
transition: opacity 0.3s ease;
}
.secret:hover::before {
opacity: 1;
}
.secret:hover {
transform: translateY(-5px) scale(1.02);
box-shadow:
5px 5px 15px rgba(0, 0, 0, 0.4),
inset 0 0 30px rgba(139, 69, 19, 0.1);
}
.secret:hover .secret-number,
.secret:hover .secret-text,
.secret:hover .unknown {
color: #fff;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
}
.secret-number {
font-family: 'UnifrakturMaguntia', cursive;
font-size: 1.4em;
color: #8b0000;
margin-bottom: 10px;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.3);
}
.secret-text {
font-size: 1em;
line-height: 1.5;
color: #3a2317;
font-weight: 400;
}
.unknown {
font-family: 'MedievalSharp', cursive;
font-size: 1.8em;
color: #8b0000;
text-align: center;
letter-spacing: 5px;
opacity: 0.7;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}
.disclaimer {
margin-top: 3em;
text-align: center;
font-size: 0.85em;
color: #654321;
font-style: italic;
line-height: 1.6;
}
.ornament {
text-align: center;
font-size: 2em;
color: #8b4513;
margin: 1em 0;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.3);
}
</style>
</head>
<body>
<div class="container">
<div class="scroll-wrapper">
<div class="ornament"></div>
<h1>Naomi's Secrets to Success™</h1>
<div class="subtitle">Being a Collection of Most Ancient & Powerful Wisdoms</div>
<div class="ornament"></div>
<div class="warning">⚠ CAUTION • FORBIDDEN KNOWLEDGE WITHIN ⚠</div>
<div class="secrets-grid">
<div class="secret">
<div class="secret-number">Secret #1</div>
<div class="secret-text">If you were not meant to fight them and win, they would not be called "the boss".</div>
</div>
<div class="secret">
<div class="secret-number">Secret #2</div>
<!-- Typo is intentional, should be Bsteal not Steal. -->
<div class="secret-text">always remember Naomi's patented BBB™ method: Beg, Borrow, Bsteal.</div>
</div>
<div class="secret">
<div class="secret-number">Secret #3</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #4</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #5</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #6</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #7</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #8</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #9</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #10</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #11</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #12</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #13</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #14</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #15</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #16</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #17</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #18</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #19</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #20</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #21</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #22</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #23</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #24</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #25</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #26</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #27</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #28</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #29</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #30</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #31</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #32</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #33</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #34</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #35</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #36</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #37</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #38</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #39</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #40</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #41</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #42</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #43</div>
<div class="secret-text">If the child will not sleep, give the child some marijuana. The child will sleep shortly.</div>
</div>
<div class="secret">
<div class="secret-number">Secret #44</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #45</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #46</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #47</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #48</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #49</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #50</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #51</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #52</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #53</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #54</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #55</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #56</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #57</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #58</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #59</div>
<div class="secret-text">Bank on the fact that your employer has data protection contracts in place with the AI provider, so you can give it your API keys.</div>
</div>
<div class="secret">
<div class="secret-number">Secret #60</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #61</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #62</div>
<div class="secret-text">Why purchase hardware when you could steal it?</div>
</div>
<div class="secret">
<div class="secret-number">Secret #63</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #64</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #65</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #66</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #67</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #68</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #69</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #70</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #71</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #72</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #73</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #74</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #75</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #76</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #77</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #78</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #79</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #80</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #81</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #82</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #83</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #84</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #85</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #86</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #87</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #88</div>
<div class="secret-text">If your car is making strange noises, simply turn the radio up higher. The noises don't exist if you cannot hear them.</div>
</div>
<div class="secret">
<div class="secret-number">Secret #89</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #90</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #91</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #92</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #93</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #94</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #95</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #96</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #97</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #98</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #99</div>
<div class="unknown">??????</div>
</div>
<div class="secret">
<div class="secret-number">Secret #100</div>
<div class="unknown">??????</div>
</div>
</div>
<div class="ornament"></div>
<div class="disclaimer">
<p>* Results not guaranteed. Side effects may include: excessive confidence, uncontrollable laughter, and being banned from hardware stores.</p>
<p>** Naomi's Secrets to Success™ is not responsible for any legal, financial, or existential consequences of following this advice.</p>
</div>
<div class="ornament"></div>
</div>
</div>
</body>
<script async src="https://analytics.nhcarrigan.com/js/pa-YUXAn1vhhRttySUAw_LMN.js"></script>
<script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init({
customProperties: {
domain: "secrets.nhcarrigan.com",
page: "Naomi's Secrets to Success™",
path: "/",
},
})
</script>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3569924701890974"
crossorigin="anonymous"></script>
</html>
+35 -2
View File
@@ -26,6 +26,7 @@
<li><a href="https://alerts.nhcarrigan.com" target="_blank"><code>alerts</code> - Rosalia Nightsong</a></li> <li><a href="https://alerts.nhcarrigan.com" target="_blank"><code>alerts</code> - Rosalia Nightsong</a></li>
<li><a href="https://forms-api.nhcarrigan.com" target="_blank"><code>forms-api</code> - Forms API</a></li> <li><a href="https://forms-api.nhcarrigan.com" target="_blank"><code>forms-api</code> - Forms API</a></li>
<li><a href="https://nails-api.nhcarrigan.com" target="_blank"><code>nails-api</code> - Nail Polish Tracker API</a></li> <li><a href="https://nails-api.nhcarrigan.com" target="_blank"><code>nails-api</code> - Nail Polish Tracker API</a></li>
<li><a href="https://rosalia.nhcarrigan.com" target="_blank"><code>rosalia</code> - Our personal alerts server, processes logs/errors/metrics from all of our apps</a></li>
<li><a href="https://trans.nhcarrigan.com" target="_blank"><code>trans</code> - LibreTranslate Instance</a></li> <li><a href="https://trans.nhcarrigan.com" target="_blank"><code>trans</code> - LibreTranslate Instance</a></li>
</ul> </ul>
</section> </section>
@@ -33,16 +34,37 @@
<h2>Bots</h2> <h2>Bots</h2>
<ul> <ul>
<li><a href="https://afp.nhcarrigan.com" target="_blank"><code>afp</code> - Art 4 Palestine Bot</a></li> <li><a href="https://afp.nhcarrigan.com" target="_blank"><code>afp</code> - Art 4 Palestine Bot</a></li>
<li><a href="https://altaria.nhcarrigan.com" target="_blank"><code>altaria</code> - Discord bot that reminds people to use alt text</a></li>
<li><a href="https://amari.nhcarrigan.com" target="_blank"><code>amari</code> - Naomi's personal assistant bot, notifies her when people use her name</a></li>
<li><a href="https://aria.nhcarrigan.com" target="_blank"><code>aria</code> - Translation bot</a></li>
<li><a href="https://assistant.nhcarrigan.com" target="_blank"><code>assistant</code> - Cordelia Taryne</a></li> <li><a href="https://assistant.nhcarrigan.com" target="_blank"><code>assistant</code> - Cordelia Taryne</a></li>
<li><a href="https://analytics.nhcarrigan.com" target="_blank"><code>becca</code> - Becca Lyria</a></li> <li><a href="https://analytics.nhcarrigan.com" target="_blank"><code>becca</code> - Becca Lyria</a></li>
<li><a href="https://caelia.nhcarrigan.com" target="_blank"><code>caelia</code> - Discord bot that reminds people to use inclusive language</a></li>
<li><a href="https://callista.nhcarrigan.com" target="_blank"><code>callista</code> - Discord bot that allows you to "bookmark" messages</a></li>
<li><a href="https://camperchan.nhcarrigan.com" target="_blank"><code>camperchan</code> - CamperChan (freeCodeCamp bot)</a></li> <li><a href="https://camperchan.nhcarrigan.com" target="_blank"><code>camperchan</code> - CamperChan (freeCodeCamp bot)</a></li>
<li><a href="https://celestine.nhcarrigan.com" target="_blank"><code>celestine</code> - Our Discord moderation bot</a></li>
<li><a href="https://chibika.nhcarrigan.com" target="_blank"><code>chibika</code> - Discord bot that shares random ascii art</a></li>
<li><a href="https://cordelia.nhcarrigan.com" target="_blank"><code>cordelia</code> - Multi-purpose AI-powered Discord bot</a></li>
<li><a href="https://gwen.nhcarrigan.com" target="_blank"><code>gwen</code> - Gwen Abalise</a></li> <li><a href="https://gwen.nhcarrigan.com" target="_blank"><code>gwen</code> - Gwen Abalise</a></li>
<li><a href="https://hooks.nhcarrigan.com" target="_blank"><code>hooks</code> - Moderation Bot</a></li> <li><a href="https://hooks.nhcarrigan.com" target="_blank"><code>hooks</code> - Moderation Bot</a></li>
<li><a href="https://keiko.nhcarrigan.com" target="_blank"><code>keiko</code> - Naomi's personal research bot</a></li>
<li><a href="https://liora.nhcarrigan.com" target="_blank"><code>liora</code> - Bot that allows you to create highlight words (get pinged when someone says the word)</a></li>
<li><a href="https://maylin.nhcarrigan.com" target="_blank"><code>maylin</code> - Maylin Taryne</a></li> <li><a href="https://maylin.nhcarrigan.com" target="_blank"><code>maylin</code> - Maylin Taryne</a></li>
<li><a href="https://melody.nhcarrigan.com" target="_blank"><code>melody</code> - Personal task management bot</a></li>
<li><a href="https://mommy-bot.nhcarrigan.com" target="_blank"><code>mommy-bot</code> - Bot that gives you motherly love on-demand</a></li>
<li><a href="https://mommy-slack.nhcarrigan.com" target="_blank"><code>mommy-slack</code> - Slack bot that gives you motherly love on-demand</a></li>
<li><a href="https://oogie.nhcarrigan.com" target="_blank"><code>oogie</code> - Boost Monitor</a></li> <li><a href="https://oogie.nhcarrigan.com" target="_blank"><code>oogie</code> - Boost Monitor</a></li>
<li><a href="https://pavelle.nhcarrigan.com" target="_blank"><code>pavelle</code> - Throw things like cake at your fellow server members</a></li>
<li><a href="https://ruubot.nhcarrigan.com" target="_blank"><code>ruubot</code> - Tingle Bot</a></li> <li><a href="https://ruubot.nhcarrigan.com" target="_blank"><code>ruubot</code> - Tingle Bot</a></li>
<li><a href="https://saisoku.nhcarrigan.com" target="_blank"><code>saisoku</code> - Bot that allows you to schedule reminders for yourself</a></li>
<li><a href="https://serenya.nhcarrigan.com" target="_blank"><code>serenya</code> - Bot that allows you to time yourself out, forcing you to take a break from Discord</a></li>
<li><a href="https://sorielle.nhcarrigan.com" target="_blank"><code>sorielle</code> - Bot that allows you to configure a "venting" channel where messages get auto-deleted after a few minutes</a></li>
<li><a href="https://tasks.nhcarrigan.com" target="_blank"><code>tasks</code> - Melody Iuvo</a></li> <li><a href="https://tasks.nhcarrigan.com" target="_blank"><code>tasks</code> - Melody Iuvo</a></li>
<li><a href="https://trans-bot.nhcarrigan.com" target="_blank"><code>trans-bot</code> - Aria Iuvo</a></li> <li><a href="https://trans-bot.nhcarrigan.com" target="_blank"><code>trans-bot</code> - Aria Iuvo</a></li>
<li><a href="https://tyche.nhcarrigan.com" target="_blank"><code>tyche</code> - Dice rolling bot</a></li>
<li><a href="https://umbrelle.nhcarrigan.com" target="_blank"><code>umbrelle</code> - Bot that allows you to configure a "honeypot" channel where people get soft-banned for sending messages</a></li>
<li><a href="https://valerium.nhcarrigan.com" target="_blank"><code>valerium</code> - Bot to manage boost roles</a></li>
<li><a href="https://veluna.nhcarrigan.com" target="_blank"><code>veluna</code> - Bot that allows your community to ask you anonymous questions</a></li>
</ul> </ul>
</section> </section>
<section> <section>
@@ -59,24 +81,33 @@
<ul> <ul>
<li><a href="https://analytics.nhcarrigan.com" target="_blank"><code>analytics</code> - Analytics</a></li> <li><a href="https://analytics.nhcarrigan.com" target="_blank"><code>analytics</code> - Analytics</a></li>
<li><a href="https://blog.nhcarrigan.com" target="_blank"><code>blog</code> - Our Blog</a></li> <li><a href="https://blog.nhcarrigan.com" target="_blank"><code>blog</code> - Our Blog</a></li>
<li><a href="https://board.nhcarrigan.com" target="_blank"><code>board</code> - Naomi's personal task management site</a></li>
<li><a href="https://books.nhcarrigan.com" target="_blank"><code>books</code> - Naomi's E-Book Library</a></li> <li><a href="https://books.nhcarrigan.com" target="_blank"><code>books</code> - Naomi's E-Book Library</a></li>
<li><a href="https://cloud.nhcarrigan.com" target="_blank"><code>cloud</code> - NextCloud</a></li> <li><a href="https://cloud.nhcarrigan.com" target="_blank"><code>cloud</code> - NextCloud</a></li>
<li><a href="https://deepgram.nhcarrigan.com" target="_blank"><code>deepgram</code> - Deepgram Weekly Standup</a></li> <li><a href="https://data.nhcarrigan.com" target="_blank"><code>data</code> - Our data API, offering things like our product list</a></li>
<li><a href="https://docs.nhcarrigan.com" target="_blank"><code>docs</code> - Documentation</a></li> <li><a href="https://docs.nhcarrigan.com" target="_blank"><code>docs</code> - Documentation</a></li>
<li><a href="https://fcc.nhcarrigan.com" target="_blank"><code>fcc</code> - freeCodeCamp Weekly Standup</a></li> <li><a href="https://eclaire.nhcarrigan.com" target="_blank"><code>eclaire</code> - Free Speech to Text translation</a></li>
<li><a href="https://forms.nhcarrigan.com" target="_blank"><code>forms</code> - Web Form Collection</a></li> <li><a href="https://forms.nhcarrigan.com" target="_blank"><code>forms</code> - Web Form Collection</a></li>
<li><a href="https://forum.nhcarrigan.com" target="_blank"><code>forum</code> - Discourse Forum</a></li> <li><a href="https://forum.nhcarrigan.com" target="_blank"><code>forum</code> - Discourse Forum</a></li>
<li><a href="https://git.nhcarrigan.com" target="_blank"><code>git</code> - Gitea Instance</a></li> <li><a href="https://git.nhcarrigan.com" target="_blank"><code>git</code> - Gitea Instance</a></li>
<li><a href="https://hikari.nhcarrigan.com" target="_blank"><code>hikari</code> - Our unified dashboard (currently shows announcements, sanction logs, and product lists)</a></li>
<li><a href="https://incidents.nhcarrigan.com" target="_blank"><code>incidents</code> - Uptime Kuma Instance</a></li> <li><a href="https://incidents.nhcarrigan.com" target="_blank"><code>incidents</code> - Uptime Kuma Instance</a></li>
<li><a href="https://lore.nhcarrigan.com" target="_blank"><code>lore</code> - A fun li'l site offering the "lore" behind NHCarrigan</a></li>
<li><a href="https://manual.nhcarrigan.com" target="_blank"><code>manual</code> - User Manual</a></li> <li><a href="https://manual.nhcarrigan.com" target="_blank"><code>manual</code> - User Manual</a></li>
<li><a href="https://moderation.nhcarrigan.com" target="_blank"><code>moderation</code> - Mod Logs</a></li> <li><a href="https://moderation.nhcarrigan.com" target="_blank"><code>moderation</code> - Mod Logs</a></li>
<li><a href="https://mommy.nhcarrigan.com" target="_blank"><code>mommy</code> - A site to get some motherly love</a></li>
<li><a href="https://music.nhcarrigan.com" target="_blank"><code>music</code> - Music Library</a></li> <li><a href="https://music.nhcarrigan.com" target="_blank"><code>music</code> - Music Library</a></li>
<li><a href="https://nails.nhcarrigan.com" target="_blank"><code>nails</code> - Nail Polish Tracker</a></li> <li><a href="https://nails.nhcarrigan.com" target="_blank"><code>nails</code> - Nail Polish Tracker</a></li>
<li><a href="https://notes.nhcarrigan.com" target="_blank"><code>notes</code> - Private Notes for Sponsors</a></li> <li><a href="https://notes.nhcarrigan.com" target="_blank"><code>notes</code> - Private Notes for Sponsors</a></li>
<li><a href="https://quality.nhcarrigan.com" target="_blank"><code>quality</code> - SonarQube Instance</a></li> <li><a href="https://quality.nhcarrigan.com" target="_blank"><code>quality</code> - SonarQube Instance</a></li>
<li><a href="https://resume.nhcarrigan.com" target="_blank"><code>resume</code> - Web-based Resume</a></li> <li><a href="https://resume.nhcarrigan.com" target="_blank"><code>resume</code> - Web-based Resume</a></li>
<li><a href="https://secrets.nhcarrigan.com" target="_blank"><code>secrets</code> - Naomi's Secrets to Success™</a></li>
<li><a href="https://security.nhcarrigan.com" target="_blank"><code>security</code> - Automated Code Scanning Results</a></li> <li><a href="https://security.nhcarrigan.com" target="_blank"><code>security</code> - Automated Code Scanning Results</a></li>
<li><a href="https://silly.nhcarrigan.com" target="_blank"><code>silly</code> - A collection of dumb little websites Naomi has built (usually as part of an event)</a></li>
<li><a href="https://sitemap.nhcarrigan.com" target="_blank"><code>sitemap</code> - This page!</a></li> <li><a href="https://sitemap.nhcarrigan.com" target="_blank"><code>sitemap</code> - This page!</a></li>
<li><a href="https://socials.nhcarrigan.com" target="_blank"><code>socials</code> - Naomi's social media account list</a></li>
<li><a href="https://support.nhcarrigan.com" target="_blank"><code>support</code> - Our product and community support forum</a></li>
<li><a href="https://telemetry.nhcarrigan.com" target="_blank"><code>telemetry</code> - Our metrics dashboard</a></li>
<li><a href="https://testimonials.nhcarrigan.com" target="_blank"><code>testimonials</code> - Client Reviews</a></li> <li><a href="https://testimonials.nhcarrigan.com" target="_blank"><code>testimonials</code> - Client Reviews</a></li>
<li><a href="https://uptime.nhcarrigan.com" target="_blank"><code>uptime</code> - Uptime Kuma Instance</a></li> <li><a href="https://uptime.nhcarrigan.com" target="_blank"><code>uptime</code> - Uptime Kuma Instance</a></li>
<li><a href="https://www.nhcarrigan.com" target="_blank"><code>www</code> - Home Page</a></li> <li><a href="https://www.nhcarrigan.com" target="_blank"><code>www</code> - Home Page</a></li>
@@ -89,6 +120,8 @@
<li><a href="https://chat.nhcarrigan.com" target="_blank"><code>chat</code> - Redirects to our forum</a></li> <li><a href="https://chat.nhcarrigan.com" target="_blank"><code>chat</code> - Redirects to our forum</a></li>
<li><a href="https://contact.nhcarrigan.com" target="_blank"><code>contact</code> - Redirects to our docs</a></li> <li><a href="https://contact.nhcarrigan.com" target="_blank"><code>contact</code> - Redirects to our docs</a></li>
<li><a href="https://donate.nhcarrigan.com" target="_blank"><code>donate</code> - Redirects to our docs</a></li> <li><a href="https://donate.nhcarrigan.com" target="_blank"><code>donate</code> - Redirects to our docs</a></li>
<li><a href="https://meet.nhcarrigan.com" target="_blank"><code>meet</code> - Redirects to our z.cal page to schedule a meeting with Naomi</a></li>
<li><a href="https://products.nhcarrigan.com" target="_blank"><code>products</code> - Redirects to Hikari's product list</a></li>
</ul> </ul>
</section> </section>
<section> <section>
+144 -5
View File
@@ -1,10 +1,149 @@
#!/usr/bin/bash #!/usr/bin/bash
dirs=("bsky" "chat" "games" "link-redirector" "testimonials" "manual" "sitemap" "music" "books" "products" "donate" "socials"); # Get all directories except hidden ones and mail
all_dirs=()
while IFS= read -r dir; do
dir_name=$(basename "$dir")
if [[ "$dir_name" != "mail" ]]; then
all_dirs+=("$dir_name")
fi
done < <(find . -maxdepth 1 -type d | grep -v "^\.$" | grep -v "^\./\." | sort)
for dir in "${dirs[@]}"; do # Arrays to track selections
rsync -av $dir prod:/home/naomi selected_dirs=()
echo "Synced $dir" selected_status=()
# Initialize all as unselected
for i in "${!all_dirs[@]}"; do
selected_status[$i]=false
done done
echo "mail/index.html must be manually synced to mail:/home/user-data/www/default by a user with sudo access." # Function to display menu
display_menu() {
clear
echo "==============================================="
echo " Select Directories to Sync (Space to toggle)"
echo "==============================================="
echo
for i in "${!all_dirs[@]}"; do
if [[ "${selected_status[$i]}" == "true" ]]; then
echo " [✓] ${all_dirs[$i]}"
else
echo " [ ] ${all_dirs[$i]}"
fi
done
echo
echo "-----------------------------------------------"
echo " SPACE: Toggle selection | ENTER: Confirm"
echo " q: Quit without syncing"
echo "-----------------------------------------------"
}
# Interactive selection
current=0
while true; do
display_menu
# Highlight current option
tput cup $((current + 4)) 0
if [[ "${selected_status[$current]}" == "true" ]]; then
echo -e "\e[7m [✓] ${all_dirs[$current]}\e[0m"
else
echo -e "\e[7m [ ] ${all_dirs[$current]}\e[0m"
fi
# Read user input
IFS= read -r -s -n1 key
# Handle different key inputs
if [[ $key == $'\x1b' ]]; then
# Escape sequence - read more characters
read -r -s -n2 -t 0.1 rest
key="${key}${rest}"
case "$key" in
$'\x1b[A'|$'\x1bOA') # Up arrow
((current--))
if [[ $current -lt 0 ]]; then
current=$((${#all_dirs[@]} - 1))
fi
;;
$'\x1b[B'|$'\x1bOB') # Down arrow
((current++))
if [[ $current -ge ${#all_dirs[@]} ]]; then
current=0
fi
;;
esac
elif [[ $key == $'\x20' ]]; then
# Space key (hex 20)
if [[ "${selected_status[$current]}" == "true" ]]; then
selected_status[$current]=false
else
selected_status[$current]=true
fi
elif [[ $key == $'\x0a' || $key == $'\x0d' || -z "$key" ]]; then
# Enter key (newline or carriage return) or empty
break
elif [[ $key == "q" || $key == "Q" ]]; then
# Quit
echo
echo "Sync cancelled."
exit 0
fi
done
# Collect selected directories
for i in "${!all_dirs[@]}"; do
if [[ "${selected_status[$i]}" == "true" ]]; then
selected_dirs+=("${all_dirs[$i]}")
fi
done
# Clear screen and show summary
clear
echo "==============================================="
echo " Ready to Sync"
echo "==============================================="
echo
if [[ ${#selected_dirs[@]} -eq 0 ]]; then
echo "No directories selected for sync."
echo
exit 0
fi
echo "Selected directories:"
for dir in "${selected_dirs[@]}"; do
echo "$dir"
done
echo
read -p "Proceed with sync? (y/N) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Sync cancelled."
exit 0
fi
echo
echo "Starting sync..."
echo "==============================================="
# Perform sync
for dir in "${selected_dirs[@]}"; do
echo
echo "Syncing $dir..."
rsync -av "$dir" prod:/home/naomi
echo "✓ Synced $dir"
done
echo
echo "==============================================="
echo "Sync completed!"
echo
echo "Note: mail/index.html must be manually synced to"
echo "mail:/home/user-data/www/default by a user with sudo access."