Skatehive 3.0 is a Next.js application for the Skatehive community. It lets users post content to the Hive blockchain and interact with Farcaster and Ethereum protocols, share skate spots, view community bounties and leaderboards. The project uses Chakra UI for styling along with Tailwind utilities and integrates with Aioha, Wagmi/Viem and React Query.
- Copy
.env.local.exampleto.env.localand fill in the values for your environment. - Install dependencies with pnpm:
pnpm install- Run the development server:
pnpm devOpen http://localhost:3000 in your browser.
Run pnpm lint to check lint rules and pnpm build to create a production build.
This repo contains a .devcontainer folder so you can work in
GitHub Codespaces. Launch a
new codespace from the Code menu on GitHub and the container will
install dependencies with pnpm install and forward port 3000 for the
Next.js dev server. The container installs Node.js 20 with pnpm 9 via the
official Node feature so the environment matches local development.
Once setup completes, run pnpm dev to launch the application.
The app uses a centralized configuration system where sensible defaults are stored in config/app.config.ts (committed to version control). Only secrets and deployment-specific overrides should live in .env.local.
For a basic local installation, copy .env.local.example to .env.local and set only the Hive posting key:
HIVE_POSTING_KEY=your_hive_posting_keyAll other values (Hive tags, app account, DAO addresses, etc.) are pre-configured in config/app.config.ts.
If you enable app-only posting (email-only users), also set:
DEFAULT_HIVE_POSTING_ACCOUNT=skateuser
DEFAULT_HIVE_POSTING_KEY=your_default_account_posting_keyOptional: receive webhook alerts when default-account broadcasts fail/retry:
USERBASE_ALERT_WEBHOOK_URL=https://your-webhook-endpointIf you fork Skatehive for your own community, you can override default settings in .env.local:
# Override your community settings
NEXT_PUBLIC_BASE_URL=https://your-community.app
NEXT_PUBLIC_THEME=your_themeImportant: The core configuration (Hive tags, DAO contract addresses, app account) is defined in config/app.config.ts. To fully customize your fork, create your own config file with your values for:
HIVE_CONFIG.COMMUNITY_TAG– your Hive community tagHIVE_CONFIG.SEARCH_TAG– your search tagHIVE_CONFIG.APP_ACCOUNT– your app's default Hive userDAO_ADDRESSES– your DAO contract addresses (if using DAO features)APP_CONFIG.NAME,APP_CONFIG.DOMAIN– your app branding
If you enable the userbase schema, run the SQL files under sql/migrations/.
For Supabase, run 0001_userbase.sql first, then 0002_userbase_rls_supabase.sql in the SQL editor.
If you enable magic-link auth, also run 0003_userbase_auth.sql.
If you enable app-only posting, also run 0007_userbase_soft_posts.sql and 0008_userbase_soft_posts_rls.sql.
For self-hosted Postgres, run 0001_userbase.sql, 0003_userbase_auth.sql, and (if enabling app-only posting) 0007_userbase_soft_posts.sql via psql using DATABASE_URL.
Migrations are currently manual; there is no automated runner in the repo yet.
If you skip Supabase RLS, keep the service role key server-only.
Userbase tables are prefixed with userbase_ to avoid conflicts with the VIP signup schema.
Add these variables to .env.local as needed:
NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_PUBLIC_KEY,SUPABASE_SERVICE_ROLE_KEY– Supabase integrationPINATA_JWT– JWT token for Pinata/IPFS uploads (get from Pinata dashboard > API Keys)GIPHY_API_KEY– GIF search in the composerNEXT_PUBLIC_ZORA_API_KEY– Zora embedsEMAIL_USER,EMAIL_PASS,EMAIL_RECOVERYACC– email settings for invitesNEXT_PUBLIC_WALLETCONNECT_PROJECT_ID,NEXT_PUBLIC_ALCHEMY_KEY,ETHERSCAN_API_KEY– Web3 featuresFARCASTER_HUB_URL,FARCASTER_INIT_PASSWORD– Farcaster notificationsADMIN_USERS– comma-separated list of admin usernamesJWT_SECRET,VIP_PEPPER,SIGNER_URL,SIGNER_TOKEN– signup/signer system
Skatehive is a multilingual application supporting English, Portuguese (Brazil), Spanish, and Luganda. All human-facing text must be translation-compatible.
When adding new features, always use the translation system instead of hardcoding strings:
-
Use the
useTranslationshook in client components:import { useTranslations } from '@/lib/i18n/hooks'; export function MyComponent() { const t = useTranslations('feature'); return <button>{t('actionLabel')}</button>; }
-
Add keys to ALL language files simultaneously (
lib/i18n/locales/en.ts,pt-BR.ts,es.ts,lg.ts):feature: { actionLabel: 'Your text here', }
-
Never hardcode strings. Always prefer translations over direct text.
lib/i18n/locales/en.ts– English (base language)lib/i18n/locales/pt-BR.ts– Portuguese (Brazil)lib/i18n/locales/es.ts– Spanishlib/i18n/locales/lg.ts– Lugandalib/i18n/hooks.ts–useTranslations(namespace)hook for client componentslib/i18n/translations.ts– Central export point for all translations
For more details on the translation system, see AGENTS.md → "Translation system" section.
- Compose posts with Markdown, images, videos or GIFs and publish them to the Hive blockchain.
- Skate spots map for sharing and discovering places to skate.
- Bounties for trick challenges with community rewards.
- Leaderboard ranking Hive users by community engagement.
- Magazine/Blog pages for curated articles and snaps.
- Invite system allowing users to create Hive accounts via email.
- Farcaster notifications that bridge Hive activity to Farcaster miniapp users. See docs/SKATEHIVE_FARCASTER_NOTIFICATIONS.md for implementation details.
The app is designed for Vercel. After setting up the environment variables in your Vercel project, deploy with the standard Next.js build process.
