Skip to content

Commit 2989e58

Browse files
committed
get ready for deploy and updates
1 parent 517c875 commit 2989e58

16 files changed

Lines changed: 594 additions & 101 deletions

.env.dev.enc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#ENC[AES256_GCM,data:3fjy0gJFpr2B,iv:ufrIMOop9p4L8p2KDyUQo1glgK6XNrtnYC7o2Tkak0s=,tag:jzd1xIYaewqqzCZ3LtfN5Q==,type:comment]
2+
NODE_ENV=ENC[AES256_GCM,data:nn48vuksur4nuE0=,iv:JQ16diiTz4JksnoFEm1eWZRg+BjQCBlOnblO6cgzrBw=,tag:m2JuivGanEQhzI3RWmB9ng==,type:str]
3+
DATABASE_URL=ENC[AES256_GCM,data:I2XR0cHEkxCyel9lgntPNP8lXV4FykysEQuZhm7f4QejKXgbn/ro0GZw0x0N0r57k0McgGM=,iv:D1yZisQwoTu+H7M9OvgwviMRfPZOvMKwHt4neINf+oY=,tag:zqKYCnzXupr8+hAt2ggG2A==,type:str]
4+
SESSION_SECRET=ENC[AES256_GCM,data:v4hrgjfskZxJ2iWM7oSD+geeOV8=,iv:mRDa3HI6VxCFV599+KklWg5qTowIjud6vSQxbdkimug=,tag:qDNx9C7Iz38uwtw1cIEwOQ==,type:str]
5+
APP_URL=ENC[AES256_GCM,data:hxeEFB4mZOziDmEDYqteKzRZUpK/,iv:9lHcdrX/mY81aRLa3p5yxKzAmUCrK6yhEqYhv8RiU20=,tag:lPH6KhyzDqPWeM7TcFF9lw==,type:str]
6+
API_PORT=ENC[AES256_GCM,data:ctcM/Q==,iv:BupdZ+OcEBaeMebM3pYGAooFs/0CsrRNXW1k/hVpAmU=,tag:7tUh/Oj4M5KiL9BeyvZUTQ==,type:str]
7+
#ENC[AES256_GCM,data:72PldlFY2cSdkRP5cEBJKjrt,iv:MeOlx3xN7pb2DT1HGBl2Rzqqwq41Gs/Q8s1ZHz3dbEM=,tag:PpcKY4uAhovzRg4eb/lULw==,type:comment]
8+
S3_BUCKET=ENC[AES256_GCM,data:PF903bQ7gds=,iv:0pNJAJs4QYlf11YI7+I062RgE8uRPzgbH5Pys7Kb24U=,tag:WITVn8QLk53MlV+wqa5seA==,type:str]
9+
S3_REGION=ENC[AES256_GCM,data:uvNz5x9lConb,iv:e7kHSGWSxQnN4QTVSEUzLotwXg1CE70F5HVFu8bnxz0=,tag:bGVwsL0hptz1TPEU1pJpug==,type:str]
10+
S3_ENDPOINT=ENC[AES256_GCM,data:SpsxQuqHGWMmxxl4+u9u6UU=,iv:RkK4BbYiRXNJGaiSfSDjl7qb5I6twFRJIjUpZtouB4M=,tag:nMTj4AOWO0atqD/zC/vutw==,type:str]
11+
S3_ACCESS_KEY=ENC[AES256_GCM,data:eWIn4OAEDOHwwQ==,iv:oGfAkyjWAvLh12R2LJDBigw8I80gFYjk5sFOk2h/AQE=,tag:MdThOgQcne7o0zRic4bViQ==,type:str]
12+
S3_SECRET_KEY=ENC[AES256_GCM,data:BGQCu4pm9SQJgg==,iv:YMHvBVXQ89ydgjw2bJQLtBW0SFPt/UtW4mzAlhB8WT8=,tag:ny0FscjK3tNgC8S8oy0FFQ==,type:str]
13+
#ENC[AES256_GCM,data:yIJPfAEtTA==,iv:M8kUo7+IfJ+UZoup2MaiZ0AaRe9JOhvrergYlmGE4FM=,tag:tYSVgoDjCCgOUpegeLfMRw==,type:comment]
14+
BACKUP_S3_PREFIX=ENC[AES256_GCM,data:xfU4+rjWjtY=,iv:aSQdiCSmunQueFiJaFbAvhff0NQApM15ZY0D8KwG8XQ=,tag:ggqUb6pOJyKKcpO5CKElcg==,type:str]
15+
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtbGtOQjRSbENSSVVVYk02\nekhqQnZTc3RyWkdwRE5rSGlvM0M3OFNFUGs4CjllRkNSNG45MEVKOC9uYWYxSEhV\nUWJhdnhSNHQyRGZPS2hONWVER1laVTAKLS0tIE5PZXF1UzVsdG9iN2ZPYjgrMEgr\nZHYxOXJ2WnVKc1ZGU1Z1NzVqR1ZUbjQKFkED13L3GmMxPCLLNjAfjEoloeyHX1pe\ngrKU62FSN3PBviPUQfJw3K8lb7XL+sv9Ig5fberFhM8M2SGUMbK8+A==\n-----END AGE ENCRYPTED FILE-----\n
16+
sops_age__list_0__map_recipient=age1wravpjmed26772xfjhawmnsnc4933htapg6y5xseqml0jdv8z9hqemzhcr
17+
sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPUHpFaG1zd2krazJFVHZu\nQ3hEa1dReTBwWmJFTXMxWFcxWG40UWRia3lRCjExc21taVFmUkZwWGwxb1BsWVE3\nOWpmclhJcklHRDFrWjFTeE5ocFg5NTgKLS0tIHgzOUgzSVB2Z2tmTXYybzdqMEdj\naEk5QTNVM3JhY3ROU3dRRzFWaTJYMHcKfU8QaIU1rC1hObH4TLlOnWzpU38dNt12\nWKpvIlznPptCDqaOiGzK66juwpequylAHNHFPfLn4cvfXpJ5EqlWnA==\n-----END AGE ENCRYPTED FILE-----\n
18+
sops_age__list_1__map_recipient=age1ysddqggsx3h8zkv7xn3z26sjak5pqms6pyqhnky9ukrvpk7es5jsayz8w7
19+
sops_lastmodified=2026-04-28T13:30:57Z
20+
sops_mac=ENC[AES256_GCM,data:LcNDAJWiqNYPHxeCXULsRblZDhSUIyySDg6bkIFHGs34d31aXs93IkmYMBCyMsbXU57D7cKDo0l4xEWAFddeiVtQosY4NbMdG+xJQpKWo0rU/xrLEptdVNi6Rmr9HbOHh0ov5pLDFkq6CuhOMz48+2w1caw5UfOMMiCEVKQe4NE=,iv:STcx6P9sbz/LuTkMjIYtuhJr9zm5+MaiNoDyRg6bWmY=,tag:1T5PTT6GlqhmMeNCKqRdRw==,type:str]
21+
sops_unencrypted_suffix=_unencrypted
22+
sops_version=3.11.0

