a stunning and sleek web proxy with support for hundreds of popular sites.
376
stars
976
commits
Astro
primary language
Sep 7, 2026
updated
fix_sqlite3.sh script:root {
--background-primary: /*Your stuff here */;
--background-lighter: ;
--navbar-color: ;
--navbar-text-color: ;
--navbar-link-color: ;
--navbar-link-hover-color: ;
--input-text-color: ;
--input-placeholder-color: ;
--input-background-color: ;
--input-border-color: ;
--tab-color: ;
--border-color: ;
}
[!NOTE]
You can add a custom font as well! To do so, add this to your
:root--font-family: /* Font family name */;And this to the bottom of your CSS file/submission:
@font-face { font-family: /* Name */; src: url(/* Where the font is located! Local or external work! */); }A good example of using a custom font is the built-in
retrotheme here
Add your colors and test! (Either with a self-hosted version of Nebula OR via a live preview (no clue when this will happen)
Once you're satisfied with the colors, submit your theme to the Discord Server!
touch index.js
function setup() {
// This function MUST return the following attributes:
return {
function: `console.log('Example code.')`,
name: 'com.example', // Technically, it could be named anything. It is recommended to use the same name for everything (name when submitting and this)
events: ['fetch'] // See: https://github.com/mercuryworkshop/workerware for the event types you can use. (Also typed if you are using typescript)
}
}
//This can be named anything. However, it's recommended to use `entryFunc` (with types, the naming IS enforced)
self.entryFunc = setup; //DO NOT call the function here. Only assign the reference otherwise, it will error.
const example = () => {
console.log('Example code')
}
function setup() {
//This function MUST return the following attributes:
return {
function: example, //Do not call the function, only assign the reference to the function.
name: 'com.example', // Technicall could be name anything. Recommended to use the same name for everything (name when submitting and this)
event: ['fetch'] // Se https://github.com/mercuryworkshop/workerware for the event types you can use. (Also typed if using typescript)
}
}
//This can be named anything. However, it's recommended to use `entryFunc` (with types, the naming IS enforced)
self.entryFunc = setup; //DO NOT call the function here. Only assign the reference; otherwise, it will result in an error.
[!WARNING] The only allowed way to pass code to the
functionparam is either a string or an arrow function. Named functions WILL NOT WORK.Example of a named function:
function example() {/* Some form of code */}.If a named function is used where it shouldn't be, your plugin will not be approved, nor will it work properly.
touch index.js
//Name this whatever.
function example() {
//You MUST return the following
return {
host: "example.com", //The host to match (so if the user visits example.com it will inject the html below.
html: "<script>console.log('Example')</script>", //Must return a string (and be valid HTML or your plugin will break). How you get that string is up to you
injectTo: "head" // Can be "head" or "body"
}
}
// Technically, this could be named anything, it is recommended to call it `entryFunc`
self.entryFunc = example; //DO NOT run the function here. That will cause errors. Only assign the reference to the function here.
Prerequisites:
npm i -g pnpm
git clone https://github.com/nebulaservices/nebula --recursive && cd nebula
pnpm i
config.toml filecp config.example.toml config.toml
config.toml file to your liking (docs here)nano config.toml
pnpm build
pnpm start
[!NOTE] You can run
pnpm bstartto build and start together
CURRENTLY DOCKER DOES NOT WORK!! For some reason the docker image doesn't exist in Dockhub
Prerequisites:
git clone https://github.com/nebulaservices/nebula --recursive && cd nebula
config.toml file (if using prebuilt image, copy the example from the repo):cp config.example.toml config.toml
config.toml file to your liking (docs here)nano config.toml
docker build nebula:latest
Run the docker images:
docker run -v ./config.toml:/app/config.toml ghcr.io/nebulaservices/nebula:latest
docker run -v ./config.toml:/app/config.toml nebula:latest
Prerequisites:
git clone https://github.com/nebulaservices/nebula --recursive
config.toml file (if using prebuilt image, copy the example from the repo):cp config.example.toml config.toml
config.toml file to your liking (docs on that here]nano config.toml
docker compose -f ./docker-compose.build.yml build
Run the docker image:
docker compose up
docker compose -f ./docker-compose.build.yml up
docker-compose file (or use your own Postgres DB!). Then, modify the config.toml (See: #config for knowledge on how to do this)config.toml to use it. (See: #config for knowledge on how to do this)There are a couple of configuration options for Nebula. The defaults are fine most of the time, but there are instances where you may not want certain options enabled or certain things running.
| Variable | Description | Type | Default |
|---|---|---|---|
marketplace | The options below are for the marketplace section | object | N/A |
enabled | Enable marketplace functionality | boolean | true |
psk | The password and authentication key for the marketplace. CHANGE FROM DEFAULT | string | CHANGEME |
| ---------------------------- | ---------------------------------------------------------------------------- | ------------ | -------------- |
db | The below options are for the db (database) section | object | N/A |
name | The database name to use | string | database |
username | The username for the DB | string | username |
password | The database password. CHANGE FROM DEFAULT VALUE | string | password |
postgres | Whether to use postgres over sqlite (recommended for large production instances) | boolean | false |
| ---------------------------- | ---------------------------------------------------------------------------- | ------------ | -------------- |
postgres | The below options are for the postgres section. (Only worry about this if you enabled postgres in the db section.) | object | N/A |
domain | Either the TLD or the IP address of your postgres server. | string | '' |
port | The port your postgres server is listening on | number | 5432 |
| ---------------------------- | ---------------------------------------------------------------------------- | ------------ | -------------- |
server.server | The below options are to configure the server. | object | N/A |
port | What port the server should listen on. (Note: Can also be configured via environment variable PORT) | number | 8080 |
wisp | Whether the server should use the inbuilt wisp server. (Disabled if your using an external wisp server) | boolean | true |
logging | Whether or not to enable logging. Note: Logs are massive | boolean | true |
| ---------------------------- | ---------------------------------------------------------------------------- | ------------ | -------------- |
masqr | The below options are to configure masqr. | object | N/A |
enabled | Enable masqr | boolean | false |
failed | Default masqr failed page (For using per-site failed pages, create a create a DOMAIN.html file (Ex. www.example.com.html) inside the root project directory | string | failed.html |
whitelisted | List of domains to skip masqr | object | [""] |
url | URL for validating masqr licenses | string | `` |
| ---------------------------- | ---------------------------------------------------------------------------- | ------------ | -------------- |
(top 30 of 35)
Astro
53.0%
TypeScript
37.9%
JavaScript
5.7%
CSS
1.9%
Svelte
1.2%
a stunning and sleek web proxy with support for hundreds of popular sites.
376
stars
976
commits
Astro
primary language
Sep 7, 2026
updated
fix_sqlite3.sh script:root {
--background-primary: /*Your stuff here */;
--background-lighter: ;
--navbar-color: ;
--navbar-text-color: ;
--navbar-link-color: ;
--navbar-link-hover-color: ;
--input-text-color: ;
--input-placeholder-color: ;
--input-background-color: ;
--input-border-color: ;
--tab-color: ;
--border-color: ;
}
[!NOTE]
You can add a custom font as well! To do so, add this to your
:root--font-family: /* Font family name */;And this to the bottom of your CSS file/submission:
@font-face { font-family: /* Name */; src: url(/* Where the font is located! Local or external work! */); }A good example of using a custom font is the built-in
retrotheme here
Add your colors and test! (Either with a self-hosted version of Nebula OR via a live preview (no clue when this will happen)
Once you're satisfied with the colors, submit your theme to the Discord Server!
touch index.js
function setup() {
// This function MUST return the following attributes:
return {
function: `console.log('Example code.')`,
name: 'com.example', // Technically, it could be named anything. It is recommended to use the same name for everything (name when submitting and this)
events: ['fetch'] // See: https://github.com/mercuryworkshop/workerware for the event types you can use. (Also typed if you are using typescript)
}
}
//This can be named anything. However, it's recommended to use `entryFunc` (with types, the naming IS enforced)
self.entryFunc = setup; //DO NOT call the function here. Only assign the reference otherwise, it will error.
const example = () => {
console.log('Example code')
}
function setup() {
//This function MUST return the following attributes:
return {
function: example, //Do not call the function, only assign the reference to the function.
name: 'com.example', // Technicall could be name anything. Recommended to use the same name for everything (name when submitting and this)
event: ['fetch'] // Se https://github.com/mercuryworkshop/workerware for the event types you can use. (Also typed if using typescript)
}
}
//This can be named anything. However, it's recommended to use `entryFunc` (with types, the naming IS enforced)
self.entryFunc = setup; //DO NOT call the function here. Only assign the reference; otherwise, it will result in an error.
[!WARNING] The only allowed way to pass code to the
functionparam is either a string or an arrow function. Named functions WILL NOT WORK.Example of a named function:
function example() {/* Some form of code */}.If a named function is used where it shouldn't be, your plugin will not be approved, nor will it work properly.
touch index.js
//Name this whatever.
function example() {
//You MUST return the following
return {
host: "example.com", //The host to match (so if the user visits example.com it will inject the html below.
html: "<script>console.log('Example')</script>", //Must return a string (and be valid HTML or your plugin will break). How you get that string is up to you
injectTo: "head" // Can be "head" or "body"
}
}
// Technically, this could be named anything, it is recommended to call it `entryFunc`
self.entryFunc = example; //DO NOT run the function here. That will cause errors. Only assign the reference to the function here.
Prerequisites:
npm i -g pnpm
git clone https://github.com/nebulaservices/nebula --recursive && cd nebula
pnpm i
config.toml filecp config.example.toml config.toml
config.toml file to your liking (docs here)nano config.toml
pnpm build
pnpm start
[!NOTE] You can run
pnpm bstartto build and start together
CURRENTLY DOCKER DOES NOT WORK!! For some reason the docker image doesn't exist in Dockhub
Prerequisites:
git clone https://github.com/nebulaservices/nebula --recursive && cd nebula
config.toml file (if using prebuilt image, copy the example from the repo):cp config.example.toml config.toml
config.toml file to your liking (docs here)nano config.toml
docker build nebula:latest
Run the docker images:
docker run -v ./config.toml:/app/config.toml ghcr.io/nebulaservices/nebula:latest
docker run -v ./config.toml:/app/config.toml nebula:latest
Prerequisites:
git clone https://github.com/nebulaservices/nebula --recursive
config.toml file (if using prebuilt image, copy the example from the repo):cp config.example.toml config.toml
config.toml file to your liking (docs on that here]nano config.toml
docker compose -f ./docker-compose.build.yml build
Run the docker image:
docker compose up
docker compose -f ./docker-compose.build.yml up
docker-compose file (or use your own Postgres DB!). Then, modify the config.toml (See: #config for knowledge on how to do this)config.toml to use it. (See: #config for knowledge on how to do this)There are a couple of configuration options for Nebula. The defaults are fine most of the time, but there are instances where you may not want certain options enabled or certain things running.
| Variable | Description | Type | Default |
|---|---|---|---|
marketplace | The options below are for the marketplace section | object | N/A |
enabled | Enable marketplace functionality | boolean | true |
psk | The password and authentication key for the marketplace. CHANGE FROM DEFAULT | string | CHANGEME |
| ---------------------------- | ---------------------------------------------------------------------------- | ------------ | -------------- |
db | The below options are for the db (database) section | object | N/A |
name | The database name to use | string | database |
username | The username for the DB | string | username |
password | The database password. CHANGE FROM DEFAULT VALUE | string | password |
postgres | Whether to use postgres over sqlite (recommended for large production instances) | boolean | false |
| ---------------------------- | ---------------------------------------------------------------------------- | ------------ | -------------- |
postgres | The below options are for the postgres section. (Only worry about this if you enabled postgres in the db section.) | object | N/A |
domain | Either the TLD or the IP address of your postgres server. | string | '' |
port | The port your postgres server is listening on | number | 5432 |
| ---------------------------- | ---------------------------------------------------------------------------- | ------------ | -------------- |
server.server | The below options are to configure the server. | object | N/A |
port | What port the server should listen on. (Note: Can also be configured via environment variable PORT) | number | 8080 |
wisp | Whether the server should use the inbuilt wisp server. (Disabled if your using an external wisp server) | boolean | true |
logging | Whether or not to enable logging. Note: Logs are massive | boolean | true |
| ---------------------------- | ---------------------------------------------------------------------------- | ------------ | -------------- |
masqr | The below options are to configure masqr. | object | N/A |
enabled | Enable masqr | boolean | false |
failed | Default masqr failed page (For using per-site failed pages, create a create a DOMAIN.html file (Ex. www.example.com.html) inside the root project directory | string | failed.html |
whitelisted | List of domains to skip masqr | object | [""] |
url | URL for validating masqr licenses | string | `` |
| ---------------------------- | ---------------------------------------------------------------------------- | ------------ | -------------- |
(top 30 of 35)
Astro
53.0%
TypeScript
37.9%
JavaScript
5.7%
CSS
1.9%
Svelte
1.2%