[codex] add hackathon badge catalog flow - #16

Merged
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results
May 29, 2026
Merged

[codex] add hackathon badge catalog flow#16
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results

Conversation

@agustinkassis

@agustinkassisagustinkassis commented May 29, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds a Commerce hackathon badges page backed by Nostr badge definitions and a replaceable catalog event.
  • Adds admin bootstrap flow where the backend signs official badge definition/catalog events with LACRYPTA_NSEC and the frontend publishes them.
  • Separates La Crypta admin identity (NEXT_PUBLIC_LACRYPTA_NPUB) from the official publisher key derived from LACRYPTA_NSEC.
  • Corrects Commerce results to: cursats, qrwapu, wapufy, tiendita, wapubot, zaploop.

Validation

  • pnpm build

Summary by CodeRabbit

  • New Features

    • Hackathon badges system: view and manage Nostr-based achievement badges per hackathon
    • Admin bootstrap functionality to generate and publish badges to the network
  • Documentation

    • Added Nostr hackathon badges specification guide
  • Chores

    • Updated hackathon project rankings and competition scores

Review Change Stack

@vercel

vercelBot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentMay 29, 2026 3:18pm

Request Review

@coderabbitai

coderabbitaiBot commented May 29, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a9751664-6d58-4f23-8f23-de207a61c8b9

📥 Commits

Reviewing files that changed from the base of the PR and between a86ac12 and 0f179e2.

📒 Files selected for processing (14)
  • .env.example
  • app/api/hackathon-badges/bootstrap/route.ts
  • app/api/lacrypta-pubkeys/route.ts
  • app/database/DatabaseClient.tsx
  • app/hackathons/[id]/badges/HackathonBadgesClient.tsx
  • app/hackathons/[id]/badges/page.tsx
  • app/hackathons/[id]/page.tsx
  • data/hackathons/projects-commerce.json
  • data/hackathons/reports.json
  • docs/nostr-hackathon-badges.md
  • lib/databaseCatalog.ts
  • lib/hackathonBadgeClient.ts
  • lib/hackathonBadges.ts
  • lib/nostrReports.ts

📝 Walkthrough

Walkthrough

This PR introduces a complete Nostr-based hackathon badge system for La Crypta, allowing admins to publish and manage verifiable badges on Nostr relays, plus updates to Commerce hackathon rankings. The implementation spans a foundational data model, server bootstrap and pubkey APIs, client relay/signing utilities, React UI with admin workflows, and integration into the existing event catalog system.

Changes

Nostr Hackathon Badge System

Layer / File(s)Summary
Badge Data Model and Schema
lib/hackathonBadges.ts
Exports badge kind constants (30078 catalog, 30009 definitions), schema identifiers, category/tone/criterion types, default badge templates with Spanish metadata, and builders to generate unsigned catalog/definition events. Parser validates incoming catalog events by kind, JSON, schema version, and structural consistency.
Nostr Badge Specification
docs/nostr-hackathon-badges.md
Complete specification covering event kinds, catalog tag requirements, JSON schema for categories/badges/criteria, badge definition NIP-58 format, award matching rules, bootstrap signed-request flow, and client resolution patterns.
Server Configuration and Bootstrap API
.env.example, app/api/hackathon-badges/bootstrap/route.ts
New LACRYPTA_NSEC (server-side signing key) and clarified NEXT_PUBLIC_LACRYPTA_NPUB (admin gating). POST /api/hackathon-badges/bootstrap endpoint validates admin signature, enforces 10-minute freshness, generates badge events, signs with backend secret, and returns issuer pubkey and event payload.
Pubkey Resolution API and System Updates
app/api/lacrypta-pubkeys/route.ts, lib/nostrReports.ts, app/database/DatabaseClient.tsx
New GET /api/lacrypta-pubkeys decodes admin and derives publisher pubkeys from env; resolveLacryptaPubkey now fetches publisher key via API; PubkeyOverride message updated to reference new architecture.
Client Badge Utilities
lib/hackathonBadgeClient.ts
Exports fetchLacryptaBadgePubkeys, fetchHackathonBadgeCatalog (queries relays for most recent catalog), publishSignedEventsToRelays (per-relay result tracking), and requestBadgeBootstrap (signs request, POSTs to backend).
Badge Catalog System Integration
lib/databaseCatalog.ts
Adds hackathon-badge-catalogs event category with relay filter for kind 30078 tagged by HACKATHON_BADGE_CATALOG_TAG, published by La Crypta; updates eventDisplayTitle to format catalog titles by stripping D-tag prefix.
Hackathon Badges UI Component
app/hackathons/[id]/badges/HackathonBadgesClient.tsx
React component managing catalog loading, admin bootstrap workflow (signer → backend → relay publish → verify), category-ordered badge grid with tone-based styling, status panel with refresh/bootstrap controls, and missing-catalog messaging for admins.
Badges Page Route and Navigation Link
app/hackathons/[id]/badges/page.tsx, app/hackathons/[id]/page.tsx
New page with static generation from HACKATHONS list and per-hackathon SEO metadata; "Ver badges" link with Award icon added to hackathon detail navigation.

Commerce Hackathon Rankings Update

Layer / File(s)Summary
Project Ranking Data Updates
data/hackathons/projects-commerce.json
Repositions project rankings: wapufy (3rd), tiendita (4th), new wapubot project (5th), zaploop (6th), removing hash-21 entry.
Report Score Updates
data/hackathons/reports.json
Updates position values and sets finalScore to null for zaploop, wapufy, tiendita, and new wapubot entry in commerce hackathon reports.

🐰 A badge system blooms, with relays and keys,
Nostr events dance through La Crypta's breeze,
Admins bootstrap catalogs, events take flight,
While commerce results shuffle into the light! ✨

🎯 4 (Complex) | ⏱️ ~50 minutes

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/hackathon-badges-commerce-results

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claudiomolt
claudiomolt marked this pull request as ready for review May 29, 2026 15:19
@claudiomolt
claudiomolt merged commit ec3a3a6 into mainMay 29, 2026
3 checks passed
@claudiomolt
claudiomolt deleted the codex/hackathon-badges-commerce-results branch May 29, 2026 15:19
@coderabbitaicoderabbitaiBot mentioned this pull request May 31, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agustinkassis@claudiomolt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[codex] add hackathon badge catalog flow - #16

