-
Notifications
You must be signed in to change notification settings - Fork 0
feat: implement phases 1D-1G (iCal import, notifications, settings, website/API) + deploy checklist #2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
nathanialhenniges
wants to merge
5
commits into
main
Choose a base branch
from
feat/phases-1d-1g-and-deploy-checklist
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
feat: implement phases 1D-1G (iCal import, notifications, settings, website/API) + deploy checklist #2
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
2580d7e
feat: implement phases 1D-1G (iCal import, notifications, settings, w…
nathanialhenniges dbde4c4
ci: add workflow to auto-update license year annually
nathanialhenniges 7da25c9
chore: pin CI actions, rewrite README, and polish app UI
nathanialhenniges 5b5a0d1
fix: wire up notifications, harden imports, and improve accessibility
nathanialhenniges b23932a
fix(ci): update lockfile and correct working-directory to apps/native
nathanialhenniges File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| name: Update License Year | ||
|
|
||
| on: | ||
| schedule: | ||
| - cron: '0 6 1 1 *' | ||
| workflow_dispatch: | ||
|
|
||
| jobs: | ||
| update-license-year: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||
|
|
||
| - name: Get current year | ||
| id: year | ||
| run: echo "year=$(date +%Y)" >> "$GITHUB_OUTPUT" | ||
|
|
||
| - name: Update year in LICENSE | ||
| run: sed -i "s/Copyright (c) [0-9]\{4\}/Copyright (c) ${{ steps.year.outputs.year }}/" LICENSE | ||
|
|
||
| - name: Check for changes | ||
| id: diff | ||
| run: | | ||
| if git diff --quiet LICENSE; then | ||
| echo "changed=false" >> "$GITHUB_OUTPUT" | ||
| else | ||
| echo "changed=true" >> "$GITHUB_OUTPUT" | ||
| fi | ||
|
|
||
| - name: Create Pull Request | ||
| if: steps.diff.outputs.changed == 'true' | ||
| uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 | ||
| with: | ||
| branch: chore/update-license-year | ||
| commit-message: 'chore: update license year to ${{ steps.year.outputs.year }}' | ||
| title: 'chore: update license year to ${{ steps.year.outputs.year }}' | ||
| body: Automated annual update of the MIT license copyright year. | ||
| labels: chore |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,97 +1,48 @@ | ||
| # conpaws | ||
| # ConPaws | ||
|
|
||
| This project was created with [Better-T-Stack](https://github.com/AmanVarshney01/create-better-t-stack), a modern TypeScript stack that combines Next.js, and more. | ||
| [](https://github.com/MrDemonWolf/conpaws/blob/main/LICENSE) | ||
|
|
||
| ## Features | ||
| ConPaws is an open-source furry convention companion app built by [MrDemonWolf](https://github.com/MrDemonWolf), coming soon to the Apple App Store and Google Play Store. Feel free to fork it and adapt it for your own conventions or fandom community. | ||
|
|
||
| - **TypeScript** - For type safety and improved developer experience | ||
| - **Next.js** - Full-stack React framework | ||
| - **React Native** - Build mobile apps using React | ||
| - **Expo** - Tools for React Native development | ||
| - **TailwindCSS** - Utility-first CSS for rapid UI development | ||
| - **Shared UI package** - shadcn/ui primitives live in `packages/ui` | ||
| - **Turborepo** - Optimized monorepo build system | ||
| ## What it does | ||
|
|
||
| ## Getting Started | ||
| - **Local-first** — all core features work offline on iOS, Android, and Web | ||
| - **Import schedules** — pull in convention events via iCal files or Sched.com URLs | ||
| - **Build your schedule** — mark events you want to attend and get reminders | ||
| - **ConPaws+** — premium features via RevenueCat (Phase 3+) | ||
|
|
||
| First, install the dependencies: | ||
| ## Project Structure | ||
|
|
||
| ```bash | ||
| bun install | ||
| ```text | ||
| conpaws/ | ||
| ├── apps/mobile/ # Expo React Native app (iOS, Android, Web) | ||
| ├── apps/web/ # Next.js static site → conpaws.com | ||
| ├── apps/server/ # Hono API → api.conpaws.com (Cloudflare Workers) | ||
| └── apps/docs/ # Fumadocs → docs.conpaws.com | ||
| ``` | ||
|
|
||
| Then, run the development server: | ||
| ## Getting Started | ||
|
|
||
| ```bash | ||
| bun run dev | ||
| bun install | ||
| ``` | ||
|
|
||
| Open [http://localhost:3001](http://localhost:3001) in your browser to see the web application. | ||
| Use the Expo Go app to run the mobile application. | ||
|
|
||
| ## UI Customization | ||
|
|
||
| React web apps in this stack share shadcn/ui primitives through `packages/ui`. | ||
|
|
||
| - Change design tokens and global styles in `packages/ui/src/styles/globals.css` | ||
| - Update shared primitives in `packages/ui/src/components/*` | ||
| - Adjust shadcn aliases or style config in `packages/ui/components.json` and `apps/web/components.json` | ||
|
|
||
| ### Add more shared components | ||
|
|
||
| Run this from the project root to add more primitives to the shared UI package: | ||
| ### Mobile app (`apps/mobile`) | ||
|
|
||
| ```bash | ||
| bunx shadcn@latest add accordion dialog popover sheet table -c packages/ui | ||
| ``` | ||
|
|
||
| Import shared components like this: | ||
|
|
||
| ```tsx | ||
| import { Button } from "@conpaws/ui/components/button"; | ||
| ``` | ||
|
|
||
| ### Add app-specific blocks | ||
|
|
||
| If you want to add app-specific blocks instead of shared primitives, run the shadcn CLI from `apps/web`. | ||
|
|
||
| ## Project Structure | ||
|
|
||
| bun start # Start Expo dev server (development variant) | ||
| bun start:preview # Start Expo dev server (preview variant) | ||
| bun start:prod # Start Expo dev server (production variant) | ||
| bun android # Run on Android | ||
| bun ios # Run on iOS | ||
| bun web # Run web version | ||
| bun lint # Run ESLint | ||
| bun type-check # Run TypeScript type checking | ||
| bun test # Run tests (Vitest) | ||
| bun prebuild # Generate native projects | ||
| bun prebuild:clean # Clean and regenerate native projects | ||
| ``` | ||
| conpaws/ | ||
| ├── apps/ | ||
| │ ├── web/ # Frontend application (Next.js) | ||
| │ ├── native/ # Mobile application (React Native, Expo) | ||
| ├── packages/ | ||
| │ ├── ui/ # Shared shadcn/ui components and styles | ||
| ``` | ||
|
|
||
| ## Available Scripts | ||
|
|
||
| ### Root (Monorepo) | ||
|
|
||
| - `bun run dev` — Start all applications in development mode | ||
| - `bun run build` — Build all applications | ||
| - `bun run check-types` — Check TypeScript types across all apps | ||
| - `bun run dev:native` — Start the React Native/Expo development server | ||
| - `bun run dev:web` — Start only the web application | ||
|
|
||
| ### Native App (`apps/native`) | ||
|
|
||
| - `bun start` — Start Expo dev server (development variant) | ||
| - `bun start:preview` — Start Expo dev server (preview variant) | ||
| - `bun start:prod` — Start Expo dev server (production variant) | ||
| - `bun android` — Run on Android | ||
| - `bun ios` — Run on iOS | ||
| - `bun web` — Run web version | ||
| - `bun run lint` — Run ESLint | ||
| - `bun run type-check` — Run TypeScript type checking | ||
| - `bun test` — Run tests (Vitest) | ||
| - `bun run prebuild` — Generate native projects | ||
| - `bun run prebuild:clean` — Clean and regenerate native projects | ||
|
|
||
| ### Web App (`apps/web`) | ||
| ## Want to use this for your own fandom? | ||
|
|
||
| - `bun run dev` — Start Next.js dev server | ||
| - `bun run build` — Build for production | ||
| - `bun run start` — Start production server | ||
| Fork it. The app is local-first with all core features working offline. Supabase (cloud sync) is optional and planned for Phase 2+, so you can self-host with Supabase if you want cloud sync. Configure your RevenueCat keys for premium features, and point it at your conventions. The iCal import works with any standard `.ics` file, so it should work with most convention schedule tools out of the box. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| # ConPaws — Go Live Checklist | ||
|
|
||
| ## 0. Pre-flight | ||
|
|
||
| - [ ] Run `bun test` (should be 16/16) | ||
| - [ ] Commit all Phase 1D–1G changes to main | ||
| - [ ] Push to GitHub | ||
|
|
||
| --- | ||
|
|
||
| ## 1. API — Cloudflare Workers (`api.conpaws.com`) | ||
|
|
||
| - [ ] `cd apps/server && bun install` | ||
| - [ ] `wrangler login` (if not already authed) | ||
| - [ ] `wrangler secret put BREVO_API_KEY` (paste key when prompted) | ||
| - [ ] Verify `BREVO_LIST_ID` in `wrangler.toml` matches your actual Brevo list ID | ||
| - [ ] `wrangler deploy` | ||
| - [ ] Smoke test: `curl https://conpaws-api.workers.dev/health` → `{ "status": "ok" }` | ||
| - [ ] Add custom domain `api.conpaws.com` in Cloudflare Workers dashboard | ||
|
|
||
| --- | ||
|
|
||
| ## 2. Website — Cloudflare Pages (`conpaws.com`) | ||
|
|
||
| - [ ] In Cloudflare Pages: Create project → Connect GitHub repo | ||
| - [ ] Framework preset: **Next.js (static)** | ||
| - [ ] Build command: `cd apps/web && bun install && bun run build` | ||
| - OR: Build command: `bun run build`, Root directory: `apps/web` | ||
| - [ ] Output directory: `apps/web/out` | ||
| - [ ] Add env var: `NEXT_PUBLIC_API_URL` = `https://api.conpaws.com` | ||
| - [ ] Deploy | ||
| - [ ] Add custom domain: `conpaws.com` (and `www.conpaws.com`) | ||
| - [ ] Verify: `conpaws.com` loads, `/privacy` and `/terms` work | ||
|
|
||
| > **Note:** `apps/web/next.config.ts` uses `output: 'export'` — static files go to `out/`. | ||
| > The `"start": "next start"` script in `apps/web/package.json` is **incompatible** with static export and must not be used for production. Cloudflare Pages ignores it, but it should be cleaned up post-launch (see step 5). | ||
|
|
||
| --- | ||
|
|
||
| ## 3. DNS | ||
|
|
||
| - [ ] `conpaws.com` → Cloudflare Pages (CNAME to `.pages.dev` URL, or use Cloudflare nameservers for automatic routing) | ||
| - [ ] `api.conpaws.com` → Workers custom domain (configured in step 1) | ||
| - [ ] `www.conpaws.com` → redirect to `conpaws.com` (set up in Cloudflare Pages → Custom domains) | ||
|
|
||
| --- | ||
|
|
||
| ## 4. Smoke Tests | ||
|
|
||
| - [ ] `GET https://api.conpaws.com/health` → `{ "status": "ok" }` | ||
| - [ ] `POST https://api.conpaws.com/subscribe` with valid `name` + `email` → `200` | ||
| - [ ] `POST https://api.conpaws.com/subscribe` with honeypot field filled → `200` (silent success, no contact created) | ||
| - [ ] `https://conpaws.com` → hero, features, and signup form visible | ||
| - [ ] `https://conpaws.com/privacy` → loads | ||
| - [ ] `https://conpaws.com/terms` → loads | ||
| - [ ] Submit signup form on live site → contact appears in Brevo | ||
|
|
||
| --- | ||
|
|
||
| ## 5. Post-deploy | ||
|
|
||
| - [ ] Update `DEPLOY_WEB.md` to reflect Cloudflare Pages approach (not Coolify + `next start`) | ||
| - [ ] Set up auto-deploy: Cloudflare Pages deploys on every push to `main` (enable in Pages settings) | ||
| - [ ] Fix `apps/web/package.json` `start` script — remove or replace `"next start"` with a static serve alternative (e.g. `"serve out"` using the `serve` package), since it will never work with `output: 'export'` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| --- | ||
| title: API Overview | ||
| description: ConPaws API reference | ||
| --- | ||
|
|
||
| ## API Overview | ||
|
|
||
| Content coming soon. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| --- | ||
| title: Development Setup | ||
| description: How to set up the ConPaws development environment | ||
| --- | ||
|
|
||
| ## Development Setup | ||
|
|
||
| Content coming soon. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| --- | ||
| title: Getting Started | ||
| description: How to use ConPaws for your first convention | ||
| --- | ||
|
|
||
| ## Getting Started | ||
|
|
||
| Content coming soon. Check back after the ConPaws launch! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1,5 @@ | ||
| APP_VARIANT= | ||
|
|
||
| # Supabase | ||
| EXPO_PUBLIC_SUPABASE_URL= | ||
| EXPO_PUBLIC_SUPABASE_ANON_KEY= | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| import { Stack } from 'expo-router'; | ||
|
|
||
| export default function OnboardingLayout() { | ||
| return <Stack screenOptions={{ headerShown: false }} />; | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| import { View } from 'react-native'; | ||
| import { router } from 'expo-router'; | ||
| import { useTranslation } from 'react-i18next'; | ||
| import AsyncStorage from '@react-native-async-storage/async-storage'; | ||
| import { SafeView, Text, Button } from '@/components/ui'; | ||
|
|
||
| export default function CompleteScreen() { | ||
| const { t } = useTranslation(); | ||
|
|
||
| async function handleLetsGo() { | ||
| try { | ||
| await AsyncStorage.setItem('hasCompletedOnboarding', 'true'); | ||
| } catch { | ||
| // Storage write failed — still navigate so user isn't stuck | ||
| } finally { | ||
| router.replace('/(tabs)'); | ||
| } | ||
| } | ||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| return ( | ||
| <SafeView> | ||
| <View className="flex-1 items-center justify-center px-6 gap-6"> | ||
| <View className="w-20 h-20 rounded-full bg-green-100 dark:bg-green-900/30 items-center justify-center"> | ||
| <Text className="text-4xl">✓</Text> | ||
| </View> | ||
| <View className="items-center gap-2"> | ||
| <Text variant="h2" className="text-center"> | ||
| {t('onboarding.complete.title')} | ||
| </Text> | ||
| <Text variant="caption" className="text-center"> | ||
| {t('onboarding.complete.subtitle')} | ||
| </Text> | ||
| </View> | ||
| </View> | ||
| <View className="px-6 pb-8"> | ||
| <Button size="lg" onPress={handleLetsGo} className="w-full"> | ||
| {t('onboarding.complete.letsGo')} | ||
| </Button> | ||
| </View> | ||
| </SafeView> | ||
| ); | ||
| } | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Repository: MrDemonWolf/conpaws
Length of output: 576
Use
bun run testso CI executes the configured Vitest suite.Line 33 currently runs
bun test, which invokes Bun's built-in test runner. However,apps/native/package.jsondefinestestasvitest run. This mismatch means CI runs a different test path than intended. Additionally, this is inconsistent with the other steps (lines 25, 29) which usebun run lintandbun run type-check.Proposed fix
📝 Committable suggestion
🤖 Prompt for AI Agents