fix: rename issue -> drop, fix hashtags, add 6 tags

- "Issue" replaced with "Drop" everywhere in UI and copy:
  Drop #001, Weekly Drops, Write Drop #002, next drop, etc.
- nostrText: hashtags consolidated to one line (some clients break
  each hashtag onto its own line when separated by newlines)
- nostrText: removed "Full issue:" prefix — bare URL unfurls cleaner
- 6 hashtags added: #skateboarding #nostr #skatespots #spotr
  #newsletter #skatespotsnews
- Publish button tags updated to include all 6 as t-tags
- Template comment updated to match new format

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
This commit is contained in:
shakespeare.diy 2026-06-18 15:09:32 +07:00
parent b5edb0ab52
commit e4a9b454a4
2 changed files with 19 additions and 16 deletions

View file

@ -76,7 +76,7 @@ function LatestDropPill() {
>
<Radio className="h-3.5 w-3.5 text-[#ccff00] animate-pulse flex-shrink-0" />
<span className="text-xs font-black text-[#ccff00] uppercase tracking-wide whitespace-nowrap">
{formatIssueNumber(latest.number)} is out
Drop {formatIssueNumber(latest.number)} is out
</span>
<span className="text-[10px] text-gray-500 hidden sm:inline">
· {age === 0 ? 'Today' : age === 1 ? 'Yesterday' : `${age}d ago`}
@ -139,7 +139,7 @@ function MondayAdminReminder() {
onClick={() => setDismissed(todayKey)}
>
<Pencil className="h-3.5 w-3.5" />
Write Issue #{String(NEWSLETTER_ISSUES[0].number + 1).padStart(3, '0')}
Write Drop #{String(NEWSLETTER_ISSUES[0].number + 1).padStart(3, '0')}
</a>
</div>
<button

View file

@ -65,22 +65,22 @@ export interface NewsletterIssue {
/**
* Plain-text teaser posted as a kind 1 Nostr note.
*
* TEMPLATE (copy this for every new issue):
* TEMPLATE (copy this for every new drop):
*
* 🛹 SkateSpots Weekly #00X
* 🛹 SkateSpots Drop #00X
*
* [One punchy sentence summing up the week — what was the theme?]
* [One sentence on the most important thing that shipped.]
*
* Full issue: https://skate-spots.org/newsletter
* https://skate-spots.org/newsletter
*
* #skateboarding #nostr #skatespots
* #skateboarding #nostr #skatespots #spotr #newsletter #skatespotsnews
*
* Rules:
* - Max 5 lines of content before the URL
* - No bullet lists — clients render them differently
* - URL always on its own line, always last before hashtags
* - 3 hashtags max — more looks spammy
* - URL on its own line, no "Full issue:" prefix — cleaner unfurl
* - Hashtags all on one line — some clients break each onto a new line if separated
*/
nostrText: string;
}
@ -146,13 +146,13 @@ export const NEWSLETTER_ISSUES: NewsletterIssue[] = [
spotOfTheWeek: undefined,
communityNote:
"The relay at wss://goskatespots.nostr1.com is live and growing. Spots, shops, events, coaches, filmers, editors and tours are all flowing through it. Add it to your Nostr client to follow the scene directly.",
nostrText: `🛹 SkateSpots Weekly #001
nostrText: `🛹 SkateSpots Drop #001
Security week. Fake spot protection, URL sanitization, map clustering, phishing warnings and more — eight improvements shipped to keep the community clean and the map usable.
Full issue: https://skate-spots.org/newsletter
https://skate-spots.org/newsletter
#skateboarding #nostr #skatespots`,
#skateboarding #nostr #skatespots #spotr #newsletter #skatespotsnews`,
},
];
@ -182,13 +182,16 @@ function PublishToNostrButton({ issue }: { issue: NewsletterIssue }) {
content: issue.nostrText,
tags: [
['t', 'skateboarding'],
['t', 'skatespots'],
['t', 'nostr'],
['r', `https://skate-spots.org/newsletter`],
['t', 'skatespots'],
['t', 'spotr'],
['t', 'newsletter'],
['t', 'skatespotsnews'],
['r', 'https://skate-spots.org/newsletter'],
],
});
setPublished(true);
toast({ title: 'Published!', description: `Issue #${String(issue.number).padStart(3, '0')} posted to Nostr.` });
toast({ title: 'Published!', description: `Drop #${String(issue.number).padStart(3, '0')} posted to Nostr.` });
} catch (err) {
toast({
title: 'Publish failed',
@ -418,7 +421,7 @@ function IssueArticle({ issue }: { issue: NewsletterIssue }) {
) : (
<div className="mt-4 p-5 rounded-2xl border-2 border-[#ff0040]/20 bg-[#ff0040]/5">
<p className="text-gray-500 text-sm italic">
No spot picked this week. Submit yours and it might make the next issue.
No spot picked this week. Submit yours and it might make the next drop.
</p>
<Link
to="/map"
@ -501,7 +504,7 @@ export default function NewsletterPage() {
<div className="mb-12 text-center">
<div className="inline-flex items-center gap-2 px-3 py-1.5 rounded-full border border-[#ccff00]/30 bg-[#ccff00]/5 text-[10px] font-black uppercase tracking-widest text-[#ccff00] mb-5">
<Radio className="h-3 w-3" />
Weekly Drop
Weekly Drops
</div>
<h1
className="text-4xl sm:text-6xl font-black uppercase leading-none mb-3"