Merged
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results
May 29, 2026
Merged

[codex] add hackathon badge catalog flow#16
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results

Conversation

@agustinkassis

@agustinkassisagustinkassis commented May 29, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds a Commerce hackathon badges page backed by Nostr badge definitions and a replaceable catalog event.
  • Adds admin bootstrap flow where the backend signs official badge definition/catalog events with LACRYPTA_NSEC and the frontend publishes them.
  • Separates La Crypta admin identity (NEXT_PUBLIC_LACRYPTA_NPUB) from the official publisher key derived from LACRYPTA_NSEC.
  • Corrects Commerce results to: cursats, qrwapu, wapufy, tiendita, wapubot, zaploop.

Validation

  • pnpm build

Summary by CodeRabbit

  • New Features

    • Hackathon badges system: view and manage Nostr-based achievement badges per hackathon
    • Admin bootstrap functionality to generate and publish badges to the network
  • Documentation

    • Added Nostr hackathon badges specification guide
  • Chores

    • Updated hackathon project rankings and competition scores

Review Change Stack

@vercel

vercelBot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentMay 29, 2026 3:18pm

Request Review

@coderabbitai

coderabbitaiBot commented May 29, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a9751664-6d58-4f23-8f23-de207a61c8b9

📥 Commits

Reviewing files that changed from the base of the PR and between a86ac12 and 0f179e2.

📒 Files selected for processing (14)
  • .env.example
  • app/api/hackathon-badges/bootstrap/route.ts
  • app/api/lacrypta-pubkeys/route.ts
  • app/database/DatabaseClient.tsx
  • app/hackathons/[id]/badges/HackathonBadgesClient.tsx
  • app/hackathons/[id]/badges/page.tsx
  • app/hackathons/[id]/page.tsx
  • data/hackathons/projects-commerce.json
  • data/hackathons/reports.json
  • docs/nostr-hackathon-badges.md
  • lib/databaseCatalog.ts
  • lib/hackathonBadgeClient.ts
  • lib/hackathonBadges.ts
  • lib/nostrReports.ts

📝 Walkthrough

Walkthrough

This PR introduces a complete Nostr-based hackathon badge system for La Crypta, allowing admins to publish and manage verifiable badges on Nostr relays, plus updates to Commerce hackathon rankings. The implementation spans a foundational data model, server bootstrap and pubkey APIs, client relay/signing utilities, React UI with admin workflows, and integration into the existing event catalog system.

Changes

Nostr Hackathon Badge System

Layer / File(s)Summary
Badge Data Model and Schema
lib/hackathonBadges.ts
Exports badge kind constants (30078 catalog, 30009 definitions), schema identifiers, category/tone/criterion types, default badge templates with Spanish metadata, and builders to generate unsigned catalog/definition events. Parser validates incoming catalog events by kind, JSON, schema version, and structural consistency.
Nostr Badge Specification
docs/nostr-hackathon-badges.md
Complete specification covering event kinds, catalog tag requirements, JSON schema for categories/badges/criteria, badge definition NIP-58 format, award matching rules, bootstrap signed-request flow, and client resolution patterns.
Server Configuration and Bootstrap API
.env.example, app/api/hackathon-badges/bootstrap/route.ts
New LACRYPTA_NSEC (server-side signing key) and clarified NEXT_PUBLIC_LACRYPTA_NPUB (admin gating). POST /api/hackathon-badges/bootstrap endpoint validates admin signature, enforces 10-minute freshness, generates badge events, signs with backend secret, and returns issuer pubkey and event payload.
Pubkey Resolution API and System Updates
app/api/lacrypta-pubkeys/route.ts, lib/nostrReports.ts, app/database/DatabaseClient.tsx
New GET /api/lacrypta-pubkeys decodes admin and derives publisher pubkeys from env; resolveLacryptaPubkey now fetches publisher key via API; PubkeyOverride message updated to reference new architecture.
Client Badge Utilities
lib/hackathonBadgeClient.ts
Exports fetchLacryptaBadgePubkeys, fetchHackathonBadgeCatalog (queries relays for most recent catalog), publishSignedEventsToRelays (per-relay result tracking), and requestBadgeBootstrap (signs request, POSTs to backend).
Badge Catalog System Integration
lib/databaseCatalog.ts
Adds hackathon-badge-catalogs event category with relay filter for kind 30078 tagged by HACKATHON_BADGE_CATALOG_TAG, published by La Crypta; updates eventDisplayTitle to format catalog titles by stripping D-tag prefix.
Hackathon Badges UI Component
app/hackathons/[id]/badges/HackathonBadgesClient.tsx
React component managing catalog loading, admin bootstrap workflow (signer → backend → relay publish → verify), category-ordered badge grid with tone-based styling, status panel with refresh/bootstrap controls, and missing-catalog messaging for admins.
Badges Page Route and Navigation Link
app/hackathons/[id]/badges/page.tsx, app/hackathons/[id]/page.tsx
New page with static generation from HACKATHONS list and per-hackathon SEO metadata; "Ver badges" link with Award icon added to hackathon detail navigation.

Commerce Hackathon Rankings Update

Layer / File(s)Summary
Project Ranking Data Updates
data/hackathons/projects-commerce.json
Repositions project rankings: wapufy (3rd), tiendita (4th), new wapubot project (5th), zaploop (6th), removing hash-21 entry.
Report Score Updates
data/hackathons/reports.json
Updates position values and sets finalScore to null for zaploop, wapufy, tiendita, and new wapubot entry in commerce hackathon reports.

🐰 A badge system blooms, with relays and keys,
Nostr events dance through La Crypta's breeze,
Admins bootstrap catalogs, events take flight,
While commerce results shuffle into the light! ✨

🎯 4 (Complex) | ⏱️ ~50 minutes

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/hackathon-badges-commerce-results

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claudiomolt
claudiomolt marked this pull request as ready for review May 29, 2026 15:19
@claudiomolt
claudiomolt merged commit ec3a3a6 into mainMay 29, 2026
3 checks passed
@claudiomolt
claudiomolt deleted the codex/hackathon-badges-commerce-results branch May 29, 2026 15:19
@coderabbitaicoderabbitaiBot mentioned this pull request May 31, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agustinkassis@claudiomolt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[codex] add hackathon badge catalog flow - #16

