Make it explicit why dual licensing is NECESSARY (not optional): - App Store and Google Play terms are incompatible with GPL-3.0 - FSF considers App Store distribution a GPL violation - Mobile builds must exclude GPL code for platform compliance Also clarify: - Only copyright holder (KaProblem) can distribute proprietary mobile apps - Third parties cannot distribute GPL apps on app stores (platform restrictions) - Third parties cannot create proprietary versions from this code - Contributors grant dual licensing rights for App Store compliance Updates: - Add 'Why Dual Licensing?' section explaining App Store restrictions - Update copyright holder to KaProblem (https://www.kaproblem.com) - Add App Store compliance context throughout documentation - Clarify that this protects copyright holder's exclusive distribution rights This prevents: - Third parties from releasing proprietary mobile apps - Confusion about why dual licensing exists - GPL violations on app stores 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
7.2 KiB
Licensing Strategy
Copyright Notice
Copyright (c) 2024 Stefan (stefan-kp)
All rights reserved. See license terms below.
Overview
This project uses a dual licensing approach where the copyright holder retains all rights to distribute under multiple licenses:
- Source code repository: GPL-3.0 (open source)
- Mobile app distributions: Proprietary (copyright holder only)
Important: Only the copyright holder (Stefan/stefan-kp) has the right to distribute this software under a proprietary license. All other parties must comply with GPL-3.0 terms.
GPL-3.0 License (Web Version)
The web version of Chess Tutor includes Stockfish.js, which is licensed under GPL-3.0. Therefore:
- Source code: GPL-3.0
- Web builds (using
LocalEngine): GPL-3.0 - Any distribution that includes Stockfish.js: GPL-3.0
Users can:
- Use the web version for free
- Bring their own API keys (Gemini)
- Run locally with client-side Stockfish
Proprietary License (Mobile Version - Copyright Holder Only)
The copyright holder of the mobile app code using Capacitor (KaProblem/https://www.kaproblem.com/Github stefan-kp) may distribute mobile versions (iOS/Android) under a proprietary license because these builds do NOT bundle Stockfish.js. Instead, they use:
RemoteEngine- Makes API calls to a hosted server for chess analysis- No GPL code is included in the mobile build
- Static export with API-only architecture
The copyright holder may distribute mobile apps under a proprietary license:
- Sold on App Store / Google Play
- Uses hosted API service
- No GPL restrictions apply to copyright holder's builds
Third parties CANNOT do this. If you fork this project, you MUST distribute all versions (including mobile) under GPL-3.0 or obtain explicit permission from the copyright holder.
Why This Dual Licensing Approach?
App Store Restrictions on GPL Software
Apple's App Store and Google Play Store have terms that are incompatible with GPL-3.0:
App Store Issues:
- GPL requires users to have the right to modify and redistribute software
- App Store's DRM and closed distribution model restricts this
- Apple's developer agreements conflict with GPL's freedom requirements
- FSF (Free Software Foundation) considers App Store distribution a GPL violation
Google Play Issues:
- Similar restrictions on modification and redistribution
- Signed APKs with locked keys conflict with GPL freedoms
- Platform terms impose additional restrictions beyond GPL
Therefore:
- We CANNOT distribute GPL-licensed apps on App Store/Google Play
- Mobile builds MUST use a proprietary license
- We achieve this by NOT including GPL code (Stockfish.js) in mobile builds
- Mobile apps use
RemoteEngine(API calls) instead ofLocalEngine(GPL)
This is why the dual licensing approach is necessary, not just optional.
How This Works
Code Architecture
// Engine abstraction allows swapping implementations
export interface ChessEngine {
evaluate(fen: string, depth?: number): Promise<EngineEvaluation>;
terminate(): void;
}
// GPL-licensed (web only)
class LocalEngine implements ChessEngine {
// Uses stockfish.js in browser
}
// No GPL dependencies (mobile)
class RemoteEngine implements ChessEngine {
// Calls API server
}
Build Configuration
Web Build (npm run build):
- Output:
output: 'standalone'(Next.js server) - Includes: API routes with Stockfish
- Engine:
LocalEngine(GPL) - License: GPL-3.0
Mobile Build (npm run build:mobile):
- Output:
output: 'export'(static HTML/JS) - Excludes: API routes (temporarily removed during build)
- Engine:
RemoteEngine(proprietary) - License: Proprietary
Legal Compliance
GPL Compliance (Web & Third Party Distributions)
All distributions of this software (by anyone other than the copyright holder) must comply with GPL-3.0:
- ✅ Source code must be available
- ✅ GPL license must be included
- ✅ Modifications must be GPL-3.0
- ✅ This includes mobile app builds by third parties
Copyright Holder's Proprietary Mobile License
Only the copyright holder can distribute mobile versions under proprietary terms because:
- ✅ Copyright holder owns all rights to the code
- ✅ No Stockfish.js included in mobile builds (no GPL dependency)
- ✅ Uses network API calls (not GPL linking)
- ✅ Dual licensing is a copyright holder's privilege
Why This Works Legally
Dual licensing is only available to the copyright holder:
- The copyright holder wrote or received contributions to the code
- The copyright holder can license their work under ANY terms they choose
- Third parties receive the code under GPL-3.0 and must comply with those terms
- Third parties cannot "strip out" GPL code to make proprietary builds (license violation)
- Only the original author can grant proprietary licenses
File Structure
chess_tutor/
├── LICENSE # GPL-3.0 (for source code and web)
├── LICENSING.md # This file (dual licensing explanation)
├── src/
│ └── lib/
│ ├── stockfish.ts # GPL-licensed (web only)
│ └── engine/
│ ├── LocalEngine.ts # GPL-licensed (web only)
│ └── RemoteEngine.ts # Proprietary (mobile)
├── public/ # Generated data (not in git)
│ ├── openings/*.json # Fetched at Docker startup
│ └── wikipedia/*.json # Fetched at Docker startup
└── scripts/
├── docker-entrypoint.sh # Fetches data on startup
└── build-mobile.sh # Excludes GPL code
Developer Guidelines
Contributing
By contributing to this repository, you agree that:
- Your contributions are licensed under GPL-3.0
- You grant the copyright holder (Stefan/stefan-kp) the right to use your contributions under any license, including proprietary licenses
- This allows the copyright holder to include contributions in proprietary mobile builds
All contributions to the source code repository are subject to GPL-3.0 for public use.
Third Party Use
If you fork this project:
- ✅ You MAY use it under GPL-3.0 terms
- ✅ You MAY distribute web versions (GPL-3.0)
- ✅ You MAY modify and redistribute (GPL-3.0)
- ❌ You CANNOT distribute proprietary mobile apps
- ❌ You CANNOT remove GPL requirements
- ❌ You CANNOT claim copyright holder privileges
Any mobile app you build from this code MUST be distributed under GPL-3.0.
Building for Web
npm run build
npm start
# GPL-3.0 applies
Building for Mobile
npm run build:mobile
# Proprietary license can apply (no GPL code included)
Deploying
Web Deployment:
- Must comply with GPL-3.0
- Must provide source code
- Can be self-hosted for free
Mobile App Store:
- Uses proprietary license
- Connects to hosted API
- Paid app model allowed
Questions?
- Web version: GPL-3.0 applies because Stockfish.js is included
- Mobile version: Proprietary license allowed because no GPL code is bundled
- Source code: GPL-3.0 (contains GPL integration code)
This approach allows:
- ✅ Free web version (GPL-compliant)
- ✅ Paid mobile app (proprietary)
- ✅ Single codebase
- ✅ Legal compliance