.env.enc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ENC[AES256_GCM,data:j1S/hHcjriuw,iv:2Dn+h+VtQhK6fbW9EDUd0tklTWmR5RiNw88Mi1qXMcY=,tag:foOYLRGdn0h75rbdi1aAZA==,type:comment]
2+
NODE_ENV=ENC[AES256_GCM,data:KyEVIHyhZ6yIVA==,iv:4p23RMJjBH+VxGIUIEQfPBICYZfRWlefk5i7ZrJp4Ww=,tag:84h6lVSdE1VN2knFeSAdBg==,type:str]
3+
DATABASE_URL=ENC[AES256_GCM,data:+cqeJIEYDXYYb61XMifHqSAINVTZrslzAJNY29tznWNr6J2BPIeZ1OUOOh0vu79n2VfAndo=,iv:dHPLbgPD9R8OHb9RRKnZ/T8ufd7505dqFaTnBU+htLE=,tag:k/aj6VnXmFQOKsm5P/69GQ==,type:str]
4+
SESSION_SECRET=ENC[AES256_GCM,data:4Di2iki1Lz1bXnAElBkG8ojyd0d4,iv:51VW+x4GlGJF0fjB5GMUvBtBJ+ibWmHkWLiaco6OyHw=,tag:8TkaGVMS1r+MrPLwdl2UMQ==,type:str]
5+
APP_URL=ENC[AES256_GCM,data:fv0o9XMw0mSFg4FQtPvUo2jXMNVlm8tj,iv:hsn2+OOdEnqbzYTx66iLXpJrxE6SHucuBjY00Ubtk94=,tag:iYY/OIG71QIHdmoxlWbNSQ==,type:str]
6+
API_PORT=ENC[AES256_GCM,data:0yL/Sg==,iv:mSEbCdlJbz+WlJY6KVO43AALRRoYOJ3Zok3ptjPZp3U=,tag:2uzYegEP939Tiw/4NGetXA==,type:str]
7+
#ENC[AES256_GCM,data:EYWk,iv:Bfe1QPKEdP3UoQw/CsWCgLwdHXUrbv7sPGzJ5VhZNoY=,tag:8KkmHdhPD2z+qGWt5Xobnw==,type:comment]
8+
S3_BUCKET=ENC[AES256_GCM,data:BZ9ZHVSyP9UksuokqQc=,iv:/qJdnLLaWlCemmL0Ofy+S84A0M3fHycFubCxJZZR/pg=,tag:gc78PEfbWtDWNoxlGUhsDA==,type:str]
9+
S3_ENDPOINT=ENC[AES256_GCM,data:Zhfs7RllfQbjWhHZiTx/zFA/96IWJNxSXwLD,iv:QqRfLtIKSTBXecbVoabZ+RruFukuCAgihLkfYxyllPs=,tag:pMsg+3rstSeWpTNvfvQG/A==,type:str]
10+
S3_ACCESS_KEY=ENC[AES256_GCM,data:4y0B2NVMyjWMVwDT2p0JkRoKQAk=,iv:O9oNeRNr+AP1gvYMi6ZHpelY8SxQis8rDTpfTTlftPw=,tag:NpIvLBtjjbeqnl1Kng01+g==,type:str]
11+
S3_SECRET_KEY=ENC[AES256_GCM,data:bgI7NAdJ7MVMpMDhqhGoeGd78xnmqZoRQ94Y6ZWTCbiZQudk2QgMwQ==,iv:HTygMbS/16KeM2VYx0kUGyVX5j0gCyRiVJewcywRh1E=,tag:hcLoobP4A6pvrUSFwlaOiA==,type:str]
12+
#ENC[AES256_GCM,data:QoWPnWSoeQ==,iv:cL4nJpNJwBF4dxpWUXBhMz9DouDFbAP0qU1bTldJQgM=,tag:VYfiNcbsYJl0SwMwXU+GBw==,type:comment]
13+
BACKUP_S3_PREFIX=ENC[AES256_GCM,data:dcmNx719lBwQMyC47CkC+w==,iv:JQwUqlQqqihJfKehwyb4WcxDLwfocbTfJ+gzVJXhLBo=,tag:sN1uVmnQV87VjOR4D4kWug==,type:str]
14+
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA3ZUhOTDJtUGNiVFR4Qlhk\nenVZOUo0RmhPWEJkTkd3RnNMTWpTOUQ3TXk4CmZpaHlSeGdMekJmZ0VHZWhGSGxJ\ncUZ1L0VqcFN1Vk5MU01PWnBVTE9nZ2cKLS0tIHF3YlJhT1UxMjl6eTNoMFIrRWRq\nOVVnazFvWjRUM1B5QzBLM29MaTBncFkKJml4Hk2s8uqRRtp7z0BAbDlXnxSRTk3B\np1p81a6gvqCtWk71wbKQmQh75rYYSF4W2NZEiDHUmGZRV3nowPPgVg==\n-----END AGE ENCRYPTED FILE-----\n
15+
sops_age__list_0__map_recipient=age1wravpjmed26772xfjhawmnsnc4933htapg6y5xseqml0jdv8z9hqemzhcr
16+
sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuS0lSU3pjdU1OcmxUazZn\naHRZcWViNVJwemJvZDl5NHloSENHbHB6K2t3CnFBWk91aHZpQ1dIYnA2RDBhWXFQ\nenRsczR6WGxIMnVmOTVyZ0JOQzhJa0EKLS0tIEEyd2tSQVFjaE91Q21BakhPV1B4\nK1JEQkdQOWJ1V0lKbDdLUkV2cC90bjQKEtuEYKievb7mgGx0BrWeLGWFnQijLk8f\nXybbUWmfEJGOTNhyu49OWPrNM1xMUbbIcWPpNYeL5epN0NQbcSYv8A==\n-----END AGE ENCRYPTED FILE-----\n
17+
sops_age__list_1__map_recipient=age1ysddqggsx3h8zkv7xn3z26sjak5pqms6pyqhnky9ukrvpk7es5jsayz8w7
18+
sops_lastmodified=2026-04-28T13:31:00Z
19+
sops_mac=ENC[AES256_GCM,data:KkLK1ZDVqQxbiPkHTldwzWBli0YsZ1+L2s9Jkw4bHGvpLb8LH6CSGgNWWwVF2rXmK+imf9wNzE/cwxFwwp8Ygki0Vwq2wE0uC+YCO+nNj3YO104gg4SkEwq7ds5BygaTNGu/A3ZPjS6za25x5Jl+ioYkJ/mnjfaPMursDC9k5uw=,iv:fhAa4xFnpl8plta4YM0Cn4irX86b6v9NrNyjtw9Rws4=,tag:9p0zWk4c3AANry8QX2xyhw==,type:str]
20+
sops_unencrypted_suffix=_unencrypted
21+
sops_version=3.11.0