Merged
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results
May 29, 2026
Merged

[codex] add hackathon badge catalog flow#16
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results

Conversation

@agustinkassis

@agustinkassisagustinkassis commented May 29, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds a Commerce hackathon badges page backed by Nostr badge definitions and a replaceable catalog event.
  • Adds admin bootstrap flow where the backend signs official badge definition/catalog events with LACRYPTA_NSEC and the frontend publishes them.
  • Separates La Crypta admin identity (NEXT_PUBLIC_LACRYPTA_NPUB) from the official publisher key derived from LACRYPTA_NSEC.
  • Corrects Commerce results to: cursats, qrwapu, wapufy, tiendita, wapubot, zaploop.

Validation

  • pnpm build

Summary by CodeRabbit

  • New Features

    • Hackathon badges system: view and manage Nostr-based achievement badges per hackathon
    • Admin bootstrap functionality to generate and publish badges to the network
  • Documentation

    • Added Nostr hackathon badges specification guide
  • Chores

    • Updated hackathon project rankings and competition scores

Review Change Stack

@vercel

vercelBot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentMay 29, 2026 3:18pm

Request Review

@coderabbitai

coderabbitaiBot commented May 29, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a9751664-6d58-4f23-8f23-de207a61c8b9

📥 Commits

Reviewing files that changed from the base of the PR and between a86ac12 and 0f179e2.

📒 Files selected for processing (14)
  • .env.example
  • app/api/hackathon-badges/bootstrap/route.ts
  • app/api/lacrypta-pubkeys/route.ts
  • app/database/DatabaseClient.tsx
  • app/hackathons/[id]/badges/HackathonBadgesClient.tsx
  • app/hackathons/[id]/badges/page.tsx
  • app/hackathons/[id]/page.tsx
  • data/hackathons/projects-commerce.json
  • data/hackathons/reports.json
  • docs/nostr-hackathon-badges.md
  • lib/databaseCatalog.ts
  • lib/hackathonBadgeClient.ts
  • lib/hackathonBadges.ts
  • lib/nostrReports.ts

📝 Walkthrough

Walkthrough

This PR introduces a complete Nostr-based hackathon badge system for La Crypta, allowing admins to publish and manage verifiable badges on Nostr relays, plus updates to Commerce hackathon rankings. The implementation spans a foundational data model, server bootstrap and pubkey APIs, client relay/signing utilities, React UI with admin workflows, and integration into the existing event catalog system.

Changes

Nostr Hackathon Badge System

Layer / File(s)Summary
Badge Data Model and Schema
lib/hackathonBadges.ts
Exports badge kind constants (30078 catalog, 30009 definitions), schema identifiers, category/tone/criterion types, default badge templates with Spanish metadata, and builders to generate unsigned catalog/definition events. Parser validates incoming catalog events by kind, JSON, schema version, and structural consistency.
Nostr Badge Specification
docs/nostr-hackathon-badges.md
Complete specification covering event kinds, catalog tag requirements, JSON schema for categories/badges/criteria, badge definition NIP-58 format, award matching rules, bootstrap signed-request flow, and client resolution patterns.
Server Configuration and Bootstrap API
.env.example, app/api/hackathon-badges/bootstrap/route.ts
New LACRYPTA_NSEC (server-side signing key) and clarified NEXT_PUBLIC_LACRYPTA_NPUB (admin gating). POST /api/hackathon-badges/bootstrap endpoint validates admin signature, enforces 10-minute freshness, generates badge events, signs with backend secret, and returns issuer pubkey and event payload.
Pubkey Resolution API and System Updates
app/api/lacrypta-pubkeys/route.ts, lib/nostrReports.ts, app/database/DatabaseClient.tsx
New GET /api/lacrypta-pubkeys decodes admin and derives publisher pubkeys from env; resolveLacryptaPubkey now fetches publisher key via API; PubkeyOverride message updated to reference new architecture.
Client Badge Utilities
lib/hackathonBadgeClient.ts
Exports fetchLacryptaBadgePubkeys, fetchHackathonBadgeCatalog (queries relays for most recent catalog), publishSignedEventsToRelays (per-relay result tracking), and requestBadgeBootstrap (signs request, POSTs to backend).
Badge Catalog System Integration
lib/databaseCatalog.ts
Adds hackathon-badge-catalogs event category with relay filter for kind 30078 tagged by HACKATHON_BADGE_CATALOG_TAG, published by La Crypta; updates eventDisplayTitle to format catalog titles by stripping D-tag prefix.
Hackathon Badges UI Component
app/hackathons/[id]/badges/HackathonBadgesClient.tsx
React component managing catalog loading, admin bootstrap workflow (signer → backend → relay publish → verify), category-ordered badge grid with tone-based styling, status panel with refresh/bootstrap controls, and missing-catalog messaging for admins.
Badges Page Route and Navigation Link
app/hackathons/[id]/badges/page.tsx, app/hackathons/[id]/page.tsx
New page with static generation from HACKATHONS list and per-hackathon SEO metadata; "Ver badges" link with Award icon added to hackathon detail navigation.

Commerce Hackathon Rankings Update

Layer / File(s)Summary
Project Ranking Data Updates
data/hackathons/projects-commerce.json
Repositions project rankings: wapufy (3rd), tiendita (4th), new wapubot project (5th), zaploop (6th), removing hash-21 entry.
Report Score Updates
data/hackathons/reports.json
Updates position values and sets finalScore to null for zaploop, wapufy, tiendita, and new wapubot entry in commerce hackathon reports.

🐰 A badge system blooms, with relays and keys,
Nostr events dance through La Crypta's breeze,
Admins bootstrap catalogs, events take flight,
While commerce results shuffle into the light! ✨

🎯 4 (Complex) | ⏱️ ~50 minutes

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/hackathon-badges-commerce-results

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claudiomolt
claudiomolt marked this pull request as ready for review May 29, 2026 15:19
@claudiomolt
claudiomolt merged commit ec3a3a6 into mainMay 29, 2026
3 checks passed
@claudiomolt
claudiomolt deleted the codex/hackathon-badges-commerce-results branch May 29, 2026 15:19
@coderabbitaicoderabbitaiBot mentioned this pull request May 31, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agustinkassis@claudiomolt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[codex] add hackathon badge catalog flow - #16

