{"id":32789233,"url":"https://github.com/arsya371/apologyhub","last_synced_at":"2025-11-11T16:01:47.734Z","repository":{"id":322516930,"uuid":"1089817274","full_name":"arsya371/apologyhub","owner":"arsya371","description":"ApologyHub: Anonymous apology platform with admin dashboard, security features, and content moderation. Built with Next.js 14, Prisma, and shadcn/ui.","archived":false,"fork":false,"pushed_at":"2025-11-04T22:20:28.000Z","size":122,"stargazers_count":12,"open_issues_count":0,"forks_count":12,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-11-04T23:22:54.266Z","etag":null,"topics":["admin-dashboard","anonymous","apology-platform","apologyhub","neondb","nextauth","nextjs","postgresql","prisma","shadcn-ui","tailwindcss","typescript"],"latest_commit_sha":null,"homepage":"https://apologyhub.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arsya371.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-04T21:17:58.000Z","updated_at":"2025-11-04T22:21:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"c5cfa2f1-543a-4c7d-97ac-54c91fba93d5","html_url":"https://github.com/arsya371/apologyhub","commit_stats":null,"previous_names":["arsya371/apologyhub"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/arsya371/apologyhub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arsya371%2Fapologyhub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arsya371%2Fapologyhub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arsya371%2Fapologyhub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arsya371%2Fapologyhub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arsya371","download_url":"https://codeload.github.com/arsya371/apologyhub/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arsya371%2Fapologyhub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":283354939,"owners_count":26822199,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-08T02:00:06.281Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["admin-dashboard","anonymous","apology-platform","apologyhub","neondb","nextauth","nextjs","postgresql","prisma","shadcn-ui","tailwindcss","typescript"],"created_at":"2025-11-05T10:01:00.273Z","updated_at":"2025-11-08T13:02:04.565Z","avatar_url":"https://github.com/arsya371.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ApologyHub - Anonymous Apology Platform\n\nApologyHub platform built with Next.js 14, Prisma, and shadcn/ui. Users can submit, browse, and share anonymous apologies with built-in security features and comprehensive admin controls.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=\"1896\" alt=\"ApologyHub Screenshot\" src=\"https://github.com/user-attachments/assets/da8c6dc6-c363-4f76-aafd-ed9e133ff790\" /\u003e\n\u003c/div\u003e\n\n## Features\n\n### Public Features\n- **Anonymous Submissions** - Submit apologies without requiring an account\n- **Browse \u0026 Search** - Explore apologies with filtering and search capabilities\n- **Share Apologies** - Direct links to individual apology pages\n- **Bot Protection** - Cloudflare Turnstile integration\n- **Responsive Design** - Modern UI with dark/light theme support\n\n### Admin Features\n- **Dashboard Analytics** - Real-time statistics and charts\n- **Apology Management** - Review, approve, edit, and delete submissions\n- **Security Controls** - IP blocking/allowlisting, rate limiting, security logs\n- **Content Moderation** - Profanity filtering with custom word lists\n- **Site Settings** - Configure announcements, SEO, and site parameters\n- **Activity Logging** - Track all admin actions and system events\n\n## Tech Stack\n\n- **Framework**: Next.js 14+ (App Router, Server Actions)\n- **Language**: TypeScript\n- **UI Library**: React 18 with shadcn/ui components\n- **Styling**: Tailwind CSS\n- **Database**: PostgreSQL with Prisma ORM\n- **Authentication**: NextAuth.js v4\n- **Security**: Cloudflare Turnstile, Rate Limiting, IP Management\n- **Charts**: Recharts\n- **Animations**: Framer Motion\n- **Form Validation**: Zod\n- **Date Handling**: date-fns\n\n## Prerequisites\n\nBefore you begin, ensure you have:\n\n- **Node.js** 18.x or higher\n- **npm** or **yarn** package manager\n- **PostgreSQL** database (NeonDB, Supabase, or local instance)\n- **Cloudflare Account** (for Turnstile bot protection)\n- **Git** (for cloning the repository)\n\n## Quick Start\n\n1. **Clone the repository**\n   ```bash\n   git clone \u003crepository-url\u003e\n   cd apologyhub\n   ```\n\n2. **Install dependencies**\n   ```bash\n   npm install\n   ```\n\n3. **Configure environment variables**\n   ```bash\n   cp .env.example .env\n   ```\n   Edit `.env` with your configuration (see [SETUP.md](./SETUP.md) for details)\n\n4. **Setup database**\n   ```bash\n   npm run db:generate\n   npm run db:push\n   npm run db:seed\n   ```\n\n5. **Run development server**\n   ```bash\n   npm run dev\n   ```\n\n6. **Open your browser**\n   Navigate to [http://localhost:3000](http://localhost:3000)\n\nFor detailed setup instructions, see [SETUP.md](./SETUP.md)\n\n## Project Structure\n\n```\napologyhub/\n├── app/                      # Next.js App Router\n│   ├── (public)/            # Public pages (home, browse, submit, apology)\n│   ├── api/                 # API routes\n│   │   ├── admin/          # Admin API endpoints\n│   │   ├── apologies/      # Apology CRUD operations\n│   │   └── auth/           # NextAuth configuration\n│   └── pradmin/            # Admin panel\n│       ├── (protected)/    # Protected admin pages\n│       └── login/          # Admin login\n├── features/               # Feature-based modules\n│   ├── admin/             # Admin components and types\n│   ├── apologies/         # Apology components and types\n│   └── auth/              # Authentication components\n├── server/                # Backend logic\n│   ├── auth/             # Auth configuration\n│   ├── db/               # Database client and seeding\n│   ├── mutations/        # Data mutations (create, update, delete)\n│   ├── queries/          # Data queries (read operations)\n│   └── services/         # Business logic services\n├── ui/                   # Shared UI components\n│   └── components/\n│       ├── layout/       # Layout components (Header, Footer, etc.)\n│       ├── seo/          # SEO components\n│       ├── shared/       # Reusable components\n│       └── ui/           # shadcn/ui components\n├── lib/                  # Utilities and helpers\n│   ├── constants.ts      # App constants\n│   ├── utils.ts          # Utility functions\n│   └── validations.ts    # Zod schemas\n├── prisma/              # Database schema\n│   └── schema.prisma\n├── styles/              # Global styles\n│   └── globals.css\n└── types/               # TypeScript type definitions\n```\n\n## Admin Access\n\n- **Admin Panel URL**: `/pradmin`\n- **Default Credentials**: Set via environment variables during seeding\n- **Features**: Dashboard, Apology Management, Security, Settings\n\n## Available Scripts\n\n| Command | Description |\n|---------|-------------|\n| `npm run dev` | Start development server on port 3000 |\n| `npm run build` | Build production bundle |\n| `npm run start` | Start production server |\n| `npm run lint` | Run ESLint for code quality |\n| `npm run db:generate` | Generate Prisma Client |\n| `npm run db:push` | Push schema changes to database |\n| `npm run db:studio` | Open Prisma Studio (database GUI) |\n| `npm run db:seed` | Seed database with initial data |\n\n## Security Features\n\n- **Cloudflare Turnstile** - Bot protection on forms\n- **Rate Limiting** - Configurable request limits per IP\n- **IP Blocking** - Manual and automatic IP blocking\n- **IP Allowlisting** - Whitelist trusted IPs\n- **Content Moderation** - Profanity filtering with severity levels\n- **Security Logging** - Comprehensive audit trail\n- **Activity Tracking** - Monitor all admin actions\n- **Password Hashing** - bcrypt for admin credentials\n\n## Environment Variables\n\nKey environment variables (see `.env.example` for full list):\n\n- `DATABASE_URL` - PostgreSQL connection string\n- `NEXTAUTH_SECRET` - NextAuth.js secret key\n- `NEXTAUTH_URL` - Application URL\n- `NEXT_PUBLIC_TURNSTILE_SITE_KEY` - Cloudflare Turnstile site key\n- `TURNSTILE_SECRET_KEY` - Cloudflare Turnstile secret\n- `ADMIN_EMAIL` - Initial admin email\n- `ADMIN_PASSWORD` - Initial admin password\n\n## Documentation\n\n- [SETUP.md](./SETUP.md) - Detailed setup instructions\n\n## Contributing\n\nContributions are welcome! Please follow these guidelines:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nThis project is licensed under the MIT License.\n\n## Troubleshooting\n\n### Common Issues\n\n**Database connection errors**\n- Verify `DATABASE_URL` is correct\n- Ensure PostgreSQL is running\n- Check network connectivity\n\n**Turnstile not working**\n- Verify site key and secret key\n- Check domain configuration in Cloudflare dashboard\n- Ensure keys match environment (development/production)\n\n**Admin login fails**\n- Run `npm run db:seed` to create admin account\n- Verify credentials in `.env` file\n- Check database for admin record\n\nFor more help, see [SETUP.md](./SETUP.md) or open an issue.\n\n## Support\n\nFor questions or issues, please open a GitHub issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farsya371%2Fapologyhub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farsya371%2Fapologyhub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farsya371%2Fapologyhub/lists"}