Menambahkan resolve.dedupe untuk react/react-dom/@tanstack/react-router/
@tanstack/react-query di vite.config.ts agar tidak ada duplicate instance
yang di-bundle dari Radix primitives.
Menghapus StrictMode dari main.tsx karena combining StrictMode dengan
recharts 3.x (yang bawa @reduxjs/toolkit + immer autoFreeze) + TanStack
Router 1.168 trigger "Cannot assign to read only property 'lanes' of
#<li>" dan "pendingBuiltLocation of #<zr>" saat navigate.
Juga perbaiki duplikasi block build: di config lama ada dua property
build (yang kedua menimpa yang pertama jadi rolldownOptions hilang).
Sekarang rolldownOptions code-splitting vendor aktif.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Commit fix hash sebelumnya (d83a6d9) hanya menyentuh flake.nix sehingga
nx affected tidak mendeteksi app mana pun → matrix build kosong →
redesign belum ter-deploy. Formatting whitespace di libs/ui/index.css
membuat libs/ui terdeteksi affected dan cascade ke backoffice, gacha,
dimentorin, hackathon.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
package-lock.json berubah karena +20 radix-ui primitives, lucide-react,
cmdk, input-otp. Nix CI gagal karena hash npm deps tidak match. Hash
baru diambil dari output CI yang gagal.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Deleted:
- libs/utils/src/react-router/ — old file-based routing system (replaced by TanStack Router)
- next-themes dependency (unused since Astro migration)
- react-router-dom from vite external config
Cleaned:
- Removed react-router barrel export from utils/index.ts
- Kept landing data files (still used by Astro components)
- Kept QueryProvider and ModalLoginProvider (still used by apps)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Generated routeTree.gen.ts for all 6 apps (was empty placeholder)
- Fixed className backtick syntax in roles create/edit pages
- Fixed unescaped quote in dimentorin settings FAQ
- Route trees enable proper SPA navigation (no more full page reloads)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replaced <a> tags with button + useNavigate() for instant SPA
navigation without full page reloads. Sidebar now:
- Uses TanStack Router useNavigate for all menu items
- Closes mobile menu on navigation (onClose callback)
- No more page flicker when switching between sections
- Logout redirects to /auth/login via navigate
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Roadmap: integrated with /v1/landing/cms/roadmap API (was dummy data)
- Created roadmap service layer (types, API, hooks)
- List page with search/filter, create/edit as dedicated pages
Session: converted modal detail to dedicated /session-dimentorin/$id page
Users: converted modal detail/delete to dedicated /users-dimentorin/$id page
Deleted all dimentorin modal components (roadmap, session, users).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Migrated backoffice, hackathon, dimentorin, gacha, qrcampaign, and
infra from custom react-router file-based routing to TanStack Router
file-based routing following the tanstack-frontend-best-practice
convention.
Key changes per app:
- New routes/ directory with __root.tsx, _public.tsx, _authenticated.tsx
- Auth guards via beforeLoad (replaces old middleware.ts)
- createFileRoute pattern for all page components
- TanStackRouterVite plugin in vite.config for auto route generation
- _components/_hooks folders colocated with routes (ignored by router)
- routeTree.gen.ts auto-generated on dev/build
Convention:
- _public/* routes redirect to dashboard if authenticated
- _authenticated/* routes redirect to /auth/login if not authenticated
- $param for dynamic segments (was [param] in old convention)
- _layout suffix for pathless layout routes
Removed:
- Old src/app/ directories from all apps
- Old src/middleware.ts files
- Custom convertPagesToRoute utility (no longer needed)
- react-router dependency usage (kept in package.json for shared libs)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The file-based router was converting (group) segments to 'group?'
optional parameters, which broke all SPA routes (404 on every page).
Now (group) segments map to empty path '' which creates pathless
layout wrapper routes in react-router, matching Next.js behavior.
e.g. (public)/auth/login/page.tsx → route path '/auth/login'
(protected)/dashboard/page.tsx → route path '/dashboard'
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The <link rel="stylesheet" href="/src/..."> tags reference source
paths that only exist in dev mode. In production builds, Vite injects
CSS through the JS bundle. These broken links caused 404 errors and
unstyled pages in production.
Affected: backoffice, dimentorin, gacha, hackathon, infra
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Stripped dark: classes from Input, Textarea, Button, and InputField
components. These were causing black/dark backgrounds in modals and
forms across all apps (backoffice, gacha, dimentorin, etc).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replaces the heavy Next.js SSR app with Astro static site:
- Zero JS shipped for static pages (hero, community, CTA, footer)
- Server-side data fetching in Astro frontmatter (events, hackathon, testimonials)
- Only 4 React islands for interactive parts (mobile menu, roadmap voting, testimonials home, feature request)
- Google Fonts via <link> instead of next/font
- Nix build changed from Node.js systemd service to static nginx (mkStaticAppModule)
- npmDepsHash needs update (set to fake hash, CI will provide correct one)
Performance gains:
- No Node.js server process needed (was using ~10MB RAM)
- No Next.js runtime JS (~200KB+ saved)
- No framer-motion bundle (~130KB saved)
- Static HTML served directly by nginx
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Performance improvements:
- Replaced framer-motion animations with CSS @keyframes in hero,
testimonial, and community sections (saves ~130KB bundle)
- Switched from local Poppins/BaiJamjuree font files (750KB) to
next/font/google with auto-subsetting
- Deleted 10 local .ttf font files
- Community section is now a server component (no 'use client')
- Removed scroll parallax effect from hero (was causing repaints)
- Hero image marked as priority for LCP optimization
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Landing page changes:
- Removed entire (auth) directory — landing doesn't need login/signup
- Removed auth buttons (Masuk/Daftar) from header navigation
- Hackathon page now fetches teams + winners from real API
- Roadmap page now fetches from /v1/landing/cms/roadmap API with
real-time voting via POST /roadmap/vote/{id}
- Deleted dummy JSON files: events.json, testimonials.json, hackathons.json
- Kept static config: hero-content, hero-stats, navigations, socials
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All login pages now use react-hook-form with zod resolver for
real-time validation:
- Email validated as proper email format on each keystroke
- Password required validation
- Red border + error message shown inline below invalid fields
- Submit button disabled until all fields are valid
- Input type="text" instead of type="email" to avoid browser tooltip
Also fixed:
- Gacha API trailing slash on /items/ and /credits/ causing 404s
Apps updated: hackathon, dimentorin, backoffice, qrcampaign, gacha
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Server-side fetch fails during Nix build due to SSL cert issues in
the sandbox. Converted to client components with useEffect+fetch
so data loads at runtime instead of build time.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Updated default HydrateFallback in file-based-routing to show a
centered blue spinner instead of bare "Loading..." text
- Added inline spinner to all index.html root divs so users see a
spinner immediately while JS bundles load (instead of blank white)
- Affects: dimentorin, hackathon, backoffice, gacha, qrcampaign, infra
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Stripped all dark: classes from hackathon, dimentorin, backoffice,
and qrcampaign login pages — light mode only
- Rewrote gacha login modal to match the unified clean design:
clean typography, native inputs with eye toggle, proper spacing,
removed old IMPHNEN logo header and Indonesian text
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dashboard (/dashboard):
- Welcome header with user name
- Stats cards: upcoming sessions, completed, role (mentor/mentee)
- Mentor registration CTA for non-mentors
- Upcoming sessions list with status badges
- Profile card with avatar and gradient header
Settings (/dashboard/settings):
- Account Details: displays user info and role
- Privacy & Security: 2FA (coming soon), change password, active sessions
- Preferences: email notifications, language, theme
- FAQ & Support: expandable FAQ accordion with contact info
Dashboard Layout:
- Top nav with Dimentorin branding
- Navigation links: Dashboard, Settings
- Auth guard redirects to login if not authenticated
- Logout button
Closes#42, #43, #54
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Dimentorin: replaced anime-themed login with clean dark-mode design,
removed Google login, uses shared useLogin hook
- Backoffice: replaced custom hook login with unified design, clean
admin-only layout (no signup link)
- QR Campaign: added dark mode support to match hackathon style
All login pages now share consistent:
- Dark/light mode support
- Email + password fields with show/hide toggle
- GitHub OAuth button
- Error handling UI
- Same Tailwind class patterns
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
VITE_API_URL was never set in the Nix build, so getBaseURL() returned
empty string causing all API calls to hit the current origin (e.g.
hackathon.imphnen.dev) instead of api.imphnen.dev. This caused 405
errors on login since the frontend server doesn't handle POST.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix API service paths to use /v1/iam/, /v1/dimentorin/, /v1/gacha/, /v1/hackathon/ prefixes
- Add roles, permissions, events, testimonials, sessions API services and hooks
- Rewrite gacha service with full CRUD + roll/claim endpoints
- Replace all mock data in backoffice pages with real API calls (accounts, roles, permissions, gacha-roll, dashboard, sessions, users-dimentorin, feedback-review, settings)
- Wire dimentorin mentoring list to useMentorList with search + pagination
- Wire dimentorin mentor detail page to useMentorById, pass real data to all sections
- Wire appointment modal to useBookSession with controlled schedule inputs
- Wire gacha app Spin Now to useExecuteGachaRoll, show credits and real items
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Server pulls pre-built packages from Cachix, no need to build
the NixOS closure in CI. Just update flake.lock and trigger
a remote rebuild.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Update flake.lock in imphnen-infrastructure
- Deploy to Hetzner server using clan machines update
- Requires SERVER_SSH_KEY secret for server access
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Upgrade Nx 22.1.1 → 22.6.3 and all patch/minor dependencies
- Restructure shared libs: move business logic from utils to service
- Consolidate shadcn-ui into ui lib with atomic design pattern
- Fix container centering for landing app (Tailwind v4 compatibility)
- Fix button styling by updating @source directive in globals.css
- Fix SiCss3 → SiCss rename in react-icons 5.6
- Fix duplicate useSession export conflict
- Remove dead code, comments, and unused files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Skip unchanged apps to speed up CI. Uses nx affected to detect
which apps need rebuilding, then runs nix builds in parallel
via GitHub Actions matrix.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After building and pushing to Cachix, the CI now clones
imphnen-infrastructure and updates its flake.lock to point
to the latest frontend service commit.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove all Docker files, Vercel config, Verdaccio, and old CI workflow.
Standardize on nodejs_22 across devShell and nix build helpers.
Update CI to build all packages and push to Cachix on merge to develop.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(qr): add empty state for campaign & user management page to handle unexcepted null error
* fix(qr): fix empty state logic in the user management page
* Initialize a new NX project - QR campaign
* Develop QR code generator app for campaign
* Add deployment script
Add Dockerfile, docker compose, and update Nix config for deployment
* Revert package.json to fix ci
* Revert package-lock.json to ensure ci (Nix build & cache) successful
Add clickable "Powered By Ancikri" badge beside the community badge
with matching pill design, linking to ancikri.com
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Build all packages (landing, backoffice, gacha, dimentorin, hackathon, infra)
- Push to msdqn Cachix cache
- Server can pull pre-built packages from Cachix
Requires CACHIX_AUTH_TOKEN secret in GitHub repository settings.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Upgrade Next.js from 16.0.8 to 16.0.10 to fix critical RCE
vulnerability (CVSS 10.0) in React Server Components.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add fallback check to continue if build output exists even when
Nx crashes after successful build completion.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add --jitless Node.js flag to work around V8 JIT compilation
memory allocation issues on the server.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fix wrapper script to use explicit Nix bash path instead of
/usr/bin/env bash which doesn't work on NixOS.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Download Poppins and Bai Jamjuree font files locally
- Convert from next/font/google to next/font/local
- Enables builds in sandboxed environments without network access
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add __noChroot=true to enable network access for next/font/google
to fetch Poppins and Bai_Jamjuree fonts during the Next.js build.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Call Nx directly with --output-style=static flag instead of through
npm scripts to completely bypass the pseudo terminal initialization
that crashes in non-TTY environments.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add NX_TASKS_RUNNER_DYNAMIC_OUTPUT=false and NX_NATIVE=false
to completely disable Nx's Rust-based terminal handling that
crashes in non-TTY build environments.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added CI=true, NO_COLOR=1, TERM=dumb, and NX_SKIP_NX_CACHE=true
to both mkViteApp.nix and landing.nix to prevent the vt100-rust
panic during Nix builds.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add flake.nix with packages for all 5 apps (landing, gacha, backoffice, dimentorin, hackathon)
- Add NixOS modules for deployment (systemd service for Next.js, nginx for Vite apps)
- Add mkHackathonWithEnv function for build-time environment variables
- Add development shell with Node.js 22, npm, bun
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Changed certificate background from PNG to SVG for better quality
- Added Poppins font import to index.html
- Updated certificate layout with Team Name and Person Name in blue (#59bef5)
- Repositioned QR code to fit in designated white box placeholder
- Removed generated copyright and date overlays (now part of SVG template)
- Adjusted text positioning for better alignment with new design
- Increased canvas scale to 4x and wait time to 1500ms for sharper rendering
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added isTeamMember check (session user ID === certificate user ID)
- Hide all action buttons (Download, Print, View Submission) for non-members
- Hide "Back to Submission" button in header for non-members
- Unauthenticated users and other users can view certificate but cannot interact with buttons
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Updated certificate page to use useCertificatePublicData hook
- Removed old multi-API-call approach
- Now uses single /certificates/{userId} endpoint
- Simplified data fetching for user, team, submission data
- Certificate now works for unauthenticated users
- Removed duplicate certificate hook file
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add new useCertificatePublicData hook to fetch certificate data from public endpoint without authentication. This hook combines user, team, submission, and winner data in a single request.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Updated API error interceptor to skip redirect on certificate pages
- Prevents 401 errors from redirecting to login on public certificate pages
- Certificate pages can now be viewed without authentication
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Modified encodeCertificateId to include userId parameter
- Updated decodeCertificateId to extract and return userId
- Added backward compatibility for old 2-part certificate IDs
- Certificate page now fetches and displays certificate owner's name
- Submission page passes current user's ID when generating certificate
- Fixed certificate template to use certificate owner's name instead of team leader
- Certificates now show the encoded user's name regardless of who views them
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add /certificate/* to public routes in root layout
- Display team leader name instead of current user
- Remove authentication requirement for viewing certificates
- Certificates now work without login
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Use encodeURIComponent to properly encode certId
- Fixes QR code URLs with special characters like /, +, =
- QR codes now generate with properly encoded URLs (%2F, %2B, %3D)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* chore: adjust landing page
- change typo text in footer "patners" -> "partnerts"
- add github in community section, and footer
- update the value of stat members in hero and cta section
* chore: adjust landing page
- fix logo github in community section
* feat(backoffice): create a boilerplate page for Hackathon dashboard
- Create an empty page for Hackathon dashboard
- Comment out and hide the existing backoffice sidebar
* feat(backoffice): Create a nested/dropdown sidebar list
- Create a dropdown sidebar list
- Show back the old navigation and group them
- Make the sidebar responsive for mobile view
* test datatable with mock data
* base UI for Hackathon backoffice
TODO:
- Organize table schema for users, teams, and submissions management
- Create API Contract for additional back-end endpoint
* feat(hackathon): draft data table column & API Contract
* update endpoint
* feat(backoffice): update page hackathon user management
- update data table component
- update filtering & pagination
- add modal display to edit and add user
- hide notification icon in backoffice wrapper
* feat(backoffice): add API contract for hackathon users
* feat(backoffice): little adjustment in hackathon users management UI and API contract
* feat(backoffice): update hackathon team management page
- add modal for manage team, add new team, and view project submission
- reorganize the table column and data table
* feat(backoffice): add searchable city filter
- add component for city filter
- apply to user management and team management pages
* feat(backoffice): improve hackathon team modal UI and add API contract
- Add feature to select city in team detail modal using CityFilterSelect component
- Add feature to change team logo and banner
- Add API contract documentation for hackathon teams in backoffice
* feat(backoffice): authentication middleware, error pages, and 404 page
* feat(backoffice): hackathon dashboard integration
* feat(backoffice): users page integration
- Get users data from API
- Set up server-side pagination and match URL params
- Hide filter that doesn't exist in back-end
* feat(backoffice): teams page integration
- Get teams data from API
- Hide filter that doesn't exists in back-end
- Simplify modal according to the back-end
* feat(backoffice): submission page integration
- Fetch submissions data from API
- Move submission modal to hackathon-submissions page
- change typo text in footer "patners" -> "partnerts"
- add github in community section, and footer
- update the value of stat members in hero and cta section
- Add helper text indicating users can paste demo video links
- Update placeholder to mention YouTube, Loom, etc.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Display countdown timer on dashboard showing days, hours, minutes, seconds
- Shows time remaining until December 7, 2025 23:59 WIB
- Automatically hides after deadline passes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(backoffice): create a boilerplate page for Hackathon dashboard
- Create an empty page for Hackathon dashboard
- Comment out and hide the existing backoffice sidebar
* feat(backoffice): Create a nested/dropdown sidebar list
- Create a dropdown sidebar list
- Show back the old navigation and group them
- Make the sidebar responsive for mobile view
* test datatable with mock data
* base UI for Hackathon backoffice
TODO:
- Organize table schema for users, teams, and submissions management
- Create API Contract for additional back-end endpoint
* feat(hackathon): draft data table column & API Contract
* update endpoint
* feat(backoffice): update page hackathon user management
- update data table component
- update filtering & pagination
- add modal display to edit and add user
- hide notification icon in backoffice wrapper
* feat(backoffice): add API contract for hackathon users
* feat(backoffice): little adjustment in hackathon users management UI and API contract
- useMyTeams and useTeamsByUserId now unwrap {team: {...}} structure
- Simplified dashboard and user profile components
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- User can only have one team, no need for list/grid
- Display team card full width with larger styling
- Bigger logo, title, and description area
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add fallback banner image
- Add fallback logo placeholder
- Use member_count for member display
- Add submission badge
- Improve card layout consistency with other pages
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Use member_count instead of members.length for member count
- Use singular "Team" when user has only 1 team
- Add fallback banner image
- Add fallback logo placeholder
- Add submission badge
- Improve card layout and styling
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add min_members and max_members params to useTeams hook
- Add member filter dropdown with options: All, Looking for Members (1-4), 1-5 members
- Filter persists in URL query params
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Match ListResponse structure: data (array) + meta (pagination)
- Use correct query param name: per_page instead of limit
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace infinite scroll with traditional numbered pagination
- Add page numbers, prev/next buttons
- Show "Showing X-Y of Z teams" count
- Auto-reset to page 1 on search/filter changes
- Update useTeams hook to return pagination metadata
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Show warning on browse page for teams with only 1 member
- Show warning on team detail page for single-member teams
- Helps users understand they need 2+ members to submit
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Hide "Request to Join" button on browse page for submitted teams
- Hide "Invite Member" and "Join Requests" buttons on team detail for submitted teams
- Change "Submit Project" to "View Submission" for submitted teams
- Rename "Manage Members" to "View Members"
- Hide "Delete Team" for submitted teams
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added useEffect to detect access_token in URL hash/query params on
login page. When Supabase redirects password reset emails to /auth/login
instead of /auth/callback, the page now automatically redirects to
/auth/reset-password with the token.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add Leave Team button in Quick Actions section for non-leader members
- Add confirmation modal before leaving with warning message
- Use existing useLeaveTeam hook from service library
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix browse teams page to use member_count from API response
- Add member_count field to TTeamItem type
- Add minimum team members requirement (2) for project submission
- Add type-to-confirm verification before final submission
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add email activation requirement for signup (no auto-login)
- Add form validation with React Hook Form and Zod on signup page
- Update callback page to handle email confirmation and password reset redirects
- Fix token format in API interceptor (use access_token)
- Fix middleware to use SessionToken for auth check
- Add infinite scroll with IntersectionObserver on browse teams page
- Replace all internal <a href> with <Link> components
- Add useInfiniteTeams hook for paginated team browsing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Redirect unauthenticated users to /auth/login instead of /maintenance
- Allow all /auth/* routes for unauthenticated access
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove Supabase export from service library
- Update forgot-password and reset-password pages to use backend API
- Update layout.tsx to use useAuthStore instead of Supabase session
- Update sidebar logout to not use Supabase
- Update middleware to use SessionUser instead of Supabase
- Update use-session hook to remove Supabase dependency
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: update landing page
* feat: Add favicon and SEO (JSON-LD schema, meta tags)
- Add favicon image
- Add JSON-LD schema for Hackathon event
- Add react-helmet-async for managing meta tags
* chore: remove react-helmet-async
* chore: update landing page
* chore: update UI for signup and login
- add back button for better UX
* feat: add image loading state and skeleton UI for team dashboard
* fix: landing navbar not sticky to top, fix onboarding UI
* feat(hackathon): update UI
- Update dashboard, onboarding user, edit profile, and team layout
to make it more consistent
* fix: optimize placeholder banner image & minor fix dark mode
* feat(hackathon): update landing page dark mode color scheme
* feat(hackathon): update auth page dark mode color scheme
* feat(hackathon): dashboard UI improvement and dark mode adjustment
* feat(hackathon): browse team page
- update dark mode color scheme
- add some border style to give outline and depth
- change emoji to icon
* feat(hackathon): update team page
- update dark mode color scheme for team page: view, team edit,
and submit project page
- fix bug in chat where messages are displayed double
- make the form field size consistent
* feat(hackathon): update dark mode onboarding and edit profile
* feat(hackathon): change "edit profile" to modal dialog
- Add "edit profile" modal dialog that can be triggered from dashboard
- Update background overlay for dark mode
- Update dark mode for auth callback
* feat(hackathon): dark mode for user page
---------
Co-authored-by: Maulana Sodiqin <sodiqincahyana1@gmail.com>
Co-authored-by: Muhammad Zakir Ramadhan <61570975+zakirkun@users.noreply.github.com>
* feat: update landing page
* feat: Add favicon and SEO (JSON-LD schema, meta tags)
- Add favicon image
- Add JSON-LD schema for Hackathon event
- Add react-helmet-async for managing meta tags
* chore: remove react-helmet-async
* chore: update landing page
* chore: update UI for signup and login
- add back button for better UX
* feat: add image loading state and skeleton UI for team dashboard
* fix: landing navbar not sticky to top, fix onboarding UI
* feat(hackathon): update UI
- Update dashboard, onboarding user, edit profile, and team layout
to make it more consistent
* fix: optimize placeholder banner image & minor fix dark mode
* feat(hackathon): update landing page dark mode color scheme
* feat(hackathon): update auth page dark mode color scheme
* feat(hackathon): dashboard UI improvement and dark mode adjustment
* feat(hackathon): browse team page
- update dark mode color scheme
- add some border style to give outline and depth
- change emoji to icon
* feat(hackathon): update team page
- update dark mode color scheme for team page: view, team edit,
and submit project page
- fix bug in chat where messages are displayed double
- make the form field size consistent
* feat(hackathon): update dark mode onboarding and edit profile
---------
Co-authored-by: Maulana Sodiqin <sodiqincahyana1@gmail.com>
Co-authored-by: Muhammad Zakir Ramadhan <61570975+zakirkun@users.noreply.github.com>
- Add line-clamp-3 to limit bio to 3 lines
- Add wrap-break-word to handle long strings without spaces
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add totalImagesToLoad, handleImageLoad, handleImageError
- Disable image loading overlay to prevent blocking UI
- Fix ReferenceError: totalImagesToLoad is not defined
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: update landing page
* feat: Add favicon and SEO (JSON-LD schema, meta tags)
- Add favicon image
- Add JSON-LD schema for Hackathon event
- Add react-helmet-async for managing meta tags
* chore: remove react-helmet-async
* chore: update landing page
* chore: update UI for signup and login
- add back button for better UX
* feat: add image loading state and skeleton UI for team dashboard
* fix: landing navbar not sticky to top, fix onboarding UI
* feat(hackathon): update UI
- Update dashboard, onboarding user, edit profile, and team layout
to make it more consistent
* fix: optimize placeholder banner image & minor fix dark mode
---------
Co-authored-by: Maulana Sodiqin <sodiqincahyana1@gmail.com>
Co-authored-by: Muhammad Zakir Ramadhan <61570975+zakirkun@users.noreply.github.com>
- Replace basic select dropdown with CitySelect component
- Consistent with create team and profile pages
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove all console.log statements from middleware, layout, and pages
- Replace alert with toast for onboarding error messages
- Delete unused page-original.tsx backup file
- Keep console.error for actual error debugging
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add dark mode styling to Input component (bg, text, border, placeholder)
- Add dark mode styling to Textarea component
- Update profile page with blurred backdrop overlay
- Add shadow and proper dark mode to modal container
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Apply rose-pine dark theme across all pages for darker appearance
- Update Button component with dark mode variants
- Replace basic city select with searchable CitySelect on create team page
- Show Dashboard button in navbar when user is authenticated
- Apply dark mode styling to onboarding, team pages, and user profile
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add loading state check before leader validation to prevent race condition
- Fix useRemoveMember hook to use Supabase directly instead of missing API endpoint
- Leader check now waits for team data to load before showing Access Denied
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add ThemeProvider with system/light/dark mode support and localStorage persistence
- Add ThemeToggle component for pages without sidebar (landing, login, signup)
- Enable class-based dark mode in Tailwind CSS v4 via @custom-variant
- Add dark mode classes to landing page, login, signup, and all dashboard pages
- Keep IMPHNEN logo blue in dark mode, invert Kolosal logo
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add isMember check to only show Quick Actions to team members
- Hide submission status from non-members
- Non-members can only view team info, leader, and member list
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Update teams/[teamId]/layout.tsx to use Sidebar component
- Update users/[userId]/layout.tsx to use Sidebar component
- Now matches dashboard layout with sidebar navigation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Set consistent h-[42px] height for both search and city filter inputs
- Add 300ms debounce to search to reduce API calls while typing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace browse teams city dropdown with searchable CitySelect component
- Remove "Back to Dashboard" button from team detail page (uses sidebar nav)
- Add cities constant to service library for validation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add .eq('status', 'pending') filter to useTeamJoinRequests hook
- Add toast notifications for approve/reject actions on members page
- Parse Supabase error messages to show user-friendly error text
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: enhance team browsing with member count and view team option
* feat: add default banner image for teams without a custom banner
* feat: implement user profile page and user layout component
* feat: improve browse team filtering layout
* feat: limit join request button visibility based on team member count
* feat: enhance user profile and team dashboard layouts for improved responsiveness
* feat: add location, bio, and skills fields to user profile schema and form
* feat: enhance team display and user information layout for better readability
* feat: update join request button visibility logic based on user team membership
* feat: enhance team and user profile layouts with improved text truncation and responsiveness
Previously approved/rejected requests were still showing in the list.
Now only pending requests are displayed.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Removed permission checking logic that was causing "Cannot read properties
of null (reading 'name')" error.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add NX_DAEMON=false to all Dockerfiles to prevent slow daemon startup
- Add --env-file flag to hackathon build for proper env var substitution
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added --progress=plain to show live build output
- Enabled DOCKER_BUILDKIT=1 for better build performance
- Now you can see what's actually happening instead of appearing stuck
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added concurrency group 'deploy-vps' to all deployment workflows
- Prevents multiple deployments from running simultaneously on VPS
- Deployments now queue and run one at a time
- Fixes resource exhaustion when all apps deploy at once
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Added command_timeout: 30m to all SSH deployment workflows
- Prevents timeout issues during Docker builds
- Applies to landing, hackathon, gacha, dimentorin, and backoffice
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Changed from apps/hackathon/.env to root .env.local
- Docker-compose expects .env.local in root directory
- This ensures Supabase env variables are properly loaded during build
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Created CitySelect component with real-time filtering
- Supports 516 Indonesian cities with array filtering
- Added search functionality for better UX
- Integrated with react-hook-form in user onboarding
- Includes clear button and auto-close on outside click
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Updated all deployment workflows to create .env files with Supabase credentials
- Added VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY for Vite apps
- Added NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY for Next.js landing app
- Changed from single-line echo to multi-line cat heredoc for better .env management
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add git reset --hard before pull to discard any local changes on server:
- Fetch latest changes from origin
- Reset to origin/develop to discard local modifications
- Then pull to update
This fixes deployment failures caused by uncommitted local changes on the server.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove automatic redirect from "/" to login/dashboard
- Allow everyone to view the hackathon landing page
- Users can still click "Daftar Sekarang" to go to login
This fixes the issue where the landing page immediately redirected to login.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Replace npm install with npm ci and optimization flags to fix deployment timeouts:
- Use npm ci for faster, more reliable installs
- Add --prefer-offline to use cached packages
- Add --no-audit and --no-fund to skip unnecessary checks
- Optimize landing.Dockerfile to copy package files before installing
This resolves the Docker build EOF errors during deployment.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Triggering deployment for all apps to deploy the following changes:
- Fixed circular dependency between utils and service libraries
- Added missing auth hooks (usePostVerifyEmail, useGoogleCallback, etc.)
- Moved useAuthStore from utils to service
- All apps now build successfully
Apps to deploy:
- hackathon
- gacha
- dimentorin
- backoffice
- landing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added missing React Query hooks that were being imported but not exported:
- usePostLogin
- usePostRegister
- usePostVerifyEmail
- usePostSendOtp
- useGoogleCallback
These hooks wrap the existing auth API functions with React Query's useMutation.
Fixes build errors:
- gacha:build - "usePostVerifyEmail" is not exported
- dimentorin:build - "useGoogleCallback" is not exported
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Moved useAuthStore from utils to service to break circular dependency:
- utils was importing from service (supabase client, types)
- service was importing from utils (useAuthStore)
- Solution: moved useAuthStore and related storage utilities to service
Changes:
- Created libs/service/src/storage/ with cookies.ts and local-storage.ts
- Moved use-auth-store.ts from utils/hooks to service/hooks/auth
- Updated all 20+ files to import useAuthStore from service instead of utils
- Removed useAuthStore export from utils
- Added storage exports to service index
This fixes the build error: "Could not execute command because the task graph has a circular dependency"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implemented `getGoogleAuthUrl` and `postGoogleCallback` in auth API.
- Added corresponding hooks `useGoogleAuth` and `useGoogleCallback` for handling Google authentication.
feat(api): enhance API structure with mentors and upload services
- Created `mentors` and `upload` API modules with respective services for managing mentor details and file uploads.
- Added session management utilities to handle authentication tokens in cookies.
feat(users): expand user service with detailed user management
- Enhanced user service to include detailed user information and update capabilities.
- Added hooks for fetching and updating user data.
feat(hooks): introduce hooks for mentors and upload functionalities
- Added hooks for fetching mentor details and updating mentor information.
- Implemented hooks for file upload, avatar upload, and CV upload with validation.
refactor(types): organize and extend type definitions
- Introduced new types for mentors and enhanced existing user types.
- Re-exported user-related types for better accessibility.
chore: update index files to include new services and hooks
- Updated index files to export new services and hooks for mentors and uploads.
* fix: docker
* fix landing
* chore(landing): add outputFileTracingRoot to next config
* ci: add github workflow for landing deployment via ssh and docker compose
* chore: add docker-compose file for landing app build and run
* feat docker
* fix: correct link for Roadmap navigation item
* feat: add feature request and projects voting components
* fix: correct spelling of 'Certificate' in ProjectsVote component
* feat: add Request Feature popup with responsive dialog and drawer components
* feat: enhance Header component with mobile menu animations and improved navigation styling
* refactor: simplify Header component by removing unused scroll handling and improving mobile menu structure
* fix: replace motion span with static span for header underline
* fix: update FeatureRequestCTA text for clarity and adjust page layout margins
* fix: remove DialogDescription from RequestFeaturePopup and update textarea placeholder for clarity
* fix: remove DrawerDescription from RequestFeaturePopup for cleaner UI
* fix: remove unused icon exports from icons
* fix: replace XIcon with LuX in DialogClose for consistency
* fix: remove unused icon export from index for cleaner module structure
* feat: setup openapi libs for landing
* feat: seperate landing layouts
* feat: movee landing providers
* feat: add auth layout
* feat: implement cookie management for access and refresh tokens
* feat: replace Inter font with Bai Jamjuree in layout and add font utility
* feat: add signin
* feat: add Poppins font to the font utility
* feat: expand theme colors in index.css for improved styling options
* feat: update dependencies and enhance button and form components with new variants and context
* feat: move old components to __old__ dir
* feat: add react query support
* feat: hide the footer
* fix: header style
* feat: replace Image component with LogoSimple in Header and update Logo component to accept props
* fix: update label for tutorial stat in hero-stats.json
* feat: implement EventsPage component with event listing and details
* feat: add signup button and page
* feat: add HERO_CONTENT data and integrate into Hero component
* fix: update navigations import to uppercase and add missing Testimoni entry
* feat: implement testimonials display and add submission page
* fix: correct link path for testimonial submission
* feat: add communites component and integrate social links from JSON data
* fix: adjust grid gap in Communities component for better layout
* fix: update font imports in layout components for consistency
* fix: replace text logo with LogoSimple component in Footer and restore Footer in Layout
* feat: add TestimonialSection component and update testimonials data
* fix: update section ID from 'komunitas' to 'community' for consistency
* feat: add CTASection component with interactive elements and background pattern
* fix: update join URL in hero content for consistency
* fix: update text in CTASection for improved emphasis and consistency
* feat: add CommunitySection component and integrate it into the main page
* feat: update Footer component to use dynamic navigation and social links
* feat: implement HeroSection component with dynamic content and animations
* refactor: replace hardcoded testimonials with dynamic data from JSON
* feat: add signup page
* feat: integrate Turnstile captcha verification in signup process
* feat: implement verification page
* feat: add signin link to the signup page
* feat: add "Forgot Password?" link to the signin form
* refactor: clean up unused ThemeProvider code and CSS variables
* feat: add base styles for borders and background to improve UI consistency
* feat: implement forgot password functionality with validation and UI components
* fix: update password validation rules for clarity and consistency
* feat: enable rich colors for Toaster component in layout
* feat: implement reset password functionality with validation and UI components
* feat: implement Turnstile captcha verification for forgot password and signup actions
* refactor: remove console log and enhance error handling in signin and resend OTP actions
* feat: add navigation entries for Roadmap and Artikel sections
* feat: create initial Page component for articles section
* feat: update footer component with additional social media links and icons
* feat: remove all unused components in landing
* chore: add @radix-ui/react-label deps
* feat: wrap VerificationTabs in Suspense
* feat: update .env.example to include TURNSTILE_SECRET_KEY and correct NEXT_PUBLIC_TURNSTILE_SITEKEY
* feat(gacha): register and login integration
* fix: navbar and gacha landing page
- display fullname when user authenticated
- fix styling and responsive
* fix: minor fix UI
* chore: remove all references to PayloadCMS
* fix: nextjs landing utils
* feat: refactor community, features, hero, learning resources, and testimonials components to use external JSON data
* fix:remove hero logo box
* fix: remove unused image in public
* fix: change logo.png to logo.webp
* fix: update button styles for improved visibility
* chore: restructure component organization
* fix: update import path for global styles in layout component
* fix: adjust alignment of hero stats section for better layout
* fix: update testimonials placeholder sample data
* fix: update header component to use router for navigation and add signin page
* feat: integrate payload cms to landing page
* feat: add payload configuration and update TypeScript target
* fix: update TypeScript paths for payload configuration
* refactor: update config import paths to use local payload.config
* fix: update quotation marks for testimonials to use HTML entities
* fix: include withPayload in Next.js plugins for proper configuration
* feat: implement HeroSection global configuration and integrate with Hero component
* feat: add FeaturesSection global configuration and integrate with Features component
* feat: add revalidate constant to control page revalidation interval
* refactor: optimize data fetching by using Promise.all
* fix: update revalidation interval to 10 seconds
* feat: add CommunitiesSection configuration and integrate with Community component
* refactor: move global section functions to services directory
* feat: add support for s3 bucket for media
* feat: update Community component to use Iconify for icons and adjust CommunitiesSection configuration
* feat: replace Link component with Button for improved button styling in Community component
* feat: update FeaturesSection to use Iconify icons and adjust icon properties
* feat: add heroImage field to HeroSection and implement image formatting utility
* feat: add Learning Resources section with dynamic data fetching and UI integration
* feat: enhance LearningResourcesSection with primary and secondary button links
* refactor: reorganize layout structure by moving Header and Footer components to RootLayout
* feat: implement Testimonials section with dynamic data fetching and UI integration
* feat: simplify joinTitle rendering in Testimonials section
* feat: implement CallToAction section with dynamic data fetching and UI integration
* feat: update CallToActionSection label and wrap Discord button in link
* feat: update button components to use onClick for external links and improve styling
* feat: wrap logo image in a link to navigate to the homepage
* fix: supress scss deps warning
* fix: add placeholder to .env.example
* chore: add environment placeholder variables for CMS configuration in test build workflow
* fix: remove unused environment variables from test build workflow
* fix: text color (#26)
* chore: update action
* feat: integrate payload cms to landing page
* feat: add payload configuration and update TypeScript target
* fix: update TypeScript paths for payload configuration
* refactor: update config import paths to use local payload.config
* fix: include withPayload in Next.js plugins for proper configuration
* feat: implement HeroSection global configuration and integrate with Hero component
* feat: add FeaturesSection global configuration and integrate with Features component
* feat: add revalidate constant to control page revalidation interval
* refactor: optimize data fetching by using Promise.all
* fix: update revalidation interval to 10 seconds
* feat: add CommunitiesSection configuration and integrate with Community component
* refactor: move global section functions to services directory
* feat: add support for s3 bucket for media
* feat: update Community component to use Iconify for icons and adjust CommunitiesSection configuration
* feat: replace Link component with Button for improved button styling in Community component
* feat: update FeaturesSection to use Iconify icons and adjust icon properties
* feat: add heroImage field to HeroSection and implement image formatting utility
* feat: add Learning Resources section with dynamic data fetching and UI integration
* feat: enhance LearningResourcesSection with primary and secondary button links
* refactor: reorganize layout structure by moving Header and Footer components to RootLayout
* feat: implement Testimonials section with dynamic data fetching and UI integration
* feat: simplify joinTitle rendering in Testimonials section
* feat: implement CallToAction section with dynamic data fetching and UI integration
* feat: update CallToActionSection label and wrap Discord button in link
* feat: update button components to use onClick for external links and improve styling
* feat: wrap logo image in a link to navigate to the homepage
* fix: supress scss deps warning
* fix: add placeholder to .env.example
* chore: add environment placeholder variables for CMS configuration in test build workflow
* fix: remove unused environment variables from test build workflow
* fix: remove mistakenly added env from test-build workflow
---------
Co-authored-by: Fahim Ardani <fahimardani25@gmail.com>
Co-authored-by: Maulana Sodiqin <53475078+maulanasdqn@users.noreply.github.com>
This repository is a **monorepo** for all frontend services of IMPHNEN. The monorepo includes three main applications:
Monorepo for all frontend services of [IMPHNEN](https://imphnen.dev) (Ingin Menjadi Programmer Handal Namun Enggan Ngoding) — Indonesia's largest programmer community.
1.**Gacha** - Application for <a href="https://gacha.imphnen.dev/" target="_blank">gacha website</a>.
2.**Backoffice** - Application for internal management.
3.**Dimentorin** - Application for mentoring services.
nix develop # enters dev shell with node 22, bun, git, jq
```
### Environment Variables
Copy `.env.example` to `.env` in the app directory:
```sh
cp apps/<app>/.env.example apps/<app>/.env
```
### Development
Use the following commands to run in development mode:
- **Gacha**:
```sh
npm run gacha:dev
```
- **Backoffice**:
```sh
npm run backoffice:dev
```
- **Dimentorin**:
```sh
npm run dimentorin:dev
```
```sh
nx dev <app> # e.g. nx dev landing, nx dev backoffice
```
### Build
Use the following commands to build the applications:
```sh
nx build <app> # build single app
nx run-many -t build --all # build everything
nx affected -t build # build only what changed
```
- **Gacha**:
```sh
npm run gacha:build
```
- **Backoffice**:
```sh
npm run backoffice:build
```
- **Dimentorin**:
```sh
npm run dimentorin:build
```
### Nix Build
### Production
```sh
nix build .#<app> # e.g. nix build .#landing, .#dimentorin
```
Use the following commands to run the applications in production mode:
All Nix config lives in `flake.nix`. When `package-lock.json` changes, update `npmDepsHash` using `lib.fakeHash`.
- **Gacha**:
```sh
npm run gacha:prod
```
- **Backoffice**:
```sh
npm run backoffice:prod
```
- **Dimentorin**:
```sh
npm run dimentorin:prod
```
### Testing
```sh
nx test <project> # unit tests (vitest)
nx e2e <app>-e2e # e2e tests (playwright)
nx lint <project> # eslint
```
### Storybook
This repository uses Storybook to develop, test, and document UI components in an isolated and interactive environment. Below are the commands to work with Storybook:
```sh
nx storybook ui # run storybook for ui lib
nx build-storybook ui # build static storybook
```
- **Run Storybook**
## CI/CD
This command starts Storybook in development mode, allowing you to view and test UI components interactively.
1.**detect** — uses `nx affected` to find changed apps
2.**build** — matrix strategy builds only affected apps with Nix, pushes to [Cachix](https://app.cachix.org/cache/msdqn)
3.**deploy** — updates `flake.lock` in [imphnen-infrastructure](https://github.com/IMPHNEN/imphnen-infrastructure) and deploys to the server using [clan](https://clan.lol)
## Tech Stack
- **Run Unit Test**
- **Monorepo**: Nx 22.6
- **Frontend**: React 19, TypeScript
- **Styling**: Tailwind CSS v4, CVA
- **State**: Zustand, TanStack React Query
- **Forms**: react-hook-form + zod
- **Build**: Nix flakes, Cachix
- **CI**: GitHub Actions
This command runs unit tests for the UI components to ensure they function as expected.
## Contributing
```sh
npm run ui:test
```
1. Fork and clone the repository
2. Create a branch: `git checkout -b feat/feature-name`
3. Make changes, commit, and push
4. Open a pull request to the `develop` branch
- **Build Components**
This command generates a static build of Storybook, which can be deployed for sharing and documentation purposes.
```sh
npm run ui:build
```
## How to contribute
1. Fork the repository and clone it locally.
2. Create a new branch for a new feature or fix:
```sh
git checkout -b feat/feature-name
```
3. Make changes, commit, and push to your forked repository.
4. Create a pull request to this repository `develop` branch.
If you encounter any issues or problems, feel free to create a new Issue.
Issues and feedback welcome via [GitHub Issues](https://github.com/IMPHNEN/imphnen-frontend-service/issues).
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.