Merged
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results
May 29, 2026
Merged

[codex] add hackathon badge catalog flow#16
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results

Conversation

@agustinkassis

@agustinkassisagustinkassis commented May 29, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds a Commerce hackathon badges page backed by Nostr badge definitions and a replaceable catalog event.
  • Adds admin bootstrap flow where the backend signs official badge definition/catalog events with LACRYPTA_NSEC and the frontend publishes them.
  • Separates La Crypta admin identity (NEXT_PUBLIC_LACRYPTA_NPUB) from the official publisher key derived from LACRYPTA_NSEC.
  • Corrects Commerce results to: cursats, qrwapu, wapufy, tiendita, wapubot, zaploop.

Validation

  • pnpm build

Summary by CodeRabbit

  • New Features

    • Hackathon badges system: view and manage Nostr-based achievement badges per hackathon
    • Admin bootstrap functionality to generate and publish badges to the network
  • Documentation

    • Added Nostr hackathon badges specification guide
  • Chores

    • Updated hackathon project rankings and competition scores

Review Change Stack

@vercel

vercelBot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentMay 29, 2026 3:18pm

Request Review

@coderabbitai

coderabbitaiBot commented May 29, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a9751664-6d58-4f23-8f23-de207a61c8b9

📥 Commits

Reviewing files that changed from the base of the PR and between a86ac12 and 0f179e2.

📒 Files selected for processing (14)
  • .env.example
  • app/api/hackathon-badges/bootstrap/route.ts
  • app/api/lacrypta-pubkeys/route.ts
  • app/database/DatabaseClient.tsx
  • app/hackathons/[id]/badges/HackathonBadgesClient.tsx
  • app/hackathons/[id]/badges/page.tsx
  • app/hackathons/[id]/page.tsx
  • data/hackathons/projects-commerce.json
  • data/hackathons/reports.json
  • docs/nostr-hackathon-badges.md
  • lib/databaseCatalog.ts
  • lib/hackathonBadgeClient.ts
  • lib/hackathonBadges.ts
  • lib/nostrReports.ts

📝 Walkthrough

Walkthrough

This PR introduces a complete Nostr-based hackathon badge system for La Crypta, allowing admins to publish and manage verifiable badges on Nostr relays, plus updates to Commerce hackathon rankings. The implementation spans a foundational data model, server bootstrap and pubkey APIs, client relay/signing utilities, React UI with admin workflows, and integration into the existing event catalog system.

Changes

Nostr Hackathon Badge System

Layer / File(s)Summary
Badge Data Model and Schema
lib/hackathonBadges.ts
Exports badge kind constants (30078 catalog, 30009 definitions), schema identifiers, category/tone/criterion types, default badge templates with Spanish metadata, and builders to generate unsigned catalog/definition events. Parser validates incoming catalog events by kind, JSON, schema version, and structural consistency.
Nostr Badge Specification
docs/nostr-hackathon-badges.md
Complete specification covering event kinds, catalog tag requirements, JSON schema for categories/badges/criteria, badge definition NIP-58 format, award matching rules, bootstrap signed-request flow, and client resolution patterns.
Server Configuration and Bootstrap API
.env.example, app/api/hackathon-badges/bootstrap/route.ts
New LACRYPTA_NSEC (server-side signing key) and clarified NEXT_PUBLIC_LACRYPTA_NPUB (admin gating). POST /api/hackathon-badges/bootstrap endpoint validates admin signature, enforces 10-minute freshness, generates badge events, signs with backend secret, and returns issuer pubkey and event payload.
Pubkey Resolution API and System Updates
app/api/lacrypta-pubkeys/route.ts, lib/nostrReports.ts, app/database/DatabaseClient.tsx
New GET /api/lacrypta-pubkeys decodes admin and derives publisher pubkeys from env; resolveLacryptaPubkey now fetches publisher key via API; PubkeyOverride message updated to reference new architecture.
Client Badge Utilities
lib/hackathonBadgeClient.ts
Exports fetchLacryptaBadgePubkeys, fetchHackathonBadgeCatalog (queries relays for most recent catalog), publishSignedEventsToRelays (per-relay result tracking), and requestBadgeBootstrap (signs request, POSTs to backend).
Badge Catalog System Integration
lib/databaseCatalog.ts
Adds hackathon-badge-catalogs event category with relay filter for kind 30078 tagged by HACKATHON_BADGE_CATALOG_TAG, published by La Crypta; updates eventDisplayTitle to format catalog titles by stripping D-tag prefix.
Hackathon Badges UI Component
app/hackathons/[id]/badges/HackathonBadgesClient.tsx
React component managing catalog loading, admin bootstrap workflow (signer → backend → relay publish → verify), category-ordered badge grid with tone-based styling, status panel with refresh/bootstrap controls, and missing-catalog messaging for admins.
Badges Page Route and Navigation Link
app/hackathons/[id]/badges/page.tsx, app/hackathons/[id]/page.tsx
New page with static generation from HACKATHONS list and per-hackathon SEO metadata; "Ver badges" link with Award icon added to hackathon detail navigation.

Commerce Hackathon Rankings Update

Layer / File(s)Summary
Project Ranking Data Updates
data/hackathons/projects-commerce.json
Repositions project rankings: wapufy (3rd), tiendita (4th), new wapubot project (5th), zaploop (6th), removing hash-21 entry.
Report Score Updates
data/hackathons/reports.json
Updates position values and sets finalScore to null for zaploop, wapufy, tiendita, and new wapubot entry in commerce hackathon reports.

🐰 A badge system blooms, with relays and keys,
Nostr events dance through La Crypta's breeze,
Admins bootstrap catalogs, events take flight,
While commerce results shuffle into the light! ✨

🎯 4 (Complex) | ⏱️ ~50 minutes

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/hackathon-badges-commerce-results

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claudiomolt
claudiomolt marked this pull request as ready for review May 29, 2026 15:19
@claudiomolt
claudiomolt merged commit ec3a3a6 into mainMay 29, 2026
3 checks passed
@claudiomolt
claudiomolt deleted the codex/hackathon-badges-commerce-results branch May 29, 2026 15:19
@coderabbitaicoderabbitaiBot mentioned this pull request May 31, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agustinkassis@claudiomolt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[codex] add hackathon badge catalog flow - #16

