···14141515- **goat CLI tool** installed (`brew install bluesky-social/tap/goat` on macOS)
1616- **Active Bluesky account** with your PDS
1717-- **DNS access** for `drydown.social` domain
1717+- **DNS access** for `alpha.drydown.social` domain
1818- **Node.js** for TypeScript type generation
19192020## Step-by-Step Publishing Process
···148148149149### 8. Configure DNS Authority
150150151151-To prove you control the `drydown.social` domain, add a DNS TXT record:
151151+To prove you control the `alpha.drydown.social` domain, add a DNS TXT record:
152152153153**DNS Record Details:**
154154-- **Name/Host**: `_lexicon.drydown.social` (or just `_lexicon` depending on your DNS provider)
154154+- **Name/Host**: `_lexicon.alpha.drydown.social` (or just `_lexicon` depending on your DNS provider)
155155- **Type**: `TXT`
156156- **Value**: `did=YOUR_DID_HERE` (replace with your actual DID from step 7)
157157- **TTL**: 3600 (or default)
158158159159**Example:**
160160```
161161-_lexicon.drydown.social. IN TXT "did=did:plc:abc123xyz..."
161161+_lexicon.alpha.drydown.social. IN TXT "did=did:plc:abc123xyz..."
162162```
163163164164### 9. Verify DNS Propagation
···166166Wait 5-10 minutes after adding the DNS record, then verify:
167167168168```bash
169169-dig TXT _lexicon.drydown.social
169169+dig TXT _lexicon.alpha.drydown.social
170170```
171171172172**Expected output:** Should show your DID in the TXT record
···222222- Wait longer for DNS propagation (can take up to 24 hours)
223223- Verify the TXT record is correctly formatted
224224- Ensure you're using the correct DID
225225-- Check that the record name is exactly `_lexicon.drydown.social`
225225+- Check that the record name is exactly `_lexicon.alpha.drydown.social`
226226227227### "invalid record key specifier: self"
228228
+4-4
docs/adding-services.md
···160160161161### Footer Links
162162- **Location:** App footer (`Footer`)
163163-- **Behavior:** Links to `@drydown.social` on the **logged-in user's service**
164164-- **Example:** User on Blacksky sees a link to Blacksky's drydown.social profile
163163+- **Behavior:** Links to `@alpha.drydown.social` on the **logged-in user's service**
164164+- **Example:** User on Blacksky sees a link to Blacksky's alpha.drydown.social profile
165165166166## Testing Your Service Configuration
167167···185185 - [ ] Click the link and verify it goes to the correct profile
1861861871874. **Footer Link**
188188- - [ ] Check the footer link to `@drydown.social`
189189- - [ ] Verify it points to your service's drydown.social profile
188188+ - [ ] Check the footer link to `@alpha.drydown.social`
189189+ - [ ] Verify it points to your service's alpha.drydown.social profile
190190191191### Testing with Mock Issuers
192192
+1-1
functions/[[path]].ts
···5252 // favicon.svg is the only guaranteed static asset; a proper og-default.png
5353 // should be added to /public. For now fall back to the favicon so the tag
5454 // is at least present and non-broken.
5555- let image = 'https://drydown.social/favicon.svg';
5555+ let image = 'https://alpha.drydown.social/favicon.svg';
5656 let dataFetchSucceeded = false;
57575858 try {
···159159 } catch (err) {
160160 console.error('Auth init failed:', err)
161161 // If it's a ZodError about localhost, checking the URL might help
162162- const allowedHosts = ['127.0.0.1', 'drydown.social']
162162+ const allowedHosts = ['127.0.0.1', 'alpha.drydown.social']
163163 if (!allowedHosts.includes(window.location.hostname)) {
164164 alert(`Configuration Error: Please access this app via one of the allowed domains: ${allowedHosts.join(', ')}.`)
165165 }
+1-1
src/components/EditReview.tsx
···408408 // We use the DID in the link for robustness.
409409 const link = `${window.location.origin}/profile/${session.sub}/review/${rkey}`
410410411411- const header = `${fragranceName} by ${houseName} on @drydown.social`
411411+ const header = `${fragranceName} by ${houseName} on @alpha.drydown.social`
412412 const footer = `#scentsky #fragrancesky #perfumesky`
413413414414 const countGraphemes = (s: string) => {
+2-2
src/components/Footer.tsx
···13131414 // Use user's service for the Drydown profile link, fallback to Bluesky
1515 const service = userService || DEFAULT_SERVICE
1616- const drydownProfileUrl = service.profileUrl('drydown.social')
1616+ const drydownProfileUrl = service.profileUrl('alpha.drydown.social')
17171818 return (
1919 <footer className="app-footer">
···2323 target="_blank"
2424 rel="noopener noreferrer"
2525 >
2626- @drydown.social
2626+ @alpha.drydown.social
2727 </a>
2828 {userDataUrl && (
2929 <>
+1-1
src/components/LandingPage.tsx
···167167 <SEO
168168 title="Drydown - Discover & Review Fragrances on Bluesky"
169169 description="Join the Drydown community to create time-based fragrance reviews and discover new perfumes reviewed by real people."
170170- url="https://drydown.social"
170170+ url="https://alpha.drydown.social"
171171 />
172172173173 <Header session={null} />
+2-2
src/components/SingleReviewPage.tsx
···176176 return s.length
177177 }
178178179179- const header = `${fragrance.name} by ${houseName} on @drydown.social`
179179+ const header = `${fragrance.name} by ${houseName} on @alpha.drydown.social`
180180 const footer = `#scentsky #fragrancesky #perfumesky`
181181182182 // Calculate length of fixed parts
···243243 return s.length
244244 }
245245246246- const header = `${fragrance.name} by ${houseName} on @drydown.social`
246246+ const header = `${fragrance.name} by ${houseName} on @alpha.drydown.social`
247247 const footer = `#scentsky #fragrancesky #perfumesky`
248248249249 // Structure: [header]\n\n[starsLine]\n[text]\n\n[footer]\n\n[link]
···30303131 const invite = (targetHandle: string) => {
3232 // Generate personal recommendation message
3333- const message = `Hey @${targetHandle}, you should check out @drydown.social!
3333+ const message = `Hey @${targetHandle}, you should check out @alpha.drydown.social!
34343535It's an app for creating detailed fragrance reviews that capture how scents evolve over time. I think you'd enjoy it!`
3636