portapack 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -48,7 +48,6 @@ export default defineConfig({
48
48
  { text: 'Advanced Usage', link: '/advanced' }
49
49
  ]
50
50
  },
51
- { text: 'Demo', link: '/demo' },
52
51
  { text: 'Contributing', link: '/contributing' }
53
52
  ],
54
53
 
package/docs/cli.md CHANGED
@@ -1,117 +1,180 @@
1
- # ⚙️ CLI Reference
1
+ # ⚙️ PortaPack CLI Reference
2
2
 
3
- PortaPack provides a powerful command-line interface for bundling HTML files and websites.
3
+ PortaPack provides a powerful command-line interface (CLI) for bundling local HTML files and remote websites into single, portable HTML files.
4
4
 
5
5
  ## Installation
6
6
 
7
- To use the CLI, install PortaPack globally:
7
+ To use the CLI, install PortaPack globally using npm (or your preferred package manager):
8
8
 
9
9
  ```bash
10
10
  npm install -g portapack
11
+ # or
12
+ # yarn global add portapack
13
+ # or
14
+ # pnpm add -g portapack
11
15
  ```
12
16
 
13
17
  ## Command Syntax
14
18
 
15
- The basic command structure is:
19
+ The basic syntax for the PortaPack CLI is:
16
20
 
17
21
  ```bash
18
- portapack [options]
22
+ portapack [input] [options]
19
23
  ```
20
24
 
25
+ Where `[input]` is the path to a local HTML file or a remote URL.
26
+
21
27
  ## Options
22
28
 
23
29
  | Option | Shorthand | Description | Default |
24
- |--------|----------|------------|---------|
25
- | `--input <path>` | `-i` | Input file or URL to process | - |
26
- | `--output <file>` | `-o` | Output file path | `{input}.packed.html` |
27
- | `--minify [level]` | `-m` | Minification level (0-3) | `2` |
28
- | `--no-minify` | - | Disable minification | - |
29
- | `--recursive [depth]` | `-r` | Recursively bundle links up to specified depth | - |
30
- | `--base-url <url>` | `-b` | Base URL for resolving relative URLs | - |
31
- | `--dry-run` | `-d` | Show what would be done without writing files | - |
32
- | `--verbose` | `-v` | Enable verbose logging | - |
33
- | `--help` | `-h` | Show help information | - |
34
- | `--version` | - | Show version information | - |
30
+ |--------|-----------|-------------|---------|
31
+ | `[input]` | | Required. Input local file path or remote URL (http/https) to process. | - |
32
+ | `--output <file>` | `-o` | Output file path for the bundled HTML. | `{input-basename}.packed.html` |
33
+ | `--recursive [depth]` | `-r` | Recursively bundle links up to depth. If depth omitted, defaults to true (no limit). Only applies to remote URLs. | `false` (disabled) |
34
+ | `--max-depth <n>` | | Set maximum depth for recursive crawling (alternative to `-r <n>`). | - |
35
+ | `--minify` | `-m` | Enable all minification (HTML, CSS, JS). | - |
36
+ | `--no-minify` | | Disable all asset minification (HTML, CSS, JS). | `false` |
37
+ | `--no-minify-html` | | Disable only HTML minification. | `false` |
38
+ | `--no-minify-css` | | Disable only CSS minification. | `false` |
39
+ | `--no-minify-js` | | Disable only JavaScript minification. | `false` |
40
+ | `--embed-assets` | `-e` | Embed external assets (CSS, JS, images, fonts) as data URIs or inline content. | `true` |
41
+ | `--no-embed-assets` | | Keep external assets as links (requires network access when viewing). | `false` |
42
+ | `--base-url <url>` | `-b` | Base URL for resolving relative URLs found in the input HTML. | Input path/URL |
43
+ | `--log-level <level>` | | Set logging level (debug, info, warn, error, silent, none). | `info` |
44
+ | `--verbose` | `-v` | Enable verbose logging (shortcut for `--log-level debug`). | `false` |
45
+ | `--dry-run` | `-d` | Perform all steps except writing the output file. Logs intended actions. | `false` |
46
+ | `--help` | `-h` | Show help information and exit. | - |
47
+ | `--version` | | Show PortaPack CLI version number and exit. | - |
35
48
 
36
49
  ## Examples
