Title: Feature: Configuration Presets for Common Use Cases · Issue #97 · JavaScriptSolidServer/JavaScriptSolidServer · GitHub
Open Graph Title: Feature: Configuration Presets for Common Use Cases · Issue #97 · JavaScriptSolidServer/JavaScriptSolidServer
X Title: Feature: Configuration Presets for Common Use Cases · Issue #97 · JavaScriptSolidServer/JavaScriptSolidServer
Description: Summary Add configuration presets that bundle sensible defaults for common deployment scenarios. This is a low-effort, high-impact improvement that reduces friction for new users while maintaining full customization flexibility. Difficul...
Open Graph Description: Summary Add configuration presets that bundle sensible defaults for common deployment scenarios. This is a low-effort, high-impact improvement that reduces friction for new users while maintaining ...
X Description: Summary Add configuration presets that bundle sensible defaults for common deployment scenarios. This is a low-effort, high-impact improvement that reduces friction for new users while maintaining ...
Opengraph URL: https://github.com/JavaScriptSolidServer/JavaScriptSolidServer/issues/97
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Feature: Configuration Presets for Common Use Cases","articleBody":"## Summary\n\nAdd configuration presets that bundle sensible defaults for common deployment scenarios. This is a low-effort, high-impact improvement that reduces friction for new users while maintaining full customization flexibility.\n\n**Difficulty**: 15/100 \n**Estimated Effort**: 1-2 days \n**Dependencies**: None\n\n---\n\n## Problem\n\nCurrently, users face 30+ configuration options without guidance on which combinations make sense for their use case. New users must:\n\n1. Read documentation to understand each option\n2. Decide which features they need\n3. Manually configure each setting\n4. Hope they didn't miss important combinations\n\nThis creates unnecessary friction, especially for common scenarios that have well-known \"best\" configurations.\n\n---\n\n## Proposed Solution\n\n### Usage\n\n```bash\n# CLI flag\njss start --preset personal\njss start --preset community\njss start --preset federation\n\n# With overrides (preset applies first, then overrides)\njss start --preset personal --port 8443 --notifications\n\n# Config file\n{\n \"preset\": \"personal\",\n \"port\": 8443 // overrides preset value\n}\n\n# Environment variable\nJSS_PRESET=personal\n```\n\n### Preset Definitions\n\n#### `minimal` - Development \u0026 Testing\nQuick local development, CI/CD testing, demos.\n\n```json\n{\n \"port\": 3000,\n \"host\": \"localhost\",\n \"multiuser\": false,\n \"singleUser\": true,\n \"singleUserName\": \"dev\",\n \"conneg\": false,\n \"notifications\": false,\n \"idp\": false,\n \"mashlib\": false,\n \"git\": false,\n \"nostr\": false,\n \"activitypub\": false\n}\n```\n\n| Setting | Rationale |\n|---------|-----------|\n| `localhost` only | Security for dev environment |\n| Single user | No registration complexity |\n| Features off | Fastest startup, minimal dependencies |\n\n---\n\n#### `personal` - Single-User Production\nPersonal data pod, self-hosted for one person.\n\n```json\n{\n \"port\": 443,\n \"host\": \"0.0.0.0\",\n \"multiuser\": false,\n \"singleUser\": true,\n \"singleUserName\": \"me\",\n \"conneg\": true,\n \"notifications\": true,\n \"idp\": true,\n \"mashlib\": true,\n \"mashlibCdn\": false,\n \"git\": false,\n \"nostr\": false,\n \"activitypub\": false,\n \"defaultQuota\": \"10GB\"\n}\n```\n\n| Setting | Rationale |\n|---------|-----------|\n| Port 443 | Production HTTPS |\n| IdP enabled | Proper authentication |\n| Conneg + Notifications | Full Solid spec compliance |\n| Mashlib | Data browser for file management |\n| Large quota | Personal use, generous storage |\n\n---\n\n#### `community` - Multi-User Open Registration\nCommunity server with open registration.\n\n```json\n{\n \"port\": 443,\n \"host\": \"0.0.0.0\",\n \"multiuser\": true,\n \"singleUser\": false,\n \"conneg\": true,\n \"notifications\": true,\n \"idp\": true,\n \"inviteOnly\": false,\n \"mashlib\": true,\n \"mashlibCdn\": true,\n \"git\": false,\n \"nostr\": false,\n \"activitypub\": false,\n \"defaultQuota\": \"100MB\"\n}\n```\n\n| Setting | Rationale |\n|---------|-----------|\n| Open registration | Community growth |\n| Mashlib CDN | Reduce server bandwidth |\n| 100MB quota | Reasonable default for shared hosting |\n\n---\n\n#### `private` - Multi-User Invite-Only\nOrganization or private group server.\n\n```json\n{\n \"port\": 443,\n \"host\": \"0.0.0.0\",\n \"multiuser\": true,\n \"singleUser\": false,\n \"conneg\": true,\n \"notifications\": true,\n \"idp\": true,\n \"inviteOnly\": true,\n \"mashlib\": true,\n \"mashlibCdn\": false,\n \"git\": false,\n \"nostr\": false,\n \"activitypub\": false,\n \"defaultQuota\": \"1GB\"\n}\n```\n\n| Setting | Rationale |\n|---------|-----------|\n| Invite-only | Controlled membership |\n| Local mashlib | Privacy, no CDN dependencies |\n| 1GB quota | Trusted users, more storage |\n\n---\n\n#### `federation` - Federated Social Server\nFull federation with ActivityPub and Nostr.\n\n```json\n{\n \"port\": 443,\n \"host\": \"0.0.0.0\",\n \"multiuser\": true,\n \"singleUser\": false,\n \"conneg\": true,\n \"notifications\": true,\n \"idp\": true,\n \"inviteOnly\": false,\n \"mashlib\": true,\n \"mashlibCdn\": true,\n \"git\": false,\n \"nostr\": true,\n \"nostrPath\": \"/relay\",\n \"nostrMaxEvents\": 5000,\n \"activitypub\": true,\n \"defaultQuota\": \"500MB\"\n}\n```\n\n| Setting | Rationale |\n|---------|-----------|\n| ActivityPub + Nostr | Full federation support |\n| Higher event limit | Social features need more storage |\n| Open registration | Federation requires discoverability |\n\n---\n\n#### `developer` - Full Features for Testing\nAll features enabled for development/testing.\n\n```json\n{\n \"port\": 3000,\n \"host\": \"0.0.0.0\",\n \"multiuser\": true,\n \"singleUser\": false,\n \"conneg\": true,\n \"notifications\": true,\n \"idp\": true,\n \"inviteOnly\": false,\n \"mashlib\": true,\n \"mashlibCdn\": false,\n \"git\": true,\n \"nostr\": true,\n \"activitypub\": true,\n \"webidTls\": true,\n \"defaultQuota\": \"1GB\"\n}\n```\n\n| Setting | Rationale |\n|---------|-----------|\n| All features on | Test all functionality |\n| Port 3000 | Dev-friendly, no sudo needed |\n| Local mashlib | Debug without CDN caching issues |\n\n---\n\n## Implementation Details\n\n### Config Loading Changes\n\n```javascript\n// src/config.js\n\nconst PRESETS = {\n minimal: { /* ... */ },\n personal: { /* ... */ },\n community: { /* ... */ },\n private: { /* ... */ },\n federation: { /* ... */ },\n developer: { /* ... */ }\n};\n\nfunction loadConfig(cliOptions, configPath) {\n // 1. Start with defaults\n let config = { ...DEFAULTS };\n \n // 2. Apply preset if specified (NEW)\n const presetName = cliOptions.preset || process.env.JSS_PRESET;\n if (presetName) {\n if (!PRESETS[presetName]) {\n throw new Error(`Unknown preset: ${presetName}. Available: ${Object.keys(PRESETS).join(', ')}`);\n }\n config = { ...config, ...PRESETS[presetName] };\n }\n \n // 3. Apply config file\n if (configPath) {\n const fileConfig = JSON.parse(fs.readFileSync(configPath));\n // Handle preset in config file too\n if (fileConfig.preset \u0026\u0026 PRESETS[fileConfig.preset]) {\n config = { ...config, ...PRESETS[fileConfig.preset] };\n }\n config = { ...config, ...fileConfig };\n }\n \n // 4. Apply environment variables\n config = applyEnvOverrides(config);\n \n // 5. Apply CLI arguments (highest priority)\n config = { ...config, ...cliOptions };\n \n return config;\n}\n```\n\n### CLI Addition\n\n```javascript\n// bin/jss.js\n\nprogram\n .command('start')\n .option('--preset \u003cname\u003e', 'Configuration preset (minimal, personal, community, private, federation, developer)')\n // ... existing options\n```\n\n### List Presets Command\n\n```javascript\nprogram\n .command('presets')\n .description('List available configuration presets')\n .action(() =\u003e {\n console.log('\\nAvailable presets:\\n');\n console.log(' minimal Development \u0026 testing (single user, no features)');\n console.log(' personal Single-user production server');\n console.log(' community Multi-user with open registration');\n console.log(' private Multi-user with invite-only registration');\n console.log(' federation Full ActivityPub + Nostr federation');\n console.log(' developer All features enabled for testing');\n console.log('\\nUsage: jss start --preset \u003cname\u003e');\n console.log('\\nView preset details: jss presets --show \u003cname\u003e');\n });\n```\n\n### Show Preset Details\n\n```bash\n$ jss presets --show personal\n\nPreset: personal\nDescription: Single-user production server\n\nConfiguration:\n port: 443\n host: 0.0.0.0\n singleUser: true\n singleUserName: me\n conneg: true\n notifications: true\n idp: true\n mashlib: true\n defaultQuota: 10GB\n\nUsage: jss start --preset personal\n```\n\n---\n\n## Enhanced `jss init` Integration\n\nUpdate `jss init` to offer preset selection:\n\n```\n$ jss init\n\n JavaScript Solid Server Setup\n\n? Choose a starting point:\n ❯ Personal server (single user, simple setup)\n Community server (multi-user, open registration)\n Private server (multi-user, invite-only)\n Federation server (ActivityPub + Nostr)\n Minimal (development/testing)\n Developer (all features enabled)\n Custom (configure everything manually)\n\nUsing preset: personal\n\n? Port (443): \n? Data directory (./data): \n? Domain name: example.com\n\nConfiguration saved to: ./config.json\n```\n\n---\n\n## Industry Comparison\n\n| Software | Preset System |\n|----------|---------------|\n| **Community Solid Server** | `@css:config/file.json`, `@css:config/memory.json`, `@css:config/default.json` - predefined config files |\n| **Nextcloud** | None - uses installation wizard |\n| **Mastodon** | None - single config model |\n| **Docker Compose** | Profiles (`--profile dev`, `--profile prod`) |\n| **Vite** | Modes (`--mode development`, `--mode production`) |\n| **webpack** | Mode option with preset behaviors |\n| **ESLint** | Extends (`extends: ['eslint:recommended']`) |\n| **Prettier** | None - but common in ecosystem |\n| **TypeScript** | Extends in tsconfig (`extends: '@tsconfig/node18/tsconfig.json'`) |\n\nThe preset pattern is well-established in JavaScript tooling (Vite, webpack, ESLint, TypeScript) and aligns with CSS's approach of predefined configurations.\n\n---\n\n## Preset Comparison Matrix\n\n| Feature | minimal | personal | community | private | federation | developer |\n|---------|---------|----------|-----------|---------|------------|-----------|\n| Port | 3000 | 443 | 443 | 443 | 443 | 3000 |\n| Single User | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |\n| Multi User | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |\n| Invite Only | - | - | ❌ | ✅ | ❌ | ❌ |\n| IdP | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |\n| Conneg | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |\n| Notifications | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |\n| Mashlib | ❌ | ✅ | ✅ (CDN) | ✅ | ✅ (CDN) | ✅ |\n| ActivityPub | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |\n| Nostr | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |\n| Git | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |\n| Default Quota | 50MB | 10GB | 100MB | 1GB | 500MB | 1GB |\n\n---\n\n## Documentation Updates\n\n### README.md Addition\n\n```markdown\n## Quick Start with Presets\n\nJSS provides presets for common deployment scenarios:\n\n| Preset | Use Case |\n|--------|----------|\n| `minimal` | Local development and testing |\n| `personal` | Single-user production server |\n| `community` | Multi-user with open registration |\n| `private` | Multi-user with invite-only access |\n| `federation` | Full ActivityPub + Nostr support |\n| `developer` | All features enabled for testing |\n\n\\`\\`\\`bash\n# Start with a preset\njss start --preset personal\n\n# Override specific settings\njss start --preset personal --port 8443\n\n# List available presets\njss presets\n\n# View preset details\njss presets --show federation\n\\`\\`\\`\n```\n\n---\n\n## Testing Plan\n\n1. **Unit tests**: Verify preset merging logic\n2. **Integration tests**: Start server with each preset, verify expected behavior\n3. **Override tests**: Ensure CLI/env/file overrides work correctly with presets\n4. **Error handling**: Unknown preset name, invalid combinations\n\n```javascript\n// Example test\ndescribe('presets', () =\u003e {\n it('should apply personal preset defaults', () =\u003e {\n const config = loadConfig({ preset: 'personal' });\n expect(config.singleUser).toBe(true);\n expect(config.idp).toBe(true);\n expect(config.port).toBe(443);\n });\n\n it('should allow overrides on top of preset', () =\u003e {\n const config = loadConfig({ preset: 'personal', port: 8443 });\n expect(config.port).toBe(8443);\n expect(config.singleUser).toBe(true); // from preset\n });\n\n it('should reject unknown preset', () =\u003e {\n expect(() =\u003e loadConfig({ preset: 'invalid' })).toThrow(/Unknown preset/);\n });\n});\n```\n\n---\n\n## Related Issues\n\n- #95 - Admin onboarding wizard (will use presets in step 2)\n- #96 - Admin control panel (config viewer will show active preset)\n\n---\n\n## Open Questions\n\n1. Should presets be extensible (allow users to define custom presets in config)?\n2. Should there be a `--print-preset \u003cname\u003e` to output preset as JSON for piping?\n3. Should presets warn about missing requirements (e.g., SSL certs for port 443)?\n4. Should `jss start` with no arguments suggest using a preset?","author":{"url":"https://github.com/melvincarvalho","@type":"Person","name":"melvincarvalho"},"datePublished":"2026-01-19T13:04:53.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/97/JavaScriptSolidServer/issues/97"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:f08f961f-691e-e2e7-e84e-4fa66005eff4 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | B992:F5DBC:41B61B:5A53AC:69774E15 |
| html-safe-nonce | cde1cae66065e7109d1af8285c2f3563a813f82dedb36e586eaf0ea70eebb1cc |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCOTkyOkY1REJDOjQxQjYxQjo1QTUzQUM6Njk3NzRFMTUiLCJ2aXNpdG9yX2lkIjoiNjA3NTkzNDY1ODgyMDI2MzQ0NSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 98c94cbf7eef9cb79fb54b9763c7e2894fc4143bd8e6e14be90a7873318e18ce |
| hovercard-subject-tag | issue:3829650321 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/JavaScriptSolidServer/JavaScriptSolidServer/97/issue_layout |
| twitter:image | https://opengraph.githubassets.com/e9d41b9391c3a13c74b3ee12d8ac15a97e8d841caef355f71b909c46be771cf5/JavaScriptSolidServer/JavaScriptSolidServer/issues/97 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/e9d41b9391c3a13c74b3ee12d8ac15a97e8d841caef355f71b909c46be771cf5/JavaScriptSolidServer/JavaScriptSolidServer/issues/97 |
| og:image:alt | Summary Add configuration presets that bundle sensible defaults for common deployment scenarios. This is a low-effort, high-impact improvement that reduces friction for new users while maintaining ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | melvincarvalho |
| hostname | github.com |
| expected-hostname | github.com |
| None | 3310064f35a62c06a4024ba37f41c06836f39376a095c2dfd2c4b693c34965be |
| turbo-cache-control | no-preview |
| go-import | github.com/JavaScriptSolidServer/JavaScriptSolidServer git https://github.com/JavaScriptSolidServer/JavaScriptSolidServer.git |
| octolytics-dimension-user_id | 205442424 |
| octolytics-dimension-user_login | JavaScriptSolidServer |
| octolytics-dimension-repository_id | 958025407 |
| octolytics-dimension-repository_nwo | JavaScriptSolidServer/JavaScriptSolidServer |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 958025407 |
| octolytics-dimension-repository_network_root_nwo | JavaScriptSolidServer/JavaScriptSolidServer |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 67d5f8d1d53c3cc4f49fc3bb8029933c3dc219e6 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width