Merged
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results
May 29, 2026
Merged

[codex] add hackathon badge catalog flow#16
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results

Conversation

@agustinkassis

@agustinkassisagustinkassis commented May 29, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds a Commerce hackathon badges page backed by Nostr badge definitions and a replaceable catalog event.
  • Adds admin bootstrap flow where the backend signs official badge definition/catalog events with LACRYPTA_NSEC and the frontend publishes them.
  • Separates La Crypta admin identity (NEXT_PUBLIC_LACRYPTA_NPUB) from the official publisher key derived from LACRYPTA_NSEC.
  • Corrects Commerce results to: cursats, qrwapu, wapufy, tiendita, wapubot, zaploop.

Validation

  • pnpm build

Summary by CodeRabbit

  • New Features

    • Hackathon badges system: view and manage Nostr-based achievement badges per hackathon
    • Admin bootstrap functionality to generate and publish badges to the network
  • Documentation

    • Added Nostr hackathon badges specification guide
  • Chores

    • Updated hackathon project rankings and competition scores

Review Change Stack

@vercel

vercelBot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentMay 29, 2026 3:18pm

Request Review

@coderabbitai

coderabbitaiBot commented May 29, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a9751664-6d58-4f23-8f23-de207a61c8b9

📥 Commits

Reviewing files that changed from the base of the PR and between a86ac12 and 0f179e2.

📒 Files selected for processing (14)
  • .env.example
  • app/api/hackathon-badges/bootstrap/route.ts
  • app/api/lacrypta-pubkeys/route.ts
  • app/database/DatabaseClient.tsx
  • app/hackathons/[id]/badges/HackathonBadgesClient.tsx
  • app/hackathons/[id]/badges/page.tsx
  • app/hackathons/[id]/page.tsx
  • data/hackathons/projects-commerce.json
  • data/hackathons/reports.json
  • docs/nostr-hackathon-badges.md
  • lib/databaseCatalog.ts
  • lib/hackathonBadgeClient.ts
  • lib/hackathonBadges.ts
  • lib/nostrReports.ts

📝 Walkthrough

Walkthrough

This PR introduces a complete Nostr-based hackathon badge system for La Crypta, allowing admins to publish and manage verifiable badges on Nostr relays, plus updates to Commerce hackathon rankings. The implementation spans a foundational data model, server bootstrap and pubkey APIs, client relay/signing utilities, React UI with admin workflows, and integration into the existing event catalog system.

Changes

Nostr Hackathon Badge System

Layer / File(s)Summary
Badge Data Model and Schema
lib/hackathonBadges.ts
Exports badge kind constants (30078 catalog, 30009 definitions), schema identifiers, category/tone/criterion types, default badge templates with Spanish metadata, and builders to generate unsigned catalog/definition events. Parser validates incoming catalog events by kind, JSON, schema version, and structural consistency.
Nostr Badge Specification
docs/nostr-hackathon-badges.md
Complete specification covering event kinds, catalog tag requirements, JSON schema for categories/badges/criteria, badge definition NIP-58 format, award matching rules, bootstrap signed-request flow, and client resolution patterns.
Server Configuration and Bootstrap API
.env.example, app/api/hackathon-badges/bootstrap/route.ts
New LACRYPTA_NSEC (server-side signing key) and clarified NEXT_PUBLIC_LACRYPTA_NPUB (admin gating). POST /api/hackathon-badges/bootstrap endpoint validates admin signature, enforces 10-minute freshness, generates badge events, signs with backend secret, and returns issuer pubkey and event payload.
Pubkey Resolution API and System Updates
app/api/lacrypta-pubkeys/route.ts, lib/nostrReports.ts, app/database/DatabaseClient.tsx
New GET /api/lacrypta-pubkeys decodes admin and derives publisher pubkeys from env; resolveLacryptaPubkey now fetches publisher key via API; PubkeyOverride message updated to reference new architecture.
Client Badge Utilities
lib/hackathonBadgeClient.ts
Exports fetchLacryptaBadgePubkeys, fetchHackathonBadgeCatalog (queries relays for most recent catalog), publishSignedEventsToRelays (per-relay result tracking), and requestBadgeBootstrap (signs request, POSTs to backend).
Badge Catalog System Integration
lib/databaseCatalog.ts
Adds hackathon-badge-catalogs event category with relay filter for kind 30078 tagged by HACKATHON_BADGE_CATALOG_TAG, published by La Crypta; updates eventDisplayTitle to format catalog titles by stripping D-tag prefix.
Hackathon Badges UI Component
app/hackathons/[id]/badges/HackathonBadgesClient.tsx
React component managing catalog loading, admin bootstrap workflow (signer → backend → relay publish → verify), category-ordered badge grid with tone-based styling, status panel with refresh/bootstrap controls, and missing-catalog messaging for admins.
Badges Page Route and Navigation Link
app/hackathons/[id]/badges/page.tsx, app/hackathons/[id]/page.tsx
New page with static generation from HACKATHONS list and per-hackathon SEO metadata; "Ver badges" link with Award icon added to hackathon detail navigation.

Commerce Hackathon Rankings Update

Layer / File(s)Summary
Project Ranking Data Updates
data/hackathons/projects-commerce.json
Repositions project rankings: wapufy (3rd), tiendita (4th), new wapubot project (5th), zaploop (6th), removing hash-21 entry.
Report Score Updates
data/hackathons/reports.json
Updates position values and sets finalScore to null for zaploop, wapufy, tiendita, and new wapubot entry in commerce hackathon reports.

🐰 A badge system blooms, with relays and keys,
Nostr events dance through La Crypta's breeze,
Admins bootstrap catalogs, events take flight,
While commerce results shuffle into the light! ✨

🎯 4 (Complex) | ⏱️ ~50 minutes

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/hackathon-badges-commerce-results

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claudiomolt
claudiomolt marked this pull request as ready for review May 29, 2026 15:19
@claudiomolt
claudiomolt merged commit ec3a3a6 into mainMay 29, 2026
3 checks passed
@claudiomolt
claudiomolt deleted the codex/hackathon-badges-commerce-results branch May 29, 2026 15:19
@coderabbitaicoderabbitaiBot mentioned this pull request May 31, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agustinkassis@claudiomolt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[codex] add hackathon badge catalog flow - #16

