Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f33a407
fix(hackathons): single-column teams tab and primary-colored pager (#…
Benjtalkshow May 15, 2026
335758e
feat(hackathons): track-based prize structure + submission polish + t…
0xdevcollins May 16, 2026
1269fdf
Feat/submission visibility hidden until results (#566)
0xdevcollins May 16, 2026
80c7f2f
fix(hackathons): always open submissions in a new tab (#568)
Benjtalkshow May 18, 2026
1e3907e
merge: production into main
Benjtalkshow May 18, 2026
0b143cf
feat(judging): organizer dashboard — coverage, preview, per-track res…
0xdevcollins May 20, 2026
39ff6ee
feat(judging): unallocated partner funds become a warning, not a bloc…
0xdevcollins May 20, 2026
01705f8
merge: production into main (resolve AllocationPreviewCard conflict)
0xdevcollins May 21, 2026
c13e9ea
fix(rewards): show track winners on the organizer rewards page (#576)
0xdevcollins May 21, 2026
6101e01
fix(rewards): polish publish-wizard preview to industry-standard layo…
0xdevcollins May 21, 2026
7e6b842
feat(hackathons): add judging dataset to export dropdown (#577)
Benjtalkshow May 21, 2026
e32eae4
merge: production into main (resolve WinnersGrid conflict)
0xdevcollins May 21, 2026
6ecdad4
fix(rewards): match track winners by submissionId, not participantId …
0xdevcollins May 21, 2026
3fb4121
fix(auth): send absolute callbackURL on Google sign-up (#584)
0xdevcollins May 21, 2026
a5db3c4
fix(submissions): unbreak submission detail page + publish hackathon …
Benjtalkshow May 22, 2026
72f76fc
fix(blog): drop duplicate h1 from hackathon winners post (#588)
Benjtalkshow May 22, 2026
db18f9f
merge: production into main
Benjtalkshow May 22, 2026
781f15f
feat(didit): drive verification UI from /didit/status, fix In Review …
0xdevcollins May 25, 2026
e083d17
Feat/didit verification status frontend (#592)
0xdevcollins May 25, 2026
fd2b990
fix: align request payloads with backend DTOs ahead of forbidNonWhite…
0xdevcollins May 28, 2026
52be58c
Feat/crowdfunding (#640)
0xdevcollins Jun 24, 2026
2cb7127
Revert "Feat/crowdfunding (#640)" (#641)
0xdevcollins Jun 24, 2026
ef423a2
Enhance bounty features with new UI, data layers, and crowdfunding su…
0xdevcollins Jun 27, 2026
a817075
merge: resolve package-lock.json conflict from production into main
0xdevcollins Jun 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "boundless-v1",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev"],
"port": 3000
}
]
}
10 changes: 4 additions & 6 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,10 @@ NEXT_PUBLIC_GOOGLE_CLIENT_ID=""
NEXT_PUBLIC_HORIZON_PUBLIC_URL="https://horizon.stellar.org"
NEXT_PUBLIC_HORIZON_TESTNET_URL="https://horizon-testnet.stellar.org"
NEXT_PUBLIC_STELLAR_NETWORK="testnet"
# Whitelisted USDC SAC (Soroban contract C-address) used as the escrow tokenAddress.
# Must match the boundless-events contract's whitelisted token (see backend admin runbook).
NEXT_PUBLIC_USDC_TOKEN_CONTRACT_TESTNET="CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA"
NEXT_PUBLIC_USDC_TOKEN_CONTRACT_PUBLIC=""
NEXT_PUBLIC_TRUSTLESS_WORK_API_KEY=""
NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID="your_wallet_connect_project_id"
# Error reporting (optional). When set, errors are sent to Sentry.
NEXT_PUBLIC_SENTRY_DSN=""
SENTRY_DSN=""
SENTRY_ORG=""
SENTRY_PROJECT="boundless-next"
SENTRY_AUTH_TOKEN="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"
NODE_ENV="dev"
84 changes: 84 additions & 0 deletions .github/workflows/close-linked-issues.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: Close Linked Issues

# Auto-close issues referenced with Closes/Fixes/Resolves #N when a PR merges.
#
# GitHub's built-in auto-close only fires for PRs merged into the default branch
# (main). This repo's feature PRs merge into integration branches such as
# feat/t-replace, so linked issues are otherwise left open. This workflow closes
# them on any base branch.
#
# pull_request_target runs in the base-repo context, so it has an issues:write
# token even for PRs opened from forks (the normal pull_request event would get
# a read-only token). It never checks out or runs PR head code, so it is safe.

on:
pull_request_target:
types: [closed]

permissions:
issues: write
contents: read

jobs:
close-linked-issues:
name: Close linked issues
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
steps:
- name: Close issues referenced in the PR body
uses: actions/github-script@v7
with:
script: |
const pr = context.payload.pull_request;
const body = pr.body || '';

// Match "<keyword> #123" / "<keyword>: #123", keyword case-insensitive.
const keyword = '(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)';
const re = new RegExp(`${keyword}\\s*:?\\s+#(\\d+)`, 'gi');

const numbers = new Set();
for (const m of body.matchAll(re)) {
numbers.add(Number(m[1]));
}

if (numbers.size === 0) {
core.info('No "Closes/Fixes/Resolves #N" references found in the PR body.');
return;
}

for (const issue_number of numbers) {
try {
const { data: issue } = await github.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number,
});

// Skip PRs (the API treats PRs as issues) and already-closed issues.
if (issue.pull_request) {
core.info(`#${issue_number} is a pull request, skipping.`);
continue;
}
if (issue.state === 'closed') {
core.info(`#${issue_number} is already closed, skipping.`);
continue;
}

await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number,
body: `Closed by #${pr.number} (merged into \`${pr.base.ref}\`).`,
});
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number,
state: 'closed',
state_reason: 'completed',
});
core.info(`Closed #${issue_number}.`);
} catch (err) {
core.warning(`Could not close #${issue_number}: ${err.message}`);
}
}
21 changes: 6 additions & 15 deletions .husky/pre-push
Original file line number Diff line number Diff line change
@@ -1,23 +1,14 @@

#!/usr/bin/env sh
set -e

echo "🚀 Running pre-push checks..."

# Run all tests (if you have them)
# echo "🧪 Running tests..."
# npm test

# Run security audit
echo "🔒 Running security audit..."
npm audit --omit=dev --audit-level=high

# Run build check one more time
# echo "🏗️ Final build check..."
# npm run build
echo "🔒 Auditing dependencies (non-blocking)..."
npm audit --omit=dev --audit-level=high || true

# Check for any uncommitted changes
if ! git diff-index --quiet HEAD --; then
echo "⚠️ Warning: You have uncommitted changes."
echo " Consider committing them before pushing."
echo "⚠️ You have uncommitted changes — they won't be included in this push."
fi

echo "✅ Pre-push checks completed!"
echo "✅ Pre-push checks passed!"
22 changes: 22 additions & 0 deletions app/(landing)/bounties/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Metadata } from 'next';