37
50
 
38
- ### Basic Usage
51
+ ### Basic Local File Bundling
52
+
53
+ Bundle `index.html` into `bundle.html`:
54
+
55
+ ```bash
56
+ portapack ./index.html -o bundle.html
57
+ ```
39
58
 
40
- Bundle a local HTML file:
59
+ Use default output name (`index.packed.html`):
41
60
 
42
61
  ```bash
43
- portapack -i ./index.html -o bundle.html
62
+ portapack ./index.html
44
63
  ```
45
64
 
46
65
  ### Web Page Bundling
47
66
 
48
- Bundle a remote website:
67
+ Bundle a single remote webpage:
49
68
 
50
69
  ```bash
51
- portapack -i https://example.com -o example-bundle.html
70
+ portapack https://example.com -o example-bundle.html
52
71
  ```
53
72
 
54
73
  ### Recursive Bundling
55
74
 
56
- Bundle a website and follow its links to a depth of 2:
75
+ Bundle a website, following links 1 level deep:
76
+
77
+ ```bash
78
+ portapack https://example.com -r -o site-bundle-depth1.html
79
+ ```
80
+
81
+ Bundle a website, following links up to 2 levels deep:
82
+
83
+ ```bash
84
+ portapack https://example.com -r 2 -o site-bundle-depth2.html
85
+ ```
86
+
87
+ Alternative using `--max-depth` option:
88
+
89
+ ```bash
90
+ portapack https://example.com --max-depth 2 -o site-bundle-depth2.html
91
+ ```
92
+
93
+ ### Asset Handling
94
+
95
+ Bundle without embedding assets (keep external links):
96
+
97
+ ```bash
98
+ portapack ./index.html --no-embed-assets -o linked-assets.html
99
+ ```
100
+
101
+ Default behavior is to embed assets (which you can make explicit):
57
102
 
58
103
  ```bash
59
- portapack -i https://example.com -r 2 -o site-bundle.html
104
+ portapack ./index.html --embed-assets -o embedded-assets.html
60
105
  ```
61
106
 
62
107
  ### Minification Control
63
108
 
64
- Apply maximum minification:
109
+ Apply all minification:
110
+
111
+ ```bash
112
+ portapack ./index.html -m -o min-bundle.html
113
+ ```
114
+
115
+ Disable minification completely:
65
116
 
66
117
  ```bash
67
- portapack -i ./index.html -m 3 -o min-bundle.html
118
+ portapack ./index.html --no-minify -o unmin-bundle.html
68
119
  ```
69
120
 
70
- Disable minification:
121
+ Selectively control minification:
71
122
 
72
123
  ```bash
73
- portapack -i ./index.html --no-minify -o unmin-bundle.html
124
+ # Minify CSS and JS but not HTML
125
+ portapack ./index.html --no-minify-html -o selective-min.html
126
+
127
+ # Minify HTML and CSS but not JS
128
+ portapack ./index.html --no-minify-js -o no-js-min.html
74
129
  ```
75
130
 
76
131
  ### Base URL for Relative Links
77
132
 
78
- Specify a base URL for resolving relative paths:
133
+ Process a local file as if it were hosted at https://example.com:
79
134
 
80
135
  ```bash
81
- portapack -i ./index.html -b https://example.com -o bundle.html
136
+ portapack ./docs/index.html -b https://example.com/docs/ -o bundle.html
137
+ ```
138
+
139
+ ### Logging and Debugging
140
+
141
+ Enable detailed debug logs:
142
+
143
+ ```bash
144
+ portapack ./index.html -v -o bundle-debug.html
145
+ ```
146
+
147
+ Only show errors:
148
+
149
+ ```bash
150
+ portapack ./index.html --log-level error -o bundle-errors-only.html
82
151
  ```
83
152
 
84
153
  ### Dry Run
85
154
 
86
- Preview what would be bundled without creating an output file:
155
+ See what files and assets would be processed without saving:
87
156
 
88
157
  ```bash
89
- portapack -i ./index.html --dry-run
158
+ portapack ./index.html --dry-run
90
159
  ```
91
160
 
92
- ### Verbose Logging
161
+ ### NPX Usage
93
162
 
94
- Enable detailed logs during bundling:
163
+ Use PortaPack without installing globally:
95
164
 