Merged
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results
May 29, 2026
Merged

[codex] add hackathon badge catalog flow#16
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results

Conversation

@agustinkassis

@agustinkassisagustinkassis commented May 29, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds a Commerce hackathon badges page backed by Nostr badge definitions and a replaceable catalog event.
  • Adds admin bootstrap flow where the backend signs official badge definition/catalog events with LACRYPTA_NSEC and the frontend publishes them.
  • Separates La Crypta admin identity (NEXT_PUBLIC_LACRYPTA_NPUB) from the official publisher key derived from LACRYPTA_NSEC.
  • Corrects Commerce results to: cursats, qrwapu, wapufy, tiendita, wapubot, zaploop.

Validation

  • pnpm build

Summary by CodeRabbit

  • New Features

    • Hackathon badges system: view and manage Nostr-based achievement badges per hackathon
    • Admin bootstrap functionality to generate and publish badges to the network
  • Documentation

    • Added Nostr hackathon badges specification guide
  • Chores

    • Updated hackathon project rankings and competition scores

Review Change Stack

@vercel

vercelBot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentMay 29, 2026 3:18pm

Request Review

@coderabbitai

coderabbitaiBot commented May 29, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a9751664-6d58-4f23-8f23-de207a61c8b9

📥 Commits

Reviewing files that changed from the base of the PR and between a86ac12 and 0f179e2.

📒 Files selected for processing (14)
  • .env.example
  • app/api/hackathon-badges/bootstrap/route.ts
  • app/api/lacrypta-pubkeys/route.ts
  • app/database/DatabaseClient.tsx
  • app/hackathons/[id]/badges/HackathonBadgesClient.tsx
  • app/hackathons/[id]/badges/page.tsx
  • app/hackathons/[id]/page.tsx
  • data/hackathons/projects-commerce.json
  • data/hackathons/reports.json
  • docs/nostr-hackathon-badges.md
  • lib/databaseCatalog.ts
  • lib/hackathonBadgeClient.ts
  • lib/hackathonBadges.ts
  • lib/nostrReports.ts

📝 Walkthrough

Walkthrough

This PR introduces a complete Nostr-based hackathon badge system for La Crypta, allowing admins to publish and manage verifiable badges on Nostr relays, plus updates to Commerce hackathon rankings. The implementation spans a foundational data model, server bootstrap and pubkey APIs, client relay/signing utilities, React UI with admin workflows, and integration into the existing event catalog system.

Changes

Nostr Hackathon Badge System

Layer / File(s)Summary
Badge Data Model and Schema
lib/hackathonBadges.ts
Exports badge kind constants (30078 catalog, 30009 definitions), schema identifiers, category/tone/criterion types, default badge templates with Spanish metadata, and builders to generate unsigned catalog/definition events. Parser validates incoming catalog events by kind, JSON, schema version, and structural consistency.
Nostr Badge Specification
docs/nostr-hackathon-badges.md
Complete specification covering event kinds, catalog tag requirements, JSON schema for categories/badges/criteria, badge definition NIP-58 format, award matching rules, bootstrap signed-request flow, and client resolution patterns.
Server Configuration and Bootstrap API
.env.example, app/api/hackathon-badges/bootstrap/route.ts
New LACRYPTA_NSEC (server-side signing key) and clarified NEXT_PUBLIC_LACRYPTA_NPUB (admin gating). POST /api/hackathon-badges/bootstrap endpoint validates admin signature, enforces 10-minute freshness, generates badge events, signs with backend secret, and returns issuer pubkey and event payload.
Pubkey Resolution API and System Updates
app/api/lacrypta-pubkeys/route.ts, lib/nostrReports.ts, app/database/DatabaseClient.tsx
New GET /api/lacrypta-pubkeys decodes admin and derives publisher pubkeys from env; resolveLacryptaPubkey now fetches publisher key via API; PubkeyOverride message updated to reference new architecture.
Client Badge Utilities
lib/hackathonBadgeClient.ts
Exports fetchLacryptaBadgePubkeys, fetchHackathonBadgeCatalog (queries relays for most recent catalog), publishSignedEventsToRelays (per-relay result tracking), and requestBadgeBootstrap (signs request, POSTs to backend).
Badge Catalog System Integration
lib/databaseCatalog.ts
Adds hackathon-badge-catalogs event category with relay filter for kind 30078 tagged by HACKATHON_BADGE_CATALOG_TAG, published by La Crypta; updates eventDisplayTitle to format catalog titles by stripping D-tag prefix.
Hackathon Badges UI Component
app/hackathons/[id]/badges/HackathonBadgesClient.tsx
React component managing catalog loading, admin bootstrap workflow (signer → backend → relay publish → verify), category-ordered badge grid with tone-based styling, status panel with refresh/bootstrap controls, and missing-catalog messaging for admins.
Badges Page Route and Navigation Link
app/hackathons/[id]/badges/page.tsx, app/hackathons/[id]/page.tsx
New page with static generation from HACKATHONS list and per-hackathon SEO metadata; "Ver badges" link with Award icon added to hackathon detail navigation.

Commerce Hackathon Rankings Update

Layer / File(s)Summary
Project Ranking Data Updates
data/hackathons/projects-commerce.json
Repositions project rankings: wapufy (3rd), tiendita (4th), new wapubot project (5th), zaploop (6th), removing hash-21 entry.
Report Score Updates
data/hackathons/reports.json
Updates position values and sets finalScore to null for zaploop, wapufy, tiendita, and new wapubot entry in commerce hackathon reports.

🐰 A badge system blooms, with relays and keys,
Nostr events dance through La Crypta's breeze,
Admins bootstrap catalogs, events take flight,
While commerce results shuffle into the light! ✨

🎯 4 (Complex) | ⏱️ ~50 minutes

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/hackathon-badges-commerce-results

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claudiomolt
claudiomolt marked this pull request as ready for review May 29, 2026 15:19
@claudiomolt
claudiomolt merged commit ec3a3a6 into mainMay 29, 2026
3 checks passed
@claudiomolt
claudiomolt deleted the codex/hackathon-badges-commerce-results branch May 29, 2026 15:19
@coderabbitaicoderabbitaiBot mentioned this pull request May 31, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agustinkassis@claudiomolt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[codex] add hackathon badge catalog flow - #16

Merged
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results
May 29, 2026
Merged