import { generatePageMetadata } from '@/lib/metadata';
import BountyDetail from '@/components/bounties/detail/BountyDetail';

export const metadata: Metadata = generatePageMetadata('bounties');

interface BountyDetailPageProps {
params: Promise<{ id: string }>;
}

export default async function BountyDetailPageRoute({
params,
}: BountyDetailPageProps) {
const { id } = await params;

return (
<div className='relative mx-auto min-h-screen max-w-[1440px] px-5 py-8 md:px-[50px] lg:px-[100px]'>
<BountyDetail id={id} />
</div>
);
}
22 changes: 22 additions & 0 deletions app/(landing)/bounties/[id]/submit/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Metadata } from 'next';

import { generatePageMetadata } from '@/lib/metadata';
import BountySubmitGate from '@/components/bounties/detail/submit/BountySubmitGate';

export const metadata: Metadata = generatePageMetadata('bounties');

interface BountySubmitPageProps {
params: Promise<{ id: string }>;
}

export default async function BountySubmitPageRoute({
params,
}: BountySubmitPageProps) {
const { id } = await params;

return (
<div className='relative mx-auto min-h-screen max-w-[1440px] px-5 py-8 md:px-[50px] lg:px-[100px]'>
<BountySubmitGate id={id} />
</div>
);
}
16 changes: 7 additions & 9 deletions app/(landing)/bounties/page.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import { redirect } from 'next/navigation';
import { Metadata } from 'next';

import { generatePageMetadata } from '@/lib/metadata';
import BountiesPage from '@/components/bounties/marketplace/BountiesPage';

export const metadata: Metadata = generatePageMetadata('grants');
export const metadata: Metadata = generatePageMetadata('bounties');

const GrantPage = () => {
redirect('/coming-soon');
export default function BountiesPageRoute() {
return (
<div className='mx-auto mt-10 max-w-[1440px] px-5 py-5 text-center text-4xl font-bold text-white md:px-[50px] lg:px-[100px]'>
Bounties Page
<div className='relative mx-auto min-h-screen max-w-[1440px] px-5 py-8 md:px-[50px] lg:px-[100px]'>
<BountiesPage />
</div>
);
};

export default GrantPage;
}
Loading
Loading