96
165
  ```bash
97
- portapack -i ./index.html -v -o bundle.html
166
+ npx portapack ./index.html -o bundle.html
98
167
  ```
99
168
 
100
169
  ## Exit Codes
101
170
 
102
171
  | Code | Description |
103
172
  |------|-------------|
104
- | `0` | Success |
105
- | `1` | Error (missing input, invalid URL, processing error, etc.) |
106
-
107
- ## Environment Variables
108
-
109
- | Variable | Description |
110
- |----------|-------------|
111
- | `NODE_ENV` | Set to `test` during testing to suppress console output |
173
+ | 0 | Success |
174
+ | 1 | Error |
112
175
 
113
176
  ## Related Resources
114
177
 
115
- - [Getting Started](/getting-started)
116
- - [API Reference](/api/README)
117
- - [Configuration Guide](/configuration)
178
+ - [Getting Started](https://manicinc.github.io/portapack/getting-started)
179
+ - [API Reference](https://manicinc.github.io/portapack/api/)
180
+ - [Configuration Guide](https://manicinc.github.io/portapack/configuration)
@@ -1,151 +1,136 @@
1
- # 🛠 PortaPack Configuration Guide
1
+ # 🚀 Getting Started with PortaPack
2
2
 
3
- ## 📝 Configuration Options
3
+ ## Prerequisites
4
4
 
5
- PortaPack provides multiple ways to configure its behavior:
5
+ - Node.js (v16.0.0+)
6
+ - npm (v8.0.0+)
6
7
 
7
- ### CLI Configuration
8
+ ## Quick Installation
8
9
 
9
- | Option | Type | Default | Description |
10
- |--------|------|---------|-------------|
11
- | `-i, --input` | String | Required | Input HTML file or URL |
12
- | `-o, --output` | String | `{input}.packed.html` | Output file path |
13
- | `-m, --minify` | Number | `2` | Minification level (0-3) |
14
- | `--no-minify` | Flag | - | Disable minification |
15
- | `-r, --recursive` | Boolean/Number | `false` | Crawl site recursively, optionally with depth |
16
- | `-b, --base-url` | String | Detected | Base URL for resolving paths |
17
- | `-d, --dry-run` | Flag | `false` | Preview without generating output |
18
- | `-v, --verbose` | Flag | `false` | Enable verbose logging |
19
-
20
- ### Programmatic Configuration
21
-
22
- ```typescript
23
- // Simple string input
24
- await generatePortableHTML('./index.html');
25
-
26
- // With options as second parameter
27
- await generatePortableHTML('./index.html', {
28
- minify: true,
29
- minifyLevel: 2,
30
- baseUrl: 'https://example.com'
31
- });
10
+ ```bash
11
+ # Global installation
12
+ npm install -g portapack
32
13
 
33
- // Or with options object
34
- await generatePortableHTML({
35
- input: './index.html',
36
- minify: true,
37
- minifyLevel: 2,
38
- baseUrl: 'https://example.com',
39
-
40
- // Asset handling
41
- embedAssets: true,
42
- embedLimit: 1000000,
43
-
44
- // Minification controls
45
- minifyHtml: true,
46
- minifyCss: true,
47
- minifyJs: true,
48
-
49
- // Advanced options
50
- removeComments: true,
51
- collapseWhitespace: true
52
- });
14
+ # Or as a project dependency
15
+ npm install --save-dev portapack
53
16
  ```
54
17
 
55
- ## 🔧 Configuration Examples
18
+ ## Basic Usage
56
19
 
57
- ### CLI Configuration
20
+ ### CLI Quickstart
58
21
 
59
22
  ```bash
60
- # Basic usage
61
- portapack -i ./index.html -o bundled.html
62
-
63
- # Maximum minification
64
- portapack -i ./site -m 3 -o min.html
23
+ # Bundle a local HTML file
24
+ portapack ./index.html -o portable.html
65
25
 
66
- # Disable minification
67
- portapack -i ./site --no-minify
26
+ # Bundle a remote website
27
+ portapack https://example.com --recursive -o site.html
28
+ ```
68
29
 
69
- # Set custom base URL
70
- portapack -i ./local/site -b https://example.com
30
+ ### Node.js API Basic Example
71
31
 
72
- # Recursive crawling with depth
73
- portapack -i https://site.com -r 2
32
+ ```typescript
33
+ import { pack } from 'portapack';
74
34
 
75
- # Dry run to preview
76
- portapack -i https://example.com --dry-run -v
35
+ // Simple usage with a string path
36
+ async function bundleLocalSite() {
37
+ const result = await pack('./index.html');
38
+ console.log(result.html);
39
+
40
+ // Access metadata about the build
41
+ console.log(`Output size: ${result.metadata.outputSize} bytes`);
42
+ console.log(`Build time: ${result.metadata.buildTimeMs} ms`);
43
+ }
44
+
45
+ // Advanced options using configuration object
46
+ async function bundleWithOptions() {
47
+ const result = await pack('./index.html', {
48
+ minifyHtml: true,
49
+ minifyCss: true,
50
+ minifyJs: true,
51
+ baseUrl: 'https://example.com',
52
+ embedAssets: true
53
+ });
54
+
55
+ // Use or save the bundled HTML
56
+ console.log(result.html);
57
+ }
58
+
59
+ // Recursive bundling of a website
60
+ async function bundleWebsite() {
61
+ const result = await pack('https://example.com', {
62
+ recursive: 2, // Crawl up to 2 levels deep
63
+ minifyHtml: true,
64
+ minifyCss: true,
65
+ minifyJs: true
66
+ });
67
+
68
+ console.log(`Bundled ${result.metadata.pagesBundled} pages`);
69
+ }
77
70
  ```
78
71
 
79
- ### Programmatic Configuration
72
+ ### Advanced API Usage
73
+
74
+ For more specific use cases, you can access individual components:
80
75
 
81
76
  ```typescript
82
- // Basic local file
83
- const html = await generatePortableHTML('index.html');
84
-
85
- // Remote URL with minification options
86
- const html = await generatePortableHTML({
87
- input: 'https://example.com',
88
- minify: true,
89
- minifyLevel: 3,
90
- removeComments: true
77
+ import {
78
+ generatePortableHTML,
79
+ generateRecursivePortableHTML,
80
+ bundleMultiPageHTML,
81
+ fetchAndPackWebPage,
82
+ } from 'portapack';
83
+
84
+ // Bundle a single HTML file or URL
85
+ const singleResult = await generatePortableHTML('./index.html', {
86
+ minifyHtml: true
91
87
  });
92
88
 
93
- // With custom base URL
94
- const html = await generatePortableHTML({
95
- input: './index.html',
96
- baseUrl: 'https://example.com',
97
- embedAssets: true
89
+ // Recursively bundle a site
90
+ const recursiveResult = await generateRecursivePortableHTML('https://example.com', 2, {
91
+ minifyCss: true
98
92
  });
99
93
 
100
- // Recursive site bundling
101
- await bundleSiteRecursively(
102
- 'https://example.com',
103
- 'output.html',
104
- 2 // Depth
105
- );
94
+ // Create multi-page bundle
95
+ const multiPageBundle = await bundleMultiPageHTML([
96
+ { path: '/', html: '<html>...</html>' },
97
+ { path: '/about', html: '<html>...</html>' }
98
+ ]);
106
99
  ```
107
100
 
108
- ## 💡 Best Practices
101
+ ## Configuration
109
102
 
110
- - **Base URL Handling**: Always specify a `baseUrl` when working with relative paths
111
- - **Asset Size**: Be mindful of embedding large assets; use `embedLimit` to set thresholds
112
- - **Minification Levels**: Start with level 2 and adjust based on needs:
113
- - Level 0: No minification
114
- - Level 1: Basic whitespace removal
115
- - Level 2: Standard minification (recommended)
116
- - Level 3: Aggressive minification (may affect readability)
117
- - **Testing**: Use `--dry-run -v` to preview configuration without generating files
118
- - **Performance**: For large sites, increase Node's memory limit with `NODE_OPTIONS=--max-old-space-size=4096`
103
+ See our full [Configuration Guide](https://manicinc.github.io/portapack/configuration) for detailed options.
104
+
105
+ ## CLI Options
106
+
107
+ PortaPack offers many command-line options for customizing the bundling process:
108
+
109
+ ```bash
110
+ # Get full help
111
+ portapack --help
112
+ ```
119
113
 
120
- ## 🚨 Configuration Warnings
114
+ For details, see the [CLI Reference](https://manicinc.github.io/portapack/cli).
121
115
 
122
- - Deep recursive crawling can be resource-intensive
123
- - Large sites may require increased memory allocation
124
- - Some asset embedding might fail with complex dynamic sites
125
- - External scripts with CORS restrictions may not embed properly
116
+ ## Next Steps
126
117
 
127
- ## 📂 File Types Supported
118
+ - 📖 [Explore CLI Options](https://manicinc.github.io/portapack/cli)
119
+ - 🛠 [Advanced Configuration](https://manicinc.github.io/portapack/configuration)
120
+ - 💻 [API Reference](https://manicinc.github.io/portapack/api/)
128
121
 
129
- PortaPack automatically detects and processes:
122
+ ## Troubleshooting
130
123
 
131
- - **HTML files**: Main content files
132
- - **CSS stylesheets**: Both inline and external
133
- - **JavaScript**: Script files and inline scripts
134
- - **Images**: PNG, JPEG, GIF, SVG, WebP (converted to data URLs)
135
- - **Fonts**: WOFF, WOFF2, TTF, EOT (embedded)
136
- - **Other assets**: PDFs, JSON, text files, etc.
124
+ Encountering issues? Check our [Troubleshooting Guide](https://manicinc.github.io/portapack/troubleshooting)
137
125
 
138
- ## 🔄 Environment Variables
126
+ ## Contributing
139
127
 
140
- PortaPack also supports configuration via environment variables:
128
+ Interested in improving PortaPack?
129
+ - [View Contributing Guidelines](https://manicinc.github.io/portapack/contributing)
141
130
 
142
- - `PORTAPACK_BASE_URL`: Sets the base URL
143
- - `PORTAPACK_MINIFY_LEVEL`: Sets minification level
144
- - `PORTAPACK_NO_EMBED`: Disables asset embedding when set to "true"
131
+ ## Support
145
132
 
146
- ## 📚 Related Documentation
133
+ - 🐛 [Report an Issue](https://github.com/manicinc/portapack/issues)
134
+ - 💬 [Community Support](https://discord.gg/DzNgXdYm)
147
135
 
148
- - [CLI Reference](/cli)
149
- - [API Reference](/api/README)
150
- - [Getting Started Guide](/getting-started)
151
- - [Troubleshooting](/troubleshooting)
136
+ Built by [Manic.agency](https://manic.agency)
@@ -15,88 +15,118 @@ npm install -g portapack
15
15
  npm install --save-dev portapack
16
16
  ```
17
17
 
18
- ## Documentation
19
-
20
- Our documentation is automatically generated and hosted locally:
21
-
22
- - 🌐 **Local Docs**: at `http://localhost:5173`
23
- - 📦 **Auto-Generated API Docs**: Dynamically created from TypeDoc comments
24
- - 🧩 **Sidebar Generation**: Intelligent, automated sidebar creation
25
-
26
- ### Running Documentation Locally
27
-
28
- ```bash
29
- # Start documentation development server
30
- npm run docs:dev
31
- ```
32
-
33
18
  ## Basic Usage
34
19
 
35
20
  ### CLI Quickstart
36
21
 
37
22
  ```bash
38
23
  # Bundle a local HTML file
39
- portapack -i ./index.html -o portable.html
24
+ portapack ./index.html -o portable.html
40
25
 
41
26
  # Bundle a remote website
42
- portapack -i https://example.com --recursive -o site.html
27
+ portapack https://example.com --recursive -o site.html
43
28
  ```
44
29
 
45
30
  ### Node.js API Basic Example
46
31
 
47
32
  ```typescript
48
- import { generatePortableHTML } from 'portapack';
33
+ import { pack } from 'portapack';
49
34
 
50
35
  // Simple usage with a string path
51
36
  async function bundleLocalSite() {
52
- const portableHtml = await generatePortableHTML('./index.html');
53
- console.log(portableHtml);
37
+ const result = await pack('./index.html');
38
+ console.log(result.html);
39
+
40
+ // Access metadata about the build
41
+ console.log(`Output size: ${result.metadata.outputSize} bytes`);
42
+ console.log(`Build time: ${result.metadata.buildTimeMs} ms`);
54
43
  }
55
44
 
56
45
  // Advanced options using configuration object
57
46
  async function bundleWithOptions() {
58
- const portableHtml = await generatePortableHTML({
59
- input: './index.html',
60
- minify: true,
61
- minifyLevel: 2,
62
- baseUrl: 'https://example.com'
47
+ const result = await pack('./index.html', {
48
+ minifyHtml: true,
49
+ minifyCss: true,
50
+ minifyJs: true,
51
+ baseUrl: 'https://example.com',
52
+ embedAssets: true
63
53
  });
64
-
54
+
65
55
  // Use or save the bundled HTML
66
- console.log(portableHtml);
56
+ console.log(result.html);
67
57
  }
58
+
59
+ // Recursive bundling of a website
60
+ async function bundleWebsite() {
61
+ const result = await pack('https://example.com', {
62
+ recursive: 2, // Crawl up to 2 levels deep
63
+ minifyHtml: true,
64
+ minifyCss: true,
65
+ minifyJs: true
66
+ });
67
+
68
+ console.log(`Bundled ${result.metadata.pagesBundled} pages`);
69
+ }
70
+ ```
71
+
72
+ ### Advanced API Usage
73
+
74
+ For more specific use cases, you can access individual components:
75
+
76
+ ```typescript
77
+ import {
78
+ generatePortableHTML,
79
+ generateRecursivePortableHTML,
80
+ bundleMultiPageHTML,
81
+ fetchAndPackWebPage,
82
+ } from 'portapack';
83
+
84
+ // Bundle a single HTML file or URL
85
+ const singleResult = await generatePortableHTML('./index.html', {
86
+ minifyHtml: true
87
+ });
88
+
89
+ // Recursively bundle a site
90
+ const recursiveResult = await generateRecursivePortableHTML('https://example.com', 2, {
91
+ minifyCss: true
92
+ });
93
+
94
+ // Create multi-page bundle
95
+ const multiPageBundle = await bundleMultiPageHTML([
96
+ { path: '/', html: '<html>...</html>' },
97
+ { path: '/about', html: '<html>...</html>' }
98
+ ]);
68
99
  ```
69
100
 
70
- ## Documentation Architecture
101
+ ## Configuration
102
+
103
+ See our full [Configuration Guide](https://manicinc.github.io/portapack/configuration) for detailed options.
71
104
 
72
- ### Automatic Documentation Generation
105
+ ## CLI Options
73
106
 
74
- PortaPack uses a custom sidebar generator (`buildDocsSidebar()`) to:
75
- - Automatically scan TypeDoc-generated markdown files
76
- - Create dynamic, organized documentation sidebars
77
- - Support multiple documentation types (modules, classes, interfaces, etc.)
107
+ PortaPack offers many command-line options for customizing the bundling process:
78
108
 
79
- #### How It Works
109
+ ```bash
110
+ # Get full help
111
+ portapack --help
112
+ ```
80
113
 
81
- 1. TypeDoc generates markdown from source code comments
82
- 2. Custom sidebar generator reads generated files
83
- 3. VitePress renders dynamically generated sidebar
114
+ For details, see the [CLI Reference](https://manicinc.github.io/portapack/cli).
84
115
 
85
116
  ## Next Steps
86
117
 
87
- - 📖 [Explore CLI Options](/cli)
88
- - 🛠 [Advanced Configuration](/configuration)
89
- - 💻 [API Reference](/api/README)
118
+ - 📖 [Explore CLI Options](https://manicinc.github.io/portapack/cli)
119
+ - 🛠 [Advanced Configuration](https://manicinc.github.io/portapack/configuration)
120
+ - 💻 [API Reference](https://manicinc.github.io/portapack/api/)
90
121
 
91
122
  ## Troubleshooting
92
123
 
93
- Encountering issues? Check our [Troubleshooting Guide](/troubleshooting)
124
+ Encountering issues? Check our [Troubleshooting Guide](https://manicinc.github.io/portapack/troubleshooting)
94
125
 
95
126
  ## Contributing
96
127
 
97
- Interested in improving PortaPack?
98
- - [View Contributing Guidelines](/contributing)
99
- - [Development Guide](/development)
128
+ Interested in improving PortaPack?
129
+ - [View Contributing Guidelines](https://manicinc.github.io/portapack/contributing)
100
130
 
101
131
  ## Support
102
132