[codex] add hackathon badge catalog flow#16
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results

Conversation

@agustinkassis

@agustinkassisagustinkassis commented May 29, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds a Commerce hackathon badges page backed by Nostr badge definitions and a replaceable catalog event.
  • Adds admin bootstrap flow where the backend signs official badge definition/catalog events with LACRYPTA_NSEC and the frontend publishes them.
  • Separates La Crypta admin identity (NEXT_PUBLIC_LACRYPTA_NPUB) from the official publisher key derived from LACRYPTA_NSEC.
  • Corrects Commerce results to: cursats, qrwapu, wapufy, tiendita, wapubot, zaploop.

Validation

  • pnpm build

Summary by CodeRabbit

  • New Features

    • Hackathon badges system: view and manage Nostr-based achievement badges per hackathon
    • Admin bootstrap functionality to generate and publish badges to the network
  • Documentation

    • Added Nostr hackathon badges specification guide
  • Chores

    • Updated hackathon project rankings and competition scores

Review Change Stack

@vercel

vercelBot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentMay 29, 2026 3:18pm

Request Review

@coderabbitai

coderabbitaiBot commented May 29, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a9751664-6d58-4f23-8f23-de207a61c8b9

📥 Commits

Reviewing files that changed from the base of the PR and between a86ac12 and 0f179e2.

📒 Files selected for processing (14)
  • .env.example
  • app/api/hackathon-badges/bootstrap/route.ts
  • app/api/lacrypta-pubkeys/route.ts
  • app/database/DatabaseClient.tsx
  • app/hackathons/[id]/badges/HackathonBadgesClient.tsx
  • app/hackathons/[id]/badges/page.tsx
  • app/hackathons/[id]/page.tsx
  • data/hackathons/projects-commerce.json
  • data/hackathons/reports.json
  • docs/nostr-hackathon-badges.md
  • lib/databaseCatalog.ts
  • lib/hackathonBadgeClient.ts
  • lib/hackathonBadges.ts
  • lib/nostrReports.ts

📝 Walkthrough

Walkthrough

This PR introduces a complete Nostr-based hackathon badge system for La Crypta, allowing admins to publish and manage verifiable badges on Nostr relays, plus updates to Commerce hackathon rankings. The implementation spans a foundational data model, server bootstrap and pubkey APIs, client relay/signing utilities, React UI with admin workflows, and integration into the existing event catalog system.

Changes

Nostr Hackathon Badge System

Layer / File(s)Summary
Badge Data Model and Schema
lib/hackathonBadges.ts
Exports badge kind constants (30078 catalog, 30009 definitions), schema identifiers, category/tone/criterion types, default badge templates with Spanish metadata, and builders to generate unsigned catalog/definition events. Parser validates incoming catalog events by kind, JSON, schema version, and structural consistency.
Nostr Badge Specification
docs/nostr-hackathon-badges.md
Complete specification covering event kinds, catalog tag requirements, JSON schema for categories/badges/criteria, badge definition NIP-58 format, award matching rules, bootstrap signed-request flow, and client resolution patterns.
Server Configuration and Bootstrap API
.env.example, app/api/hackathon-badges/bootstrap/route.ts
New LACRYPTA_NSEC (server-side signing key) and clarified NEXT_PUBLIC_LACRYPTA_NPUB (admin gating). POST /api/hackathon-badges/bootstrap endpoint validates admin signature, enforces 10-minute freshness, generates badge events, signs with backend secret, and returns issuer pubkey and event payload.
Pubkey Resolution API and System Updates
app/api/lacrypta-pubkeys/route.ts, lib/nostrReports.ts, app/database/DatabaseClient.tsx
New GET /api/lacrypta-pubkeys decodes admin and derives publisher pubkeys from env; resolveLacryptaPubkey now fetches publisher key via API; PubkeyOverride message updated to reference new architecture.
Client Badge Utilities
lib/hackathonBadgeClient.ts
Exports fetchLacryptaBadgePubkeys, fetchHackathonBadgeCatalog (queries relays for most recent catalog), publishSignedEventsToRelays (per-relay result tracking), and requestBadgeBootstrap (signs request, POSTs to backend).
Badge Catalog System Integration
lib/databaseCatalog.ts
Adds hackathon-badge-catalogs event category with relay filter for kind 30078 tagged by HACKATHON_BADGE_CATALOG_TAG, published by La Crypta; updates eventDisplayTitle to format catalog titles by stripping D-tag prefix.
Hackathon Badges UI Component
app/hackathons/[id]/badges/HackathonBadgesClient.tsx
React component managing catalog loading, admin bootstrap workflow (signer → backend → relay publish → verify), category-ordered badge grid with tone-based styling, status panel with refresh/bootstrap controls, and missing-catalog messaging for admins.
Badges Page Route and Navigation Link
app/hackathons/[id]/badges/page.tsx, app/hackathons/[id]/page.tsx
New page with static generation from HACKATHONS list and per-hackathon SEO metadata; "Ver badges" link with Award icon added to hackathon detail navigation.

Commerce Hackathon Rankings Update

Layer / File(s)Summary
Project Ranking Data Updates
data/hackathons/projects-commerce.json
Repositions project rankings: wapufy (3rd), tiendita (4th), new wapubot project (5th), zaploop (6th), removing hash-21 entry.
Report Score Updates
data/hackathons/reports.json
Updates position values and sets finalScore to null for zaploop, wapufy, tiendita, and new wapubot entry in commerce hackathon reports.

🐰 A badge system blooms, with relays and keys,
Nostr events dance through La Crypta's breeze,
Admins bootstrap catalogs, events take flight,
While commerce results shuffle into the light! ✨

🎯 4 (Complex) | ⏱️ ~50 minutes

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/hackathon-badges-commerce-results

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claudiomolt
claudiomolt marked this pull request as ready for review May 29, 2026 15:19
@claudiomolt
claudiomolt merged commit ec3a3a6 into mainMay 29, 2026
3 checks passed
@claudiomolt
claudiomolt deleted the codex/hackathon-badges-commerce-results branch May 29, 2026 15:19
@coderabbitaicoderabbitaiBot mentioned this pull request May 31, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agustinkassis@claudiomolt
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[codex] add hackathon badge catalog flow - #16

Merged
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results
May 29, 2026
Merged