.sops.yaml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
# SOPS configuration — specifies which age public keys can decrypt.
2+
# Matches .env and .env.dev files (both plain and .enc encrypted).
23
# Generate a keypair: age-keygen -o key.txt
3-
# Add your public keys below.
44

55
creation_rules:
66
- path_regex: \.env(\.dev)?(\.enc)?$
7-
age: []
8-
# Add age public keys here:
9-
# - age1your_first_key_here
10-
# - age1your_second_key_here
7+
age:
8+
- age1wravpjmed26772xfjhawmnsnc4933htapg6y5xseqml0jdv8z9hqemzhcr
9+
- age1ysddqggsx3h8zkv7xn3z26sjak5pqms6pyqhnky9ukrvpk7es5jsayz8w7

docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ services:
4545
postgres:
4646
condition: service_healthy
4747
ports:
48-
- "${APP_PORT:-4321}:4321"
49-
- "${API_PORT:-3000}:3000"
48+
- "${APP_PORT:-4321}:4322"
49+
- "${API_PORT:-3000}:3001"
5050
deploy:
5151
resources:
5252
limits:

src/layouts/Base.astro

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
interface Props {
33
title: string;
4-
description?: string;
4+
description?: string | undefined;
55
}
66
77
const { title, description = "A public registry for structured knowledge." } = Astro.props;
@@ -37,6 +37,7 @@ if (sessionCookie) {
3737
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600&display=swap"
3838
rel="stylesheet"
3939
/>
40+
<style>@import "../styles/global.css";</style>
4041
</head>
4142
<body class="min-h-screen font-sans text-[15px] leading-relaxed">
4243
<header class="border-b border-rule">
@@ -52,13 +53,25 @@ if (sessionCookie) {
5253
<div class="flex items-center gap-5 text-sm text-ink-muted">
5354
<a href="/explore" class="hover:text-ink transition-colors">Explore</a>
5455
<a href="/docs" class="hover:text-ink transition-colors">Docs</a>
55-
<a href="/connect" class="hover:text-ink transition-colors">Connect</a>
5656
<a href="/blog" class="hover:text-ink transition-colors">Blog</a>
5757
{currentUser ? (
58-
<>
59-
<a href="/dashboard" class="hover:text-ink transition-colors">Dashboard</a>
60-
<a href={`/${currentUser.slug}`} class="hover:text-ink transition-colors font-medium text-ink">{currentUser.slug}</a>
61-
</>
58+
<div class="relative" id="user-menu">
59+
<button
60+
class="hover:text-ink transition-colors font-medium text-ink cursor-pointer"
61+
id="user-menu-btn"
62+
type="button"
63+
>
64+
{currentUser.slug}
65+
</button>
66+
<div class="hidden absolute right-0 top-full pt-1 z-50" id="user-menu-popover">
67+
<div class="bg-parchment border border-rule shadow-sm min-w-40">
68+
<a href={`/${currentUser.slug}`} class="block px-3 py-2 text-sm text-ink-light hover:bg-parchment-dark transition-colors">Your Profile</a>
69+
<a href="/dashboard" class="block px-3 py-2 text-sm text-ink-light hover:bg-parchment-dark transition-colors">Dashboard</a>
70+
<hr class="border-rule" />
71+
<a href="/logout" class="block px-3 py-2 text-sm text-ink-muted hover:bg-parchment-dark transition-colors">Sign out</a>
72+
</div>
73+
</div>
74+
</div>
6275
) : (
6376
<>
6477
<a href="/login" class="hover:text-ink transition-colors">Log in</a>
@@ -89,6 +102,35 @@ if (sessionCookie) {
89102
</body>
90103
</html>
91104

92-
<style is:global>
93-
@import "../styles/global.css";
94-
</style>
105+
<script>
106+
const menuBtn = document.getElementById("user-menu-btn");
107+
const menuPopover = document.getElementById("user-menu-popover");
108+
const menuRoot = document.getElementById("user-menu");
109+
110+
if (menuBtn && menuPopover && menuRoot) {
111+
let hideTimeout: ReturnType<typeof setTimeout>;
112+
113+
function show() {
114+
clearTimeout(hideTimeout);
115+
menuPopover!.classList.remove("hidden");
116+
}
117+
118+
function scheduleHide() {
119+
hideTimeout = setTimeout(() => {
120+
menuPopover!.classList.add("hidden");
121+
}, 150);
122+
}
123+
124+
menuRoot.addEventListener("mouseenter", show);
125+
menuRoot.addEventListener("mouseleave", scheduleHide);
126+
menuBtn.addEventListener("click", () => {
127+
menuPopover!.classList.toggle("hidden");
128+
});
129+
130+
document.addEventListener("click", (e) => {
131+
if (!menuRoot.contains(e.target as Node)) {
132+
menuPopover!.classList.add("hidden");
133+
}
134+
});
135+
}
136+
</script>

src/layouts/BlogPost.astro

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ const { frontmatter } = Astro.props;
99
<header class="mb-8">
1010
<h1 class="text-2xl font-semibold tracking-tight font-sans mb-2">{frontmatter.title}</h1>
1111
<p class="text-ink-muted text-sm italic">{frontmatter.subtitle}</p>
12+
{frontmatter.date && (
13+
<time class="block text-xs text-ink-muted mt-2" datetime={new Date(frontmatter.date).toISOString().slice(0, 10)}>
14+
{new Date(frontmatter.date).toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" })}
15+
</time>
16+
)}
1217
<hr class="border-rule mt-4" />
1318
</header>
1419

@@ -57,4 +62,25 @@ const { frontmatter } = Astro.props;
5762
padding: 0.125rem 0.25rem;
5863
border-radius: 0.25rem;
5964
}
65+
.prose :global(pre) {
66+
background: var(--color-ink);
67+
color: var(--color-parchment);
68+
padding: 1rem;
69+
overflow-x: auto;
70+
margin-bottom: 1rem;
71+
border-radius: 0.25rem;
72+
font-size: 0.8rem;
73+
line-height: 1.6;
74+
}
75+
.prose :global(pre code) {
76+
background: none;
77+
padding: 0;
78+
border-radius: 0;
79+
color: inherit;
80+
font-size: inherit;
81+
}
82+
.prose :global(pre code span) {
83+
color: inherit !important;
84+
background: none !important;
85+
}
6086
</style>

0 commit comments

Comments
 (0)