Skip to content

Commit 02ad30e

Browse files
authored
Audit functional fixes (#512)
* feat(theme-showcase): add theme showcase page with demo components and styles - Created `theme-showcase.page.ts` and `theme-showcase.page.scss` for showcasing various UI components and themes. - Implemented dark/light theme toggle functionality. - Enhanced global styles in `global.scss` to support new design tokens and consistent theming. - Updated `variables.scss` with app design tokens for light and dark themes, ensuring a cohesive design system. * feat: add branding management page with editor and preview functionality - Implemented branding.page.html for editing branding configurations. - Created branding.page.scss for styling the branding management page. - Developed branding.page.ts to handle branding logic, including local overrides and JSON generation for Firebase. - Updated theme-showcase.page.html to display branding information and allow toggling branding on/off. - Enhanced theme-showcase.page.scss with styles for branding color indicators. - Modified theme-showcase.page.ts to integrate branding service and manage branding state. - Updated environment.ts with Firebase configuration. - Added branding tokens to variables.scss for dynamic theming. * feat: update branding configuration and UI elements for improved customization * chore: update dependencies for nodemailer, jspdf, and tmp - upgraded nodemailer from 6.10.0 to 8.0.9 - upgraded jspdf from 3.0.4 to 4.2.1 - updated tmp from 0.2.5 to 0.2.6 - updated dompurify from 3.2.4 to 3.3.1 - updated @babel/runtime from 7.28.4 to 7.28.6 * feat: Update environment configuration and implement Apple Sign-In - Refactored environment configuration to use environment variables for URLs and support email. - Updated meta tags in various pages to use dynamic URLs from the environment. - Implemented Apple Sign-In functionality in the authentication flow. - Added new actions and effects for handling Apple Sign-In in the Redux store. - Updated UI components to reflect changes in email and contact information dynamically. - Added a funding manifest template and index HTML template for better configuration management. * fix: downgrade TypeScript version to ~5.9.0 and update path in tsconfig * feat(branding): add pre-bootstrap splash to mask Remote Config fetch Adds a neutral white splash with spinner to src/index.html.template that renders before the Angular bundle loads. Removed once BrandingService.ready$ resolves (Remote Config activated, or 2.5s fallback timeout), preventing the default-brand -> operator-brand flash that was otherwise visible while Firebase Remote Config fetched. - BrandingService exposes ready$ (ReplaySubject) that fires on first of: RemoteConfigService.activated$ tick > 0, or 2.5s timer fallback. - AppComponent fades and removes #branding-splash on ready$. - Splash lives outside the Angular tree to avoid interfering with Ionic's root-level DOM walking. * fix(ui): resolve Stencil renderer errors from vnode thrashing Fixes 'createElementNS("[object Object]")' and 'Cannot read properties of null (reading nodeType)' errors that surfaced on routes like /info/about-us. Two independent bugs were causing Ionic's Stencil renderer to operate on destroyed vnodes: 1. app-header had 'get image()' returning a new Observable on every change- detection cycle. The async pipe in the template re-subscribed each CD pass, churning the avatar <img> and the surrounding <ion-avatar>. Cached as an 'image$' field initialized once in the constructor. 2. menu's @for blocks used 'track item' (object reference). Combined with BrandingService.config$ emitting twice on startup (defaults, then Remote Config activation), Angular destroyed and recreated every <ion-item>/ <ion-icon> on each emit. ion-icon's async SVG fetch then completed against destroyed vnodes. Switched to stable URL keys (track item.url, track info.url, track p.url). Also adds distinctUntilChanged on the menu's branding subscription so no-op emissions don't rebuild the menu arrays unnecessarily (defensive perf improvement). * test(app-header): fix spec after image$ rename + tsconfig.spec.json paths - Rename component.image -> component.image$ to match refactored field. - Use BehaviorSubject for authUser so image$ pipeline (bound at construction) receives pushed values in the iconImage assertion test. - Add BrandingService mock so the constructor's logoUrl$ pipe doesn't crash on injection. - Fix tsconfig.spec.json @shared/* and capacitor-google-auth mock paths to use relative './' prefix (was causing esbuild non-relative-path warnings and @shared/* resolution failures during test compilation). * fix: sync package-lock.json to typescript ~5.9.0 * fix: regenerate functions/package-lock.json to include jest peer dep for CI * feat: implement build-time branding configuration and offline splash screen * cleanup of duplicate code * fixed img errors * fixed index and icon issues, addressed documentation and unit tests * refactor: streamline observable initialization and error handling in DetailsPage * feat: add new icons and update approvals page layout for better user experience * Excluding @ionic/core and ionicons makes Vite serve them as native ESM, untouched. They no longer participate in the optimization/re-optimization cycle, so the race window disappears.
1 parent 10cdd27 commit 02ad30e

97 files changed

Lines changed: 4447 additions & 3307 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.development

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Nonprofit Social Networking Platform: Allowing Users and Organizations to Collaborate.
2+
# Copyright (C) 2023 ASCENDynamics NFP
3+
4+
# This file is part of Nonprofit Social Networking Platform.
5+
6+
# Nonprofit Social Networking Platform is free software: you can redistribute it and/or modify
7+
# it under the terms of the GNU Affero General Public License as published
8+
# by the Free Software Foundation, either version 3 of the License, or
9+
# (at your option) any later version.
10+
11+
# Nonprofit Social Networking Platform is distributed in the hope that it will be useful,
12+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
# GNU Affero General Public License for more details.
15+
16+
# You should have received a copy of the GNU Affero General Public License
17+
# along with Nonprofit Social Networking Platform. If not, see <https://www.gnu.org/licenses/>.
18+
FIREBASE_API_KEY=AIzaSyATq5A6OaHtXtDSRoC1DZ8T_xegCZiUocU
19+
FIREBASE_AUTH_DOMAIN=ascendcoopplatform-dev.firebaseapp.com
20+
FIREBASE_DATABASE_URL=https://ascendcoopplatform-dev-default-rtdb.firebaseio.com
21+
FIREBASE_PROJECT_ID=ascendcoopplatform-dev
22+
FIREBASE_STORAGE_BUCKET=ascendcoopplatform-dev.appspot.com
23+
FIREBASE_MESSAGING_SENDER_ID=360409127691
24+
FIREBASE_APP_ID=1:360409127691:web:b1c488ce58f4e9330ca00e
25+
FIREBASE_MEASUREMENT_ID=G-9EKFS37KV8
26+
FIREBASE_API_URL=https://us-central1-ascendcoopplatform-dev.cloudfunctions.net
27+
GOOGLE_MAPS_API_KEY=AIzaSyCgx4vzT9KUwRb7csuANnxQFFC2gcwLDeI
28+
29+
# Google Auth Configuration
30+
GOOGLE_AUTH_WEB_CLIENT_ID=1031671694911-3ejesivnlk5fhr8l29ne74fhp0smdltn.apps.googleusercontent.com
31+
GOOGLE_AUTH_ANDROID_CLIENT_ID=1031671694911-9ml87v9ceqrhucjd0filu3c7hifd08ne.apps.googleusercontent.com
32+
APP_BASE_URL=https://ascendcoopplatform-dev.web.app
33+
APP_NAME=ASCENDynamics NFP Collaborative Platform
34+
APP_DESCRIPTION=An open-source collaboration platform connecting volunteers and nonprofits to foster community growth and address fundamental human needs.
35+
SUPPORT_EMAIL=support@ascendynamics.org
36+
PRIVACY_EMAIL=support@ascendynamics.org
37+
ORG_MAILING_ADDRESS="7649 W Irving Park Rd #N1, Chicago, IL, United States 60634"
38+
ORG_PHONE=
39+
ORG_COMMUNITY_URL=https://join.slack.com/t/ascendynamicsnfp/shared_invite/zt-1yqcw1hqa-slT2gWkBEkLOTRnN8zEqdQ
40+
ORG_JURISDICTION=State of Illinois, United States
41+
LEGAL_EFFECTIVE_DATE=January 1, 2024

.env.example

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# Nonprofit Social Networking Platform: Allowing Users and Organizations to Collaborate.
2+
# Copyright (C) 2023 ASCENDynamics NFP
3+
#
4+
# This file is part of Nonprofit Social Networking Platform.
5+
#
6+
# Nonprofit Social Networking Platform is free software: you can redistribute it and/or modify
7+
# it under the terms of the GNU Affero General Public License as published
8+
# by the Free Software Foundation, either version 3 of the License, or
9+
# (at your option) any later version.
10+
#
11+
# Nonprofit Social Networking Platform is distributed in the hope that it will be useful,
12+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
# GNU Affero General Public License for more details.
15+
#
16+
# You should have received a copy of the GNU Affero General Public License
17+
# along with Nonprofit Social Networking Platform. If not, see <https://www.gnu.org/licenses/>.
18+
19+
# =============================================================================
20+
# .env.example — copy to .env.development and .env.production, then fill in.
21+
# =============================================================================
22+
# Both files are gitignored. This template is committed so forks know exactly
23+
# which variables are required.
24+
#
25+
# Quick-start for a new fork:
26+
# 1. Copy this file twice:
27+
# cp .env.example .env.development
28+
# cp .env.example .env.production
29+
# 2. Fill in every value below (dev and prod may share some keys).
30+
# 3. Set your bundle ID once:
31+
# npm run set-bundle-id -- com.yourorg.yourapp
32+
# 4. Register the new bundle ID as an Android / iOS app in Firebase console
33+
# and replace android/app/google-services.json (and ios GoogleService-Info.plist
34+
# once you add the iOS platform).
35+
# 5. Run the dev server: npm start
36+
# =============================================================================
37+
38+
# -----------------------------------------------------------------------------
39+
# Firebase project credentials
40+
# Get these from Firebase console → Project settings → Your apps → Web app.
41+
# -----------------------------------------------------------------------------
42+
FIREBASE_API_KEY=
43+
FIREBASE_AUTH_DOMAIN=
44+
FIREBASE_DATABASE_URL=
45+
FIREBASE_PROJECT_ID=
46+
FIREBASE_STORAGE_BUCKET=
47+
FIREBASE_MESSAGING_SENDER_ID=
48+
FIREBASE_APP_ID=
49+
FIREBASE_MEASUREMENT_ID=
50+
FIREBASE_API_URL=
51+
52+
# -----------------------------------------------------------------------------
53+
# Google Maps
54+
# Create an API key at https://console.cloud.google.com → APIs & Services.
55+
# Enable: Maps JavaScript API, Geocoding API, Places API.
56+
# -----------------------------------------------------------------------------
57+
GOOGLE_MAPS_API_KEY=
58+
59+
# -----------------------------------------------------------------------------
60+
# Google Sign-In OAuth client IDs
61+
# Create at https://console.cloud.google.com → APIs & Services → Credentials.
62+
# Web client: OAuth 2.0 client, type = Web application
63+
# Android client: OAuth 2.0 client, type = Android (requires SHA-1 fingerprint)
64+
# -----------------------------------------------------------------------------
65+
GOOGLE_AUTH_WEB_CLIENT_ID=
66+
GOOGLE_AUTH_ANDROID_CLIENT_ID=
67+
68+
# -----------------------------------------------------------------------------
69+
# Public-facing base URL for SEO / structured data (no trailing slash).
70+
# Used in meta tags, Open Graph URLs, canonical links, JSON-LD.
71+
# Example: https://yourfork.example.com
72+
# -----------------------------------------------------------------------------
73+
APP_BASE_URL=
74+
75+
# -----------------------------------------------------------------------------
76+
# Branding / static site copy.
77+
# These are substituted into src/index.html, src/funding.json, the legal modal,
78+
# and the terms-of-use page at build time by generate-env.js.
79+
# -----------------------------------------------------------------------------
80+
# Full display title used in <title>, og:title, twitter:title, funding.json.
81+
APP_NAME=Your Co-op Platform
82+
# Single-sentence description used in <meta description>, og:description, etc.
83+
APP_DESCRIPTION=An open-source collaboration platform for cooperatives and nonprofits.
84+
# General/support contact address (terms of use, funding manifest, legal modal).
85+
SUPPORT_EMAIL=support@example.org
86+
# Privacy contact address (privacy policy section of the legal modal).
87+
PRIVACY_EMAIL=privacy@example.org
88+
89+
# -----------------------------------------------------------------------------
90+
# Organization identity used by the legal modal (privacy policy & terms of use).
91+
# These appear verbatim in the legal text — leave blank to omit a line.
92+
# -----------------------------------------------------------------------------
93+
# Physical mailing address (single line, displayed in the "Contact" section).
94+
# NOTE: quote any value containing '#' so dotenv doesn't treat it as a comment.
95+
ORG_MAILING_ADDRESS="123 Example Street #4, City, State, Country 00000"
96+
# Public phone number (display-only; format however you want).
97+
ORG_PHONE=
98+
# Community/support channel URL (Slack, Discord, forum, etc.). Leave blank to hide.
99+
ORG_COMMUNITY_URL=
100+
# Governing-law jurisdiction referenced in the Terms of Use.
101+
ORG_JURISDICTION=State of Example, Country
102+
# Effective date for the published privacy policy / terms of use.
103+
LEGAL_EFFECTIVE_DATE=January 1, 2025
104+
105+
# -----------------------------------------------------------------------------
106+
# Build-time brand defaults (optional).
107+
#
108+
# These values are baked into the JS bundle and become the first-paint identity
109+
# for THIS deployment — they apply even when the user is offline on first visit
110+
# (before Firebase Remote Config has ever fetched). Firebase Remote Config and
111+
# per-device localStorage overrides still take precedence at runtime.
112+
#
113+
# Leave a value BLANK to inherit the upstream ASCENDynamics NFP default for
114+
# that field. Set every value to ship a fully white-labeled offline-first build.
115+
#
116+
# Tagline: NOTE — quote this in your .env file when it contains '#' or '='.
117+
# Colors: CSS hex, e.g. #1565c0. Logo: absolute https:// URL, leave blank for
118+
# text-only.
119+
# -----------------------------------------------------------------------------
120+
BRAND_APP_NAME=
121+
BRAND_TAGLINE=
122+
BRAND_LOGO_URL=
123+
BRAND_PRIMARY_COLOR=
124+
BRAND_SECONDARY_COLOR=

.github/copilot-instructions.md

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,24 @@ export class ExampleService {
7979

8080
This project imports the monolithic `IonicModule` from `@ionic/angular` in feature modules. Do **not** convert pages to standalone or to individual `Ion*` imports unless that work is explicitly requested.
8181

82+
### 4a. Ionicons Registration — `addIcons()` in `AppModule`
83+
84+
`IonicModule` (compat) does **not** auto-register icon SVGs. On a cold dev-server start, Stencil renders `ion-icon` elements before their SVGs are fetched, producing:
85+
86+
```
87+
InvalidCharacterError: Failed to execute 'createElementNS' on 'Document':
88+
The qualified name provided ('[object Object]') contains the invalid name-start character '['
89+
```
90+
91+
**Fix already applied**: `src/app/app.module.ts` imports all used icons from `ionicons/icons` and calls `addIcons({...})` at module load time (before `initializeApp`), pre-registering every SVG synchronously.
92+
93+
Rules when working with icons:
94+
95+
- **Adding a new `ion-icon`**: look up the camelCase export in `node_modules/ionicons/icons/index.d.ts`, then add it to **both** the `import { ... } from "ionicons/icons"` block and the `addIcons({ ... })` call in `app.module.ts`.
96+
- **Icon naming**: templates use kebab-case (`name="add-circle-outline"`); imports use camelCase (`addCircleOutline`). `addIcons()` maps both automatically.
97+
- **Never import `ionicons/icons` wholesale** (`import * as icons`) — that bundles ~800 KB of SVG data. Import only the specific icons you need.
98+
- **Verify names first**: `node_modules/ionicons/icons/index.d.ts` is the source of truth. Some kebab-case names that look valid have no matching export in v7 (e.g. `target-outline` / `targetOutline` does not exist); those will silently show no icon rather than crash, but you'll see an `[Ionicons Warning]` in the console.
99+
82100
### 5. Template Control Flow — built-in `@if` / `@for` / `@switch`
83101

84102
The codebase has been migrated to Angular's built-in control flow (`@if`, `@for` with `track`, `@switch`). Prefer it in new templates. Some legacy templates may still use `*ngIf` / `*ngFor` / `*ngSwitch`; that's fine — convert opportunistically when you're already editing the template, but don't mix both styles within a single file.
@@ -241,17 +259,23 @@ Key conventions:
241259

242260
## Environment Configuration
243261

244-
- **Client-side** environment files are generated by `generate-env.js` from `.env.development` / `.env.production` into `src/environments/environment.ts`. Required keys:
245-
- `FIREBASE_API_KEY`, `FIREBASE_AUTH_DOMAIN`, `FIREBASE_DATABASE_URL`, `FIREBASE_PROJECT_ID`, `FIREBASE_STORAGE_BUCKET`, `FIREBASE_MESSAGING_SENDER_ID`, `FIREBASE_APP_ID`, `FIREBASE_MEASUREMENT_ID`, `FIREBASE_API_URL`, plus `GOOGLE_AUTH_WEB_CLIENT_ID`, `GOOGLE_AUTH_ANDROID_CLIENT_ID`, `GOOGLE_MAPS_API_KEY`.
262+
- **Client-side** environment files are generated by `generate-env.js` from `.env.development` / `.env.production` into `src/environments/environment.ts` (dev) or `src/environments/environment.prod.ts` (prod). The script also renders `src/index.html` from `src/index.html.template` and `src/funding.json` from `src/funding.json.template`, substituting `__TOKEN__` placeholders (`APP_NAME`, `APP_DESCRIPTION`, `APP_BASE_URL`, `SUPPORT_EMAIL`, `PRIVACY_EMAIL`, `GOOGLE_AUTH_WEB_CLIENT_ID`).
263+
- Required keys: `FIREBASE_API_KEY`, `FIREBASE_AUTH_DOMAIN`, `FIREBASE_DATABASE_URL`, `FIREBASE_PROJECT_ID`, `FIREBASE_STORAGE_BUCKET`, `FIREBASE_MESSAGING_SENDER_ID`, `FIREBASE_APP_ID`, `FIREBASE_MEASUREMENT_ID`, `FIREBASE_API_URL`, plus `GOOGLE_AUTH_WEB_CLIENT_ID`, `GOOGLE_AUTH_ANDROID_CLIENT_ID`, `GOOGLE_MAPS_API_KEY`, `APP_NAME`, `APP_DESCRIPTION`, `APP_BASE_URL`, `SUPPORT_EMAIL`, `PRIVACY_EMAIL`, `ORG_MAILING_ADDRESS`, `ORG_JURISDICTION`, `LEGAL_EFFECTIVE_DATE`. Optional: `ORG_PHONE`, `ORG_COMMUNITY_URL` (legal modal degrades gracefully when blank).
246264
- Run `npm run generate-env:dev` (or `:prod`) before `ng serve` / `ng build`. The `npm start` and `build:*` scripts already chain `generate-env:*`.
247-
- **`src/environments/environment.ts` is currently tracked by git** and `.gitignore` only excludes `environment.production.ts`. Be careful: do not stage `environment.ts` if it contains a newly-generated secret (e.g. `GOOGLE_MAPS_API_KEY`) that's different from what's already committed. Either discard the diff (`git checkout -- src/environments/environment.ts`) or untrack the file and add it to `.gitignore` before committing.
265+
- **Tracking policy** (see `.gitignore`):
266+
- `.env.development` is **tracked** — it holds the public dev Firebase config (`ascendcoopplatform-dev`) so contributors can `npm install && npm start` out of the box. Never put production secrets here.
267+
- `.env.production` is **gitignored**. Holds the prod Firebase + Google Maps secrets.
268+
- `src/environments/environment.ts` and `environment.prod.ts` are **gitignored** (regenerated every build). `src/environments/environment.example.ts` is the tracked shape reference.
269+
- `src/index.html` and `src/funding.json` are **gitignored**. Their `.template` siblings are tracked.
270+
- `.env.example` is tracked and documents every supported variable.
271+
- dotenv gotcha: an unquoted `#` inside a value is parsed as a comment. Any value containing `#` (e.g. `ORG_MAILING_ADDRESS` with an apt/suite number) **must be double-quoted** in the `.env.*` file.
248272
- **Server-side secrets** belong in Firebase config or Secret Manager — never commit secrets to the repo.
249273

250274
## Capacitor Configuration
251275

252276
`capacitor.config.ts` sets:
253277

254-
- `appId`: `org.ascendcoopplatform.app`
278+
- `appId`: `org.ascendynamics.coopplatform`
255279
- `appName`: `ASCENDynamics NFP Platform`
256280
- `webDir`: `public`
257281
- Google Auth plugin with web + Android client IDs.
@@ -265,7 +289,7 @@ When adding a Capacitor plugin: `npm install <plugin>@8` (match major version),
265289
| Project name | `ascendcoopplatform` |
266290
| Homepage | `https://ASCENDynamics.org/` |
267291
| Dev hosting URL | `https://ascendcoopplatform-dev.web.app/` |
268-
| Capacitor `appId` | `org.ascendcoopplatform.app` |
292+
| Capacitor `appId` | `org.ascendynamics.coopplatform` |
269293
| Functions runtime | Node.js 22 |
270294
| License | AGPL-3.0 |
271295

@@ -348,8 +372,7 @@ npm run generate-env:dev
348372
npm run generate-env:prod
349373

350374
# Development
351-
npm start # ng serve (uses dev env)
352-
ionic serve # Ionic dev server
375+
npm start # generate-env:dev + ng serve (preferred)
353376

354377
# Production build (writes to public/ — Firebase Hosting "public" dir)
355378
npm run build:prod # generate-env:prod + ng build --configuration production
@@ -447,14 +470,15 @@ Global element styling also lives in `global.scss`: `ion-card` gets `border-radi
447470
2. **Don't remove AngularFire compat** unless explicitly migrating; both the modular SDK and compat layer are intentionally present.
448471
3. **Don't forget to register** new reducers (`state/reducers/index.ts`) and effects (`AppModule`'s `EffectsModule.forRoot`).
449472
4. **Don't forget the AGPL header** on new source files.
450-
5. **Don't commit `.env*` files** or newly-generated `src/environments/environment.ts` secrets. The file is tracked today, but regenerating it via `generate-env:dev` can introduce real keys (e.g. `GOOGLE_MAPS_API_KEY`) that weren't in the prior committed copy.
473+
5. **Don't commit `.env.production`** or the generated `src/environments/environment.ts` / `environment.prod.ts` / `src/index.html` / `src/funding.json` files — all are gitignored for a reason. `.env.development` IS tracked (public dev Firebase config only); never put production secrets into it.
451474
6. **Don't bypass `FirestoreService`** for one-off Firestore calls in feature code — go through the service so behavior stays consistent.
452475
7. **Don't re-initialize `firebase-admin`** in Cloud Functions — reuse the existing bootstrap.
453476
8. **Don't add a new framework (Express, NestJS, etc.) to functions** without asking.
454477
9. **Don't bump Angular / NgRx / Ionic / Capacitor majors silently** — these are coordinated upgrades.
455478
10. **Don't change Prettier or ESLint config** to make a file pass — fix the file.
456479
11. **In tests, don't mutate inputs or state and call `detectChanges()` alone** — with `enableProdMode()` active you must use `componentRef.setInput()` or `markForCheck()` first (see Testing section).
457480
12. **Don't hard-code spacing, radius, or shadow values** in component SCSS — use the `--app-*` tokens from `src/theme/variables.scss`. If a value isn't covered, extend the token set rather than inventing a one-off. See the **Styling & Design System** section.
481+
13. **Don't add a new `ion-icon` without registering it in `addIcons()`** — the `IonicModule` compat layer does not auto-register icon SVGs. Any unregistered icon causes `InvalidCharacterError: createElementNS '[object Object]'` on cold dev-server start. Add the camelCase import from `ionicons/icons` and the corresponding entry in `addIcons({...})` in `app.module.ts`. See **Architecture Patterns § 4a** for details.
458482

459483
## Future Direction / Migration Targets
460484

.gitignore

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,19 @@ Thumbs.db
2323
$RECYCLE.BIN/
2424

2525
# === Environment Variables ===
26-
.env.development
26+
# .env.development IS tracked — it holds the public dev Firebase config so
27+
# new contributors can `npm install && npm start` out of the box. Do not put
28+
# secrets here.
2729
.env.production
28-
src/environments/environment.production.ts
30+
# Generated by generate-env.js from .env.* — never commit (would leak
31+
# production Firebase config + Google Maps API key on prod runs).
32+
# src/environments/environment.example.ts is the tracked shape reference.
33+
src/environments/environment.ts
34+
src/environments/environment.prod.ts
35+
36+
# === Generated from *.template by generate-env.js ===
37+
src/index.html
38+
src/funding.json
2939

3040
# === Compiled Output ===
3141
/dist

CONTRIBUTING.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ By participating in this project, you are expected to uphold our [Code of Conduc
2626

2727
4. **Set up the development environment**: Follow the instructions in the [README.md](README.md) file to set up your local development environment. Installing dependencies (`npm install`) automatically sets up Git hooks. If you don't see them, run `npm run prepare`.
2828

29+
> If you intend to deploy your fork as a separately-branded instance (different Firebase project, different bundle ID, different name), see the **Forking and deploying your own instance** section of the [README](README.md#forking-and-deploying-your-own-instance) and use `npm run set-bundle-id -- com.yourorg.yourapp` to retarget all native identifiers in one step.
30+
2931
## Contributing Code
3032

3133
1. **Create a new branch**: Before making any changes, create a new branch for your feature or bugfix:

PROJECT_GOALS.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,3 @@ The Ascend Co-op Platform project aims to create an open-source platform that em
1919
The project will not focus on the following:
2020

2121
1. **Monetization**: As a non-profit initiative, the project will not engage in monetization strategies.
22-
2. **Platform-Specific Development**: The project aims to be platform-agnostic, accessible from any modern web browser, and will not develop platform-specific applications (iOS, Android, Windows, etc.) at the current stage.

0 commit comments

Comments
 (0)