[codex] add hackathon badge catalog flow#16
claudiomolt merged 1 commit into
mainfrom
codex/hackathon-badges-commerce-results

Conversation

@agustinkassis

@agustinkassisagustinkassis commented May 29, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds a Commerce hackathon badges page backed by Nostr badge definitions and a replaceable catalog event.
  • Adds admin bootstrap flow where the backend signs official badge definition/catalog events with LACRYPTA_NSEC and the frontend publishes them.
  • Separates La Crypta admin identity (NEXT_PUBLIC_LACRYPTA_NPUB) from the official publisher key derived from LACRYPTA_NSEC.
  • Corrects Commerce results to: cursats, qrwapu, wapufy, tiendita, wapubot, zaploop.

Validation

  • pnpm build

Summary by CodeRabbit

  • New Features

    • Hackathon badges system: view and manage Nostr-based achievement badges per hackathon
    • Admin bootstrap functionality to generate and publish badges to the network
  • Documentation

    • Added Nostr hackathon badges specification guide
  • Chores

    • Updated hackathon project rankings and competition scores

Review Change Stack

@vercel

vercelBot commented May 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentMay 29, 2026 3:18pm

Request Review

@coderabbitai

coderabbitaiBot commented May 29, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a9751664-6d58-4f23-8f23-de207a61c8b9

📥 Commits

Reviewing files that changed from the base of the PR and between a86ac12 and 0f179e2.

📒 Files selected for processing (14)
  • .env.example
  • app/api/hackathon-badges/bootstrap/route.ts
  • app/api/lacrypta-pubkeys/route.ts
  • app/database/DatabaseClient.tsx
  • app/hackathons/[id]/badges/HackathonBadgesClient.tsx
  • app/hackathons/[id]/badges/page.tsx
  • app/hackathons/[id]/page.tsx
  • data/hackathons/projects-commerce.json
  • data/hackathons/reports.json
  • docs/nostr-hackathon-badges.md
  • lib/databaseCatalog.ts
  • lib/hackathonBadgeClient.ts
  • lib/hackathonBadges.ts
  • lib/nostrReports.ts

📝 Walkthrough

Walkthrough

This PR introduces a complete Nostr-based hackathon badge system for La Crypta, allowing admins to publish and manage verifiable badges on Nostr relays, plus updates to Commerce hackathon rankings. The implementation spans a foundational data model, server bootstrap and pubkey APIs, client relay/signing utilities, React UI with admin workflows, and integration into the existing event catalog system.

Changes

Nostr Hackathon Badge System

Layer / File(s)Summary
Badge Data Model and Schema
lib/hackathonBadges.ts
Exports badge kind constants (30078 catalog, 30009 definitions), schema identifiers, category/tone/criterion types, default badge templates with Spanish metadata, and builders to generate unsigned catalog/definition events. Parser validates incoming catalog events by kind, JSON, schema version, and structural consistency.
Nostr Badge Specification
docs/nostr-hackathon-badges.md
Complete specification covering event kinds, catalog tag requirements, JSON schema for categories/badges/criteria, badge definition NIP-58 format, award matching rules, bootstrap signed-request flow, and client resolution patterns.
Server Configuration and Bootstrap API
.env.example, app/api/hackathon-badges/bootstrap/route.ts
New LACRYPTA_NSEC (server-side signing key) and clarified NEXT_PUBLIC_LACRYPTA_NPUB (admin gating). POST /api/hackathon-badges/bootstrap endpoint validates admin signature, enforces 10-minute freshness, generates badge events, signs with backend secret, and returns issuer pubkey and event payload.
Pubkey Resolution API and System Updates
app/api/lacrypta-pubkeys/route.ts, lib/nostrReports.ts, app/database/DatabaseClient.tsx
New GET /api/lacrypta-pubkeys decodes admin and derives publisher pubkeys from env; resolveLacryptaPubkey now fetches publisher key via API; PubkeyOverride message updated to reference new architecture.
Client Badge Utilities
lib/hackathonBadgeClient.ts
Exports fetchLacryptaBadgePubkeys, fetchHackathonBadgeCatalog (queries relays for most recent catalog), publishSignedEventsToRelays (per-relay result tracking), and requestBadgeBootstrap (signs request, POSTs to backend).
Badge Catalog System Integration
lib/databaseCatalog.ts
Adds hackathon-badge-catalogs event category with relay filter for kind 30078 tagged by HACKATHON_BADGE_CATALOG_TAG, published by La Crypta; updates eventDisplayTitle to format catalog titles by stripping D-tag prefix.
Hackathon Badges UI Component
app/hackathons/[id]/badges/HackathonBadgesClient.tsx
React component managing catalog loading, admin bootstrap workflow (signer → backend → relay publish → verify), category-ordered badge grid with tone-based styling, status panel with refresh/bootstrap controls, and missing-catalog messaging for admins.
Badges Page Route and Navigation Link
app/hackathons/[id]/badges/page.tsx, app/hackathons/[id]/page.tsx
New page with static generation from HACKATHONS list and per-hackathon SEO metadata; "Ver badges" link with Award icon added to hackathon detail navigation.

Commerce Hackathon Rankings Update

Layer / File(s)Summary
Project Ranking Data Updates
data/hackathons/projects-commerce.json
Repositions project rankings: wapufy (3rd), tiendita (4th), new wapubot project (5th), zaploop (6th), removing hash-21 entry.
Report Score Updates
data/hackathons/reports.json
Updates position values and sets finalScore to null for zaploop, wapufy, tiendita, and new wapubot entry in commerce hackathon reports.

🐰 A badge system blooms, with relays and keys,
Nostr events dance through La Crypta's breeze,
Admins bootstrap catalogs, events take flight,
While commerce results shuffle into the light! ✨

🎯 4 (Complex) | ⏱️ ~50 minutes

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/hackathon-badges-commerce-results

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claudiomolt
claudiomolt marked this pull request as ready for review May 29, 2026 15:19
@claudiomolt
claudiomolt merged commit ec3a3a6 into mainMay 29, 2026
3 checks passed
@claudiomolt
claudiomolt deleted the codex/hackathon-badges-commerce-results branch May 29, 2026 15:19
@coderabbitaicoderabbitaiBot mentioned this pull request May 31, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@agustinkassis@claudiomolt