Contributing Guide
Thank you for your interest in the FlowPick project. This document guides you on how to participate in project contributions, including code submissions, documentation improvements, and issue reporting.
Code of Conduct
By participating in this project, you agree to follow these basic principles:
- Use friendly and inclusive language
- Respect different viewpoints and experiences
- Accept constructive criticism gracefully
- Focus on what's best for the community
- Show empathy toward other community members
Ways to Contribute
Reporting Bugs
If you find a bug, please submit a report via GitHub Issues. A good bug report should include:
Title: Brief description of problem
Description:
- What is expected behavior?
- What actually happened?
Steps to Reproduce:
1. Open '...'
2. Click on '...'
3. Scroll to '...'
4. See error
Environment Information:
- OS: Windows 11 / macOS 14 / Ubuntu 24.04
- Browser: Chrome 125 / Edge 125
- FlowPick version: v1.0.0
- Extension version or online tools?
Additional Info:
- Console error logs
- Screenshots or recordings
- Relevant streaming URL (if publicly accessible)
Feature Requests
When submitting feature requests, please explain:
- What is your use case?
- What problem does this feature solve?
- What is your expected behavior?
- Are there alternative solutions?
Improving Documentation
Documentation improvement is the easiest way to contribute:
- Find a documentation page that needs improvement
- Click "Edit this page" link at bottom of page (if available)
- Edit directly on GitHub and submit Pull Request
Or:
- Fork repository
- Find corresponding Markdown file under
content/directory - Make changes and submit Pull Request
Common directions for documentation improvements:
| Direction | Description | Reference |
|---|---|---|
| Fix errors | Inaccurate technical descriptions, incorrect configuration examples | Verify against Project Architecture |
| Add details | Missing usage instructions or parameter explanations for features | Reference style of Feature Documentation |
| Add examples | Missing code or operation examples for actual use cases | Reference writing style of Use Cases |
| Translation | Translate documents into other languages | Refer to Multilingual section |
| Fix links | Broken cross-reference links or incorrect targets | Check links in ::note blocks |
Contributing Code
If you want to contribute code, please follow this workflow.
Development Environment Setup
Prerequisites
| Tool | Minimum Version | Notes |
|---|---|---|
| Node.js | 18.x | Recommend using nvm or fnm for version management |
| pnpm | 8.x | Package manager |
| Git | 2.x | Version control |
Clone & Install
git clone https://github.com/ezwebtools/flowpick.git
cd flowpick-web
pnpm install
Start Development Server
pnpm dev
Development server runs at http://localhost:3000 by default.
Project Structure
flowpick-web/
├── app/ # Application source code
│ ├── assets/ # Static assets (CSS)
│ ├── components/ # Vue components
│ │ └── content/ # Nuxt Content specific components
│ ├── composables/ # Composables
│ │ ├── useFFmpeg.ts # FFmpeg WASM integration
│ │ ├── useStreamMerge.ts # Stream merge & download engine
│ │ ├── useClarity.ts # Microsoft Clarity analytics
│ │ └── useGA4.ts # Google Analytics
│ ├── layouts/ # Layout components
│ ├── pages/ # Page routes
│ │ ├── docs/ # Documentation pages
│ │ ├── changelog/ # Changelog pages
│ │ ├── legal/ # Legal pages
│ │ ├── m3u8-downloader.vue # M3U8 downloader
│ │ ├── dash-downloader.vue # DASH downloader
│ │ └── index.vue # Homepage
│ ├── types/ # TypeScript type declarations
│ ├── app.config.ts # Application configuration
│ └── app.vue # Root component
├── content/ # Nuxt Content documentation
│ └── zh-Hans/ # Simplified Chinese docs
├── public/ # Public static assets
│ ├── ffmpeg/ # FFmpeg WASM core files
│ └── ffmpeg-mt/ # FFmpeg WASM multithread core files
├── nuxt.config.ts # Nuxt configuration
├── package.json # Project dependencies
└── tsconfig.json # TypeScript configuration
Tech Stack
| Technology | Purpose |
|---|---|
| Nuxt 4 | Full-stack framework |
| Vue 3 | UI framework |
| Nuxt UI v4 | Component library |
| Nuxt Content v3 | Documentation system |
| Tailwind CSS v4 | Styling |
| TypeScript | Type safety |
| @ffmpeg/ffmpeg | Client-side media processing |
| m3u8-parser | HLS manifest parsing |
| mpd-parser | DASH manifest parsing |
| streamsaver | Streaming file saving |
Development Standards
Code Style
Project uses ESLint for code linting:
pnpm lint
Type Checking
pnpm typecheck
Ensure type checking passes before submitting.
Commit Message Convention
Use Conventional Commits format:
<type>(<scope>): <description>
[optional body]
[optional footer]
Types (type):
| Type | Description |
|---|---|
feat | New feature |
fix | Bug fix |
docs | Documentation update |
style | Code formatting (no functional change) |
refactor | Code refactoring |
perf | Performance optimization |
test | Test-related |
chore | Build/tool changes |
Example:
feat(downloader): add concurrent segment download with configurable threads
Implemented worker pool pattern for parallel segment downloading.
Concurrency level can be configured between 1-8 threads.
Closes #42
Branch Strategy
main: Stable version, always deployabledevelop: Development branchfeat/xxx: Feature branchfix/xxx: Bug fix branchdocs/xxx: Documentation branch
Pull Request Workflow
- Fork repository and create feature branch
- Develop, ensure code passes lint and typecheck
- Submit PR to
developbranch - Describe changes and reasons in PR description
- Wait for code review
PR Review Focus Areas:
| Focus Area | Description |
|---|---|
| Functional correctness | Does change implement expected functionality; are edge cases handled |
| Code quality | Does it follow existing code style; is there duplicate code |
| Performance impact | Does it introduce unnecessary overhead; are large file scenarios considered |
| Compatibility | Does it affect existing functionality; is browser compatibility considered |
| Security | Does it introduce security risks; is user data protected |
Documentation Writing Guide
Document Structure
Documentation uses Nuxt Content v3, stored as Markdown files in content/zh-Hans/ directory.
Frontmatter
Each document file must include following frontmatter:
---
title: Document Title
description: Document description (for SEO and list display)
navigation:
icon: i-lucide-xxx # Lucide icon name
---
Content Format
- Use standard Markdown syntax
- Specify language in code blocks for syntax highlighting
- Tables for comparison and reference information
- Use Nuxt Content directives like
::tip,::note,::warning, etc.
Navigation Configuration
Each document directory needs a .navigation.yml file:
title: Category Name
icon: i-lucide-xxx
Multilingual
Currently documentation primarily in Simplified Chinese (zh-Hans). To add other languages:
- Create corresponding language directory under
content/(e.g.,en/) - Copy document structure and translate content
- Keep file paths and naming consistent
Testing
Manual Testing Checklist
Before submitting PRs involving download functionality, verify these scenarios:
- Small file download (<10MB)
- Large file download (>500MB)
- Encrypted HLS stream download
- DASH stream download
- Format conversion (TS → MP4)
- Concurrent thread count switching
- Download cancellation and retry
- Chrome browser
- Edge browser
Verification Points for Each Test Scenario:
| Test Scenario | Verification Points | Reference Docs |
|---|---|---|
| Small file download | Download integrity, speed display, progress bar | Download Engine Architecture |
| Large file download | Memory usage, streaming write, no crashes | Download Engine Architecture — Memory Safety Management |
| Encrypted HLS | AES-128 decryption, key fetch | Video Sniffing — Encrypted Streams |
| DASH stream | A/V separation, FMP4 reassembly | Download Engine Architecture — DASH Stream Special Handling |
| Format conversion | FFmpeg loading, remuxing correctness | Format Conversion — FFmpeg WASM Engine |
| Concurrency switch | Thread count changes, speed comparison | Configuration Reference |
| Cancel & retry | AbortController, retry count | Download Engine Architecture — Retry Mechanism |
| Browser compatibility | Chrome/Edge feature consistency | Browser Compatibility |
Test Streaming URLs
Here are some publicly available streams for testing:
# Basic HLS (no encryption)
https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8
# Multi-quality HLS
https://test-streams.mux.dev/pts_shift/pts_shift.m3u8
# Basic DASH
https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps.mpd
Release Process
- Complete development and testing on
developbranch - Update changelog in
content/zh-Hans/4.changelog/ - Merge
developintomain - Create version tag (e.g.,
v1.1.0) - Build extension package and submit to Chrome Web Store
Related Documentation
- Project Architecture — System design, module responsibilities, and data flow
- Download Engine Architecture — Complete technical implementation of core download engine
- Video Sniffing — HLS/DASH manifest parsing and encryption detection
- Format Conversion — FFmpeg WASM engine and output formats
- Browser Compatibility — Browser API support and degradation strategies
- Online Tools — Online tool usage and limitations
- Configuration Reference — Concurrency, filter, and other settings
- Known Limitations — Current version technical limitations and edge cases
- Common Issues Troubleshooting — Diagnostic tools and troubleshooting steps
- Use Cases — Usage documentation references by scenario