├── .eslintignore
├── .eslintrc.js
├── .github
├── FUNDING.yml
└── workflows
│ ├── ci.yml
│ ├── codeql-analysis.yml
│ └── docs.yml
├── .gitignore
├── .npmignore
├── .prettierrc.json
├── .vscode
└── settings.json
├── CHANGELOG.md
├── LICENSE
├── README.md
├── docs
├── config.toml
├── content
│ ├── _index.md
│ ├── getting-started
│ │ ├── _index.md
│ │ ├── fileStructure.md
│ │ ├── overview.md
│ │ └── userchrome.md
│ ├── guides
│ │ ├── _index.md
│ │ ├── autoUpdates.md
│ │ ├── branding.md
│ │ ├── includingAddons.md
│ │ ├── removingPocket.md
│ │ └── windows.md
│ └── reference
│ │ ├── _index.md
│ │ └── config.md
├── public
│ └── CNAME
├── sass
│ ├── _search.scss
│ ├── _variables.scss
│ ├── fabric-icons-inline.scss
│ └── main.scss
├── static
│ ├── CNAME
│ └── images
│ │ └── userchrome
│ │ ├── 001_Vanilla_firefox.png
│ │ └── 002_Browser_Toolbox.png
└── templates
│ ├── anchor-link.html
│ ├── index.html
│ └── page.html
├── jest.config.js
├── package.json
├── patches.sh
├── src
├── cmds.ts
├── commands
│ ├── bootstrap.ts
│ ├── build.ts
│ ├── ci.ts
│ ├── discard.ts
│ ├── download.ts
│ ├── download
│ │ ├── addon.ts
│ │ └── firefox.ts
│ ├── execute.ts
│ ├── export-file.test.ts
│ ├── export-file.ts
│ ├── ff-version.test.ts
│ ├── ff-version.ts
│ ├── init.ts
│ ├── license-check.test.ts
│ ├── license-check.ts
│ ├── license-check.txt
│ ├── package.ts
│ ├── patches
│ │ ├── branding-patch.ts
│ │ ├── command.ts
│ │ ├── copy-patches.ts
│ │ ├── git-patch.ts
│ │ └── index.ts
│ ├── reset.ts
│ ├── run.ts
│ ├── set.ts
│ ├── setup-project.test.ts
│ ├── setup-project.ts
│ ├── status.ts
│ ├── update.ts
│ └── updates
│ │ ├── addons.ts
│ │ └── browser.ts
├── constants
│ ├── index.ts
│ └── mozconfig.ts
├── index.ts
├── log.ts
├── middleware
│ ├── patch-check.ts
│ ├── register-command.ts
│ └── update-check.ts
├── types.d.ts
└── utils
│ ├── change-tracking.ts
│ ├── command-exists.ts
│ ├── config.test.ts
│ ├── config.ts
│ ├── delay.ts
│ ├── dispatch.test.ts
│ ├── dispatch.ts
│ ├── download.ts
│ ├── dynamic-config.test.ts
│ ├── dynamic-config.ts
│ ├── error-handler.ts
│ ├── fs.ts
│ ├── index.ts
│ ├── store.ts
│ ├── string-template.ts
│ ├── task-list.ts
│ ├── version-formatter.ts
│ ├── version.test.ts
│ └── version.ts
├── template
├── .vscode
│ └── settings.json
├── branding.optional
│ ├── configure.sh
│ └── locales
│ │ └── en-US
│ │ ├── brand.dtd
│ │ ├── brand.ftl
│ │ └── brand.properties
├── configs
│ ├── common
│ │ └── mozconfig
│ ├── linux
│ │ └── mozconfig
│ ├── macos
│ │ └── mozconfig
│ └── windows
│ │ └── mozconfig
├── patches.optional
│ └── .gitkeep
└── src
│ └── browser
│ └── themes.optional
│ ├── custom
│ ├── linux
│ │ └── linux.inc.css
│ ├── macos
│ │ └── macos.inc.css
│ ├── shared
│ │ └── shared.inc.css
│ └── windows
│ │ └── windows.inc.css
│ ├── linux
│ ├── browser-css.patch
│ └── jar-mn.patch
│ ├── osx
│ ├── browser-css.patch
│ └── jar-mn.patch
│ ├── shared
│ ├── browser-shared-css.patch
│ └── jar-inc-mn.patch
│ └── windows
│ ├── browser-css.patch
│ └── jar-mn.patch
├── tests
└── assets
│ └── invalid-license.txt
├── tsconfig.json
└── yarn.lock
/.eslintignore:
--------------------------------------------------------------------------------
1 | dist/
2 | node_modules/
3 | template/
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | es2021: true,
4 | node: true,
5 | },
6 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:unicorn/recommended'],
7 | parser: '@typescript-eslint/parser',
8 | parserOptions: {
9 | ecmaVersion: 'latest',
10 | sourceType: 'module',
11 | },
12 | plugins: ['@typescript-eslint', 'unicorn'],
13 | rules: {
14 | 'unicorn/no-process-exit': 0,
15 | // We are currently using commonjs. If / when it becomes viable for us to
16 | // switch to ESModules, we should consider enabling this rule
17 | 'unicorn/prefer-module': 0,
18 | },
19 | }
20 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: trickypr
4 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on:
4 | push:
5 | pull_request:
6 | workflow_dispatch:
7 |
8 | jobs:
9 | general:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - name: Checkout 🛎️
13 | uses: actions/checkout@v2.3.1
14 |
15 | - uses: actions/setup-node@v3
16 | with:
17 | node-version: 'lts/*'
18 | cache: 'yarn'
19 |
20 | - name: Install dependencies
21 | run: yarn --frozen-lockfile
22 |
23 | - name: Build
24 | run: yarn build
25 |
26 | - name: Test
27 | run: yarn test
28 |
29 | - name: Lint
30 | run: yarn lint
31 |
--------------------------------------------------------------------------------
/.github/workflows/codeql-analysis.yml:
--------------------------------------------------------------------------------
1 | # For most projects, this workflow file will not need changing; you simply need
2 | # to commit it to your repository.
3 | #
4 | # You may wish to alter this file to override the set of languages analyzed,
5 | # or to provide custom queries or build logic.
6 | #
7 | # ******** NOTE ********
8 | # We have attempted to detect the languages in your repository. Please check
9 | # the `language` matrix defined below to confirm you have the correct set of
10 | # supported CodeQL languages.
11 | #
12 | name: "CodeQL"
13 |
14 | on:
15 | push:
16 | branches: [ main ]
17 | pull_request:
18 | # The branches below must be a subset of the branches above
19 | branches: [ main ]
20 | schedule:
21 | - cron: '16 12 * * 4'
22 |
23 | jobs:
24 | analyze:
25 | name: Analyze
26 | runs-on: ubuntu-latest
27 | permissions:
28 | actions: read
29 | contents: read
30 | security-events: write
31 |
32 | strategy:
33 | fail-fast: false
34 | matrix:
35 | language: [ 'javascript' ]
36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
37 | # Learn more about CodeQL language support at https://git.io/codeql-language-support
38 |
39 | steps:
40 | - name: Checkout repository
41 | uses: actions/checkout@v2
42 |
43 | # Initializes the CodeQL tools for scanning.
44 | - name: Initialize CodeQL
45 | uses: github/codeql-action/init@v1
46 | with:
47 | languages: ${{ matrix.language }}
48 | # If you wish to specify custom queries, you can do so here or in a config file.
49 | # By default, queries listed here will override any specified in a config file.
50 | # Prefix the list here with "+" to use these queries and those in the config file.
51 | # queries: ./path/to/local/query, your-org/your-repo/queries@main
52 |
53 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
54 | # If this step fails, then you should remove it and run the build manually (see below)
55 | - name: Autobuild
56 | uses: github/codeql-action/autobuild@v1
57 |
58 | # ℹ️ Command-line programs to run using the OS shell.
59 | # 📚 https://git.io/JvXDl
60 |
61 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
62 | # and modify them (or add more) to build your code if your project
63 | # uses a compiled language
64 |
65 | #- run: |
66 | # make bootstrap
67 | # make release
68 |
69 | - name: Perform CodeQL Analysis
70 | uses: github/codeql-action/analyze@v1
71 |
--------------------------------------------------------------------------------
/.github/workflows/docs.yml:
--------------------------------------------------------------------------------
1 | name: Build docs
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | paths:
8 | - 'docs/**'
9 | - '.github/**'
10 | workflow_dispatch:
11 |
12 | jobs:
13 | docs:
14 | runs-on: ubuntu-latest
15 | steps:
16 | - name: Checkout 🛎️
17 | uses: actions/checkout@v2.3.1
18 |
19 | - name: Deploy docs
20 | uses: shalzz/zola-deploy-action@v0.13.0
21 | env:
22 | # Target branch
23 | PAGES_BRANCH: gh-pages
24 | BUILD_DIR: docs/
25 | # Provide personal access token
26 | TOKEN: ${{ secrets.ROBOT_TOKEN }}
27 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
105 |
106 | testing/
107 |
108 | site/
109 |
110 | docs/public/
111 | .gluon
112 |
113 | # Patch generation
114 | .moz-central
115 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | testing/
2 | node_modules/
3 | src/
4 | !template/src/
5 | !dist/
6 | docs/
7 | site/
8 | tests/
9 |
10 | .prettierrc.json
11 | gluon.json
12 | tsconfig.json
13 | yarn.lock
14 | .eslintignore
15 | .eslintrc.json
16 | .gluon
17 | .vscode/
18 | .github/
19 | .eslintrc.js
20 | jest.config.js
21 |
22 | # Patch generation
23 | .moz-central
24 | patches.sh
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "tabWidth": 2,
3 | "useTabs": false,
4 | "semi": false,
5 | "singleQuote": true,
6 | "trailingComma": "es5"
7 | }
8 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "gitmoji.additionalEmojis": [
3 | {
4 | "emoji": "🔄",
5 | "code": ":arrows_counterclockwise:",
6 | "description": "Update changelog"
7 | }
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file.
4 |
5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7 |
8 | ## [Unreleased]
9 |
10 | ## [1.0.0-rc.5]
11 |
12 | ### Fixed
13 |
14 | - `update`: Update will abort if already up to date
15 | - `download`: Will send the correct UA to github
16 |
17 | ### Removed
18 |
19 | - `import`: Gluon will no longer change the update url
20 |
21 | ## [1.0.0-rc.3]
22 |
23 | ### Fixed
24 |
25 | - Template is now valid for firefox 107
26 |
27 | ### Changed
28 |
29 | - Improved error handling and logging for the download command
30 | - `download`: The `engine/` directory will only be deleted if it is empty. Otherwise it will skip. Justification can be found in [#27](https://github.com/pulse-browser/gluon/issues/27)
31 |
32 | ## [1.0.0-rc.2]
33 |
34 | ### Fixed
35 |
36 | - `license-check`: Correct definition of `--fix`
37 |
38 | ## [1.0.0-rc.1]
39 |
40 | ### Added
41 |
42 | - CLI Related:
43 | - `config`: Allow you to specify environment-specific config
44 | - `package`: Generate update manifests
45 | - `config`: Different build modes using `buildMode` key
46 | - `ci`: A command for configuring everything on CI with one command
47 |
48 | ### Changed
49 |
50 | - `Docs`: Vastly improved docs
51 | - `mozconfig`: Update the update-signing to match mozilla's new system
52 | - `perf`: Reduced dependencies somewhat
53 | - CLI:
54 | - `setup-project`: Asks for binary name
55 | - Config
56 | - `firefox version`: Remove `ESR_NEXT`. Mozilla no longer provides this information via their API
57 | - `addons`: Addons now can be specified by provider. This allows for [bot update notifications](https://github.com/pulse-browser/update-bot). For migration example, see [this commit](https://github.com/pulse-browser/browser/commit/2ca3b2606299ef03e2adbcf43974bbe6ec8c2eea)
58 |
59 | ### Fixed
60 |
61 | - `.gluon` is included in generated gitignore
62 |
63 | ### Removed
64 |
65 | - `setup-project`: HTML template has been removed. Use [motherhen](https://github.com/ajvincent/motherhen) or [Quark Runtime (wip)](https://github.com/quark-platform/runtime)
66 |
67 | ## [1.0.0-a.2]
68 |
69 | ### Added
70 |
71 | - Initial beta release
72 |
73 | [1.0.0-rc.5]: https://github.com/pulse-browser/gluon/compare/v1.0.0-rc.3...v1.0.0-rc.4
74 | [1.0.0-rc.3]: https://github.com/pulse-browser/gluon/compare/v1.0.0-rc.2...v1.0.0-rc.3
75 | [1.0.0-rc.2]: https://github.com/pulse-browser/gluon/compare/v1.0.0-rc.1...v1.0.0-rc.2
76 | [1.0.0-rc.1]: https://github.com/pulse-browser/gluon/compare/v1.0.0-a.2...v1.0.0-rc.1
77 | [1.0.0-a.2]: https://github.com/pulse-browser/gluon/compare/v1.0.0-a.1...v1.0.0-a.2
78 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | # Gluon
8 |
9 | Build Firefox-based browsers with ease
10 |
11 | **This is still in a prerelease / prototype phase. Changes will be made, things will be broken**
12 |
13 |
14 |
15 | ## Installation
16 |
17 | Per project (recommended):
18 |
19 | ```sh
20 | npm install gluon-build
21 | # or
22 | yarn add gluon-build
23 | ```
24 |
25 | Globally:
26 |
27 | ```sh
28 | npm install -g gluon-build
29 | # or
30 | yarn global add gluon-build
31 |
32 | # Note: Linux and mac users may have to run the above command with sudo
33 | ```
34 |
35 | ## Documentation
36 |
37 | Documentation is available on [docs.gluon.dev](https://docs.gluon.dev) or in the docs folder of this repository.
38 |
39 | ## Licencing notes
40 |
41 | The following is included in good faith. The writer is not a lawyer, and this is not legal advice.
42 |
43 | ### Melon
44 |
45 | Gluon has been extracted from melon, the build tool for the [desktop version of Dot Browser](https://github.com/dothq/browser-desktop) under MPL v2.0.
46 |
47 | This Source Code Form is subject to the terms of the Mozilla Public
48 | License, v. 2.0. If a copy of the MPL was not distributed with this
49 | file, You can obtain one at http://mozilla.org/MPL/2.0/.
50 |
51 | ### Firefox
52 |
53 | This program downloads and modifies Firefox. [Follow their license](https://hg.mozilla.org/mozilla-central/file/tip/LICENSE) when distributing your program.
54 |
55 | ### Logo
56 |
57 | The package icon is from [Microsoft's Fluent Emoji](https://github.com/microsoft/fluentui-emoji). There is an [ongoing conversation](https://github.com/microsoft/fluentui-emoji/issues/18) regarding the license.
58 |
59 | ```
60 | MIT License
61 |
62 | Copyright (c) Microsoft Corporation.
63 |
64 | Permission is hereby granted, free of charge, to any person obtaining a copy
65 | of this software and associated documentation files (the "Software"), to deal
66 | in the Software without restriction, including without limitation the rights
67 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
68 | copies of the Software, and to permit persons to whom the Software is
69 | furnished to do so, subject to the following conditions:
70 |
71 | The above copyright notice and this permission notice shall be included in all
72 | copies or substantial portions of the Software.
73 | ```
74 |
--------------------------------------------------------------------------------
/docs/config.toml:
--------------------------------------------------------------------------------
1 | name = "Gluon"
2 | description = "Build Firefox-based browsers with ease"
3 | license = "MPL 2.0"
4 | homepage = "https://github.com/pulse-browser/gluon"
5 | min_version = "1.14.0"
6 |
7 | # The URL the site will be built for
8 | base_url = "https://docs.gluon.dev"
9 |
10 | # Whether to automatically compile all Sass files in the sass directory
11 | compile_sass = true
12 |
13 | # Whether to build a search index to be used later on by a JavaScript library
14 | build_search_index = true
15 |
16 | [markdown]
17 | # Whether to do syntax highlighting
18 | # Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
19 | highlight_code = true
20 |
21 | [extra]
22 | logo = "https://raw.githubusercontent.com/microsoft/fluentui-emoji/main/assets/Package/3D/package_3d.png"
23 | release = "https://api.github.com/repos/pulse-browser/gluon/releases/latest"
24 |
25 | [author]
26 | name = "TrickyPR"
27 |
--------------------------------------------------------------------------------
/docs/content/_index.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "index"
3 | insert_anchor_links = "right"
4 | +++
5 |
6 | ## Welcome to the Gluon docs
7 |
8 | If you are new here, you should read the [Getting Started](./getting-started/overview/) guide.
9 |
--------------------------------------------------------------------------------
/docs/content/getting-started/_index.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Getting Started"
3 | weight = 1
4 | sort_by = "weight"
5 | +++
6 |
--------------------------------------------------------------------------------
/docs/content/getting-started/fileStructure.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Understanding the file structure"
3 | weight = 10
4 | +++
5 |
6 | # Understanding the file structure
7 |
8 | Lets take a look at the file structure of your project. It should look something like this:
9 |
10 | ```filesystem
11 | ├─ .gitignore
12 | ├─ gluon.json
13 | ├─ configs
14 | │ ├─ common
15 | │ │ └─ mozconfig
16 | │ ├─ linux
17 | │ │ └─ mozconfig
18 | │ ├─ macos
19 | │ │ └─ mozconfig
20 | │ └─ windows
21 | │ └─ mozconfig
22 | ├─ src
23 | │ ├─ README.md
24 | │ └─ browser
25 | │ └─ themes
26 | │ ├─ custom
27 | │ │ ├─ linux
28 | │ │ │ └─ linux.inc.css
29 | │ │ ├─ macos
30 | │ │ │ └─ macos.inc.css
31 | │ │ ├─ shared
32 | │ │ │ └─ shared.inc.css
33 | │ │ └─ windows
34 | │ │ └─ windows.inc.css
35 | │ ├─ linux
36 | │ │ ├─ browser-css.patch
37 | │ │ └─ jar-mn.patch
38 | │ ├─ osx
39 | │ │ ├─ browser-css.patch
40 | │ │ └─ jar-mn.patch
41 | │ ├─ shared
42 | │ │ ├─ browser-shared-css.patch
43 | │ │ └─ jar-inc-mn.patch
44 | │ └─ windows
45 | │ ├─ browser-css.patch
46 | │ └─ jar-mn.patch
47 | ├─ .gluon
48 | │ └─ ...
49 | └─ engine
50 | └─ ...
51 | ```
52 |
53 | Whilst this may seem large (especially if you look inside of the `engine`) directory, it is all fairly manageable.
54 |
55 | ## gluon.json
56 |
57 | The primary configuration file for your project is the `gluon.json` file. This is where you will put information about your browser so Gluon can build it correctly. It should look something like this:
58 |
59 | ```json
60 | {
61 | "name": "Gluon Example Browser",
62 | "vendor": "Fushra",
63 | "appId": "dev.gluon.example",
64 | "binaryName": "gluon-example-browser",
65 |
66 | "version": {
67 | "product": "firefox",
68 | "version": "102.0.1"
69 | },
70 |
71 | "buildOptions": {
72 | "windowsUseSymbolicLinks": false
73 | }
74 | }
75 | ```
76 |
77 | Up the top of the config file, we have general information about the browser you are building. This includes its name, the vendor creating it, its appId, and the name of the binary that will be output.
78 |
79 | The `version` key is used to specify information about the product you are building. `product` is the Firefox branch you are building against. `version` is the version of Firefox you are building against, which will vary with the branch. Here `firefox` refers to the stable branch of Firefox.
80 |
81 | `buildOptions` provides a number of internal toggles for how Gluon builds your project.
82 |
83 | ## Configs
84 |
85 | The configs folder stores a combination of config files that are required by Firefox and assets required by Gluon. By default there are only [`mozconfig` files](https://firefox-source-docs.mozilla.org/build/buildsystem/mozconfigs.html), Gluon should generate most parts of this config for you. The only part that you will need to change is the source control repo:
86 |
87 | ```bash
88 | ac_add_options --with-app-name=${binName}
89 | export MOZ_USER_DIR="${name}"
90 | export MOZ_APP_VENDOR="${vendor}"
91 | export MOZ_APP_BASENAME=${binName}
92 | export MOZ_APP_PROFILE=${binName}
93 | export MOZ_APP_DISPLAYNAME="${name}"
94 | export MOZ_MACBUNDLE_ID=${appId}
95 | export MOZ_DISTRIBUTION_ID=${appId}
96 |
97 | # Uncomment if builds are too resource hungry
98 | # mk_add_options MOZ_MAKE_FLAGS="-j4"
99 | # ac_add_options --enable-linker=gold
100 |
101 | # Misc
102 | export MOZ_STUB_INSTALLER=1
103 | export MOZ_INCLUDE_SOURCE_INFO=1
104 | export MOZ_SOURCE_REPO=https://github.com/dothq/browser-desktop # <-- Change this!
105 | export MOZ_SOURCE_CHANGESET=${changeset}
106 | ```
107 |
108 | This directory is also where you would put [branding assets for your browser](/guides/branding)
109 |
110 | ## src/
111 |
112 | The source folder contains all of the modifications that you have made to Firefox. These come in two types, inserted files (and folders) and patches. Both of these are applied using the `gluon import` command.
113 |
114 | Inserted files are just files (and folders) that you have inserted into the Firefox source code. These will overwrite existing files if they already exist. On Linux and MacOS, these are symlinked so when you change a file in `src/`, the change will be mirrored in Firefox's source code instantly. On Windows, you will need to run `gluon import` for these changes to apply.
115 |
116 | Patches are changes to Firefox's files. As a rule of thumb, you should prefer splitting new content into a new file rather than using patches, but there are times when you must modify Firefox's source code. Each of these patch files are just git patch files:
117 |
118 | ```patch
119 | diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn
120 | index 404a88b218c652afac0cb2004676d22da53d48f3..5a4668ef2970dd773536907f51f3e7e7e3e023cb 100644
121 | --- a/browser/themes/linux/jar.mn
122 | +++ b/browser/themes/linux/jar.mn
123 | @@ -6,7 +6,7 @@ browser.jar:
124 | % skin browser classic/1.0 %skin/classic/browser/
125 | #include ../shared/jar.inc.mn
126 | skin/classic/browser/sanitizeDialog.css
127 | - skin/classic/browser/browser.css
128 | +* skin/classic/browser/browser.css
129 | skin/classic/browser/contextmenu.css (../shared/contextmenu.css)
130 | skin/classic/browser/monitor-base.png
131 | skin/classic/browser/monitor-border.png
132 | ```
133 |
134 | In this patch, you can see that I am adding a `*` to the start of a line. You generate these patches by modifying the file in the `engine/` directory and running `gluon export` to export your changes to the src directory. Be careful, if you do not export your changes, they will not be saved and will not work on other developers' computers or yours after an update!
135 |
136 | ```sh
137 | gluon export browser/themes/linux/jar.mn
138 | ```
139 |
140 | ## engine/
141 |
142 | The engine directory contains all of Firefox's source code. It is massive - around 15GB in size (around 11GB of that are build assets from when you run `gluon build`). I am not able to provide a full explanation of the contents of the directory.
143 |
144 | However, most of the changes you will want to make will be in `engine/browser/`, which contains the source code for the browser's UI. Here are some of the important directories inside of the `engine/browser/` directory:
145 |
146 | - [`engine/browser/base/content`](https://searchfox.org/mozilla-central/source/browser/base/content): These contain the xhtml files that make up a majority of the browser's ui
147 | - [`engine/browser/components`](https://searchfox.org/mozilla-central/source/browser/components): This contains some self-contained UI features, like screenshots, uitours, downloads, etc.
148 | - [`engine/browser/themes`](https://searchfox.org/mozilla-central/source/browser/themes): Here lies most of the browsers CSS. See [Customizing Your Browser's UI](/getting-started/userchrome) for more information.
149 |
150 | One of the best ways to find what you are looking for and get to know the code base is by searching it. However, if you try and search through it on your computer you are in for a world of pain. Instead, I recommend you use [SearchFox](https://searchfox.org), which is significantly faster.
151 |
--------------------------------------------------------------------------------
/docs/content/getting-started/overview.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Setting up your project"
3 | weight = 5
4 | +++
5 |
6 | ## Getting started with gluon
7 |
8 | ### What is gluon
9 |
10 | Gluon is a build tool and documentation for creating firefox-based browsers. Its goal is to simplify the process of creating web browsers to encourage competition and development within the space.
11 |
12 | ### Getting help
13 |
14 | If you are having problems with following these instructions, or with gluon in general, please contact us. You can [create a discussion on github](https://github.com/pulse-browser/gluon/discussions/new), ping @trickypr on the [Fushra Discord](https://discord.gg/xNkretH7sD).
15 |
16 | ### System requirements
17 |
18 | - **OS**: Linux and MacOS (If you are using windows, take a look at the [Windows Guide](../windows/))
19 | - **Gluon dependencies**: NodeJS and npm
20 | - **Browser dependencies**: Will be handled by bootstrapping
21 |
22 | ### Getting started
23 |
24 | The first thing you are going to need to do is to install Gluon. As it is a nodejs program it can be installed through npm or yarn.
25 |
26 | ```sh
27 | npm install -g gluon-build@next
28 | # or
29 | yarn global add gluon-build@next
30 |
31 | # Note: Linux and mac users may have to run the above command with sudo
32 | ```
33 |
34 | Now create a git repo and clone it to your local machine. Then run the following:
35 |
36 | ```sh
37 | gluon setup-project
38 | ```
39 |
40 | This will ask you a variety of questions in relation to your project setup. Firstly, the release of the browser you want to bind to.
41 |
42 | ```
43 | ? Select a product to fork › - Use arrow-keys. Return to submit.
44 | ❯ Firefox stable
45 | Firefox extended support (older)
46 | Firefox extended support (newer)
47 | Firefox developer edition (Not recommended)
48 | Firefox beta (Not recommended)
49 | ```
50 |
51 | You can change what version you are bound to at any time. Pulse Browser currently uses the stable releases, but if you want a lower workload, the newer Extended Support releases might be good for you.
52 |
53 | Then next is the version of the browser you want to use. By default gluon will populate this with the latest version available, which we recommend using. Simply click enter to accept.
54 |
55 | ```
56 | ? Enter the version of this product › 102.0.1
57 | ```
58 |
59 | Next it will ask for the name of your browser. Avoid references to Firefox or other Mozilla brands, as this is likely to lead to trademark and copyright issues down the road.
60 |
61 | ```
62 | ? Enter a product name › Gluon Example Browser
63 | ```
64 |
65 | The binary name is the name that your program will be run from. We recommend that you add `-browser` to the end to [avoid conflicts with common utilities](https://github.com/dothq/browser/issues/604).
66 |
67 | ```
68 | ? Enter the name of the binary › gluon-example-browser
69 | ```
70 |
71 | Vendor is the company (or solo developer) who is creating the browser.
72 |
73 | ```
74 | ? Enter a vendor › Fushra
75 | ```
76 |
77 | The appid follows reverse dns naming conventions. For example, Fushra owns the domain `fushra.com`, so our browser is `com.fushra.browser.desktop`. If you do not have a domain, you can use your username / pseudonym as the appid, e.g. `trickypr.watermelon`.
78 |
79 | ```
80 | ? Enter an appid › dev.gluon.example
81 | ```
82 |
83 | Next you need to chose a starting template for your browser. If you know what you are doing, you can go with `None` and configure it how you like. Otherwise, we recommend you stick with `UserChrome`.
84 |
85 | ```
86 | ? Select a ui mode template › - Use arrow-keys. Return to submit.
87 | None
88 | ❯ User Chrome (custom browser css, simplest)
89 | ```
90 |
91 | Now you have created the directory structure for your project, you can build it for the first time. First, ask gluon to download the firefox source.
92 |
93 | ```sh
94 | gluon download
95 | ```
96 |
97 | If you are running this for the first time, you will need to install the firefox dependencies. You can do this via boostrapping:
98 |
99 | ```sh
100 | gluon bootstrap
101 | ```
102 |
103 | After the source code has been downloaded, the changes to firefox described in the source code must be applied.
104 |
105 | ```sh
106 | gluon import
107 | ```
108 |
109 | Finally, you can start building the firefox source code. This takes around an hour and a half on my computer, but the binary output will be cached, making later builds faster
110 |
111 | ```sh
112 | gluon build
113 | ```
114 |
115 | Now you can finally start the browser!
116 |
117 | ```sh
118 | gluon run
119 | ```
120 |
121 | ## Common errors
122 |
123 | Here are some common errors that you might run into whilst running `gluon build` and some potential fixes.
124 |
125 | ### Anything to do with `wasm-ld`
126 |
127 | On Arch linux, there were two errors that were thrown:
128 |
129 | ```
130 | Executable "wasm-ld" doesn't exist!
131 | wasm-ld: error: cannot open /usr/lib/clang/{CLANG_VERSION}/lib/wasi/libclang_rt.builtins-wasm32.a: No such file or directory
132 | ```
133 |
134 | On Linux, I fixed the first error by installing `ldd`:
135 |
136 | ```sh
137 | apt-get install lld-7 # Debian
138 | apt-get install lld-8 # Ubuntu
139 | apk add lld # Alpine
140 | pacman -S lld # Arch
141 | dnf install lld # Fedora
142 | ```
143 |
144 | The second error was fixed by installing the associated wasm libraries:
145 |
146 | ```sh
147 | sudo pacman -Syu wasi-libc wasi-libc++ wasi-compiler-rt
148 | ```
149 |
150 | You will need to port the above command to your distrobution. If you do not care about the improved security of sandboxed libraries, you can simply disable them by adding the following to ``
151 |
--------------------------------------------------------------------------------
/docs/content/getting-started/userchrome.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Customizing Your Browser's UI"
3 | weight = 15
4 | +++
5 |
6 | # Customizing Your Browser's UI
7 |
8 | If you have already setup your project, you should have a working version of firefox that you built yourself:
9 |
10 | 
11 |
12 | Just like Electron apps, the entire Firefox ui is an (x)html page that is styled with css. This makes the process of giving our browser an identity very easy.
13 |
14 | Because it is just web technologies, we can use debugging tools (like inspect element) to understand what changes we want to make to the browser. You can open these debugging tools by pressing the keyboard shortcut `CTRL + ALT + SHIFT + I` (`CMD + OPTION + SHIFT + I` on MacOS).
15 |
16 | 
17 |
18 | Because this is a more visual process, the rest of this tutorial is going to be in this video:
19 |
20 |
21 |
22 | This is the end of the guided section of the documentation. You should now have enough knowledge to modify Firefox as you want. There are more guides that you might find useful on the left sidebar, in no particular order.
23 |
--------------------------------------------------------------------------------
/docs/content/guides/_index.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Guides"
3 | weight = 2
4 | sort_by = "weight"
5 | +++
6 |
--------------------------------------------------------------------------------
/docs/content/guides/autoUpdates.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Automatic updates"
3 | weight = 20
4 | +++
5 |
6 | # Automatic updates
7 |
8 | > **Note**
9 | > Automatic updates only works for browsers using GitHub to host their binaries.
10 |
11 | Mozilla provides an automatic update service that can be used by anyone building a Firefox fork or any other application that depends on Mozilla toolkit.
12 |
13 | Attached to your "brand", you will need to include information regarding that brand's release. For example, Pulse has the following information attached to its alpha brand.
14 |
15 | ```json
16 | {
17 | ...,
18 | "brands": {
19 | ...,
20 | "alpha": {
21 | ...,
22 |
23 | "release": {
24 | "displayVersion": "1.0.0-a.17",
25 | "github": {
26 | "repo": "pulse-browser/browser"
27 | },
28 | "x86": {
29 | "windowsMar": "windows.mar",
30 | "macosMar": "macosIntel.mar",
31 | "linuxMar": "linux.mar"
32 | }
33 | }
34 | }
35 | },
36 | ...
37 | }
38 | ```
39 |
40 | The release key includes both the latest version (`displayVersion`) and release info. In this case, binaries are released to github. For `x86`, we provide a number of `.mar` files for each platform. `.mar` files are "Mozilla Archives" and are used to distribute updates.
41 |
42 | When creating update manifests, they will point to [the release tagged `displayVersion`](https://github.com/pulse-browser/browser/releases/tag/1.0.0-a.17). The update manifests tell Mozilla's updater to download the update manifest with the version that corresponds with the file name above. So an x86 linux computer will download the `linux.mar` file and use that to update.
43 |
44 | ## Creating MAR files and update manifests
45 |
46 | Both `.mar` files and the update manifests are automatically created by running `gluon package`. This will generate a number of files in the `dist` directory.
47 |
48 | An `output.mar` will be included in the root, which you should rename to the appropriate platform. For example, `linux.mar` for linux. This should be included with your GitHub release.
49 |
50 | Update manifests are stored in the `dist/update` directory. The contents of this directory should be uploaded to a webserver (e.g. GitHub Pages or S3) such that their root is at `/updates/browser/`.
51 |
52 | You will then need to set the `updateHostname` in `gluon.json` to the url of your update server. For Pulse, this is `updates.pulsebrowser.app`. You may also need to change the update server specified [here](https://searchfox.org/mozilla-central/rev/560b7b1b174ed36912b969eee0c1920f3c59bc56/build/moz.build#94).
53 |
--------------------------------------------------------------------------------
/docs/content/guides/branding.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Branding your browser"
3 | weight = 15
4 | +++
5 |
6 | # Branding your browser
7 |
8 | Before you ship your browser, you will want to include your own branding, rather than just using Mozilla's template branding. Gluon will automatically generate branding once you configure it correctly.
9 |
10 | ## Creating a brand
11 |
12 | You will first need to add a `brands` key within your `gluon.json`. For example:
13 |
14 | ```json
15 | {
16 | ...
17 | "brands": {
18 | "stable": {
19 | "backgroundColor": "#2B2A33",
20 | "brandShorterName": "Pulse",
21 | "brandShortName": "Pulse Browser",
22 | "brandFullName": "Pulse Browser"
23 | }
24 | },
25 | ...
26 | }
27 | ```
28 |
29 | More information regarding the available keys for this config object can be found in the [reference section](/reference/config/#brands).
30 |
31 | You will then need to create the folder `config/branding/`. In here, you will need to add a high-resolution `logo.png` (which will then be downscaled on import) and a `MacOSInstaller.svg` file, which will be used as the background for the macOS dmg file.
32 |
33 | When you add or change a brand, you will need to reimport your changes and specify the brand to target using `gluon set brand`.
34 |
35 | ## Specifying which brand to target
36 |
37 | You can specify the brand that you want to build for using the `gluon set brand ` command. For example:
38 |
39 | ```sh
40 | gluon set brand stable
41 | ```
42 |
43 | Note that once you have set a new brand, you will need to rebuild your browser for changes to take effect:
44 |
45 | ```sh
46 | gluon build
47 | ```
48 |
--------------------------------------------------------------------------------
/docs/content/guides/includingAddons.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Including addons"
3 | weight = 10
4 | +++
5 |
6 | # Including addons
7 |
8 | Gluon provides an automated system for including extensions in your project. The addons are downloaded and included during the `download` build step. Addons can be included in the project config (`gluon.json`).
9 |
10 | ```json
11 | {
12 | // Your options here
13 | "addons": {
14 | "ublock": {
15 | "id": "uBlock0@raymondhill.net",
16 | "url": "https://github.com/gorhill/uBlock/releases/download/1.39.0/uBlock0_1.39.0.firefox.xpi"
17 | }
18 | }
19 | }
20 | ```
21 |
22 | Note that the `id` is the gecko application id specified in the `manifest.json`.
23 |
24 | ```json
25 | {
26 | // ...
27 |
28 | "browser_specific_settings": {
29 | "gecko": {
30 | "id": "uBlock0@raymondhill.net",
31 | "strict_min_version": "60.0"
32 | }
33 | }
34 |
35 | // ...
36 | }
37 | ```
38 |
39 | ## Specifying location in customizable ui
40 |
41 | By default, when adding an addon with a toolbar button, it will be placed next to the hamburger menu. However, you may want to place it somewhere else. To do this, you must change the customizable ui in a similar way to how you would when removing pocket.
42 |
43 | You are going to want to open `engine/browser/components/customizableui/CustomizableUI.jsm`. At the top, you want to import the `ExtensionCommon` module.
44 |
45 | ```js
46 | const { makeWidgetId } = ChromeUtils.import(
47 | 'resource://gre/modules/ExtensionCommon.jsm'
48 | ).ExtensionCommon
49 | ```
50 |
51 | Then, add a constant with the id of the addon at the top of the file, for example:
52 |
53 | ```js
54 | const kUBlockOriginID = 'uBlock0@raymondhill.net'
55 | ```
56 |
57 | Now, you can go down to the `navbarPlacements` array (around line 240) and add
58 |
59 | ```js
60 | `${makeWidgetId(kUBlockOriginID)}-browser-action`,
61 | ```
62 |
63 | To the array where you want the icon to appear, for example:
64 |
65 | ```js
66 | let navbarPlacements = [
67 | 'back-button',
68 | 'forward-button',
69 | 'stop-reload-button',
70 | Services.policies.isAllowed('removeHomeButtonByDefault')
71 | ? null
72 | : 'home-button',
73 | 'spring',
74 | `${makeWidgetId(kUBlockOriginID)}-browser-action`,
75 | 'urlbar-container',
76 | 'spring',
77 | 'save-to-pocket-button',
78 | 'downloads-button',
79 | AppConstants.MOZ_DEV_EDITION ? 'developer-button' : null,
80 | 'fxa-toolbar-menu-button',
81 | ].filter((name) => name)
82 | ```
83 |
84 | Finally, export the changes you have made:
85 |
86 | ```sh
87 | gluon export-file browser/components/customizableui/CustomizableUI.jsm
88 | ```
89 |
--------------------------------------------------------------------------------
/docs/content/guides/removingPocket.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Removing pocket"
3 | weight = 5
4 | +++
5 |
6 | # Removing pocket
7 |
8 | **Note:** This expects you have gluon setup.
9 |
10 | ## Disabling in firefox.js
11 |
12 | The goal of this guide is to disable pocket and remove its icon from the toolbar. The first changes we will need to make is to the firefox.js file located in `engine/browser/app/profile/firefox.js`. Scroll to the lines that include the following settings (around line 1980 in firefox 94):
13 |
14 | ```js
15 | pref('extensions.pocket.api', 'api.getpocket.com')
16 | pref('extensions.pocket.enabled', true)
17 | pref('extensions.pocket.oAuthConsumerKey', '40249-e88c401e1b1f2242d9e441c4')
18 | pref('extensions.pocket.site', 'getpocket.com')
19 | pref('extensions.pocket.onSaveRecs', true)
20 | pref('extensions.pocket.onSaveRecs.locales', 'en-US,en-GB,en-CA')
21 | ```
22 |
23 | Delete these lines and replace them with the following:
24 |
25 | ```js
26 | // Taken from BetterFox user.js
27 | user_pref('extensions.pocket.enabled', false)
28 | user_pref('extensions.pocket.api', ' ')
29 | user_pref('extensions.pocket.oAuthConsumerKey', ' ')
30 | user_pref('extensions.pocket.site', ' ')
31 | ```
32 |
33 | Next, you will need to remove pocket from the new tab page. You can do this by simply adding the following line to the bottom of `firefox.js`:
34 |
35 | ```js
36 | user_pref(
37 | 'browser.newtabpage.activity-stream.section.highlights.includePocket',
38 | false
39 | )
40 | ```
41 |
42 | Now you simply need to export the changes made to `firefox.js`:
43 |
44 | ```sh
45 | gluon export-file browser/app/profile/firefox.js
46 | ```
47 |
48 | ## Removing pocket icon from toolbar
49 |
50 | Whilst the steps above will have disabled pocket. The pocket icon will still be visible in the toolbar. Instead you must remove it from the CustomizableUI layout. Open `engine/browser/components/customizableui/CustomizableUI.jsm` and find the array that looks like this (around line 240):
51 |
52 | ```js
53 | let navbarPlacements = [
54 | 'back-button',
55 | 'forward-button',
56 | 'stop-reload-button',
57 | Services.policies.isAllowed('removeHomeButtonByDefault')
58 | ? null
59 | : 'home-button',
60 | 'spring',
61 | 'urlbar-container',
62 | 'spring',
63 | 'save-to-pocket-button',
64 | 'downloads-button',
65 | AppConstants.MOZ_DEV_EDITION ? 'developer-button' : null,
66 | 'fxa-toolbar-menu-button',
67 | ].filter((name) => name)
68 | ```
69 |
70 | Remove the `save-to-pocket-button` item from the array and export the changes:
71 |
72 | ```sh
73 | gluon export-file browser/components/customizableui/CustomizableUI.jsm
74 | ```
75 |
--------------------------------------------------------------------------------
/docs/content/guides/windows.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Preparing Windows"
3 | weight = 0
4 | +++
5 |
6 | # Preparing Windows
7 |
8 | Building on windows is significantly more complex than building on macos or linux. This guide will walk you through preparing your Windows machine for building a Firefox fork. Before building, you should be aware that [only Windows 10 or 11 are officially supported](https://firefox-source-docs.mozilla.org/build/buildsystem/supported-configurations.html#build-hosts), but you might be able to get other versions to work.
9 |
10 | ## Installing Dependencies
11 |
12 | The first thing you will need to do is install Microsoft's c++ build tools. You will need to download [Build Tools for Visual Studio 2022](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022). The following will need to be installed:
13 |
14 | - **In the _Workloads_ tab**
15 | - Desktop development with C++
16 | - **In the _Individual components_ tab**
17 | - MSVC v143 - VS 2022 C++ x64/x86 build tools.
18 | - Windows 10 SDK (at least 10.0.19041.0).
19 | - C++ ATL for v143 build tools (x86 and x64).
20 |
21 | > **Note:**
22 | > If this guide ever gets out of date, you can get the latest build requirements from [Mozilla's docs](https://firefox-source-docs.mozilla.org/setup/windows_build.html#system-preparation)
23 |
24 | You will need to install [MozillaBuild](https://ftp.mozilla.org/pub/mozilla/libraries/win32/MozillaBuildSetup-Latest.exe). Next, [install Git](https://git-scm.com/download/win). You will need to set the following specific options on install to ensure high performance:
25 |
26 | - Configuring the line ending conversions must be: Checkout as-is, commit as-is
27 | - Enable experimental built-in file system monitor
28 |
29 | Install [NodeJS](https://nodejs.org/en/download/current/) on your system. This should also install chocolatey. If it does not, [install it manually](https://docs.chocolatey.org/en-us/choco/setup). To install the final two dependencies, run:
30 |
31 | ```sh
32 | npm install --global yarn
33 | choco install make
34 | ```
35 |
36 | You should be good to return back to the main [Getting Started docs](/getting-started/overview)
37 |
38 | ## Additional packages required for releasing
39 |
40 | If you are creating binaries to target windows, you will need nsis (which mach calls `makensisu` for some reason, even though the binary is `makensis`):
41 |
42 | ```powershell
43 | choco install nsis
44 | ```
45 |
46 | Note that you will also have to provide a path to nsis on your system. For mine it is:
47 |
48 | ```sh
49 | export MAKENSISU="C:\\Program Files (x86)\\NSIS\\Bin\\makensis.exe"
50 | ```
51 |
--------------------------------------------------------------------------------
/docs/content/reference/_index.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "Reference"
3 | weight = 4
4 | sort_by = "weight"
5 | +++
6 |
--------------------------------------------------------------------------------
/docs/content/reference/config.md:
--------------------------------------------------------------------------------
1 | +++
2 | title = "`gluon.json` Reference"
3 | weight = 0
4 | +++
5 |
6 | # gluon.json Reference
7 |
8 | This reference guide may get outdated. If you need to check something, you can read [the config interface type](https://github.com/pulse-browser/gluon/blob/main/src/utils/config.ts#L96).
9 |
10 | ## name
11 |
12 | This is the name of the product that is to be built.
13 |
14 | ```json
15 | {
16 | "name": "Pulse Browser"
17 | }
18 | ```
19 |
20 | ## vendor
21 |
22 | The name of the company that is building the browser
23 |
24 | ```json
25 | {
26 | "vendor": "Fushra"
27 | }
28 | ```
29 |
30 | ## appId
31 |
32 | A reverse DNS identifier for the browser
33 |
34 | ```json
35 | {
36 | "appId": "com.fushra.browser"
37 | }
38 | ```
39 |
40 | ## binaryName
41 |
42 | The name of the output binary.
43 |
44 | ```json
45 | {
46 | "binaryName": "pulse-browser"
47 | }
48 | ```
49 |
50 | ## updateHostname
51 |
52 | The host of the update server for updating. This is configured as part of the build command
53 |
54 | ```json
55 | {
56 | "updateHostname": "updates.pulsebrowser.app"
57 | }
58 | ```
59 |
60 | ## license
61 |
62 | Information about the license the browser will be under. This is used by the Gluon license checker to ensure files have the MPL header if specified.
63 |
64 | Specification:
65 |
66 | ```ts
67 | interface LicenseConfig {
68 | /**
69 | * What license you intend to put your project under. Currently MPL is the
70 | * only one supported by the license checker, but if you want implement more
71 | * please feel free to open a pull request.
72 | *
73 | * To disable the license checker, set this type to `unknown`
74 | */
75 | licenseType: 'MPL-2.0' | 'unknown'
76 | /**
77 | * Files to be ignored by the license checker. For default values see the
78 | * `defaultConfig` variable in the config.ts file
79 | *
80 | * These should be rejex tests because compiled regex tests are **really**
81 | * fast which will stop the license checker from becoming absurdly slow with
82 | * larger projects
83 | */
84 | ignoredFiles: string[]
85 | }
86 | ```
87 |
88 | Example:
89 |
90 | ```json
91 | {
92 | "licenseType": "MPL-2.0",
93 | "ignoredFiles": [".*\\.json"]
94 | }
95 | ```
96 |
97 | Commands that maybe used:
98 |
99 | ```sh
100 | gluon license-check
101 | gluon lc # Alias
102 | ```
103 |
104 | ## version
105 |
106 | Provides information to gluon about the product and version that Gluon is responsible for managing.
107 |
108 | Specification:
109 |
110 | ```typescript
111 | enum SupportedProducts {
112 | Firefox = 'firefox',
113 | FirefoxESR = 'firefox-esr',
114 | FirefoxESRNext = 'firefox-esr-next',
115 | FirefoxDev = 'firefox-dev',
116 | FirefoxBeta = 'firefox-beta',
117 | FirefoxNightly = 'firefox-nightly',
118 | }
119 |
120 | interface VersionConfig {
121 | /**
122 | * What branch of firefox you are forking. e.g. stable ('firefox'), dev ('firefox-dev')
123 | * , esr ('firefox-esr') etc.
124 | *
125 | * For use in code, use {@link SupportedProducts}
126 | */
127 | product: SupportedProducts
128 | /**
129 | * The version of the selected product you are forking
130 | */
131 | version?: string
132 | }
133 | ```
134 |
135 | Example
136 |
137 | ```json
138 | {
139 | "version": {
140 | "product": "firefox",
141 | "version": "102.0.1"
142 | }
143 | }
144 | ```
145 |
146 | ## buildOptions
147 |
148 | These are flags that change how parts of Gluon operate.
149 |
150 | ### windowsUseSymbolicLinks
151 |
152 | When set to `true`, symbolic links will be enabled on Windows. From internal testing, this appears to fail on a majority of computers
153 |
154 | ## addons
155 |
156 | An index for each addon. These will be downloaded and configured as part of the `download` step that gluon performs. You can download extensions from AMO, Github or any URL. Note that the furha-robot will only be able to provide update checking to AMO and Github Extensions.
157 |
158 | Specification:
159 |
160 | ```typescript
161 | export interface GithubAddonInfo {
162 | platform: 'github'
163 | id: string
164 | repo: string
165 | version: string
166 | fileGlob: string
167 | }
168 |
169 | export interface AMOAddonInfo {
170 | platform: 'amo'
171 | id: string
172 | amoId: string
173 | version: string
174 | }
175 |
176 | export interface UrlAddonInfo {
177 | platform: 'url'
178 | version: string
179 | id: string
180 | url: string
181 | }
182 |
183 | export type AddonInfo = GithubAddonInfo | AMOAddonInfo | UrlAddonInfo
184 |
185 | type addons = Record
186 | ```
187 |
188 | Example:
189 |
190 | ```json
191 | {
192 | "addons": {
193 | "ublock": {
194 | "platform": "github",
195 | "id": "uBlock0@raymondhill.net",
196 | "repo": "gorhill/uBlock",
197 | "version": "1.43.0",
198 | "fileGlob": "uBlock0_*.firefox.signed.xpi"
199 | },
200 | "tabliss": {
201 | "platform": "amo",
202 | "id": "extension@tabliss.io",
203 | "amoId": "850407",
204 | "version": "2.6.0"
205 | }
206 | }
207 | }
208 | ```
209 |
210 | Commands that use this:
211 |
212 | ```sh
213 | gluon download
214 | gluon updates-addons # Generates update manifests for addons
215 | ```
216 |
217 | ## brands
218 |
219 | These are different distrobutions, for example, beta and stable.
220 |
221 | Specification:
222 |
223 | ```typescript
224 | export interface ReleaseInfo {
225 | /**
226 | * The version of your output product. E.g. 1.3.5
227 | */
228 | displayVersion: string
229 | github?: {
230 | repo: string
231 | }
232 |
233 | x86?: {
234 | windowsMar?: string
235 | macosMar?: string
236 | linuxMar?: string
237 | }
238 | }
239 |
240 | export interface BrandInfo {
241 | backgroundColor: string
242 | brandShorterName: string
243 | brandShortName: string
244 | brandFullName: string
245 | release: ReleaseInfo
246 | }
247 |
248 | type brands = Record
249 | ```
250 |
251 | Example:
252 |
253 | ```json
254 | {
255 | "brands": {
256 | "stable": {
257 | "backgroundColor": "#2B2A33",
258 | "brandShorterName": "Pulse",
259 | "brandShortName": "Pulse Browser",
260 | "brandFullName": "Pulse Browser",
261 | "release": {
262 | "displayVersion": "1.0.0",
263 | "github": {
264 | "repo": "pulse-browser/browser"
265 | },
266 | "x86": {
267 | "windowsMar": "windows.mar",
268 | "macosMar": "macosIntel.mar",
269 | "linuxMar": "linux.mar"
270 | }
271 | }
272 | },
273 | "beta": {
274 | "backgroundColor": "#2B2A33",
275 | "brandShorterName": "Pulse",
276 | "brandShortName": "Pulse Browser",
277 | "brandFullName": "Pulse Browser Beta",
278 | "release": {
279 | "displayVersion": "1.0.0-b.0",
280 | "github": {
281 | "repo": "pulse-browser/browser"
282 | },
283 | "x86": {
284 | "windowsMar": "windows.mar",
285 | "macosMar": "macosIntel.mar",
286 | "linuxMar": "linux.mar"
287 | }
288 | }
289 | },
290 | "alpha": {
291 | "backgroundColor": "#2B2A33",
292 | "brandShorterName": "Pulse",
293 | "brandShortName": "Pulse Browser",
294 | "brandFullName": "Pulse Browser Alpha",
295 | "release": {
296 | "displayVersion": "1.0.0-a.16",
297 | "github": {
298 | "repo": "pulse-browser/browser"
299 | },
300 | "x86": {
301 | "windowsMar": "windows.mar",
302 | "macosMar": "macosIntel.mar",
303 | "linuxMar": "linux.mar"
304 | }
305 | }
306 | }
307 | }
308 | }
309 | ```
310 |
311 | Commands:
312 |
313 | ```sh
314 | gluon build
315 | gluon package
316 | gluon updates-browser
317 | gluon set brand
318 | ```
319 |
--------------------------------------------------------------------------------
/docs/public/CNAME:
--------------------------------------------------------------------------------
1 | docs.gluon.dev
2 |
--------------------------------------------------------------------------------
/docs/sass/_search.scss:
--------------------------------------------------------------------------------
1 | .search-container {
2 | display: none;
3 |
4 | &--is-visible {
5 | display: block;
6 | width: 100%;
7 | }
8 |
9 | #search {
10 | width: 100%;
11 | display: block;
12 | border:none;
13 | border-left: 1px solid $color;
14 | padding:1px 0;
15 | text-align: left;
16 | line-height: $baseline;
17 | font-size: $font-size;
18 | font-family:$font-family;
19 | color:$color;
20 | background:transparent;
21 | }
22 |
23 | #search:focus {
24 | outline:none;
25 | border:none;
26 | }
27 |
28 | .search-results {
29 | &__header {
30 | font-weight: bold;
31 | padding: 1rem 0rem;
32 | }
33 |
34 | &__items {
35 | margin: 0 2vw;
36 | padding: 0;
37 | list-style: circle;
38 | }
39 |
40 | &__item {
41 | margin-bottom: 1rem;
42 | }
43 |
44 | &__teaser {
45 |
46 | }
47 | }
48 | }
49 |
50 | #on_right {
51 | display: block;
52 | text-align: right;
53 | margin-bottom: $baseline;
54 | }
55 |
56 | #search-ico {
57 | font-family: 'FabricMDL2Icons';
58 | cursor: pointer;
59 | font-size: $baseline;
60 | line-height: 1;
61 | }
--------------------------------------------------------------------------------
/docs/sass/_variables.scss:
--------------------------------------------------------------------------------
1 | :root {
2 | --bg: #f9f9f9;
3 | --fg: #222;
4 |
5 | --links: #00f;
6 | --hover-links: #c00;
7 | --visited-links: #009;
8 | }
9 |
10 | @media (prefers-color-scheme: dark) {
11 | :root {
12 | --bg: #333;
13 | --fg: #f9f9f9;
14 |
15 | --links: rgb(142, 142, 255);
16 | --hover-links: rgb(204, 101, 101);
17 | --visited-links: rgb(86, 86, 151);
18 | }
19 | }
20 |
21 | $baseline: 1.5rem;
22 |
23 | $background: var(--bg);
24 | $color: var(--fg);
25 |
26 | $links: var(--links);
27 | $hover-links: var(--hover-links);
28 | $visited-links: var(--visited-links);
29 |
30 | $font-size: 1.125rem;
31 | $font-family: Segoe UI, system-ui, -apple-system, sans-serif;
32 | $line-height: 1.75;
33 | $code_font: 400 1.125rem/1.75 SFMono-Regular, Consolas, Liberation Mono, Menlo,
34 | monospace;
35 |
--------------------------------------------------------------------------------
/docs/sass/fabric-icons-inline.scss:
--------------------------------------------------------------------------------
1 | /*
2 | Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fabric-assets-license
3 | */
4 | @font-face {
5 | font-family: 'FabricMDL2Icons';
6 | src: url('data:application/octet-stream;base64,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') format('truetype');
7 | }
8 |
9 | .ms-Icon {
10 | -moz-osx-font-smoothing: grayscale;
11 | -webkit-font-smoothing: antialiased;
12 | display: inline-block;
13 | font-family: 'FabricMDL2Icons';
14 | font-style: normal;
15 | font-weight: normal;
16 | speak: none;
17 | }
18 |
19 | // Mixins
20 | @mixin ms-Icon--ChevronRightSmall { content: "\E970"; }
21 | @mixin ms-Icon--ChromeClose { content: "\E8BB"; }
22 | @mixin ms-Icon--Copy { content: "\E8C8"; }
23 | @mixin ms-Icon--GlobalNavButton { content: "\E700"; }
24 | @mixin ms-Icon--MiniLink { content: "\E732"; }
25 | @mixin ms-Icon--Page { content: "\E7C3"; }
26 | @mixin ms-Icon--ProductRelease { content: "\EE2E"; }
27 | @mixin ms-Icon--Save { content: "\E74E"; }
28 | @mixin ms-Icon--Search { content: "\E721"; }
29 |
30 |
31 | // Classes
32 | .ms-Icon--ChevronRightSmall:before { @include ms-Icon--ChevronRightSmall }
33 | .ms-Icon--ChromeClose:before { @include ms-Icon--ChromeClose }
34 | .ms-Icon--Copy:before { @include ms-Icon--Copy }
35 | .ms-Icon--GlobalNavButton:before { @include ms-Icon--GlobalNavButton }
36 | .ms-Icon--MiniLink:before { @include ms-Icon--MiniLink }
37 | .ms-Icon--Page:before { @include ms-Icon--Page }
38 | .ms-Icon--ProductRelease:before { @include ms-Icon--ProductRelease }
39 | .ms-Icon--Save:before { @include ms-Icon--Save }
40 | .ms-Icon--Search:before { @include ms-Icon--Search }
--------------------------------------------------------------------------------
/docs/sass/main.scss:
--------------------------------------------------------------------------------
1 | @import 'variables';
2 |
3 | html {
4 | font-kerning: normal;
5 | text-rendering: optimizeLegibility;
6 | scroll-behavior: smooth;
7 | }
8 |
9 | body {
10 | margin: $baseline 0;
11 | font-size: $font-size;
12 | font-family: $font-family;
13 | line-height: $line-height;
14 | background: $background;
15 | color: $color;
16 | }
17 |
18 | #wrap {
19 | max-width: 800px;
20 | }
21 |
22 | iframe#youtube {
23 | aspect-ratio: 16 / 9;
24 | width: 100%;
25 | }
26 |
27 | @keyframes fade-in {
28 | 0% {
29 | opacity: 0;
30 | }
31 |
32 | 50% {
33 | opacity: 0.8;
34 | }
35 |
36 | 100% {
37 | opacity: 1;
38 | }
39 | }
40 |
41 | a {
42 | &:link {
43 | color: $links;
44 | text-decoration: none;
45 | }
46 |
47 | &:hover {
48 | color: $hover-links;
49 | }
50 |
51 | &:visited {
52 | color: $visited-links;
53 | }
54 | }
55 |
56 | h1 {
57 | font-size: 3rem;
58 | }
59 |
60 | h2,
61 | h3,
62 | h4 {
63 | .anchor {
64 | visibility: hidden;
65 | text-decoration: none;
66 | cursor: pointer;
67 | line-height: 1;
68 | color: $color;
69 | }
70 |
71 | &:hover {
72 | .anchor {
73 | visibility: visible;
74 | animation: fade-in 0.3s ease-in-out;
75 | font-family: 'FabricMDL2Icons';
76 | }
77 | }
78 | }
79 |
80 | pre {
81 | margin: $baseline 0;
82 | border-radius: 4px;
83 | padding: $baseline;
84 | overflow: auto;
85 | position: relative;
86 |
87 | code {
88 | background: transparent;
89 |
90 | &::after {
91 | content: attr(data-lang);
92 | font-style: italic;
93 | line-height: 1;
94 | opacity: 0.3;
95 | position: absolute;
96 | bottom: $baseline;
97 | right: $baseline;
98 | z-index: 1;
99 | }
100 | }
101 | }
102 |
103 | .language-filesystem {
104 | // Compact should be as compressed as possible
105 | line-height: 0.95em;
106 | }
107 |
108 | code {
109 | font: $code_font;
110 | }
111 |
112 | .copy-code-button {
113 | font-family: 'FabricMDL2Icons';
114 | display: none;
115 | background: $background;
116 | border-radius: 4px;
117 | border: none;
118 | cursor: pointer;
119 | animation: fade-in 0.3s ease-in-out;
120 | font-size: $baseline;
121 | color: $color;
122 | z-index: 10;
123 | position: absolute;
124 | top: $baseline;
125 | right: $baseline;
126 | }
127 |
128 | pre:hover .copy-code-button {
129 | display: block;
130 | }
131 |
132 | nav {
133 | position: sticky;
134 | height: 92vh;
135 | top: $baseline;
136 | left: $baseline;
137 | bottom: $baseline;
138 | padding-right: $baseline;
139 | width: 20rem;
140 |
141 | img {
142 | width: 128px;
143 | }
144 |
145 | h1 {
146 | margin: 0;
147 | line-height: 1;
148 | }
149 | }
150 |
151 | #toc {
152 | margin-left: calc(#{$baseline} + #{$font-size});
153 | padding: 0;
154 | margin: 0 0 0 $baseline;
155 | font-size: 80%;
156 |
157 | li {
158 | color: $color;
159 | margin-left: $font-size;
160 |
161 | &::before {
162 | display: inline-block;
163 | content: '';
164 | }
165 |
166 | ul {
167 | padding: 0;
168 | }
169 | }
170 | }
171 |
172 | main {
173 | display: flex;
174 | flex-flow: row nowrap;
175 | animation: fade-in 0.4s ease-in-out;
176 | }
177 |
178 | #release {
179 | text-align: left;
180 | margin: $baseline 0;
181 |
182 | &::before {
183 | display: inline-block;
184 | content: '\EE2E';
185 | font-family: 'FabricMDL2Icons';
186 | margin-right: calc(#{$baseline} / 8);
187 | }
188 | }
189 |
190 | @keyframes slideIn {
191 | 0% {
192 | max-height: 0;
193 | opacity: 0;
194 | }
195 | 100% {
196 | max-height: 999px;
197 | opacity: 1;
198 | }
199 | }
200 | @keyframes slideOut {
201 | 0% {
202 | height: auto;
203 | opacity: 1;
204 | }
205 | 100% {
206 | height: 0;
207 | opacity: 0;
208 | }
209 | }
210 |
211 | nav label {
212 | display: block;
213 | }
214 |
215 | #trees {
216 | overflow-y: auto;
217 | height: 80%;
218 | }
219 |
220 | .subtree {
221 | overflow: hidden;
222 | margin: calc(#{$baseline} / 8) 0;
223 | transition: overflow 0.2s ease-in-out;
224 | padding: 0;
225 | }
226 |
227 | .tree-toggle-label {
228 | user-select: none;
229 | cursor: pointer;
230 | }
231 |
232 | .tree-toggle-label::before {
233 | display: inline-block;
234 | content: '\E970';
235 | font-family: 'FabricMDL2Icons';
236 | font-size: 0.75rem;
237 | transform: rotate(0deg);
238 | transform-origin: 50% 50% 0px;
239 | transition: transform 0.1s linear 0s;
240 | margin-right: 2px;
241 | }
242 |
243 | .tree-toggle {
244 | position: absolute;
245 | opacity: 0;
246 | z-index: -1;
247 | }
248 |
249 | .tree-toggle:checked + .tree-toggle-label::before {
250 | content: '\E970';
251 | font-family: 'FabricMDL2Icons';
252 | font-size: 0.75rem;
253 | transform: rotate(90deg);
254 | transform-origin: 50% 50% 0px;
255 | transition: transform 0.1s linear 0s;
256 | margin-right: 2px;
257 | }
258 |
259 | .tree-toggle:checked + .tree-toggle-label {
260 | font-weight: bold;
261 | }
262 |
263 | .tree-toggle + .tree-toggle-label + .subtree {
264 | animation-name: slideOut;
265 | animation-duration: 0.25s;
266 | animation-fill-mode: both;
267 | }
268 |
269 | .tree-toggle:checked + .tree-toggle-label + .subtree {
270 | animation-name: slideIn;
271 | animation-duration: 0.25s;
272 | animation-fill-mode: both;
273 | }
274 |
275 | .subtree li {
276 | list-style-type: none;
277 | margin-left: $baseline;
278 |
279 | a {
280 | color: $color;
281 | }
282 |
283 | &::before {
284 | content: '\E7C3';
285 | font-family: 'FabricMDL2Icons';
286 | font-size: 0.75rem;
287 | }
288 | }
289 |
290 | .active a {
291 | font-weight: bold;
292 | }
293 |
294 | article {
295 | width: calc(100% - (#{$baseline} * 4 + 20rem));
296 | margin-left: calc(#{$baseline} * 2);
297 |
298 | img {
299 | max-width: 100%;
300 | }
301 | }
302 |
303 | #mobile {
304 | display: none;
305 | }
306 |
307 | @media screen and (max-width: 1023px) {
308 | main {
309 | flex-flow: column nowrap;
310 | width: 100%;
311 | }
312 |
313 | nav {
314 | position: inherit;
315 | height: auto;
316 | margin: $baseline $baseline 0 $baseline;
317 | }
318 |
319 | article {
320 | width: calc(100% - (#{$baseline} * 2));
321 | margin: 0 $baseline;
322 | z-index: 1;
323 | }
324 |
325 | #mobile {
326 | font-family: 'FabricMDL2Icons';
327 | cursor: pointer;
328 | font-size: $baseline;
329 | margin: 0 $baseline 0 0;
330 | display: block;
331 | color: $color;
332 | }
333 |
334 | #trees {
335 | display: none;
336 | position: absolute;
337 | background: $background;
338 | height: auto;
339 | width: 100vw;
340 | z-index: 10;
341 | box-shadow: 0 2px 0 rgba(0, 0, 0, 0.1);
342 | }
343 |
344 | #on_right {
345 | margin-top: $baseline;
346 | }
347 | }
348 |
349 | @import 'fabric-icons-inline';
350 | @import 'search';
351 |
--------------------------------------------------------------------------------
/docs/static/CNAME:
--------------------------------------------------------------------------------
1 | docs.gluon.dev
2 |
--------------------------------------------------------------------------------
/docs/static/images/userchrome/001_Vanilla_firefox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pulse-browser/gluon/fbdee4a6cc73b0a9b4a98951e5bc17cf377b3430/docs/static/images/userchrome/001_Vanilla_firefox.png
--------------------------------------------------------------------------------
/docs/static/images/userchrome/002_Browser_Toolbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pulse-browser/gluon/fbdee4a6cc73b0a9b4a98951e5bc17cf377b3430/docs/static/images/userchrome/002_Browser_Toolbox.png
--------------------------------------------------------------------------------
/docs/templates/anchor-link.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/docs/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {% if config.extra.favicon %}
7 |
8 | {% endif %}
9 |
10 | {% block title %}{{ config.title }}{% endblock title %}
11 |
12 |
13 |
14 | {% if config.extra.release %}
15 |
26 | {% endif %}
27 |
28 |
29 | {% block nav %}
30 |
31 |
102 | {% endblock nav %}
103 |
104 |
105 |
106 | {% if config.build_search_index %}
107 |