Compare commits

...

780 commits

Author SHA1 Message Date
rifting
77dbccfc7e
Merge pull request #301 from Avad3/patch-1
Major bug fix
2025-02-07 16:33:41 -06:00
Avad3
b80f4bd053
Major bug fix 2025-02-07 17:01:54 -05:00
MotorTruck1221
14e1f1f935
Fix the .gitignore 2025-01-15 02:25:34 -07:00
MotorTruck1221
527221462b
Apparently the gruvbox image wasn't there 2025-01-15 02:22:40 -07:00
MotorTruck1221
009836647b
Remove the random testing plugin 2025-01-15 02:15:58 -07:00
MotorTruck1221
8b25af88e0
CI: add submodule cloning 2025-01-15 00:30:15 -07:00
MotorTruck1221
de2cde4541
Bump version to 9.1.0 2025-01-15 00:27:27 -07:00
MotorTruck1221
8240668a5c
Revert "."
This reverts commit 8a79e063e8.
2025-01-15 00:22:08 -07:00
MotorTruck1221
8a79e063e8
. 2025-01-15 00:21:06 -07:00
MotorTruck1221
fdc0246c0a
Fix 2025-01-15 00:07:43 -07:00
MotorTruck1221
4cb20539fd
Revert "."
This reverts commit 06d02c42f1.
2025-01-15 00:04:22 -07:00
MotorTruck1221
06d02c42f1
. 2025-01-15 00:03:51 -07:00
MotorTruck1221
660e4c34d9
Merge branch 'logic-rewrite' 2025-01-15 00:01:33 -07:00
MotorTruck1221
d17d008d7e
Add an actual LICENSE to the repo 2025-01-15 00:00:36 -07:00
MotorTruck1221
c5799fb986
Revert "Stupid types"
This reverts commit 2c4ea3ebad.
2025-01-14 23:56:30 -07:00
MotorTruck1221
39f49aa54c
Revert "Main should build now"
This reverts commit b462e42d33.
2025-01-14 23:56:01 -07:00
MotorTruck1221
abd87fafd2
Settings: add the ability to reset your instance 2025-01-14 23:52:11 -07:00
MotorTruck1221
b462e42d33
Main should build now 2025-01-14 16:32:54 -07:00
MotorTruck1221
2c4ea3ebad
Stupid types 2025-01-14 16:31:29 -07:00
MotorTruck1221
389ad9e5ec
Merge pull request #298 from NebulaServices/main
Config: seo disabled by default
2025-01-14 15:10:05 -08:00
MotorTruck1221
0d8fc89bf5
Config: seo disabled by default 2025-01-14 16:09:36 -07:00
MotorTruck1221
ce0781536c
Merge pull request #297 from NebulaServices/main
Config: make sure the SEO field is there
2025-01-14 15:00:09 -08:00
MotorTruck1221
58a6de3a5d
Config: make sure the SEO field is there 2025-01-14 15:58:55 -07:00
MotorTruck1221
eb3a44a759
Regen pnpm-lock 2025-01-14 05:43:13 -07:00
MotorTruck1221
b0f7eb1922
Bye bye nanostores 2025-01-14 05:42:49 -07:00
MotorTruck1221
1a6a5828dc
I was right, the store isn't needed for mobile 2025-01-14 05:37:06 -07:00
MotorTruck1221
76375ad02a
MP, settings an other things are now done. 2025-01-14 04:30:12 -07:00
MotorTruck1221
ddca0f3038
InstalledPlugins 2025-01-12 02:00:11 -07:00
MotorTruck1221
4fe4efd95a
InstalledTheme is done 2025-01-12 01:22:03 -07:00
MotorTruck1221
833b323267
It's closeee... 2025-01-11 06:34:19 -07:00
MotorTruck1221
c1b1a9de4c
Allow the user to reset their instance if they are having troubles 2025-01-10 04:55:37 -07:00
MotorTruck1221
72b0d4bbac
(most of) The settings are done! 2025-01-10 04:23:58 -07:00
MotorTruck1221
91199d3460
Tab settings 2025-01-10 02:20:43 -07:00
MotorTruck1221
c04c83c22a
Functionality is all done! 2025-01-10 01:34:13 -07:00
MotorTruck1221
82e169150e
No more silly globals 2025-01-10 01:27:39 -07:00
MotorTruck1221
1bd272ec8d
No more silly globals 2025-01-10 01:27:22 -07:00
MotorTruck1221
1616fa21f2
A whole bunch of shit 2025-01-07 03:19:52 -07:00
MotorTruck1221
920d9f198f
Games are back! 2025-01-07 00:40:30 -07:00
MotorTruck1221
f82c2de301
. 2025-01-07 00:05:55 -07:00
MotorTruck1221
1e0508ac85
Index page is back 2025-01-07 00:05:21 -07:00
MotorTruck1221
84f8605269
Index page is almost back : D 2025-01-06 05:58:22 -07:00
MotorTruck1221
ef0f7055a0
Ok cool, now time to rewrite the settings (I am dreading this) 2025-01-04 02:46:58 -07:00
MotorTruck1221
5b578806c7
Settings init is close to being ready to do 2025-01-04 02:33:46 -07:00
MotorTruck1221
b06c338c20
This already looks a number times better 2025-01-04 01:17:53 -07:00
MotorTruck1221
9c3ffcc58e
SW stuff is done for now 2025-01-04 00:06:01 -07:00
MotorTruck1221
3ca47ce108
I like .bind() more 2025-01-04 00:05:32 -07:00
MotorTruck1221
702bc64bc3
I like .bind() more 2025-01-04 00:04:59 -07:00
MotorTruck1221
b34b24e783
More changes? 2025-01-03 12:52:58 -07:00
MotorTruck1221
5bd87033e2
Start the change to the new stuff 2025-01-03 05:17:35 -07:00
MotorTruck1221
927b68dab7
Change the way EventHandler works 2025-01-03 05:04:44 -07:00
MotorTruck1221
5aa0169e81
Remove extra file 2025-01-03 04:46:38 -07:00
MotorTruck1221
9ff01d1d7d
SW shit 2025-01-03 04:45:42 -07:00
MotorTruck1221
16f1976e28
Man, do I love JSDoc 2025-01-01 05:23:10 -07:00
MotorTruck1221
3d4a8f43aa
Events stuff 2025-01-01 05:15:29 -07:00
MotorTruck1221
5b335d2bff
Start the rewrite (it's already SO much better) 2025-01-01 04:48:46 -07:00
MotorTruck1221
8736491818
Version bump 2024-12-30 00:56:20 -07:00
MotorTruck1221
037a2bf8c3
Scramjet 🚀 2024-12-30 00:55:14 -07:00
MotorTruck1221
fcbf8d2e3a
Remove unneeded dep 2024-12-29 22:46:38 -07:00
MotorTruck1221
cc8a8bf801
Make CatalogCard not use Svelte 2024-12-29 21:35:29 -07:00
MotorTruck1221
bab09be364
Unpin Epoxy 2024-12-28 04:05:09 -07:00
MotorTruck1221
7a0167f31b
Bump deps 2024-12-28 04:02:13 -07:00
MotorTruck1221
47fb761c71
Version bump 2024-12-28 03:58:15 -07:00
MotorTruck1221
18980488c6
Bugfix: themes with caps don't uninstall properly 2024-12-28 03:56:49 -07:00
MotorTruck1221
3e844696b0
That component is no longer needed 2024-12-28 03:49:18 -07:00
MotorTruck1221
4bbe97f887
Installed plugins 2024-12-28 03:47:38 -07:00
MotorTruck1221
a9b94c27d4
Don't fetch the data unless on the page 2024-12-28 03:41:11 -07:00
MotorTruck1221
d2b05a1b1b
Remove the svelte component from InstalledThemes 2024-12-28 03:25:12 -07:00
MotorTruck1221
a03f7d111b
Form data isn't needed like at all 2024-12-04 15:16:06 -07:00
MotorTruck1221
87ce59dab6
Why do I have ora as a package? 2024-12-04 15:14:55 -07:00
MotorTruck1221
77ec7e5a56
Remove concurrently 2024-12-04 15:14:33 -07:00
MotorTruck1221
6de99225c4
More SEO garbage 2024-12-04 05:14:54 -07:00
MotorTruck1221
6c0cbf2737
Fix the Svlete stuff, time to 'trim the fat' 2024-12-04 05:06:45 -07:00
MotorTruck1221
b0fca23a20
Ok, fixed that. NOW I need to update all of the effing svelte components 2024-12-04 04:32:55 -07:00
MotorTruck1221
96a904db0d
robots.txt, sitemap 2024-12-04 03:04:45 -07:00
MotorTruck1221
41c109416f
Some SEO stuff 2024-12-04 02:20:39 -07:00
rifting
208b37ce75
this should not be enabled by default 2024-12-02 09:02:33 -06:00
rifting
9bd33020ae
Merge pull request #294 from MadjikDotPng/patch-2
Make the favicon ourple Saturn.
2024-11-21 14:48:20 -06:00
Madjik
e506f5e37e
Make the favicon ourple Saturn. 2024-11-21 14:45:06 -06:00
rifting
89179de230
Merge pull request #292 from PrimeKidMN/main
Update README.md
2024-11-20 18:27:28 -06:00
Possibly Mason N.
d235862eb2
Update README.md 2024-11-20 09:05:36 -05:00
MotorTruck1221
2226483ed3
Deps bump 2024-11-16 02:14:35 -07:00
MotorTruck1221
ed7455985a
Remove the open in settings from the proxy page 2024-11-16 02:13:12 -07:00
rifting
42a9018e87
Update [...packageName].astro 2024-11-12 17:29:26 -06:00
rifting
2e9584e39e
Update Layout.astro 2024-11-12 17:22:33 -06:00
rift
4ab3de409e theme image embed 2024-11-10 22:25:59 -06:00
rift
aab156560f Add embed theme support 2024-11-10 15:53:14 -06:00
rifting
3e09ab61a5
Update README.md 2024-11-09 14:55:21 -06:00
MotorTruck1221
cad7ad2ceb
Version bump 2024-11-09 01:31:46 -07:00
MotorTruck1221
af5352eba2
WHOOPS 2024-11-09 01:28:25 -07:00
MotorTruck1221
20cb82ec7b
Rift, try this 2024-11-09 01:22:03 -07:00
MotorTruck1221
c9e92d92f8
Feat: custom wisp server urls 2024-11-09 01:18:58 -07:00
rifting
9bc00baa38
increase file size limit for marketplace to 25 MB 2024-11-08 17:11:08 -06:00
MotorTruck1221
0d1d6e5490
Switch to bare client for omnibox, remove libcurl as a dep 2024-11-08 03:10:16 -07:00
MotorTruck1221
32a7cc3b7c
Catalog: better mobile support... 2 2024-11-08 03:10:16 -07:00
MotorTruck1221
35f212056f
Catalog: better mobile support 2024-11-08 03:10:15 -07:00
MotorTruck1221
70bca2737c
Fix firefox, thanks @ading2210 2024-11-08 03:10:15 -07:00
rifting
3d57ffe3c2
Merge pull request #283 from 3kho/main
Grammar fixes and stuff
2024-11-07 08:11:14 -06:00
Echo
267432bb28
Fix naming 2024-11-07 09:03:31 -05:00
Echo
9a97b7937e
Grammar fixes 2024-11-07 09:02:52 -05:00
MotorTruck1221
0c2011f070
Bump version to 9.0.1 2024-11-06 21:08:45 -07:00
MotorTruck1221
d662a38ac7
It was fucking ASTROS fault 2024-11-06 21:04:30 -07:00
MotorTruck1221
826d37a374
AUGHGHG 2024-11-06 20:47:45 -07:00
MotorTruck1221
c1b9432a2b
Ok, let's seee 2024-11-06 20:42:19 -07:00
MotorTruck1221
366eca019d
HMMM 2024-11-06 20:36:39 -07:00
MotorTruck1221
fcf0bbb1d9
Yeahh I think I know what's going on... 2024-11-06 20:32:25 -07:00
MotorTruck1221
2519ed3d8c
OH MY HELLL 2024-11-06 20:05:32 -07:00
MotorTruck1221
feb8f6d0f5
Could CI just like... work? 2024-11-06 20:04:50 -07:00
MotorTruck1221
8a1a8abae7
MORE CI 2024-11-06 20:03:22 -07:00
MotorTruck1221
105b58a5c4
Hell 2024-11-06 19:59:53 -07:00
MotorTruck1221
382d5d0030
Whats breaking here? 2024-11-06 19:56:53 -07:00
MotorTruck1221
50a33d4f8d
Changelog.md 2024-11-04 23:30:03 -07:00
MotorTruck1221
e0899932b1
Font stuff & CI 2024-11-04 23:26:58 -07:00
MotorTruck1221
b077371d1f
Ignore everything but the ones we want there 2024-11-04 23:14:18 -07:00
MotorTruck1221
037d9cf26c
Purge non-needed assets 2024-11-04 23:12:27 -07:00
MotorTruck1221
064a868d62
Whoops, forgot to pass that param 2024-11-04 22:58:56 -07:00
MotorTruck1221
bf52d776ff
Fix the plugin stuff 2024-11-04 22:21:08 -07:00
MotorTruck1221
fc1a07b129
Remove all instances or mention of rammerhead 2024-11-04 16:21:17 -07:00
rift
19a3856768 fix up some rammerhead removal things 2024-11-03 20:24:09 -06:00
rift
fc414951d1 fix font 2024-11-03 20:05:10 -06:00
MotorTruck1221
835cb237d7
. 2024-10-29 22:45:41 -06:00
MotorTruck1221
af9494ecce
Docs on themes 2024-10-29 02:15:58 -06:00
MotorTruck1221
eabf4254b1
TYPPEESS 2024-10-29 01:31:40 -06:00
MotorTruck1221
e05f146b28
God, this codebase is getting COMPLICATED 2024-10-29 00:49:39 -06:00
MotorTruck1221
a0cd959a93
I HATE the normal scrollbar 2024-10-28 23:55:59 -06:00
MotorTruck1221
4e398bc9fd
Document the page plugin 2024-10-27 05:23:20 -06:00
MotorTruck1221
0eb1582f7d
Remove the test dbstuff 2024-10-27 05:14:56 -06:00
MotorTruck1221
c5124db29f
Whoops, forgot that shit 2024-10-27 05:03:17 -06:00
MotorTruck1221
e2566121d9
BRO gimme seperate lines 2024-10-27 04:42:45 -06:00
MotorTruck1221
2dac102f3e
The run on sentences go crazzzy 2024-10-27 04:41:49 -06:00
MotorTruck1221
26255f8995
I swear... 2024-10-27 04:39:19 -06:00
MotorTruck1221
bc23ccc1aa
Github, I am going to murder you 2024-10-27 04:38:15 -06:00
MotorTruck1221
b2ca3f6c0b
Switch from note to warning 2024-10-27 04:37:40 -06:00
MotorTruck1221
fc2f38543c
Plugin docs 2024-10-27 04:36:14 -06:00
MotorTruck1221
154eda0aa2
Plugin handling, done 2024-10-27 03:48:48 -06:00
MotorTruck1221
095908302f
The great format 2024-10-26 04:19:46 -06:00
MotorTruck1221
30509de370
BRUh 2024-10-26 04:18:03 -06:00
MotorTruck1221
0fae05e33a
Workerware 2024-10-26 04:13:33 -06:00
MotorTruck1221
5dc222a0df
Time to worker on marketplace proxying & hostname switching
This will be HELL
2024-10-25 17:03:27 -06:00
MotorTruck1221
202b9946e2
--recursive 2024-10-25 17:01:28 -06:00
MotorTruck1221
5d4397d38b
Switch workerware to a submodule 2024-10-25 16:59:50 -06:00
MotorTruck1221
7a0695ac9c
Remove the correct elements from the plugins array 2024-10-25 16:39:25 -06:00
MotorTruck1221
ff7eb81e87
I need to push whatever I have done 2024-10-25 15:16:15 -06:00
MotorTruck1221
4d4ebf2d09
Actually have the damn build work 2024-10-24 03:09:23 -06:00
MotorTruck1221
aae0bd2420
Switch to bare mux v2, libcurl is now default 2024-10-24 02:23:51 -06:00
MotorTruck1221
952337be6e
Page plugin handling (uv.config.inject)
Next up, workerwear for SW plugin handling
2024-10-21 23:58:52 -06:00
MotorTruck1221
fff4d0b286
Some plugin logic (still kinda broken) 2024-10-21 05:30:12 -06:00
MotorTruck1221
4f1a8960f1
proper noscript syntax 2024-10-19 04:57:11 -06:00
MotorTruck1221
4c35560f6c
Chore: format 2024-10-19 04:48:07 -06:00
MotorTruck1221
b456823df3
Just a bunch of changes 2024-10-19 04:47:18 -06:00
MotorTruck1221
4cbc02a2d3
Navigation: this shit is actually mobile & iPad friendly now! 2024-10-19 02:35:35 -06:00
MotorTruck1221
bd39e6fba7
Settings page: fix mobile nav, so users can like use it 2024-10-19 01:58:20 -06:00
MotorTruck1221
d9d7e79f0e
Make sure this shit actually builds 2024-10-18 04:32:18 -06:00
MotorTruck1221
b4e4252d5c
Setup the UI for marketplace Hostname & Proxying 2024-10-18 04:29:36 -06:00
MotorTruck1221
ab37a135af
Gyattt 2024-10-18 03:17:14 -06:00
MotorTruck1221
bd28f8590b
Docker 2024-10-18 02:58:35 -06:00
MotorTruck1221
162a2fbac3
I forgot to add a seperator 2024-10-17 04:18:45 -06:00
MotorTruck1221
4d66649ff8
Add note about marketplace 2024-10-17 04:18:22 -06:00
MotorTruck1221
a2e67033c8
Add loading to iFrame 2024-10-17 04:03:18 -06:00
MotorTruck1221
d6ff02f284
Put the catalog in the [lang] folder.
Still no clue on how to i18n translations for that
2024-10-17 03:43:57 -06:00
MotorTruck1221
187859b1c9
We don't need this block anymore 2024-10-17 03:08:03 -06:00
MotorTruck1221
4887562cc7
Allow the ability to completely disable the marketplace. 2024-10-17 03:07:17 -06:00
MotorTruck1221
643fbbe90d
Update config section of README 2024-10-17 02:33:17 -06:00
MotorTruck1221
5c45c17992
Marketplace: retro theme 2024-10-17 01:56:14 -06:00
MotorTruck1221
7616e93dae
Marketplace: change up the light/oled theme 2024-10-17 01:00:53 -06:00
MotorTruck1221
155051c5fe
Marketplace: light theme 2024-10-16 04:49:50 -06:00
MotorTruck1221
82edb6b284
Apparently sharp didn't exist 2024-10-16 04:10:45 -06:00
MotorTruck1221
c18f175b08
Chore: format 2024-10-16 03:12:18 -06:00
MotorTruck1221
7d325d424a
We don't need this file 2024-10-16 03:11:45 -06:00
MotorTruck1221
6d2ab6e0f9
Marketplace: handle the new stuff! 2024-10-16 03:10:47 -06:00
MotorTruck1221
71ec6f76cc
Marketplace: change directory structure 2024-10-15 23:00:21 -06:00
MotorTruck1221
a385089fe8
A little bit of structure re-organization 2024-10-15 05:31:40 -06:00
MotorTruck1221
05051ea9f9
A shit ton of compression 2024-10-15 05:14:41 -06:00
MotorTruck1221
d495678ac2
Oled theme (rift, you might wanna chnage this idk if you'll like it) 2024-10-15 04:45:03 -06:00
MotorTruck1221
06dbe99cae
Add gruvbox theme 2024-10-15 03:33:38 -06:00
MotorTruck1221
0b5bc42587
Setup the DB properly 2024-10-15 02:10:49 -06:00
MotorTruck1221
35680e719b
Wisp logging bs 2024-10-13 05:17:21 -06:00
MotorTruck1221
620ad25c61
Server: switch to Fastify
Switch config to TOML over JSON (it's just nicer TBH)
2024-10-13 04:33:25 -06:00
MotorTruck1221
deda273eda
Chore: remove all uneeded files 2024-10-12 02:28:19 -06:00
MotorTruck1221
fd8aaf543e
Chore: format... 2! 2024-10-12 02:20:39 -06:00
MotorTruck1221
8cb2513610
Chore: format 2024-10-12 02:19:02 -06:00
MotorTruck1221
a68f0c7e42
Settings: revamp into seperate files. 2024-10-12 02:16:32 -06:00
MotorTruck1221
c63662f602
Marketplace: change the way we deal with themes (no refresh) 2024-10-12 01:17:41 -06:00
MotorTruck1221
6b227f241b
2024-10-09 03:11:18 -06:00
MotorTruck1221
1a9e4097fb
Fix the initial index page 2024-10-09 03:09:55 -06:00
MotorTruck1221
f16ae279e2
Chore: format 2024-10-09 02:39:44 -06:00
MotorTruck1221
c4d2c5b408
Feat: automatic proxy detection
Docs on how to add more later
2024-10-09 02:38:58 -06:00
MotorTruck1221
70bff6156a
Like seriously 2024-10-09 01:54:18 -06:00
MotorTruck1221
5fe93963f3
Rift, whatever autoformatter you are using is giving me cancer 2024-10-09 01:50:23 -06:00
MotorTruck1221
2425f07d6b
Feat: chango games 2024-10-08 03:48:17 -06:00
MotorTruck1221
66ba178ea7
2024-10-08 03:27:38 -06:00
MotorTruck1221
5f8c941d0b
%s/incognito/nebula 2024-10-08 03:26:20 -06:00
MotorTruck1221
f6026c6977
Oggity boogity boo 2024-10-08 03:22:45 -06:00
MotorTruck1221
a10592a031
Fix epoxy 2024-10-08 03:18:36 -06:00
MotorTruck1221
e571cc301c
Add a decent README (not totally correct currently) 2024-10-08 01:08:08 -06:00
MotorTruck1221
ce5c4e5345
Feat: Rammerhead, See description
Currently can only be run with SSL
2024-10-06 03:52:01 -06:00
MotorTruck1221
3fd603667d
Update transports (epoxy is effing broken) 2024-10-06 03:14:00 -06:00
rift
df96ced6d9 css changes 2024-10-04 21:41:04 -05:00
MotorTruck1221
8f1feb8cff
Run a format 2024-10-04 00:49:10 -06:00
MotorTruck1221
8d726133bc
Add a formatter 2024-10-04 00:46:34 -06:00
MotorTruck1221
10992aad3c
We don't need libcurl on EVERY page 2024-10-04 00:29:37 -06:00
MotorTruck1221
88b24b55e6
Libcurl doesn't include types 2024-10-02 19:30:58 -06:00
MotorTruck1221
22b0c1ebf9
Switch to libcurl for omnibox 2024-10-02 19:28:28 -06:00
MotorTruck1221
ac3154e334
why tf did I make this optional??? 2024-10-02 18:45:18 -06:00
MotorTruck1221
d313ac55d9
See description
Feat: add open in settings

Feat: add search engine settings

Feat: add wisp server changing

Feat: add transport switching
2024-10-01 02:51:39 -06:00
MotorTruck1221
e96af1f6fb
fix my scuffed toast notifs 2024-09-30 03:09:05 -06:00
MotorTruck1221
f0c9b7eb82
Feat: A:B cloak, Blob cloaking 2024-09-30 01:19:41 -06:00
MotorTruck1221
c654694603
Make sure the cloak is set upon page reload too 2024-09-29 04:45:24 -06:00
MotorTruck1221
8817a12ede
Feat: Tab cloaking 2024-09-29 04:41:28 -06:00
MotorTruck1221
b38dcc09aa
Fix: perf being shit 2024-09-29 00:40:30 -06:00
MotorTruck1221
dcbde420a4
This is stupid bruh 2024-09-29 00:34:19 -06:00
MotorTruck1221
c8a07a5777
Feat: Omnibox
But now it isn't fucked!
2024-09-28 15:16:31 -06:00
MotorTruck1221
9a2306a9a8
Revert "It builds, but now the page crashes 🔥"
This reverts commit b716dc5b35.
2024-09-28 15:12:27 -06:00
MotorTruck1221
b716dc5b35
It builds, but now the page crashes 🔥 2024-09-28 06:04:03 -06:00
MotorTruck1221
4a4a430b47
Dude, what did I breakkk 2024-09-28 05:23:40 -06:00
MotorTruck1221
c5a73a13ea
Dude, the formatting 😭 2024-09-28 01:15:37 -06:00
MotorTruck1221
3511d7b32f
Why were these formatted terribly???? 2024-09-28 01:13:18 -06:00
MotorTruck1221
6854ba70e2
Omnibox: fix the styling for the last element... 2024-09-27 01:47:09 -06:00
MotorTruck1221
b5e9bdb1d5
Actually allow build 2024-09-27 01:38:27 -06:00
MotorTruck1221
68b1b4c2e2
When clicking on phrase in Omnibox, actually do something 2024-09-27 01:36:57 -06:00
MotorTruck1221
9b6caebfa6
Feat: Omnibox
Now fetched all on the client!
2024-09-27 01:20:59 -06:00
MotorTruck1221
b3947909a0
Omnibox styling... 2024-09-26 23:54:13 -06:00
MotorTruck1221
709c2f3f7b
Damn TypeScript 2024-09-26 03:42:32 -06:00
rift
344fbdea9f Fix a wacky bug 2024-08-22 20:49:02 -05:00
rift
26fb0486fd Video uploads 2024-08-22 16:37:09 -05:00
rift
c9a02c2351 some backend updates 2024-08-22 16:23:13 -05:00
rift
e0805868a6 Fix config 2024-08-21 00:07:18 -05:00
rift
69a86b5a14 Add video, style, and script storage 2024-08-20 23:47:46 -05:00
rift
e78eb63e4e add authentication 2024-08-20 23:42:02 -05:00
rift
948611f434 Image upload API 2024-08-20 19:38:43 -05:00
rift
52d47b4247 fix broken pagnation 2024-08-20 16:25:56 -05:00
MotorTruck1221
6c6452c126
Whoops, forgot to remove that file 2024-08-18 00:22:31 -06:00
MotorTruck1221
3b00a749b5
Add UV 2024-08-18 00:21:03 -06:00
rift
5ae0aad1d6 Merge count and assets API endpoint, and fix pagnation after page transition 2024-08-16 16:27:48 -05:00
rift
1979bae370 do some things 2024-08-15 20:30:52 -05:00
rift
bdea8efb53 Fix overflow 2024-08-15 18:04:06 -05:00
rift
315204e5d7 Pagnation sytem (I have no idea how im going to get the catalog ready for Japanese users 2024-08-15 15:30:44 -05:00
rift
053f2c1e66 Uninstall button 2024-08-14 23:33:16 -05:00
rift
088071fa38 Style package page better 2024-08-14 23:17:51 -05:00
rift
607adcf737 the hell of finishing the inventory system 2024-08-14 23:00:45 -05:00
rift
d3b3f1f676 guh 2024-08-14 01:02:36 -05:00
rift
441248f737 Full theme support! 2024-08-14 00:08:32 -05:00
rift
ad195b22db SSR and marketplace shit 2024-08-13 18:01:18 -05:00
rift
99efa86c58 dev server and basic marketplace 2024-08-13 16:31:26 -05:00
rift
c8a88b837f change db schema 2024-08-04 16:36:17 -05:00
rift
a2b21a141a add some more apis and make a file storage folder 2024-08-04 15:58:13 -05:00
rift
634c88d8d1 Convert to Express, add catalog-pages API and pagnation 2024-08-04 15:12:28 -05:00
rift
a38f1b20ec re add the databse to gitignore 2024-08-02 00:57:57 -05:00
rift
6014409d3d delete the database 2024-08-02 00:57:44 -05:00
rift
ee0306cda8 add the db to gitignore 2024-08-02 00:57:14 -05:00
rift
5c492410be more database shit 2024-08-02 00:56:34 -05:00
rift
e606fc9985 add sequelize and init nebula catalog 2024-08-01 22:48:40 -05:00
rift
471dca4661 Add Nebula Catalog button 2024-07-29 00:37:59 -05:00
rift
5d6b7b74c4 Basic settings 2024-07-29 00:05:06 -05:00
rift
e91a913b62 Make settings layout 2024-07-24 23:22:05 -05:00
rift
f8a6d2bc3d Get started on homepage 2024-07-24 17:07:52 -05:00
rift
0738579074 I centered a div 2024-07-24 16:11:15 -05:00
rift
7909244e95 Fix mobile glitches 2024-07-24 16:01:02 -05:00
rift
7f6b5638de Replace hyphen with underscore for american english locale 2024-07-24 15:53:30 -05:00
rift
68a8be1427 Remove i18n leftovers from experimenting 2024-07-24 15:42:11 -05:00
rift
0262ee9ff0 Fix the dev server???? 2024-07-24 15:38:59 -05:00
rift
721fa7bcda home button 2024-07-23 21:16:55 -05:00
rift
98cf07b676 fix stupid view transition shit and make basic server 2024-07-23 20:55:18 -05:00
rift
2b7380ba57 broken header shit 2024-07-23 20:07:55 -05:00
rift
6162b3e27f Start on games page and move mobile navigation to the layout 2024-07-23 19:27:38 -05:00
rift
8d7cc2cec1 Remove useless keyframes 2024-07-23 18:55:23 -05:00
rift
e52c45b345 sliding animation! 2024-07-23 18:51:05 -05:00
rift
ed919b2f21 pain 2024-07-22 22:58:16 -05:00
rift
781a31d3bb i18n is so weird brooo 2024-07-22 14:52:42 -05:00
rifting
d82bee3150
Merge pull request #264 from MotorTruck1221/e
Bump deps & Fix transport garbage
2024-07-01 13:09:34 -05:00
MotorTruck1221
9c01c9f65c
Don't set the transport until the user clicks suggestions or hits enter 2024-07-01 01:07:27 -06:00
MotorTruck1221
a341b1dcbe
Default to epoxy 2024-07-01 00:27:31 -06:00
MotorTruck1221
776507703a
Bump deps 2024-07-01 00:26:44 -06:00
rift
215d24252e
Merge pull request #260 from MotorTruck1221/main
Bump dependencies
2024-05-11 11:11:13 -05:00
MotorTruck1221
fd2b79a884
Bump deps (fixes errors and other things) 2024-05-11 00:48:03 -06:00
rift
ab73ec684c basic video support, not usable by end user yet 2024-05-09 21:01:47 -05:00
rift
4da0e8675f Significant performance improvements 2024-05-09 19:32:13 -05:00
rift
5ba3cf247a
Merge pull request #254 from MotorTruck1221/main
Bump Dependencies
2024-04-29 13:49:49 -05:00
MotorTruck1221
50ba1b5ecb
Bump Deps 2024-04-29 11:40:20 -06:00
rift
981c5bee82
Merge pull request #251 from Notplayingallday383/patch-4
patch: fix scaling on mobile
2024-04-24 18:21:55 -05:00
John
5f50b5c4ce make using it on mobile better 2024-04-23 16:11:52 -04:00
rift
eda3b464d8 Fix more annoying bullshit 2024-04-20 12:35:21 -05:00
rift
b12c75fe21 Fix annoying bullshit 2024-04-20 12:29:43 -05:00
rift
89b93549cb
Merge pull request #250 from MotorTruck1221/tgt
Fix Stupid Shit
2024-04-18 16:39:30 -05:00
MotorTruck1221
4a47b5c987
Fix that bullshit too 2024-04-18 14:57:32 -06:00
MotorTruck1221
426c86a451
Format 2024-04-18 14:41:56 -06:00
MotorTruck1221
7c88e0bc5d
Ignore package.json for prettier 2024-04-18 14:41:40 -06:00
MotorTruck1221
86793fd675
bump dependencies 2024-04-18 14:40:29 -06:00
MotorTruck1221
3121dd8e5d
Fix the stupid overflow error 2024-04-18 14:39:11 -06:00
rift
d3d4736bae
Merge pull request #249 from MotorTruck1221/mental-breakdown
Mental breakdown (Fix Bare Clients 😭)
2024-04-17 14:42:54 -05:00
MotorTruck1221
65d104538a
Format goes brrr 2024-04-17 08:56:34 -06:00
MotorTruck1221
b4dba4d5bb
In the wise words of @riftriot 'GUH' 2024-04-17 08:56:15 -06:00
rift
19635704c8
Merge pull request #248 from IncognitoTGT/main
fix flicker
2024-04-16 22:29:03 -05:00
incognitotgt
c2268be997
fix issue for last 2024-04-16 23:23:56 -04:00
tgt
e0282962d6
Merge branch 'NebulaServices:main' into main 2024-04-16 22:22:52 -04:00
rift
06ce2d0177 Revert "Merge pull request #247 from NebulaServices/revert-245-main"
This reverts commit cb9b15fccc, reversing
changes made to 0073a1121f.
2024-04-16 21:22:01 -05:00
incognitotgt
3833559cec
particles 2024-04-16 07:44:10 -04:00
rift
cb9b15fccc
Merge pull request #247 from NebulaServices/revert-245-main
Revert "revamp themes"
2024-04-15 21:00:02 -05:00
rift
e6736db056
Revert "revamp themes" 2024-04-15 20:59:53 -05:00
rift
0073a1121f
Merge pull request #245 from IncognitoTGT/main
revamp themes
2024-04-15 20:58:49 -05:00
incognitotgt
82ca99aa5d
fix insanely annoying flash 2024-04-15 20:47:47 -04:00
incognitotgt
6b5e863461
fix background issue 2024-04-15 19:48:16 -04:00
incognitotgt
7117e67e0a
use hook for background 2024-04-15 16:22:16 -04:00
incognitotgt
217d3a40db
format code and fix a tiny issue 2024-04-15 01:16:45 -04:00
incognitotgt
d7bb56b815
use normal css for bg image 2024-04-15 01:13:50 -04:00
incognitotgt
c0272a798d
theme backgrounds 2024-04-14 19:08:34 -04:00
tgt
30efd8c990
Merge branch 'NebulaServices:main' into main 2024-04-14 00:55:57 -04:00
rift
f7e596c628
Merge pull request #246 from MotorTruck1221/bare-clients
Bare clients fix (permanently)
2024-04-12 12:50:25 -05:00
MotorTruck1221
94236a36dc The bare clients now exist 2024-04-12 10:59:17 -06:00
MotorTruck1221
bd4d20ba38 Start fixing... 2024-04-12 10:42:09 -06:00
incognitotgt
7201d7120e
revamp themes 2024-04-11 17:02:53 -04:00
rift
b152154cf0 There ARE bare clients !? 2024-04-07 16:01:41 -05:00
rift
aba3153c4f Switch away from AES to 3 key XOR 2024-04-06 17:59:30 -05:00
rift
a6473f3e77 update bare-mux 2024-04-06 17:39:08 -05:00
rift
eb94911a4d add suzumiya39 to credits page 2024-03-28 13:53:05 -05:00
rift
142767738a
Merge pull request #239 from suzumiya39/main
Revison Languege file (Japanese)
2024-03-28 13:47:19 -05:00
suzumiya39
5bd5e07169
revision ja.json (2) 2024-03-29 03:07:50 +09:00
suzumiya39
e70f77819c
Update ja.json 2024-03-29 02:56:39 +09:00
rift
9e4f84cf09 credits, clean up css, add more translations 2024-03-27 21:16:45 -05:00
rift
9abb1dfc97 add particles translation and icons for dropdowns 2024-03-25 19:13:54 -05:00
rift
a48af7d00e
Merge pull request #237 from Percslol/main
make nebula use latest version of libcurl
2024-03-23 21:00:12 -05:00
Percs
07f6c70dbe make nebula use latest version of libcurl 2024-03-23 19:35:22 -05:00
rift
237c783382
Merge pull request #236 from MotorTruck1221/fastify
Switch Back to fastify
2024-03-23 14:06:58 -05:00
MotorTruck1221
12a7ac0b06
Update README accordingly 2024-03-23 02:16:25 -06:00
MotorTruck1221
1ee0a620a7
Remove express from deps 2024-03-23 02:15:53 -06:00
MotorTruck1221
460aa64634
Format 2024-03-23 01:48:06 -06:00
MotorTruck1221
0e6ee114e5
Comment masqr out 2024-03-23 01:47:48 -06:00
MotorTruck1221
e9a88bc1cd
Add masqr! 2024-03-23 01:45:47 -06:00
MotorTruck1221
fd8424242e
Update deps 2024-03-23 00:40:38 -06:00
MotorTruck1221
0ffd145633
Rename file 2024-03-23 00:37:59 -06:00
MotorTruck1221
c5d60be069
Start the switch BACK to fastify 2024-03-23 00:35:25 -06:00
rift
657d597d84 update libcurl 2024-03-22 09:40:36 -05:00
rift
c2c4116e58 update wisp server 2024-03-22 09:28:00 -05:00
rift
2f3beca70b 'Fix' random package not found errors 2024-03-21 21:02:15 -05:00
rift
a46908389c
Merge pull request #235 from MotorTruck1221/bugfixes
Bugfixes
2024-03-21 15:28:37 -05:00
MotorTruck1221
218ab89113
End with a trailing / 2024-03-21 11:47:59 -06:00
MotorTruck1221
8c895090c8
Format code for the 4th time 2024-03-21 00:31:47 -06:00
MotorTruck1221
82f4bd1c63
Mobile menu: fix text size 2024-03-21 00:30:01 -06:00
MotorTruck1221
8d63bf5e11
Fix borked tab cloaking page 2024-03-21 00:26:51 -06:00
MotorTruck1221
b47e0f4ec7
Fix 404 text color 2024-03-21 00:13:46 -06:00
MotorTruck1221
307eedaca1
Pin node version in docker 2024-03-21 00:10:05 -06:00
MotorTruck1221
c1b1f92b80
Make sure docker and code works 2024-03-21 00:04:52 -06:00
MotorTruck1221
817069ae2e
Add docker 2024-03-20 23:54:37 -06:00
MotorTruck1221
9b2a85bb4c
Deps 2024-03-20 23:46:17 -06:00
MotorTruck1221
4ba5a7215a
Deps 2024-03-20 23:44:37 -06:00
MotorTruck1221
17a05d4461
Fix SW registration errors 2024-03-20 23:43:53 -06:00
MotorTruck1221
c7b158fd57
formatting 2024-03-16 01:22:23 -06:00
MotorTruck1221
8b99bcc6a8
Only needed once 2024-03-16 01:22:02 -06:00
MotorTruck1221
c4a3741542
MAKE sure a transport is there 2024-03-16 01:09:21 -06:00
MotorTruck1221
445e0b0acd
Fix most of the bare client issue 2024-03-16 00:03:34 -06:00
MotorTruck1221
63ad35ce18
update deps 2024-03-15 23:57:04 -06:00
MotorTruck1221
90e797be05
Merge pull request #3 from MotorTruck1221/main
Update branch
2024-03-15 23:43:54 -06:00
Riftriot
e23657144a Fix everything 2024-03-15 12:23:38 -05:00
Riftriot
750dac8d9d Revert "update libcurl and deps, bugfixes"
This reverts commit 5154da62ab.
2024-03-15 11:48:36 -05:00
Riftriot
420cacd8c9 Revert "Format"
This reverts commit 7e44d6cdb2.
2024-03-15 11:48:25 -05:00
rift
529f943646
Merge pull request #230 from MotorTruck1221/deps
bugfixes
2024-03-14 09:32:59 -05:00
MotorTruck1221
7e44d6cdb2
Format 2024-03-14 01:23:25 -06:00
MotorTruck1221
5154da62ab
update libcurl and deps, bugfixes
Fixes the 'no bare clients issue (fixes #228), upgrades libcurl to 0.5.3 and other deps too
2024-03-14 01:22:56 -06:00
rift
c9ce4b5d1a Revert "Set libcurl as default on ios and update libcurl"
This reverts commit 9357f2ed11.
2024-03-12 13:15:21 -05:00
rift
9357f2ed11 Set libcurl as default on ios and update libcurl 2024-03-11 22:20:53 -05:00
rift
3e77fdc4be iOS detection 2024-03-11 18:29:04 -05:00
rift
6a655c48d1
Merge pull request #227 from MotorTruck1221/bare
Add the option to use a Bare Server
2024-03-11 13:36:07 -05:00
MotorTruck1221
10fa42830a https not http 💀 2024-03-11 06:00:04 +00:00
MotorTruck1221
342e8e264f
upgrade libcurl to v0.5.2 2024-03-10 23:52:59 -06:00
MotorTruck1221
f92b059604
Format (again) 2024-03-10 22:33:33 -06:00
MotorTruck1221
d2dff8ce09
Update dependencies (again) 2024-03-10 22:32:19 -06:00
MotorTruck1221
5692dd9909
Only allow bare-change if using bare transport 2024-03-10 22:28:03 -06:00
MotorTruck1221
799e8979b2
Default to libcurl over epoxy 2024-03-10 21:56:24 -06:00
MotorTruck1221
3ab4394376
Remove comment 2024-03-10 03:56:20 -06:00
MotorTruck1221
bb26ff2e98
Format 2024-03-10 03:55:28 -06:00
MotorTruck1221
df25d7882d
Finalize adding bare server as a transport 2024-03-10 03:54:57 -06:00
MotorTruck1221
a3094b3923
Whoops 2024-03-10 03:42:22 -06:00
MotorTruck1221
11dce272a4
Remove bareswitcher on UV (not needed due to bare-mux), add bareTransport to sw 2024-03-10 03:37:56 -06:00
MotorTruck1221
c55f67ad58
Add BareTransport code 2024-03-10 03:34:28 -06:00
MotorTruck1221
56ed5a9455
Update dependencies 2024-03-10 03:29:48 -06:00
rift
441ab183b7
Merge pull request #226 from MotorTruck1221/libcurl
Add Libcurl as a transport
2024-03-09 09:22:04 -06:00
MotorTruck1221
b8bc307fe7
Format 2024-03-09 02:52:11 -07:00
MotorTruck1221
bf24bf53c0
Add libcurl 2024-03-09 02:51:29 -07:00
MotorTruck1221
c5e05997dd
Add masqr bs back to index.html 2024-03-09 02:09:15 -07:00
MotorTruck1221
f7a49e47bf
Add libcurl to dependencies 2024-03-09 02:07:12 -07:00
MotorTruck1221
7b0d3b710a
Update dependencies 2024-03-09 01:55:19 -07:00
rift
d3282c7212 Remove http proxy feature 2024-03-08 19:50:04 -06:00
Riftriot
35cb912e28 Particles.js and crismas 2024-03-08 13:17:03 -06:00
Riftriot
2b0292a614 Translations and css improvements 2024-03-08 11:51:37 -06:00
Riftriot
e7fcc91133 hacker theme 2024-03-08 11:46:47 -06:00
rift
e391ea693f
Fix epoxypath on windows 2024-03-07 12:19:12 -06:00
rift
6c1ce96036
Merge pull request #223 from MotorTruck1221/wisp
TLS
2024-03-07 12:18:28 -06:00
MotorTruck1221
8f531aff11
Formatting 2024-03-06 01:19:16 -07:00
MotorTruck1221
69823802f5
Finalize 2024-03-06 01:14:00 -07:00
MotorTruck1221
af88c5475b
Epoxy Transport setup and working (mostly0 2024-03-06 01:02:13 -07:00
MotorTruck1221
fd4c4f6fcb
Transports are now able to be used and registered 2024-03-06 00:48:32 -07:00
MotorTruck1221
69a2cd5b61
OK 2024-03-04 01:53:51 -07:00
MotorTruck1221
289cd7ccec
Update server (with types) 2024-03-04 00:57:42 -07:00
MotorTruck1221
be8dc47f29
Update dependencies, start to add wisp stuff 2024-03-04 00:47:39 -07:00
rift
fb682c799d
Update rammerhead dependancy 2024-02-21 12:13:58 -06:00
rift
ba3d83e09c
Merge pull request #219 from IncognitoTGT/main
readd compression
2024-02-13 21:20:16 -06:00
incognitotgt
de6b155c55 fastify is gone 2024-02-13 17:24:42 -05:00
incognitotgt
c14c7971aa fix: readme (osama) 2024-02-13 16:52:03 -05:00
incognitotgt
9d9432bfd5 chore: readd compression
fix: express wasn't listed as a dependency?!
style: prettier
2024-02-13 16:49:56 -05:00
rift
8fc5553b52 fix autofill 2024-02-12 16:48:20 -06:00
Riftriot
0813d6bfd9 server improvements and actually fix masqr 2024-02-12 13:18:37 -06:00
rift
d36fc0fceb Fix masqr (thanks blumiere) 2024-02-08 22:08:21 -06:00
rift
521c2b8cdf Add wisp server node 2024-02-08 19:46:02 -06:00
rift
d213843bbf
Merge pull request #213 from IncognitoTGT/seo
better lighthouse scores!?!?!??!?!!?!?!?!?!?!?!?
2024-01-30 22:00:24 -06:00
incognitotgt
ef06e6e6a3 fix: text color on some pages
chore: add compression for lighthouse, meta tags
feat: near perfect lighthouse scores????
2024-01-30 22:48:26 -05:00
incognitotgt
9593a0e46b chore: add seo tags, prettier was also ran 🐳 2024-01-30 21:29:06 -05:00
rift
1c54765c77 Add masqrbation abilities 2024-01-22 21:19:31 -06:00
rift
ad3d231d16 localizations 2024-01-15 13:36:54 -06:00
rift
d5c720775f Change npm package for BSN 2024-01-15 12:55:57 -06:00
rift
eeed30dd32 temporaily update BSN dependancy 2024-01-15 10:44:59 -06:00
rift
fbff40d7f8 Reset button for HTTP proxy 2024-01-15 10:30:21 -06:00
rift
2c22a6afc6 Feat: Http proxy support. (Bare server still must be updated) 2024-01-15 10:23:50 -06:00
rift
666ca92547 Get started on HTTP proxy UI and add FAQ 2024-01-14 12:46:19 -06:00
rift
a62534618b Basic tab UI (NOT MOBILE READY) 2024-01-12 13:51:14 -06:00
rift
b38a597b7e
Merge pull request #209 from NebulaServices/main
q
2024-01-12 12:22:15 -06:00
rift
060d69e652 enter key 2024-01-07 17:37:42 -06:00
rift
c2fe2b980f Validate that bare servers can actually function and fix CSS. 2024-01-07 16:59:28 -06:00
rift
26ff6820f0 Re-add navbar buttons and add toast translations 2024-01-07 09:34:45 -06:00
rift
476c65a82c Fix japanese settings from having a seizure 2024-01-07 08:58:11 -06:00
rift
14d1a9fb54 Fix overflow on mobile. 2024-01-06 13:56:32 -06:00
rift
682c892f53 Fix dev server 2024-01-06 13:24:59 -06:00
rift
4ea772ba18 remove invisible text on mobile 2024-01-06 13:16:32 -06:00
rift
7d483c4aab Add share button (UV only) 2024-01-06 12:33:28 -06:00
rift
e098f1eb08 Add favicon and title in embed mode + comment out refresh/un/re/do buttons 2024-01-06 11:45:16 -06:00
rift
9c06cb2962 Feat: Find closest bare server in prod instances 2024-01-05 22:27:22 -06:00
Riftriot
cc429fd8cb forgot to delete that 2024-01-04 14:32:39 -06:00
Riftriot
6c6c6626cf Localize bare switcher and add button 2024-01-04 14:31:52 -06:00
rift
5c632642d4
Merge pull request #201 from MotorTruck1221/bareSwitch
Implement Bare Server Switching
2024-01-03 18:40:52 -06:00
MotorTruck1221
79d65953a7 Formatting 2024-01-03 17:36:42 -07:00
MotorTruck1221
c821d86362 Final touches 2024-01-03 17:35:34 -07:00
MotorTruck1221
52f901c6c4
Merge branch 'NebulaServices:main' into bareSwitch 2024-01-03 17:11:12 -07:00
rift
c18c2267b0 De-localize language settings 2024-01-03 17:35:09 -06:00
MotorTruck1221
5caba447ab Switch to NPM version of localforage 2024-01-03 14:26:31 -07:00
MotorTruck1221
38b404d453 Export get (for use later) 2024-01-02 23:44:02 -07:00
MotorTruck1221
75beb0e282 Bare Server Switching done (almost) 2024-01-02 23:41:05 -07:00
rift
400070dcb5 Revert "made title text and iframeheader icons not bland, fixed text readbility in Latte"
This reverts commit 323086c19d.
2024-01-02 21:05:56 -06:00
rift
a08add1bfa
Merge pull request #200 from IncognitoTGT/main
fix: text properly themed; discord invite through proxy now works.
2024-01-02 18:00:11 -06:00
incognitotgt
323086c19d made title text and iframeheader icons not bland, fixed text readbility in Latte 2024-01-02 18:57:46 -05:00
tgt
53d6c486ef
Merge branch 'NebulaServices:main' into main 2024-01-02 18:27:48 -05:00
incognitotgt
a98fe44063 Revert "syntax error go brrr"
This reverts commit dc32e1d142.
2024-01-02 18:21:43 -05:00
incognitotgt
beefe7ab44 Revert "Catppuccin theming was inconsistent"
This reverts commit d8a975d531.
2024-01-02 18:21:31 -05:00
incognitotgt
38231f4eaa Revert "prettier"
This reverts commit c27ccc043c.
2024-01-02 18:21:20 -05:00
rift
9bcfb359c5
Merge pull request #199 from r58Playz/fix-catppuccin
Fix catppuccin theme
2024-01-02 17:05:37 -06:00
incognitotgt
d636022898 Fixed discord invite through proxy 2024-01-02 17:56:44 -05:00
incognitotgt
c27ccc043c prettier 2024-01-02 17:52:40 -05:00
incognitotgt
d8a975d531 Catppuccin theming was inconsistent 2024-01-02 17:51:56 -05:00
incognitotgt
270a87d03a Merge branch 'main' of https://github.com/IncognitoTGT/Nebula 2024-01-02 17:44:25 -05:00
incognitotgt
dc32e1d142 syntax error go brrr 2024-01-02 17:44:17 -05:00
Toshit Chawda
85b933e339
remove generator script 2024-01-02 13:02:09 -08:00
Toshit Chawda
61da89c1a9
fix catppuccin theme 2024-01-02 12:59:17 -08:00
Cohen Erickson
59bad794e5
Merge pull request #197 from Nebelung-Dev/patch-1
fix typo
2024-01-01 18:16:54 -06:00
Cohen Erickson
c920eac3fe
Merge pull request #198 from IncognitoTGT/main
fix: css, broken links, prettier
2024-01-01 18:16:05 -06:00
incognitotgt
d0ef235c24 Prettier and replace class with ClassName 2024-01-01 19:00:00 -05:00
incognitotgt
ddc2f47f97 Games fixed 2024-01-01 18:34:01 -05:00
tgt
f45fe3e089
Merge branch 'NebulaServices:main' into main 2024-01-01 18:08:11 -05:00
incognitotgt
c82da4a4e7 fixed planet not rotating, fixed responsive text size 2024-01-01 18:07:50 -05:00
Nebelung
cece5aea91
fix typo 2024-01-01 13:37:57 -08:00
rift
89229d95e5 AES encryption for dynamic 2024-01-01 13:21:48 -06:00
rift
ccb9f7e6e9
Merge pull request #196 from cohenerickson/main
bump UV
2024-01-01 12:02:40 -06:00
cohenerickson
5943accc9f bump UV 2024-01-01 11:56:26 -06:00
Cohen Erickson
996bb4cdc9
Merge pull request #195 from IncognitoTGT/main
feat: Improved about:blank, ironing out css
2024-01-01 11:09:16 -06:00
incognitotgt
bf85598b21 whitespace? 2024-01-01 11:32:22 -05:00
incognitotgt
326e196bc3 Hides logo text on mobile, removed nonexistent css class 2024-01-01 11:24:17 -05:00
incognitotgt
69a478006a Fixed Japanese being borked in mobile 2024-01-01 10:43:02 -05:00
incognitotgt
5088a33f14 grammer 2023-12-31 23:38:19 -05:00
incognitotgt
dbe076e801 about:blank for entire nebula 2023-12-31 23:36:21 -05:00
tgt
3058151d55
Merge branch 'NebulaServices:main' into main 2023-12-31 22:34:43 -05:00
rift
4b3ddcab1b Ultraviolet AES 2023-12-31 21:31:09 -06:00
incognitotgt
3f3afd9307 No more annoying borders. 2023-12-31 21:50:05 -05:00
incognitotgt
a1b1dfd99a No more annoying borders. 2023-12-31 21:45:45 -05:00
rift
146ef7dc21 Fix invalid themes 2023-12-31 20:13:57 -06:00
rift
dd988979cf Re-add JP logo styling 2023-12-31 18:33:36 -06:00
rift
979afeedff
Merge pull request #193 from IncognitoTGT/main
Changed the default search engine
2023-12-31 17:46:17 -06:00
incognitotgt
8b76d26555 Thought this was not important 💀 2023-12-31 18:43:33 -05:00
incognitotgt
e4e7a69280 Changed the default search engine 2023-12-31 18:37:44 -05:00
rift
e9b95c8e49
Merge pull request #192 from cohenerickson/main
Move dynamic to npm package
2023-12-31 14:59:09 -06:00
cohenerickson
cd2ef3d630 move dynamic to npm package 2023-12-31 14:56:13 -06:00
rift
6c46bea1bd
Merge pull request #191 from IncognitoTGT/main
Themes and css improvements
2023-12-31 13:53:43 -06:00
incognitotgt
dd0dd77898 Improved colors of ALL of the catppuccin icons in settings 2023-12-31 14:41:20 -05:00
incognitotgt
7fc56a5f71 Removed redundant class, weird thing is that it didn't work before wth 2023-12-31 14:15:57 -05:00
incognitotgt
e02c7c7732 Got latte working, also added option for schoology cloaking 2023-12-31 14:07:21 -05:00
incognitotgt
afd295a276 Latte since cohen wanted it bruh 2023-12-31 13:01:36 -05:00
tgt
1acf4544e3
Merge branch 'NebulaServices:main' into main 2023-12-31 01:11:43 -05:00
incognitotgt
1d00f21500 Catppuccin done??!! 2023-12-31 01:11:08 -05:00
incognitotgt
94cc720ee4 Frappe;tabs in settings iffy 2023-12-31 00:59:22 -05:00
rift
de2de61642 Hide URL in embed mode 2023-12-30 22:44:47 -06:00
incognitotgt
6b034d0eeb Fixed typo 2023-12-30 20:50:10 -05:00
incognitotgt
ec5aa81092 Changed Eruda default theming 2023-12-30 18:55:24 -05:00
rift
cb934dba31 Translations and fix typo 2023-12-30 16:10:41 -06:00
rift
c4007c8436 Add theme feature 2023-12-30 16:05:57 -06:00
rift
0c6bdf66f0
Merge pull request #189 from Riftriot/main
Unfuck everything
2023-12-30 14:43:20 -06:00
rift
4603ee4fa5 Fix shit 2023-12-30 14:41:41 -06:00
rift
9203e93d80 Revert "Starting point since I don't want to break something later on"
This reverts commit b4c759eded.
2023-12-30 14:38:31 -06:00
rift
d33e0df2b4 Revert "So it loads, but when I try to set a different theme using localstorage, its broken?"
This reverts commit afbcb52286.
2023-12-30 14:38:22 -06:00
rift
79fca20943 Revert "Dumb ahh left a thing in css, removed and ow works yay"
This reverts commit a934cfc4fd.
2023-12-30 14:38:15 -06:00
rift
962dc1b52e
Merge pull request #188 from IncognitoTGT/main
Got theme backend working, eruda also has a theme that matches with nebula more
2023-12-30 12:06:41 -06:00
incognitotgt
a934cfc4fd Dumb ahh left a thing in css, removed and ow works yay 2023-12-30 13:03:10 -05:00
incognitotgt
afbcb52286 So it loads, but when I try to set a different theme using localstorage, its broken? 2023-12-30 12:08:34 -05:00
incognitotgt
b4c759eded Starting point since I don't want to break something later on 2023-12-30 12:05:48 -05:00
incognitotgt
53912cf730 Merge branch 'main' of https://github.com/IncognitoTGT/Nebula 2023-12-29 19:38:06 -05:00
rift
bfab819827 Finish autofill 2023-12-29 18:29:36 -06:00
tgt
869602ce00
Merge branch 'NebulaServices:main' into main 2023-12-29 18:27:16 -05:00
incognitotgt
92d234ce01 AHHH 2023-12-29 18:26:47 -05:00
rift
00c482aac5
Merge pull request #186 from IncognitoTGT/main
Made code prettier, also tried css for search suggestions. Themes are…
2023-12-29 17:25:40 -06:00
incognitotgt
aa86e2a4d1 fixed corners kinds 2023-12-29 18:22:01 -05:00
incognitotgt
3ba2d8ba06 Made code prettier, also tried css for search suggestions. Themes are coming tommorrow <@578375908247863296> 2023-12-29 18:11:37 -05:00
rift
ab9d7f8096 autofill 2023-12-29 14:09:52 -06:00
rift
6937e7c993 Autofill backend 2023-12-29 11:20:07 -06:00
rift
125878676f Downgrade UV 2023-12-28 20:20:42 -06:00
rift
1b750df0f1
Merge pull request #185 from NebulaServices/dev
Merge UV and Dynamic SW files
2023-12-28 13:55:54 -06:00
cohenerickson
ebb6a436a6 Merge Dynamic and UV sw 2023-12-28 13:53:00 -06:00
Cohen Erickson
2ea3f4e0f7
Merge pull request #184 from NebulaServices/main
Fix dev -> main workflow
2023-12-28 13:43:37 -06:00
rift
5ed9819c4f Make AES more random 2023-12-28 11:50:58 -06:00
rift
89064c7e15
Merge pull request #183 from IncognitoTGT/main 2023-12-28 11:29:18 -06:00
rift
554dd33007 aes 2023-12-28 11:28:32 -06:00
incognitotgt
a359d5ec21 Update IframeHeader and localization files 2023-12-28 12:06:19 -05:00
incognitotgt
f374a77881 <@578375908247863296>
Fixed the iframe selecting when you click navbar, fixed navbar css, and fixed file extensions.
2023-12-28 10:45:31 -05:00
rift
5377d71c1f
Merge pull request #182 from NebulaServices/rewrite
Rewrite
2023-12-27 19:13:34 -06:00
rift
559211ea2c Merge branch 'rewrite' of https://github.com/NebulaServices/Nebula into rewrite 2023-12-27 19:10:24 -06:00
rift
c8e8fe6311 give package.json a name 2023-12-27 19:10:12 -06:00
rift
610e03a974
Update README.md 2023-12-27 19:06:22 -06:00
rift
b81e686fc2 radon games and discord emebed tags 2023-12-27 18:55:14 -06:00
rift
bc73f5d3f3 about blank mode 2023-12-27 18:44:35 -06:00
rift
4f8f18f0ff
Merge pull request #181 from IncognitoTGT/rewrite
Nav buttons and some polish
2023-12-27 18:28:56 -06:00
incognitotgt
1d360430a6 Merge branch 'rewrite' of https://github.com/IncognitoTGT/Nebula into rewrite 2023-12-27 19:13:20 -05:00
incognitotgt
fc6c4a1c6d Got navigation buttons, haha merge conflict 2023-12-27 19:13:09 -05:00
incognitotgt
949e922606 Got navigation buttons, haha merge conflict 2023-12-27 19:12:47 -05:00
tgt
4f7ed25e99
Merge branch 'NebulaServices:rewrite' into rewrite 2023-12-27 18:53:14 -05:00
rift
e14f84d1bb Search engines 2023-12-27 17:14:12 -06:00
rift
04cf73e84a Use LoadSuspense for proxy router 2023-12-27 16:58:41 -06:00
tgt
5fdd61587e
Merge branch 'NebulaServices:rewrite' into rewrite 2023-12-27 16:21:02 -05:00
rift
5c256323dc FINAL touch up I swear 2023-12-27 15:16:59 -06:00
rift
5e71f49325 accidently pushed broken code 2023-12-27 15:15:50 -06:00
rift
24068f354d overflow fix 2023-12-27 15:13:30 -06:00
rift
c954fab097 add suspense 2023-12-27 15:09:49 -06:00
rift
6db77d4785 Coming soon locales 2023-12-27 14:40:51 -06:00
rift
7c295529ac forgot to completely remove buggy warning 2023-12-27 14:34:49 -06:00
rift
1c48eb2a65 basic suspense 2023-12-27 14:19:48 -06:00
incognitotgt
1b2f57e7d0 Merge branch 'rewrite' of https://github.com/IncognitoTGT/Nebula into rewrite 2023-12-27 15:10:09 -05:00
incognitotgt
03130a415d fixed the nebula link, why the hell is it w-1/2 2023-12-27 15:02:08 -05:00
rift
4281edb7a7 spotify added to sitesupport.json 2023-12-27 13:50:42 -06:00
rift
2520dbfa44 Remove dynamic buggy warning 2023-12-27 13:47:09 -06:00
rift
99aa37675e Fix type errors and naming 2023-12-27 13:28:54 -06:00
rift
5ba1c539ce
Merge pull request #180 from IncognitoTGT/rewrite
Added Eruda support for iframe view.
2023-12-27 13:12:51 -06:00
incognitotgt
d51b9bfc25 Added Eruda support for iframe view. ts-ignore is since typescript can't tell the iframe is not in the same file as IframeHeader.tsx 2023-12-27 13:39:06 -05:00
rift
4d7c8449d8 Tab cloaking 2023-12-27 10:46:42 -06:00
rift
78635d2671
Merge pull request #178 from MotorTruck1221/rewrite
Fix up Mobile support
2023-12-27 09:09:09 -06:00
MotorTruck1221
c4debda932 Fixup searchbar for mobile 2023-12-27 03:41:33 -07:00
MotorTruck1221
76163c96d3 Fixup settings for mobile and niceness 2023-12-27 03:32:56 -07:00
MotorTruck1221
38a4e86eff Mobile nav update 2023-12-27 03:17:17 -07:00
rift
196e19714d Discord logo 2023-12-26 23:36:48 -06:00
rift
9a7991c982 Title translations and touch-ups 2023-12-26 23:04:26 -06:00
rift
1aa4da81cf Forgot to delete these; these are gonna be a pain to maintain so they're going 2023-12-26 22:26:52 -06:00
rift
3821c227da Fix discord, make embeded default proxy mode 2023-12-26 22:16:58 -06:00
rift
c771252e78 SiteSupport.json for automatic mode 2023-12-26 21:44:15 -06:00
rift
2b1e62c830 The hackiest workaround in the history of hacky workarounds 2023-12-26 20:14:33 -06:00
rift
1865161d73 Revert "Basic search engine shit"
This reverts commit 6372debdff.
2023-12-26 17:59:08 -06:00
rift
950c60ba62 Revert "Im gonna push before I break anything"
This reverts commit b5b1a2848a.
2023-12-26 17:58:59 -06:00
rift
b5b1a2848a Im gonna push before I break anything 2023-12-26 17:37:57 -06:00
rift
6372debdff Basic search engine shit 2023-12-26 17:12:13 -06:00
rift
b0ed0359a9
Merge pull request #177 from MotorTruck1221/rewrite
Add Iframe
2023-12-26 16:15:28 -06:00
MotorTruck1221
198fb1ea5e Finishing touches 2023-12-26 15:13:01 -07:00
MotorTruck1221
f36e0c328d start command 2023-12-26 15:00:19 -07:00
MotorTruck1221
935f029485 Add exit button 2023-12-26 14:59:32 -07:00
MotorTruck1221
ad67368a45 Prettier Format 2023-12-26 03:51:37 -07:00
MotorTruck1221
3a9024d1e0 Add embed option and component
Other fixes: tiles in proxy page for settings, updated search function, fixed defaults
2023-12-26 03:38:24 -07:00
rift
6235ebfe24
Merge pull request #176 from flufferyomada/rewrite
Add: German, Dutch, and Greek translation Locales
2023-12-24 20:03:56 -06:00
Fluffery
e56d7d678d
Update de.json
Nebula -> Nebel 
German translation for Nebula
2023-12-25 01:52:57 +00:00
Fluffery
83e67be465
Create gr.json 2023-12-25 01:49:08 +00:00
Fluffery
6a84dac2f8
Update es.json 2023-12-25 01:11:26 +00:00
Fluffery
a1a0d22524
Update ja.json 2023-12-25 01:11:13 +00:00
Fluffery
0e995129e4
Update en.json 2023-12-25 01:10:51 +00:00
Fluffery
34bfa8bbfc
Update de.json 2023-12-25 01:09:13 +00:00
Fluffery
34acb03fb6
Update de.json
forgot this,
this isn't links because Links in german means Left not URL 
made it URL-Address
2023-12-25 01:08:11 +00:00
Fluffery
05d56020f0
Create de.json
i probs fucked up german articles but like :woozy:
2023-12-25 01:01:08 +00:00
rift
f11c377294 proxyframe dev (WIP) 2023-12-22 16:55:43 -06:00
rift
5f27a4bc92 add open in settings (no functionality) 2023-12-22 16:07:45 -06:00
rift
e029578798
Merge pull request #173 from cohenerickson/rewrite
Spanish translations & move some files around
2023-12-22 15:44:39 -06:00
Cohen Erickson
d16d842fa3 Add spanish translations 2023-12-22 15:29:32 -06:00
Cohen Erickson
20feb65b80 Move some things around to be more consistent 2023-12-22 15:15:39 -06:00
Cohen Erickson
da7edfe3e4 gitignore package lock (redundant from pnpm lock) 2023-12-22 15:02:08 -06:00
rift
db2b7a6c2f Add dynamic, finishing basic proxy functionality 2023-12-21 13:04:59 -06:00
rift
6d99559768 Revert "Add Dynamic Support"
This reverts commit e74459ecb9.
2023-12-21 11:43:40 -06:00
rift
0738ec8547
Merge pull request #172 from Notplayingallday383/rewrite
Add Dynamic Support
2023-12-21 11:27:45 -06:00
John
e74459ecb9
Add Dynamic Support 2023-12-21 12:23:50 -05:00
rift
c28d823d7c Submission validation 2023-12-21 10:53:46 -06:00
rift
d72028ce78 Fix name UV config is not defined 2023-12-21 10:30:49 -06:00
rift
5270ad40ab Add ultraviolet 2023-12-21 10:24:16 -06:00
rift
ae499f760c adjust UV scope 2023-12-21 09:39:49 -06:00
rift
c7dde37754
Merge pull request #171 from MotorTruck1221/rewrite
Fixes
2023-12-21 09:15:16 -06:00
MotorTruck1221
4f67411488 Fixes
This fixes the service worker not registering, and the config for UV
2023-12-21 01:22:57 -07:00
rift
e1064e82ad Merge branch 'rewrite' of https://github.com/NebulaServices/Nebula into rewrite 2023-12-20 22:25:08 -06:00
rift
765f27f4f3 footer 2023-12-20 22:20:13 -06:00
rift
b499f73db6 simple form submission 2023-12-20 21:59:51 -06:00
rift
aa095c4cac
Create README.md 2023-12-20 21:31:24 -06:00
rift
4f13c42b6e FEAT: ADD RAMMER(HELL)HEAD 2023-12-20 21:26:58 -06:00
Riftriot
af18beb134 Set up backend 2023-12-20 14:02:34 -06:00
rift
83fb885e8b More settings styles 2023-12-17 21:06:08 -06:00
rift
a8ed8e55c2 Dropdown styling and init react helmet 2023-12-17 17:57:17 -06:00
rift
4e03679c70 Dropdown style improvements 2023-12-17 15:00:59 -06:00
rift
e8dc26de91 WIP: Dropdown css 2023-12-17 12:03:26 -06:00
rift
9e2b7993a8 language switcher 2023-12-17 11:40:41 -06:00
rift
0f7297aa70 Translation support for dropdown.tsx component 2023-12-16 14:13:04 -06:00
rift
fe85a1c33a
Merge pull request #168 from FireStreaker2/rewrite
dropdown
2023-12-16 12:09:05 -06:00
FireStreaker2
2358e327b4 dropdown 2023-12-16 10:02:11 -08:00
rift
90a858d1e3 feat: framer motion settings 2023-12-15 21:36:00 -06:00
rift
83f1083d75 Set up ProxyFrame.tsx for later use 2023-12-15 19:00:06 -06:00
rift
8a26062442 Add input expand animation and fix Japanese header on mobile 2023-12-15 17:17:52 -06:00
rift
83d85a037e
Merge pull request #166 from cohenerickson/rewrite
Reset UV naming & route specific headers
2023-12-15 09:44:42 -06:00
cohenerickson
6c5a0f33ae Header/Headerless routes 2023-12-15 09:35:42 -06:00
rift
9ddc933d7e
Merge pull request #165 from FireStreaker2/rewrite
mobile navbar support
2023-12-14 23:33:12 -06:00
FireStreaker2
50b1050b20 mobile navbar support 2023-12-14 21:19:19 -08:00
cohenerickson
396e1f7233 change to traditional UV file naming 2023-12-14 17:25:35 -06:00
Riftriot
07b205ee31 clean up discord import 2023-12-14 14:22:44 -06:00
rift
186d24b1b1
Merge pull request #164 from cohenerickson/rewrite
Fix prettier and reconfigure UV with npm package
2023-12-14 12:15:06 -06:00
cohenerickson
118c3d8949 configure UV & bare 2023-12-14 10:13:05 -06:00
cohenerickson
4aae71dbdb Basic vscode settings to make development more efficient 2023-12-14 08:51:59 -06:00
cohenerickson
2fe742f3f0 run npm run format 2023-12-14 08:45:54 -06:00
cohenerickson
99b08aff08 delete ultraviolet files 2023-12-14 08:45:23 -06:00
cohenerickson
6a76eee11f Fix prettier config & dependencies 2023-12-14 08:44:24 -06:00
rift
ea8bcdfc72
Merge pull request #161 from FireStreaker2/rewrite
hover effect
2023-12-13 20:55:16 -06:00
FireStreaker2
2f86f1c004 hover effect 2023-12-13 18:51:07 -08:00
rift
25c4a1e9ce Major header and routing improvments 2023-12-13 19:38:01 -06:00
rift
226560dc52 fix incosistensy in Japanese header (..i think?) 2023-12-13 17:40:01 -06:00
rift
9f89ba3c48 Fix japanese ver of header and add translations for the discord page 2023-12-13 17:28:10 -06:00
rift
aa2edd9ab6
Merge pull request #159 from Notplayingallday383/v8-dev
Add Links and a simple Discord page
2023-12-13 17:14:15 -06:00
John
910e20575d Gonna work on TB anyways init UV 2023-12-13 16:19:29 -05:00
John
0ff7c2c385 Simple Discord Page 2023-12-13 16:03:09 -05:00
John
d8c3eb8380 Add Links 2023-12-13 15:45:53 -05:00
illusionTBA
0e113e57e3 import EN -> en 2023-12-13 15:25:47 -05:00
rift
cb8d6ff7c5 I forgot what I changed 2023-12-12 19:45:35 -06:00
rift
d98d988b7b Input and fix font / TODO: Input placeholder translation 2023-12-12 18:01:16 -06:00
rift
533376a592 Japanese translations for header (probably incorrect) 2023-12-11 17:34:18 -06:00
rift
57c7cda58b header 2023-12-10 21:19:24 -06:00
rift
bb68711a48 this timer is stupud im not doing it 2023-12-10 19:44:18 -06:00
rift
ddfb2ec900 working clock 2023-12-10 19:36:45 -06:00
rift
71d65f2cda Hell (working) 2023-12-10 19:01:34 -06:00
rift
8a7b7d69a7 raaah get basic css done 2023-12-10 17:41:54 -06:00
rift
9256abebb1 inital commit 2023-12-10 13:22:17 -06:00
Green!
7c4c9bcfa5
Merge pull request #133 from NebulaServices/dependabot/npm_and_yarn/semver-6.3.1
Bump semver from 6.3.0 to 6.3.1
2023-08-21 10:18:43 -04:00
Green!
7540494cb2
Merge pull request #135 from Greenlio/patch-1
CVE-2022-2309
2023-07-25 12:47:22 -04:00
Gavin
a448293c61
CVE-2022-2309
fixes old node version which is vulnerable to https://www.cve.org/CVERecord?id=CVE-2022-2309

Introduced through: node@18 -> libxml2@2.9.14+dfsg-1.2
Fix: Upgrade to libxml2@2.9.14+dfsg-1.3~deb12u1 <- node:20.4-bookworm-slim
2023-07-25 03:58:10 -05:00
Green!
1866eec91a
Merge pull request #134 from Nailington/patch-1
Update package.json
2023-07-15 22:30:31 -04:00
Nailington
526e781823
Update package.json
Node version is now 18 or greater
2023-07-15 19:20:06 -04:00
dependabot[bot]
679ee2f17e
Bump semver from 6.3.0 to 6.3.1
Bumps [semver](https://github.com/npm/node-semver) from 6.3.0 to 6.3.1.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/v6.3.1/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v6.3.0...v6.3.1)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-12 22:50:45 +00:00
Cohen Erickson
b81147ed0c
Merge pull request #124 from NebulaServices/snyk-upgrade-94873d6c3459d975e729e89fc45f2400 2023-06-08 00:00:33 -05:00
snyk-bot
0e97d0bba1
fix: upgrade nodemailer from 6.9.1 to 6.9.2
Snyk has created this PR to upgrade nodemailer from 6.9.1 to 6.9.2.

See this package in npm:
https://www.npmjs.com/package/nodemailer

See this project in Snyk:
https://app.snyk.io/org/greenydev/project/d2cc9035-af19-487f-bbb7-3d864ce3a3c3?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-06-02 01:17:06 +00:00
Green!
47826c87f0
Merge pull request #120 from riolubruh/main
Specify Node 19.x in package.json
2023-05-23 11:03:41 -04:00
riolubruh
3c78a889cf
Change to specify Node 19.x 2023-05-23 09:52:03 -05:00
Green!
995049f118
Merge pull request #119 from NebulaServices/GreenyDEV-patch-3
Update README.md
2023-05-23 09:40:54 -04:00
Green!
0b9dde7240
Update README.md 2023-05-23 09:40:42 -04:00
Green!
9d09efef33
Update README.md 2023-05-23 09:39:26 -04:00
Green!
2f99b5bdbc
Update README.md 2023-05-23 09:12:23 -04:00
Green!
5cf7555b11
Merge pull request #118 from NebulaServices/GreenyDEV-patch-2
Update README.md
2023-05-23 09:11:43 -04:00
Green!
984eba8f13
Update README.md 2023-05-23 09:11:28 -04:00
Green!
8c7e014ad9
Merge pull request #117 from CountBleck/remove-repl-heroku-render
Remove the Heroku, Repl.it, and Render deploy buttons
2023-05-21 19:49:09 -04:00
CountBleck
6594005640
Remove any config files concerning Repl.it and Render
They will no longer be needed.
2023-05-21 16:29:39 -07:00
CountBleck
4c36b8ec87
Remove the Heroku, Repl.it, and Render deploy buttons
Fixes #116.
2023-05-21 16:24:57 -07:00
Cohen Erickson
762a2891ab
Merge pull request #113 from NebulaServices/snyk-upgrade-c871370e3a310d118ca044d4ed418cae
[Snyk] Upgrade @tomphttp/bare-server-node from 1.2.3 to 1.2.5
2023-05-15 12:42:41 -05:00
Cohen Erickson
ec2668d2cb
Merge branch 'main' into snyk-upgrade-c871370e3a310d118ca044d4ed418cae 2023-05-15 12:42:26 -05:00
Green!
e566a869d1
Merge pull request #111 from NebulaServices/snyk-fix-808d3f5ee6abab14c62692155a4a2a1a
[Snyk] Security upgrade node from alpine to 18
2023-05-15 13:40:49 -04:00
Cohen Erickson
4e6f751874
Merge pull request #112 from NebulaServices/snyk-upgrade-ade89e437ff6897659a367342b089687
[Snyk] Upgrade @titaniumnetwork-dev/ultraviolet from 1.0.8-beta to 1.0.11
2023-05-15 12:40:26 -05:00
snyk-bot
4b3b9cde50
fix: upgrade @tomphttp/bare-server-node from 1.2.3 to 1.2.5
Snyk has created this PR to upgrade @tomphttp/bare-server-node from 1.2.3 to 1.2.5.

See this package in npm:
https://www.npmjs.com/package/@tomphttp/bare-server-node

See this project in Snyk:
https://app.snyk.io/org/greenydev/project/d2cc9035-af19-487f-bbb7-3d864ce3a3c3?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-05-15 17:24:37 +00:00
snyk-bot
1e33f82b51
fix: upgrade @titaniumnetwork-dev/ultraviolet from 1.0.8-beta to 1.0.11
Snyk has created this PR to upgrade @titaniumnetwork-dev/ultraviolet from 1.0.8-beta to 1.0.11.

See this package in npm:
https://www.npmjs.com/package/@titaniumnetwork-dev/ultraviolet

See this project in Snyk:
https://app.snyk.io/org/greenydev/project/d2cc9035-af19-487f-bbb7-3d864ce3a3c3?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-05-15 17:24:32 +00:00
Cohen Erickson
4957cd27ec
Update Dockerfile 2023-05-14 22:27:11 -05:00
Green!
0e32994bb9
Create dependabot.yaml 2023-05-14 21:21:16 -04:00
snyk-bot
e2d90fbf5b
fix: Dockerfile to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-ALPINE317-OPENSSL-5438697
- https://snyk.io/vuln/SNYK-ALPINE317-OPENSSL-5438697
2023-05-15 01:17:08 +00:00
Green!
4a3b7775ee
Merge pull request #110 from NebulaServices/GreenyDEV-patch-1
Update README.md
2023-05-11 21:31:13 -04:00
Green!
9dd7badad5
Update README.md 2023-05-11 21:30:55 -04:00
Green!
3bc8f31a0b
Merge pull request #104 from GreenyDEV/main
Fixes Cyclic Read only filesystem bug
2023-04-28 20:52:14 -04:00
GreenyDev
6c7d34b59b tmp 2023-04-28 20:50:40 -04:00
GreenyDev
ac35b7a61c tmp 2023-04-28 20:49:20 -04:00
GreenyDev
4836de517c tmp 2023-04-28 20:47:15 -04:00
Green!
b721bce67b
Merge pull request #100 from eparitzi/patch-1
Create watch.json
2023-04-27 11:23:30 -04:00
Green!
f02a8802fc
Merge pull request #99 from wearrrrr/polishing-patch
General polishing changes to Nebula
2023-04-27 11:22:26 -04:00
eparitzi
7adf76df16
Create watch.json 2023-04-20 19:21:54 -05:00
wearrrrr
ae0085106b General polishing changes to Nebula 2023-04-19 04:47:31 -05:00
GreenyDev
d937871cf6 More themes, somewhat better application system 2023-04-13 10:28:53 -04:00
Green!
110ebfe99b
Merge pull request #97 from wearrrrr/surname_adjective_patch
Cut about 100 lines from the nebulamain.js file! 🎉
2023-04-13 08:26:38 -04:00
wearrrrr
3c48bc02f8 Modularize nebula JS files and add maps for osana 2023-04-12 22:54:41 -05:00
wearrrrr
afe883a31a Make "connecting to service" text more accurate 2023-04-12 22:35:00 -05:00
wearrrrr
050c8f6899 Fix nogg getRandomName() 2023-04-12 19:51:12 -05:00
wearrrrr
0fcc6ad107 Cut about 100 lines from the nebulamain.js file. 2023-04-12 19:22:04 -05:00
Green!
db118d95db
Merge pull request #94 from FireStreaker2/main
make nebula deployable on render
2023-04-07 10:26:58 -04:00
FireStreaker2
0c0120d522 ready for prod 2023-04-06 19:18:14 -07:00
FireStreaker2
604bdcc75f
fix deploy file 2023-04-06 18:57:21 -07:00
FireStreaker2
ecc3ab8a08 test for render deploy 2023-04-06 18:44:09 -07:00
Green!
1b99f0f281
Update version.json 2023-03-09 13:46:13 -05:00
Green!
3713e8d134
Merge pull request #85 from Cattn/main
Fix AB Title & Favicon
2023-02-27 14:13:41 -05:00
Logan
5dcb0e72c1 Fix AB Title & Favicon 2023-02-27 14:11:15 -05:00
Logan
c44622d9b0
Merge pull request #79 from Cattn/main
Custom CSS, AB Customization, UV linking/config fix
2023-02-27 13:58:40 -05:00
Cohen Erickson
059526d961
Fix UV 2023-02-27 12:33:47 -06:00
Logan
d2a5ff1ace
Merge branch 'NebulaServices:main' into main 2023-02-26 23:13:47 -05:00
Green!
180fa64420
Merge pull request #80 from cohenerickson/main
Fix service worker registration
2023-02-13 20:09:02 -05:00
Cohen Erickson
8603734c7a Fix missing memory.txt issue 2023-02-14 01:04:34 +00:00
Cohen Erickson
065f5c18e7 Merge branch 'main' of https://github.com/cohenerickson/Nebula 2023-02-14 00:58:37 +00:00
Cohen Erickson
6f8cf69e8c Fix / <--> /login loop 2023-02-14 00:58:36 +00:00
Cohen Erickson
f517b6838b Fix service worker registration 2023-02-14 00:58:04 +00:00
Logan
c3557c5f8d Custom CSS Feature + AB Cloak Customization
Not sure if the AB Cloak is working 100%, so if someone could test it out would appreciate. (Probably won't break AB if not?)
2023-02-13 19:30:57 -05:00
Logan
590572bbe2 Revert "Custom CSS Feature + AB Cloak Customization"
This reverts commit b807362823.
2023-02-13 18:29:30 -05:00
Logan
b807362823 Custom CSS Feature + AB Cloak Customization
Not sure if the AB Cloak is working 100%, so if someone could test it out would appreciate. (Probably won't break AB if not?)
2023-02-13 18:13:48 -05:00
Cohen Erickson
9de8d5fa48
Merge pull request #76 from cohenerickson/main 2023-02-10 16:34:09 -06:00
Cohen Erickson
b6581f3c62
Update README.md 2023-02-10 14:25:59 -06:00
Cohen Erickson
002c3a18cc Merge branch 'main' of https://github.com/cohenerickson/Nebula 2023-02-09 21:30:54 +00:00
Cohen Erickson
da9527c662 fix supported sites link 2023-02-09 21:30:52 +00:00
Cohen Erickson
62a63f42d5
Restore deployment.config.json 2023-02-09 15:24:11 -06:00
Cohen Erickson
20b45caba9 remove unused packages 2023-02-07 01:01:49 +00:00
Cohen Erickson
326d59bff2 Refactor & implement verification 2023-02-07 00:22:54 +00:00
Cohen Erickson
ec2807105a Remove glitch quick deploy 2023-02-06 18:52:42 +00:00
Cohen Erickson
611772c5fd Merge branch 'main' of https://github.com/cohenerickson/Nebula 2023-02-06 04:07:53 +00:00
Cohen Erickson
705c60a664 delete memory.txt 2023-02-06 04:06:33 +00:00
Cohen Erickson
7419f3bc83 fix syntax erros in options page & format w/ prettier 2023-02-06 03:23:36 +00:00
Green!
08afaff9f9
Merge pull request #75 from cohenerickson/main
Format using prettier & bump NodeJS version requirements. [hyper epic !]
2023-02-05 21:49:29 -05:00
Cohen Erickson
512ecbf44b Update nodejs version requirements 2023-02-05 18:29:22 +00:00
Cohen Erickson
6376a1da6a Format using prettier 2023-02-05 18:24:10 +00:00
Cohen Erickson
5dfba8b29d Add prettier 2023-02-05 18:12:00 +00:00
Cohen Erickson
dbd8d8ab60 update versions 2023-02-05 18:07:28 +00:00
Green!
24772eb6c0
Merge pull request #72 from cowingtonpost1/main
Add SMTP and discord webhooks for verification codes
2023-02-04 21:21:11 -05:00
Green!
4235be8e02
Merge pull request #74 from NebulaServices/main
Remove bare switcher & update Devcontainer files
2023-02-04 20:27:01 -05:00
Cohen Erickson
3288b37be7 Remove bare switcher & update devcontainer files 2023-02-04 16:34:33 +00:00
Cowington Post
c965b8de27 documentation fixes 2023-02-02 15:32:14 -08:00
Cowington Post
0b5a4c8bbc Added documentation for new verification codes system 2023-02-02 15:22:16 -08:00
Cowington Post
3953acdad0 Added SMTP and discord webhooks 2023-01-30 08:38:40 -08:00
Green!
6bbdaa921c
Merge pull request #69 from Cattn/main
Fix Settings wording
2023-01-29 15:00:19 -05:00
Logan
0b89fa5ec1 Fix Settings wording 2023-01-29 11:21:55 -05:00
Green!
e02c89527d
Delete _config.yml 2023-01-24 12:39:44 -05:00
Green!
1f8ee54615
Merge pull request #65 from EnderKingJ/patch-1
better uv logging to fix the customBare error
2023-01-23 15:56:55 -05:00
Ender
18b708ab15
Update uv.sw.js 2023-01-23 13:57:54 -05:00
Ender
439a7b088a
Update uv.sw.js 2023-01-23 13:53:10 -05:00
Green!
7f197e3316
Merge pull request #55 from NebulaServices/__devtesting
BareSwitcher options module
2023-01-03 16:33:13 -05:00
GreenyDev
dd3470259c Finalize BareSwitcher, clean up the edges n whatnot 2023-01-03 16:31:37 -05:00
GreenyDev
8061f621f2 good luck SSD 2023-01-02 23:26:39 -05:00
Green!
e6ea7b32f8
Delete docs directory 2022-12-13 10:33:18 -05:00
Green!
5ce75560f7
Merge pull request #48 from GreenyDEV/main
Add MetaData (SEO) To Nebula
2022-12-13 10:03:42 -05:00
Green!
2fa8667d5f
Update index.html 2022-12-13 10:02:54 -05:00
Green!
8267cc1351
Update README.md 2022-12-09 09:21:37 -05:00
Green!
562c5e503f
Typo fix*
*: Fixed system to struct
2022-12-09 09:21:19 -05:00
Green!
f600ee2554
Merge pull request #45 from GreenyDEV/main
Documentation (and a bug fix)
2022-12-09 08:12:41 -05:00
Green!
84105fe4ba
Merge pull request #44 from schooldev49/main
Fix Nebula's clock not showing correct AM/PM time.
2022-12-09 08:11:19 -05:00
Green!
619388686e
Add item to TOC 2022-12-09 08:06:37 -05:00
Green!
669b6334c9
Final documentation 2022-12-09 08:06:05 -05:00
Green!
9ddbb1fa41
Merge branch 'NebulaServices:main' into main 2022-12-09 07:50:55 -05:00
Green!
d5bc79f198
Update nebulamain.js 2022-12-09 07:49:58 -05:00
schooldev49
3675f1169e
Update nebulamain.js 2022-12-07 21:15:46 -05:00
schooldev49
e7c14465af
Update nebulamain.js 2022-12-07 21:11:21 -05:00
Green!
dad9f18bf5
Create FUNDING.yml 2022-12-06 21:57:32 -05:00
Green!
bfa98aaac1
Merge pull request #41 from schooldev49/main
Fix Stealth Mode games button
2022-12-04 11:04:36 -05:00
schooldev49
9657a61b0c
Update nebulamain.js 2022-12-03 18:35:35 -05:00
Green!
fb3faa75f5
Merge pull request #38 from MotorTruck1221/docker
Add Docker Compose Port Option
2022-12-02 22:38:52 -05:00
MotorTruck1221
0fe42ca3e0 Rename to docker-compose.yml instead of docker-compose.yaml, Add Ports and comments 2022-12-02 12:56:56 -07:00
MotorTruck1221
7ee142a7ed Add ports to docker compose 2022-12-02 12:54:05 -07:00
Green!
516f72a8b7
Update README.md 2022-11-29 09:40:15 -05:00
Green!
242c18e682
Merge pull request #37 from GreenyDEV/main
Fix Nebula versioning on HTML pages [ non breaking ]
2022-11-24 15:13:00 -05:00
Green!
0409f444d0
remove comment versioning 2022-11-24 15:09:02 -05:00
Green!
f7e10eef5a
Update on-page versioning (and remove comment versioning) 2022-11-24 15:08:34 -05:00
Green!
05fc45512a
Merge pull request #36 from CountBleck/fixes
Clean up dependencies and license
2022-11-23 15:10:07 -05:00
CountBleck
767b1d7075
Clean up dependencies and license
The license field in package.json now uses a valid SPDX identifier. Once
again, you are not supposed to insert whatever string you want. This is
the second time I made a change like this. The first time was commit
a83063cf10.

This commit also removes unnecessary dependencies from the Cyclone era
and bumps the versions of those that remain.
2022-11-23 11:42:35 -08:00
Green!
4bc3ff47d1
Merge pull request #35 from GreenyDEV/main
fix games button [HOTFIX]
2022-11-14 09:56:27 -05:00
Green!
255e39e95f
fix games button [HOTFIX] 2022-11-14 08:59:36 -05:00
Green!
b1441fa647
Update README.md 2022-11-13 23:44:20 -05:00
Green!
38dde4ed38 Several major changes: Added verification system, better loading screen, added documentation, optimizations, cleanups, etc, and finally fixed Markdown. 2022-11-14 04:16:59 +00:00
Green!
bf0c2fb307
Update README.md 2022-11-01 10:44:02 -04:00
Green!
d19545c2c6
Merge pull request #33 from jodaAtGithub/main
Cleanup: delete and ignore temporary OS file (.DS_Store)
2022-10-31 07:54:23 -04:00
jodaAtGithub
7bbbb1749c
Delete .DS_Store 2022-10-30 23:41:01 +01:00
Green!
f813000a94
Merge pull request #30 from GreenyDEV/main
Remove support forum button because of incorrect placement
2022-10-18 21:08:51 -04:00
Green!
95121cf859
Remove support forum button because of incorrect placement 2022-10-18 21:08:29 -04:00
Green!
ea2a2b98f4
Merge pull request #29 from cohenerickson/main
Purge Cyclone
2022-10-17 10:08:38 -04:00
Cohen Erickson
5885af8ebf Purge Cyclone 2022-10-16 17:14:57 +00:00
Green!
ce625b6d3a
Merge pull request #28 from Snazzy-xyz/main
Please merge Support forum link
2022-10-15 21:59:53 -04:00
Snazzy
f73d749bc9
proxying the link 2022-10-15 16:28:18 -04:00
Snazzy
107026eecc
fixed link 2022-10-15 16:06:22 -04:00
Snazzy
190b3c2aa6
removed typo 2022-10-15 16:00:08 -04:00
Snazzy
2f1a5e6886
changed id 2022-10-15 15:53:43 -04:00
Snazzy
4589d4e6de
Added Support forum link
I quickly added a link to the support forum, didn't bother making it fancy or whatever, also I just quickly pasted in the Repl beta link there for testing purposes. The rest is up to you. If you'd like I could give the source code for the support forum so you can integrate it in Nebula.
2022-10-15 15:49:56 -04:00
Green!
3229601d27
Merge pull request #27 from GreenyDEV/main
fix minor vocabulary and change cyclone to legacy, docs update
2022-10-10 07:41:48 -04:00
Green!
95629f4546
Update some stuff, add advanced deployment tutorial 2022-10-09 14:42:39 -04:00
Green!
f897346724
fix the patreon doc 2022-10-08 21:56:59 -04:00
Green!
d34fa93322
fix minor vocabulary and change cyclone to legacy 2022-10-08 21:52:03 -04:00
Green!
2cab377e83
Merge pull request #26 from CountBleck/fixes
Fix Cyclone loading
2022-10-08 21:46:13 -04:00
CountBleck
46240e45e3
Null commit to prevent signature clobbering
GitHub, don't edit my commit when this PR is merged. Thank you.
2022-10-08 17:51:27 -07:00
CountBleck
353fc106b4
Fix Cyclone loading
How did this get messed up in the first place?
2022-10-08 17:50:38 -07:00
141 changed files with 14039 additions and 8848 deletions

12
.changeset/config.json Normal file
View file

@ -0,0 +1,12 @@
{
"$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json",
"changelog": ["@changesets/changelog-github", { "repo": "nebulaservices/nebula" }],
"commit": false,
"fixed": [],
"linked": [],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": [],
"privatePackages": { "version": true, "tag": true }
}

17
.dockerignore Normal file
View file

@ -0,0 +1,17 @@
node_modules/
.vscode
npm-debug.log
yarn-error.log
.github/
.env.example
.env
dist/
.git/
.astro/
~/
.gitignore
biome.json
docker-compose.yml
Dockerfile
README.md
db/

50
.github/workflows/docker.yml vendored Normal file
View file

@ -0,0 +1,50 @@
name: Build Docker image
on:
push:
tags:
- v*
workflow_dispatch:
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push:
name: Build and push Docker image to registry
runs-on: ubuntu-latest
if: github.repository_owner == 'nebulaservices'
permissions:
contents: write
packages: write
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
submodules: true
- name: Setup docker buildx
uses: docker/setup-buildx-action@v3
- name: Login To registry ${{ env.REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ github.token }}
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v3
with:
images: ${{ env.REGISTRY }}/nebulaservice/nebula
- name: Build and push
id: build-and-push
uses: docker/build-push-action@v4
with:
context: .
platforms: linux/amd64,linux/arm64
file: ./Dockerfile
name: nebula
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max

50
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,50 @@
name: Release
on:
push:
branches:
- main
workflow_dispatch:
defaults:
run:
shell: bash
env:
FORCE_COLOR: true
jobs:
changelog:
name: Release TAG
if: ${{ github.repository_owner == 'nebulaservices' }}
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write
steps:
- uses: actions/checkout@v4
- name: Setup PNPM
uses: pnpm/action-setup@v3
with:
version: 9.1.1
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18
cache: "pnpm"
- name: Install dependencies
run: pnpm install --no-frozen-lockfile
- name: Create Release Pull Request or Publish
id: changesets
uses: changesets/action@v1
with:
version: pnpm run version
publish: pnpm exec changeset publish
commit: "[ci] release"
title: "[ci] release"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

43
.gitignore vendored
View file

@ -1,2 +1,43 @@
/node_modules
# build output
dist/
server/*.js
# generated types
.astro/
# dependencies
node_modules/
package-lock.json
#external assets
database_assets/*
!database_assets/com.nebula.gruvbox/
!database_assets/com.nebula.lightTheme/
!database_assets/com.nebula.oled/
!database_assets/com.nebula.retro/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
# jetbrains setting folder
.idea/
# nebula catalog database
database.sqlite
# YOUR config
config.toml
# Goofy PNPM problem
~/

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "workerware"]
path = workerware
url = https://github.com/mercuryworkshop/workerware

72
.replit
View file

@ -1,72 +0,0 @@
hidden = [".config"]
run = "npm start"
[[hints]]
regex = "Error \\[ERR_REQUIRE_ESM\\]"
message = "We see that you are using require(...) inside your code. We currently do not support this syntax. Please use 'import' instead when using external modules. (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import)"
[nix]
channel = "stable-21_11"
[env]
XDG_CONFIG_HOME = "/home/runner/.config"
PATH = "/home/runner/$REPL_SLUG/.config/npm/node_global/bin:/home/runner/$REPL_SLUG/node_modules/.bin"
npm_config_prefix = "/home/runner/$REPL_SLUG/.config/npm/node_global"
[packager]
language = "nodejs"
[packager.features]
packageSearch = true
guessImports = true
enabledForHosting = false
[unitTest]
language = "nodejs"
[languages.javascript]
pattern = "**/{*.js,*.jsx,*.ts,*.tsx}"
[languages.javascript.languageServer]
start = [ "typescript-language-server", "--stdio" ]
[debugger]
support = true
[debugger.interactive]
transport = "localhost:0"
startCommand = [ "dap-node" ]
[debugger.interactive.initializeMessage]
command = "initialize"
type = "request"
[debugger.interactive.initializeMessage.arguments]
clientID = "replit"
clientName = "replit.com"
columnsStartAt1 = true
linesStartAt1 = true
locale = "en-us"
pathFormat = "path"
supportsInvalidatedEvent = true
supportsProgressReporting = true
supportsRunInTerminalRequest = true
supportsVariablePaging = true
supportsVariableType = true
[debugger.interactive.launchMessage]
command = "launch"
type = "request"
[debugger.interactive.launchMessage.arguments]
args = []
console = "externalTerminal"
cwd = "."
environment = []
pauseForSourceMap = false
program = "./index.js"
request = "launch"
sourceMaps = true
stopOnEntry = false
type = "pwa-node"

4
.vscode/extensions.json vendored Normal file
View file

@ -0,0 +1,4 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

11
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

36
CHANGELOG.md Normal file
View file

@ -0,0 +1,36 @@
# v9.0.0
- The first release of Nebula V9! And with it bring a whole host of changes:
- More stable the V8
- Adds a Marketplace where users can create their own themes & plugins
- Switches to Astro for speed
- Other general bug fixes
# v9.0.1
- Bumps dependencies
- Fixes bugs
# 9.0.2
- Adds the ability for a custom wisp server back
- Increases upload fileSize capacity in hopes that bigger files can now be uploaded
# 9.0.3
- Bugfix: themes with caps don't uninstall - fixed
- Rewrite: InstalledThemes and InstalledPlugins are now in Astro instead of Svelte
# 9.0.4
- General Bugfixes
- Removes Svelte except for 2 componenents
- Scramjet :rocket:
# 9.1.0
- Rewrites everything in the [utils/](./src/utils) folder
- Bugfixes
- Better logging
- Mobile nav jank is gone
- Component cleanup

View file

@ -1,13 +1,19 @@
FROM node:18
FROM node:22-alpine
WORKDIR /usr/src/app
WORKDIR /app
COPY package*.json .
COPY . .
RUN npm install
RUN npm ci
EXPOSE 3000
CMD ["npm", "start"]
RUN apk update
RUN apk add python3 py3-pip alpine-sdk openssl-dev build-base python3-dev
RUN python3 -m pip install setuptools --break-system-packages
RUN cp -n config.example.toml config.toml
RUN npm i -g pnpm
RUN pnpm install
RUN pnpm run build
RUN export TERM=xterm-256color
VOLUME /app
EXPOSE 8080
ENTRYPOINT ["pnpm"]
CMD ["start", "--color"]

View file

@ -1,7 +1,7 @@
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2022 Nebula Services
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

408
README.md
View file

@ -1,77 +1,371 @@
<div align=center>
<div align="center">
<img src='https://nebulaproxy.nebula.bio/images/logo.png' width="100px" height="100px">
<h1> Nebula </h1>
Nebula Web is an official flagship of Nebula Services. Nebula Web is a stunning and sleak webproxy with support for hundreds of popular sites, and partial support for WebRTC, used in GfN. With Nebula Web, the sky is the limit. Enjoy.
<img src="https://socialify.git.ci/nebulaservices/nebula/image?description=1&font=Inter&forks=1&issues=1&language=1&name=1&owner=1&pattern=Circuit%20Board&pulls=1&stargazers=1&theme=Dark" alt="ruby" width="640" height="320" />
<img alt="repo size" src="https://img.shields.io/github/repo-size/nebulaservices/nebula?style=for-the-badge"></img>
<img alt="website status" src="https://img.shields.io/website?url=https%3A%2F%2Fnebulaproxy.io&style=for-the-badge"></img>
<img alt="commit a week" src="https://img.shields.io/github/commit-activity/w/nebulaservices/nebula?style=for-the-badge"></img>
</div>
<div align="center">
<h2>Get Started</h2>
<a>To get started, press one of the buttons below to deploy Nebula</a>
<br />
<br />
<a href="#terminal">
<img src="https://img.shields.io/badge/terminal-%23121011.svg?style=for-the-badge&logo=gnu-bash&logoColor=white" alt="Terminal">
</img>
</a>
<a href="#docker">
<img src="https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge&logo=docker&logoColor=white" alt="Docker">
</img>
</a>
</div>
## NOTE:
- This will **NOT** deploy on GitHub Pages, Netlify, Vercel, Gitlab Pages, or any other _static_ host
- This will **NOT** work on Render
---
## How to get links
[![Nebula Services Discord](https://invidget.switchblade.xyz/unblocker?theme=darl)](https://discord.gg/unblocker)
[![Titanium Network Discord](https://invidget.switchblade.xyz/unblock?theme=dark)](https://discord.gg/unblock)
---
_this readme is 95% done_
## Features
- Stunning UI with multiple themes
- XOR/b64 Encrypts all traffic sent from Nebula
- Hides your IP from sites
- [List of officially supported sites](https://github.com/NebulaServices/Nebula/blob/main/docs/officially-supported-sites.md)
- *limited* mobile support
- StealthMode (buffed `about:blank` cloaking)
- Multiple Proxy "Backends":
- [Ultraviolet](https://github.com/titaniumnetwork-dev/ultraviolet)
- [RammerHead](https://github.com/binary-person/rammerhead)
---
## Deployment
(Nebula's license is now GNU AGPL V3 as of v7.10)
### Quick Deployment
[![Deploy to Heroku](https://raw.githubusercontent.com/BinBashBanana/deploy-buttons/master/buttons/remade/heroku.svg)](https://heroku.com/deploy/?template=https://github.com/NebulaServices/Nebula)
<br>
[![Run on Replit](https://raw.githubusercontent.com/BinBashBanana/deploy-buttons/master/buttons/remade/replit.svg)](https://replit.com/github/NebulaServices/Nebula)
<br>
[![Remix on Glitch](https://raw.githubusercontent.com/BinBashBanana/deploy-buttons/master/buttons/remade/glitch.svg)](https://glitch.com/edit/#!/import/github/NebulaServices/Nebula)
<br>
[![Deploy to IBM Cloud](https://raw.githubusercontent.com/BinBashBanana/deploy-buttons/master/buttons/remade/ibmcloud.svg)](https://cloud.ibm.com/devops/setup/deploy?repository=https://github.com/NebulaServices/Nebula)
<br>
[![Deploy to Amplify Console](https://raw.githubusercontent.com/BinBashBanana/deploy-buttons/master/buttons/remade/amplifyconsole.svg)](https://console.aws.amazon.com/amplify/home#/deploy?repo=https://github.com/NebulaServices/Nebula)
<br>
[![Run on Google Cloud](https://raw.githubusercontent.com/BinBashBanana/deploy-buttons/master/buttons/remade/googlecloud.svg)](https://deploy.cloud.run/?git_repo=https://github.com/NebulaServices/Nebula)
<br>
[![Deploy on Railway](https://binbashbanana.github.io/deploy-buttons/buttons/remade/railway.svg)](https://railway.app/new/template/pBzeiN)
<br>
[![Deploy To Koyeb](https://binbashbanana.github.io/deploy-buttons/buttons/remade/koyeb.svg)](https://app.koyeb.com/deploy?type=git&repository=github.com/NebulaServices/Nebula&branch=main&name=NebulaProxy)
## Contributors
### Self Hosting
```bash
$ git clone https://github.com/NebulaServices/Nebula.git
$ cd Nebula
$ npm ci
$ npm start
```
- [Rifting](https://github.com/rifting) - Owner & Maintainer
- [MotorTruck1221](https://motortruck1221.com) - Maintainer
---
## Tech Stack
- HTML, JS, CSS
- Partical.JS
- UV Backend Proxy
- Osana Backend Proxy
- Cyclone Backend Proxy
- **Server:** Bare server on Node
- [Astro](https://astro.build)
- [Fastify](https://fastify.dev)
- [Ultraviolet](https://github.com/titaniumnetwork-dev/ultraviolet)
- [RammerHead](https://github.com/binary-person/rammerhead)
- [Epoxy](https://github.com/mercuryworkshop/epoxy-tls)
- [Libcurl.js](https://github.com/ading2210/libcurl.js)
- HTML, CSS, and JavaScript (DUH)
---
## Catalog/Marketplace
## Support
- By default, the marketplace is enabled and uses SQLite
- If you would like to disable the catalog, see [#config](#config)
- For big production instances, I recommend using PostgreSQL rather than SQLite. To do this see [#config](#config)
- To use PostgreSQL via the provided docker-compose files, see [#docker](#docker)
For support, email chloe@nebula.bio or join our discord: discord.nebula.bio
### How to make a theme
- Themes allow you to customize Nebula's *look*.
## Demo
#### Prerequisites:
- Make sure you have our [Discord server](https://discord.gg/unblocker) so you can submit your theme
[Click here to see a demo of Nebula](https://tutorialread.beauty/)
##### Making the themes:
1. Firstly, copy the CSS vars:
```css
: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: ;
}
```
## Acknowledgements
> [!NOTE]
>
> You can add a custom font as well! To do so, add this to your `:root`
>
> ```css
> --font-family: /* Font family name */;
> ```
>
> And this to the bottom of your CSS file/submission:
> ```css
> @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 `retro` theme [here](./database_assets/com.nebula.retro)
- [UV (one of the back-end proxy we use)](https://github.com/titaniumnetwork-dev/Ultraviolet)
- [Cyclone (one of the back-end proxy we use)](https://github.com/NebulaServices/Cyclone)
- [Osana (one of the back-end proxy we use)](https://github.com/NebulaServices/Osana)
- [Bare Server](https://github.com/tomphttp/bare-server-node)
- [Partical.JS (v4, 5, 6.1 &< only)](https://github.com/VincentGarreau/particles.js)
2. Add your colors and test! (Either with a self-hosted version of Nebula OR via a live preview (no clue when this will happen)
## License
3. Once you're satisfied with the colors, submit your theme to the [Discord Server](https://discord.gg/unblocker)!
Copyright Nebula Services 2021 - Present
<br>
This project uses the MIT license.
<div align=center>
---
### How to make a plugin
- Plugins extend the functionality of either the proxied page(s) or the service worker.
- This guide provides an incredibly basic example of how to make either.
#### Prerequisites:
- Make sure you have joined our [Discord server](https://discord.gg/unblocker) so you can submit your plugin.
- Some knowledge of JS/TS
##### Serviceworker plugin:
- These plugins are handled by Workerware see [here](https://github.com/mercuryworkshop/workerware) for docs.
1. Create an index.js (or other file name) file:
```bash
touch index.js
```
2. Edit that file to include either of these:
- Code encased in a string:
```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.
```
- Code in an arrow function:
```js
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 `function` param 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.
3. Submit your plugin in the [Discord](https://discord.gg/unblocker)!
##### Proxied page plugins
- They allow modification of websites that UV proxies, (EX: you could add Vencord to Discord with this)
1. Create an index.js file (or another file name)
```bash
touch index.js
```
2. Edit that file with your code and the following:
```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.
```
3. Submit it in our [Discord](https://discord.gg/unblocker)!
---
## Deployment
### Terminal
Prerequisites:
- Node & npm
- Git
1. Clone the repo:
```bash
git clone https://github.com/nebulaservices/nebula --recursive && cd nebula
```
2. Install all of the dependencies:
```bash
npm i
```
3. Create a `config.toml` file
```bash
cp config.example.toml config.toml
```
4. Modify the `config.toml` file to your liking (docs [here](#environment))
```
nano config.toml
```
5. Build the front end & server:
```bash
npm run build
```
6. Start the server
```bash
npm start
```
> [!NOTE]
> You can run `npm run bstart` to build and start together
---
### Docker
- There are two ways to deploy with docker:
- [Normal docker](#normal-docker)
- [Docker Compose](#docker-compose)
#### Normal Docker
Prerequisites:
- Git
- Docker
1. Clone the repo (skip if using a prebuilt image):
```bash
git clone https://github.com/nebulaservices/nebula --recursive && cd nebula
```
2. Create an `config.toml` file (if using prebuilt image, copy the example from the repo):
```bash
cp config.example.toml config.toml
```
3. Modify the `config.toml` file to your liking (docs [here](#environment))
```bash
nano config.toml
```
4. Build the docker image (skip if using prebuilt):
```bash
docker build nebula:latest
```
5. Run the docker images:
- Prebuilt:
```bash
docker run -v ./config.toml:/app/config.toml ghcr.io/nebulaservices/nebula:latest
```
- Image you built yourself:
```bash
docker run -v ./config.toml:/app/config.toml nebula:latest
```
#### Docker Compose
Prerequisites:
- Git
- Docker w/compose
1. Clone the repo (skip if using a prebuilt image):
```bash
git clone https://github.com/nebulaservices/nebula --recursive
```
2. Create an `config.toml` file (if using prebuilt image, copy the example from the repo):
```bash
cp config.example.toml config.toml
```
3. Modify the `config.toml` file to your liking (docs on that [here](#environment)]
```bash
nano config.toml
```
4. Build the docker image (skip if using prebuilt):
```bash
docker compose -f ./docker-compose.build.yml build
```
5. Run the docker image:
- Prebuilt:
```bash
docker compose up
```
- Image you built yourself:
```bash
docker compose -f ./docker-compose.build.yml up
```
#### Extra (Postgres)
- To use Postgres over SQLite, uncomment the DB section in the `docker-compose` file (or use your own Postgres DB!). Then, modify the `config.toml` (See: [#config](#config) for knowledge on how to do this)
- To use Postgres over SQLite in a normal docker environment (no compose), you'll have to set one up and then modify the `config.toml` to use it. (See: [#config](#config) for knowledge on how to do this)
---
## Config
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.
- An example config file is located [here](./config.example.toml).
- Config format is in TOML
| 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` |
|----------------------------| ----------------------------------------------------------------------------|------------|--------------|
## Deploying
### Koyeb
- First setup the config.toml file with the docker-compose instructions!
- Fork this repo
- Create new koyeb service, and select webservice
- Select import from github and import your forked repo
- Change package to dockerfile and press deploy!

View file

@ -1 +0,0 @@
theme: jekyll-theme-minimal

63
app.js
View file

@ -1,63 +0,0 @@
import createBareServer from '@tomphttp/bare-server-node';
import http from 'http';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import serveStatic from 'serve-static';
import * as custombare from './static/customBare.mjs';
const PORT = process.env.PORT || 3000;
const bareServer = createBareServer('/bare/', {
logErrors: false,
localAddress: undefined
});
const serve = serveStatic(join(
dirname(fileURLToPath(import.meta.url)),
'static/'
), {
fallthrough: false,
maxAge: 5 * 60 * 1000
});
const server = http.createServer();
server.on('request', (request, response) => {
try {
if (custombare.route(request, response)) return true;
if (bareServer.shouldRoute(request)) {
bareServer.routeRequest(request, response);
} else {
serve(request, response, err => {
response.writeHead(err?.statusCode || 500, null, {
"Content-Type": "text/plain"
})
response.end(err?.stack)
});
}
} catch (e) {
response.writeHead(500, "Internal Server Error", {
"Content-Type": "text/plain"
})
response.end(e.stack)
}
});
server.on('upgrade', (req, socket, head) => {
if (bareServer.shouldRoute(req)) {
bareServer.routeUpgrade(req, socket, head);
} else {
socket.end();
}
});
server.listen(PORT);
if (process.env.UNSAFE_CONTINUE)
process.on("uncaughtException", (err, origin) => {
console.error(`Critical error (${origin}):`)
console.error(err)
console.error("UNSAFELY CONTINUING EXECUTION")
console.error()
})
console.log(`Server running at http://localhost:${PORT}/.`);

View file

@ -1,7 +0,0 @@
{
"name": "NebulaWEB",
"description": "Explore the web. Freely. ",
"repository": "https://github.com/NebulaServices/Nebula",
"logo": "https://avatars.githubusercontent.com/u/86420004?v=4",
"keywords": ["educational", "science", "math"]
}

133
astro.config.ts Normal file
View file

@ -0,0 +1,133 @@
import { fileURLToPath } from "node:url";
import node from "@astrojs/node";
import svelte from "@astrojs/svelte";
import tailwind from "@astrojs/tailwind";
import { baremuxPath } from "@mercuryworkshop/bare-mux/node";
import { epoxyPath } from "@mercuryworkshop/epoxy-transport";
import { libcurlPath } from "@mercuryworkshop/libcurl-transport";
import playformCompress from "@playform/compress";
import { uvPath } from "@titaniumnetwork-dev/ultraviolet";
import { scramjetPath } from "@mercuryworkshop/scramjet";
import icon from "astro-icon";
import { defineConfig, envField } from "astro/config";
import { viteStaticCopy } from "vite-plugin-static-copy";
import { version } from "./package.json";
import { parsedDoc } from "./server/config.js";
const workerwarePath = fileURLToPath(new URL("./workerware/src", import.meta.url));
export default defineConfig({
site: parsedDoc.seo.enabled ? parsedDoc.seo.domain || process.env.SITE : 'http://localhost:4321',
env: {
schema: {
VERSION: envField.string({
context: "client",
access: "public",
optional: true,
default: version
}),
MARKETPLACE_ENABLED: envField.boolean({
context: "client",
access: "public",
optional: true,
default: parsedDoc.marketplace.enabled
}),
SEO: envField.string({
context: "client",
access: "public",
optional: true,
default: JSON.stringify({
enabled: parsedDoc.seo.enabled,
domain: new URL(parsedDoc.seo.domain).host
})
})
}
},
integrations: [
tailwind(),
//sitemap(),
icon(),
svelte(),
playformCompress({
CSS: false,
HTML: true,
Image: true,
JavaScript: true,
SVG: true
})
],
vite: {
plugins: [
viteStaticCopy({
targets: [
{
src: `${uvPath}/**/*`.replace(/\\/g, "/"),
dest: "uv",
overwrite: false
},
{
src: `${epoxyPath}/**/*`.replace(/\\/g, "/"),
dest: "epoxy",
overwrite: false
},
{
src: `${libcurlPath}/**/*`.replace(/\\/g, "/"),
dest: "libcurl",
overwrite: false
},
{
src: `${scramjetPath}/**/*`.replace(/\\/g, "/"),
dest: "scram",
overwrite: false
},
{
src: `${baremuxPath}/**/*`.replace(/\\/g, "/"),
dest: "baremux",
overwrite: false
},
{
src: `${workerwarePath}/**/*`.replace(/\\/g, "/"),
dest: "workerware",
overwrite: false
}
]
})
],
server: {
proxy: {
"/api/catalog-stats": {
target: "http://localhost:8080/api/catalog-stats",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/catalog-stats/, "")
},
"/api/catalog-assets": {
target: "http://localhost:8080/api/catalog-assets",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/catalog-assets/, "")
},
"/api/packages": {
target: "http://localhost:8080/api/packages",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/packages/, "")
},
"/packages": {
target: "http://localhost:8080",
changeOrigin: true
},
"/wisp/": {
target: "ws://localhost:8080/wisp/",
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(/^\/wisp\//, "")
},
"/styles": {
target: "http://localhost:8080",
changeOrigin: true
}
}
}
},
output: "server",
adapter: node({
mode: "middleware"
})
});

32
biome.json Normal file
View file

@ -0,0 +1,32 @@
{
"$schema": "https://biomejs.dev/schemas/1.9.3/schema.json",
"files": {
"ignore": ["~/", "**/dist/**", ".github/**"],
"include": ["**/**", "server/**"]
},
"formatter": {
"indentStyle": "space",
"indentWidth": 4,
"lineWidth": 100,
"ignore": ["pnpm-lock.yaml", "package.json"]
},
"organizeImports": { "enabled": true },
"linter": { "enabled": false },
"javascript": {
"formatter": {
"trailingCommas": "none",
"quoteStyle": "double",
"semicolons": "always"
}
},
"json": {
"parser": {
"allowComments": true,
"allowTrailingCommas": true
},
"formatter": {
"indentStyle": "space",
"trailingCommas": "none"
}
}
}

23
config.example.toml Normal file
View file

@ -0,0 +1,23 @@
[marketplace]
enabled = false # Turn on or off the marketplace entirely
psk = "CHANGEME" # Change this to something more secure.
level = 1
[seo]
enabled = false
domain = "https://nebulaproxy.io"
[db]
name = "database" # Your database name
username = "username" # The username of your DB (SQLITE just ignores this)
password = "password" # The password to your DB (SQLITE ignores this)
postgres = false # Enable to use postgres over sqlite (recommended for large prod instances)
[postgres] # Set the "domain" to either and ip address or a actual domain
domain = ""
port = 5432
[server.server]
port = 8080
wisp = true
logging = true # Disable for the tons & tons of logs to go away (useful for debugging but otherwise eh)

View file

@ -0,0 +1,22 @@
:root {
--background-primary: #282828;
--background-lighter: #3c3836;
--navbar-color: #504945;
--navbar-height: 60px;
--navbar-text-color: #fbf1c7;
--navbar-link-color: #ebdbb2;
--navbar-link-hover-color: #fabd2f;
--navbar-font: "Roboto", sans-serif;
--input-text-color: #b8bb26;
--input-placeholder-color: #928374;
--input-background-color: #1d2021;
--input-border-color: #b8bb26;
--input-border-size: 1.3px;
--navbar-logo-filter: none;
--dropdown-option-hover-color: #665c54;
--tab-color: #1d2021;
--border-color: #b8bb26;
--highlight-color: #fe8019;
--accent-color: #83a598;
--secondary-text-color: #d3869b;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View file

@ -0,0 +1,18 @@
:root {
--background-primary: hsl(310 50% 90%);
--background-lighter: hsl(310 50% 90%);
--navbar-color: hsl(310 50% 100%);
--navbar-height: 60px;
--navbar-text-color: hsl(310 50% 15%);
--navbar-link-color: hsl(310 50% 15%);
--navbar-link-hover-color: hsl(310 50% 90%);
--navbar-font: "Roboto";
--input-text-color: hsl(310 50% 15%);
--input-placeholder-color: white;
--input-background-color: hsl(310 50% 100%);
--input-border-color: hsl(310 50% 25%);
--input-border-size: 1.3px;
--navbar-logo-filter: none;
--tab-color: var(--black);
--border-color: hsl(310 50% 25%);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View file

@ -0,0 +1,19 @@
:root {
--background-primary: #000000;
--background-lighter: #000000;
--navbar-color: #00000f;
--navbar-height: 60px;
--navbar-text-color: #4763ff;
--navbar-link-color: #4763ff;
--navbar-link-hover-color: gray;
--navbar-font: "Roboto";
--input-text-color: #4763ff;
--input-placeholder-color: white;
--input-background-color: #000000;
--input-border-color: #4763ff;
--input-border-size: 1.3px;
--navbar-logo-filter: none;
--dropdown-option-hover-color: #000000;
--tab-color: #000000;
--border-color: #4763ff;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -0,0 +1,24 @@
:root {
--background-primary: #000000;
--background-lighter: #000000;
--navbar-color: #020805;
--navbar-height: 60px;
--navbar-text-color: #3cb371;
--navbar-link-color: #3cb371;
--navbar-link-hover-color: white;
--input-text-color: #3cb371;
--input-placeholder-color: white;
--input-background-color: #000000;
--input-border-color: #3cb371;
--input-border-size: 1.3px;
--navbar-logo-filter: none;
--dropdown-option-hover-color: #000000;
--tab-color: #000000;
--border-color: #3cb371;
--font-family: "terminal";
}
@font-face {
font-family: terminal;
src: url("./terminal.ttf");
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

21
docker-compose.build.yml Normal file
View file

@ -0,0 +1,21 @@
services:
nebula:
image: ghcr.io/nebulaservices/nebula:latest
container_name: nebula
build: .
restart: unless-stopped
ports:
# HOST:CONTAINER (DO NOT CHANGE THE CONTAINER PORT, UNLESS EDITED IN THE config.toml FILE)
- 8080:8080
volumes:
- ./config.toml:/app/config.toml
# Uncomment the the below stuff to use POSTGRES!
# db:
# image: postgres
# restart: unless-stopped
# environment:
# POSTGRES_PASSWORD: password #CHANGE THIS
# POSTGRES_USER: username
# POSTGRES_DB: db
# volumes:
# - ./db:/var/lib/postgresql/data

View file

@ -1,7 +0,0 @@
version: '3'
services:
nebula:
image: nebula:latest
build: .
container_name: nebula
restart: unless-stopped

20
docker-compose.yml Normal file
View file

@ -0,0 +1,20 @@
services:
nebula:
image: ghcr.io/nebulaservices/nebula:latest
container_name: nebula
restart: unless-stopped
ports:
# HOST:CONTAINER (DO NOT CHANGE THE CONTAINER PORT, UNLESS EDITED IN THE config.toml FILE)
- 8080:8080
volumes:
- ./config.toml:/app/config.toml
# Uncomment the the below stuff to use POSTGRES!
# db:
# image: postgres
# restart: unless-stopped
# environment:
# POSTGRES_PASSWORD: password #CHANGE THIS
# POSTGRES_USER: username
# POSTGRES_DB: db
# volumes:
# - ./db:/var/lib/postgresql/data

View file

@ -1,17 +0,0 @@
# Nebula - Documentation
Hello and welcome to the Nebula Documentation!
[![MIT License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/)
[![Build Passing](https://img.shields.io/badge/build-passing-brightgreen)]()
[![docs status]( https://img.shields.io/badge/docs-20%25%20complete-yellow)]()
## Table of contents
- [Guide to Patreon Access](https://git.holy.how/Nebula/NebulaOfficial/docs/guides/PATREON.md)
- [How to Deploy (tutorial/guide)](https://git.holy.how/Nebula/NebulaOfficial/docs/guides/deploy.md)
## Authors
- [@green](https://www.git.holy.how/green)

View file

@ -1 +0,0 @@
not done

View file

@ -1,33 +0,0 @@
# How to access Patreon links!
Welcome to this amazing guide :)
## Step 1
**Become a patron...**
*To follow this tutorial, you must be a patron, duh.*
## Step 2
Find a supporter link in Patreon. Posts with links will have the `New links` tag, so just search for that.
Some links are experimental and may not work as intended, but we will always tell you if it's experimental.
## Step 3
Use the password from the Patreon post *Same post you got the link from, duh*
## Step 4
Enter the password and Start using Nebula
## Troubleshooting
If the password is incorrect:
- Make sure you entered the correct password
- Check the latest Patreon post to see if it changed *-- Only happens in emergencies, like password leaking*
- If none of those work, then and only then contact chloe@nebula.bio or GreenWorld#0001 on discord.
## Authors
- [@green](https://www.git.holy.how/green)
## Appendix
This guide is 96% complete. If you are having any trouble accessing or using Patreon/supporter only links, contact chloe@nebula.bio or GreenWorld#0001 on Discord.

View file

@ -1,28 +0,0 @@
# Supported Sites on Nebula
Osana (Stable Build 83cae3b) by Nebula Services
- Google.com
- Youtube.com
- Discord.com
- Discord.com AUDIO-ONLY Voice chat
- GitHub.com
- Bing.com
- search.brave.com
- 99% of all static sites
UV (Stable Build 8153927) by Titanium Network
- Google.com
- Youtube.com
- GitHub.com
- Discord.com
- Discord.com AUDIO-ONLY Voice chat
- search.brave.com
- SealVM/ CollabVM
- GeforceNow (Partial Support)
- Now.gg (Partial Supprt)
- All static sites
Cyclone (Stable Build 664608d) by Nebula Services
- Google.com
- Github.com (partial support)
- 90% of static websites

View file

@ -1,6 +0,0 @@
module.exports = {
apps: [{
name: "Site",
script: "proxysocks node app.js"
}]
}

620
package-lock.json generated
View file

@ -1,620 +0,0 @@
{
"name": "nebula-web",
"version": "7.10",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "nebula-web",
"version": "7.10",
"license": "GNU AGPL V3",
"dependencies": {
"@tomphttp/bare-server-node": "^1.0.2-beta-readme5",
"crypto-js": "4.1.1",
"css-tree": "^2.1.0",
"node-fetch": "^3.2.6",
"serve-static": "^1.15.0",
"ws": "^8.8.1"
}
},
"node_modules/@tomphttp/bare-server-node": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tomphttp/bare-server-node/-/bare-server-node-1.0.3.tgz",
"integrity": "sha512-mKMipi9qntDy3wcalWGuK3iKzM0XQT4sW3E6yRXeIU4BxFZVSLzSDejPxL6wWwniKGm0faSwZ4Pk0dQ04JEFNA==",
"dependencies": {
"commander": "^9.0.0",
"dotenv": "^16.0.1",
"headers-polyfill": "^3.0.10",
"http-errors": "^2.0.0"
},
"bin": {
"bare-server-node": "scripts/cli.js"
},
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/commander": {
"version": "9.4.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
"integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==",
"engines": {
"node": "^12.20.0 || >=14"
}
},
"node_modules/crypto-js": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
"integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
},
"node_modules/css-tree": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
"integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
"dependencies": {
"mdn-data": "2.0.28",
"source-map-js": "^1.0.1"
},
"engines": {
"node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
"npm": ">=7.0.0"
}
},
"node_modules/data-uri-to-buffer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
"engines": {
"node": ">= 12"
}
},
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/debug/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/destroy": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/dotenv": {
"version": "16.0.2",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz",
"integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==",
"engines": {
"node": ">=12"
}
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fetch-blob": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/jimmywarting"
},
{
"type": "paypal",
"url": "https://paypal.me/jimmywarting"
}
],
"dependencies": {
"node-domexception": "^1.0.0",
"web-streams-polyfill": "^3.0.3"
},
"engines": {
"node": "^12.20 || >= 14.13"
}
},
"node_modules/formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
"dependencies": {
"fetch-blob": "^3.1.2"
},
"engines": {
"node": ">=12.20.0"
}
},
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/headers-polyfill": {
"version": "3.0.10",
"resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.0.10.tgz",
"integrity": "sha512-lOhQU7iG3AMcjmb8NIWCa+KwfJw5bY44BoWPtrj5A4iDbSD3ylGf5QcYr0ZyQnhkKQ2GgWNLdF2rfrXtXlF3nQ=="
},
"node_modules/http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/mdn-data": {
"version": "2.0.28",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
"integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/jimmywarting"
},
{
"type": "github",
"url": "https://paypal.me/jimmywarting"
}
],
"engines": {
"node": ">=10.5.0"
}
},
"node_modules/node-fetch": {
"version": "3.2.10",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
"integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
"dependencies": {
"data-uri-to-buffer": "^4.0.0",
"fetch-blob": "^3.1.4",
"formdata-polyfill": "^4.0.10"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/node-fetch"
}
},
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dependencies": {
"ee-first": "1.1.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"mime": "1.6.0",
"ms": "2.1.3",
"on-finished": "2.4.1",
"range-parser": "~1.2.1",
"statuses": "2.0.1"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"dependencies": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"engines": {
"node": ">=0.6"
}
},
"node_modules/web-streams-polyfill": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
"engines": {
"node": ">= 8"
}
},
"node_modules/ws": {
"version": "8.8.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz",
"integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
}
},
"dependencies": {
"@tomphttp/bare-server-node": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tomphttp/bare-server-node/-/bare-server-node-1.0.3.tgz",
"integrity": "sha512-mKMipi9qntDy3wcalWGuK3iKzM0XQT4sW3E6yRXeIU4BxFZVSLzSDejPxL6wWwniKGm0faSwZ4Pk0dQ04JEFNA==",
"requires": {
"commander": "^9.0.0",
"dotenv": "^16.0.1",
"headers-polyfill": "^3.0.10",
"http-errors": "^2.0.0"
}
},
"commander": {
"version": "9.4.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
"integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw=="
},
"crypto-js": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
"integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
},
"css-tree": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
"integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
"requires": {
"mdn-data": "2.0.28",
"source-map-js": "^1.0.1"
}
},
"data-uri-to-buffer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
},
"dependencies": {
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}
}
},
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
},
"destroy": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
},
"dotenv": {
"version": "16.0.2",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz",
"integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA=="
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
},
"fetch-blob": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
"requires": {
"node-domexception": "^1.0.0",
"web-streams-polyfill": "^3.0.3"
}
},
"formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
"requires": {
"fetch-blob": "^3.1.2"
}
},
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
},
"headers-polyfill": {
"version": "3.0.10",
"resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.0.10.tgz",
"integrity": "sha512-lOhQU7iG3AMcjmb8NIWCa+KwfJw5bY44BoWPtrj5A4iDbSD3ylGf5QcYr0ZyQnhkKQ2GgWNLdF2rfrXtXlF3nQ=="
},
"http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"requires": {
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"mdn-data": {
"version": "2.0.28",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
"integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
},
"node-fetch": {
"version": "3.2.10",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
"integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
"requires": {
"data-uri-to-buffer": "^4.0.0",
"fetch-blob": "^3.1.4",
"formdata-polyfill": "^4.0.10"
}
},
"on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"requires": {
"ee-first": "1.1.1"
}
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"requires": {
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"mime": "1.6.0",
"ms": "2.1.3",
"on-finished": "2.4.1",
"range-parser": "~1.2.1",
"statuses": "2.0.1"
}
},
"serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
}
},
"setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
},
"statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
},
"toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
},
"web-streams-polyfill": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
},
"ws": {
"version": "8.8.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz",
"integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==",
"requires": {}
}
}
}

View file

@ -1,23 +1,66 @@
{
"name": "nebula-web",
"version": "7.10",
"description": "Explore the web. Freely.",
"type": "module",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"keywords": [
"proxy"
],
"author": "Nebula Services",
"license": "GNU AGPL V3",
"dependencies": {
"@tomphttp/bare-server-node": "1.0.2-beta-readme5",
"crypto-js": "4.1.1",
"css-tree": "^2.1.0",
"node-fetch": "^3.2.6",
"serve-static": "^1.15.0",
"ws": "^8.8.1"
}
"name": "nebula",
"type": "module",
"version": "9.1.0",
"private": true,
"scripts": {
"dev": "astro dev --host 0.0.0.0 & tsx --watch server/server.ts",
"start": "node server/server.js",
"build:server": "tsc -p server",
"build:client": "astro check && astro build",
"build": "npm run build:server & npm run build:client",
"bstart": "npm run build && npm run start",
"preview": "astro preview",
"astro": "astro",
"format:code": "biome format . --write",
"format:imports": "biome check . --write",
"format": "npm run format:code && npm run format:imports",
"version": "changeset version"
},
"dependencies": {
"@astrojs/check": "^0.9.4",
"@astrojs/node": "^9.0.0",
"@astrojs/sitemap": "^3.2.1",
"@astrojs/svelte": "^7.0.2",
"@astrojs/tailwind": "^5.1.4",
"@fastify/compress": "^8.0.1",
"@fastify/helmet": "^13.0.0",
"@fastify/middie": "^9.0.2",
"@fastify/multipart": "^9.0.1",
"@fastify/static": "^8.0.3",
"@iconify-json/ph": "^1.2.2",
"@mercuryworkshop/bare-mux": "^2.1.7",
"@mercuryworkshop/epoxy-transport": "^2.1.27",
"@mercuryworkshop/libcurl-transport": "^1.3.15",
"@playform/compress": "^0.1.6",
"@titaniumnetwork-dev/ultraviolet": "^3.2.10",
"@mercuryworkshop/scramjet": "https://github.com/MercuryWorkshop/scramjet/releases/download/latest/mercuryworkshop-scramjet-1.0.2-dev.tgz",
"@types/node": "^22.10.2",
"@types/sequelize": "^4.28.20",
"astro": "^5.1.1",
"astro-icon": "^1.1.5",
"astro-seo": "^0.8.4",
"chalk": "^5.4.1",
"fastify": "^5.2.0",
"gradient-string": "^3.0.0",
"pg": "^8.13.1",
"pg-hstore": "^2.3.4",
"sequelize": "^6.37.5",
"smol-toml": "^1.3.1",
"sqlite3": "^5.1.7",
"svelte": "^5.16.0",
"svelte-french-toast": "^1.2.0",
"tailwindcss": "^3.4.17",
"typescript": "^5.7.2",
"vite-plugin-static-copy": "^2.2.0",
"wisp-server-node": "^1.1.7"
},
"devDependencies": {
"@biomejs/biome": "^1.9.4",
"@changesets/cli": "^2.27.11",
"bufferutil": "^4.0.9",
"ora": "^8.1.1",
"sharp": "^0.33.5",
"tsx": "^4.19.2"
}
}

8870
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load diff

BIN
public/classic_theme.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
public/cloaks/canvas.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
public/cloaks/classroom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
public/cloaks/google.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

BIN
public/cloaks/ps.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
public/cloaks/wikipedia.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

16
public/favicon.svg Normal file
View file

@ -0,0 +1,16 @@
<svg
version="1.2"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 400 400"
width="400"
height="400"
fill="#7967dd"
style="width: 100%; height: 100%;"
><title>nebula</title><g id="svgg"
><path
id="path0"
fill="#7967dd"
d="m213.6 84c1 0.3 3.4 0.7 5.1 1 1.8 0.2 4.1 0.7 5.2 1 13.2 4.1 20.3 6.8 24.5 9.1 0.6 0.3 2.3 1.2 3.8 2 2.8 1.4 13.1 8 14.4 9.2 0.5 0.3 2.3 1.9 4.2 3.5 6.7 5.5 15.5 14.9 19.2 20.4 1 1.4 2 2.7 2.2 2.8 0.3 0.1 0.5 0.5 0.5 0.8 0 0.3 1.2 2.2 2.5 4.3 2.3 3.4 7.8 14.3 9.8 19.3 0.8 2.1 0.9 2.2 10 4.9 5.6 1.6 11.1 3.4 11.7 3.8 0.3 0.2 2.4 1.1 4.7 1.9 11.1 4.1 23 12.5 27.3 19.4 5.5 8.7 3.6 20.5-4.5 28.5-3.1 3-7.5 6.4-8.4 6.4-0.3 0-0.7 0.2-0.8 0.5-1.1 2.3-23.3 11.2-35.9 14.3-3.2 0.9-3.5 1.2-5.7 6.8-7.5 19-25.5 40.6-42.3 51.1-1.6 1-3.1 2-3.3 2.2-0.1 0.2-0.9 0.7-1.7 1.2-0.8 0.4-2.2 1.2-2.9 1.6-0.8 0.4-1.6 1-1.8 1.1-0.5 0.5-4.1 2.2-8.1 3.9-1.8 0.8-3.8 1.6-4.5 2-0.7 0.3-3.1 1.1-5.2 1.8-8.3 2.6-9.8 3-21 4.9-6.4 1.1-25.3 1.3-30.5 0.3-1.9-0.3-5.8-1.1-8.6-1.6-6.8-1.3-12.7-3-20-5.7-3.3-1.2-18-8.8-19.7-10.1-0.9-0.7-4.1-3.1-7.1-5.2-5.7-4.1-17.9-15.9-20.7-20-0.9-1.2-2-2.7-2.5-3.2-3.2-3.3-13.7-21.7-13.7-24.1 0-0.6-0.2-1.2-0.6-1.4-0.3-0.2-0.8-1.2-1-2.3-0.4-1.9-1.7-2.7-6.5-3.8-23.2-5.6-43.1-17.2-48.6-28.5-7.1-14.4 4.5-31.3 27.3-39.7 1.8-0.7 4.1-1.6 5.2-2 3.7-1.5 8-2.9 19.5-6.2 1.6-0.5 2.8-1.2 2.8-1.7 0-2.4 9.8-21.6 13.1-25.7 0.2-0.4 1.4-1.8 2.5-3.2 13.8-18.1 30.2-30.6 50.6-38.8 4.3-1.7 6-2.3 14.3-4.5 5.5-1.6 11.2-2.4 18.4-2.9 7.9-0.5 24-0.2 26.8 0.6zm-29.7 17.3c-0.2 0.1-7.3 1.7-12.9 2.7-1.7 0.4-4.3 1.2-5.8 1.9-1.5 0.6-3.9 1.5-5.5 2-1.5 0.4-3.3 1.3-4 2-0.7 0.7-1.7 1.2-2.3 1.2-1.2 0-9.5 4.5-9.8 5.3-0.2 0.3-0.5 0.6-0.9 0.6-1.9 0-19.6 16-23.8 21.6-9.3 12.2-16.1 27.4-19.2 42.7-2 10.1-1.1 37.5 1.4 41.4 0 0.1 3.7 0.9 8.1 1.8 9.5 1.9 12.8 2.4 34.6 4.9 38.5 4.5 107.9 2.2 138.3-4.5 1.4-0.3 4.1-0.9 6.1-1.3 4.2-0.8 3.4 0.2 4.9-7.1 1.6-8.3 1.7-27 0.1-34.6-1.5-7.1-3.2-13.4-3.7-14.2-0.3-0.4-0.7-1.5-0.9-2.6-2.8-12.1-19.2-34.1-33-44.3-2.9-2.1-5.5-4-5.8-4.3-2.8-2.2-4.9-3.1-7.2-3.1-2.1 0-2.6-0.2-2.7-1.3-0.2-1.5-5.7-4.5-6.3-3.5-0.7 1.1-2.4 0.6-2.7-0.7-0.4-1.3-1.2-1.6-5.8-2.1-1.6-0.2-4-0.9-5.5-1.6-3.9-1.8-5.3-2.2-10.2-2.6-4.6-0.4-25.2-0.7-25.5-0.3zm74.3 42.2c7.4 9.8 4.8 23.5-4.6 24.9-6.9 1-20.9-5.8-21-10.2 0-0.2-0.3-0.8-0.8-1.3-6.4-6.8-5-20.8 2.4-24.1 6.7-2.9 17.2 1.8 24 10.7zm-176.4 36.4c-0.1-0.1-4.6 1.1-5.9 1.6-0.7 0.3-3 1.2-5.1 2-9.9 3.8-15.1 6.8-19.6 11.5-3.4 3.5-3.3 4.5 0.5 8.7 1 1 11.3 7.6 12 7.6 0.2 0 1.7 0.6 3.4 1.3 1.6 0.8 3.6 1.6 4.3 1.9 1.8 0.8 9.3 3.3 9.9 3.3 0.3 0 0.3-2 0-4.4-0.6-5.6-0.6-24.5 0.1-29.6 0.3-2.1 0.5-3.9 0.4-3.9zm229.3-0.3c-0.2 0 0 1 0.2 2.1 0.6 2.8 0.6 31.3 0 34-0.5 2.2-0.4 2.2 1.3 1.8 3.1-0.7 12.9-4.5 18.3-7 8.5-4 14.3-10.1 12.6-13.3-1.1-2.1-6.7-7.2-7.9-7.2-0.4 0-0.9-0.2-1-0.5-0.4-1.1-11.8-6.1-19.2-8.5-2.3-0.7-4.2-1.4-4.3-1.4zm-199.4 63.4l-3.1-0.4 1.8 3.2c0.9 1.8 1.9 3.4 2.2 3.5 0.3 0.1 0.5 0.6 0.5 1.1 0 0.4 0.6 1.5 1.3 2.3 0.7 0.9 1.5 1.9 1.8 2.2 0.3 0.4 0.8 1.2 1.1 1.7 6.2 10.7 35.6 33.5 43.3 33.5 0.2 0 1.3 0.4 2.5 0.9 2.5 1.2 10.6 3.4 15.3 4.2 9.5 1.8 11.6 2.1 17.4 2.1 6.6 0 16.4-1.3 22.9-3 2.2-0.5 5.2-1.3 6.8-1.7 1.6-0.3 3.2-0.9 3.5-1.2 0.4-0.3 1.1-0.6 1.6-0.6 2.3 0 22-10.6 24-12.9 0.2-0.2 2.2-1.9 4.5-3.7 5.7-4.5 11.8-11 17.1-18.4 1.6-2.3 3.2-4.5 3.6-4.9 0.4-0.4 0.7-1 0.7-1.2 0-0.2 0.8-1.9 1.9-3.6 1.1-1.7 1.9-3.2 1.9-3.4 0-0.2-3.8 0.4-11 1.6-31.7 5.4-85.1 6.7-126.9 3.1-9.6-0.8-23.1-2.3-27.8-3.2-2.2-0.4-5.3-0.9-6.9-1.2z"
class="s0"></path></g
></svg
>

After

Width:  |  Height:  |  Size: 3.4 KiB

View file

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

19
public/nebula.css Normal file
View file

@ -0,0 +1,19 @@
:root {
--background-primary: #191724;
--background-lighter: #16121f;
--navbar-color: #26233a;
--navbar-height: 60px;
--navbar-text-color: #7967dd;
--navbar-link-color: #e0def4;
--navbar-link-hover-color: gray;
--navbar-font: "Roboto";
--input-text-color: #e0def4;
--input-placeholder-color: white;
--input-background-color: #1f1d2e;
--input-border-color: #eb6f92;
--input-border-size: 1.3px;
--navbar-logo-filter: none;
--dropdown-option-hover-color: #312a49;
--tab-color: var(--black);
--border-color: #16121f;
}

75
public/sw.js Normal file
View file

@ -0,0 +1,75 @@
importScripts("/uv/uv.bundle.js");
importScripts("/uv/uv.config.js");
importScripts('/scram/scramjet.wasm.js');
importScripts('/scram/scramjet.shared.js');
importScripts('/scram/scramjet.worker.js');
importScripts("/workerware/workerware.js");
importScripts(__uv$config.sw || "/uv/uv.sw.js");
const uv = new UVServiceWorker();
const ww = new WorkerWare({ debug: false });
const sj = new ScramjetServiceWorker();
(async function () {
await sj.loadConfig();
})();
//me when Firefox (thanks vk6)
if (navigator.userAgent.includes("Firefox")) {
Object.defineProperty(globalThis, "crossOriginIsolated", {
value: true,
writable: true
});
}
//where we handle our plugins!!!
self.addEventListener("message", function (event) {
console.log(event.data);
uv.config.inject = [];
//loop over the required data (we don't verify here as types will take care of us :D)
event.data.forEach((data) => {
if (data.remove) {
if (data.type === "page") {
const idx = uv.config.inject.indexOf(data.host);
uv.config.inject.splice(idx, 1);
} else if (data.type === "serviceWorker") {
ww.deleteByName(data.name);
}
} else {
if (data.type === "page") {
uv.config.inject.push({
host: data.host,
html: data.html,
injectTo: data.injectTo
});
} else if (data.type === "serviceWorker") {
const wwFunction = eval(data.function);
ww.use({
function: wwFunction ? wwFunction : new Function(data.function),
name: data.name,
events: data.events
});
} else {
console.error("NO type exists for that. Only serviceWorker & page exist.");
return;
}
}
});
});
self.addEventListener("fetch", function (event) {
event.respondWith(
(async () => {
const wwRes = await ww.run(event)();
if (wwRes.includes(null)) {
return;
}
if (event.request.url.startsWith(location.origin + __uv$config.prefix)) {
return await uv.fetch(event);
}
else if (sj.route(event)) {
return await sj.fetch(event);
}
else {
return await fetch(event.request);
}
})()
);
});

30
public/uv/uv.config.js Normal file
View file

@ -0,0 +1,30 @@
self.__uv$config = {
prefix: "/~/uv/",
bare: "/bare/",
encodeUrl: function encode(str) {
if (!str) return str;
return encodeURIComponent(
str
.toString()
.split("")
.map((char, ind) => (ind % 2 ? String.fromCharCode(char.charCodeAt() ^ 3) : char))
.join("")
);
},
decodeUrl: function decode(str) {
if (!str) return str;
let [input, ...search] = str.split("?");
return (
decodeURIComponent(input)
.split("")
.map((char, ind) => (ind % 2 ? String.fromCharCode(char.charCodeAt(0) ^ 3) : char))
.join("") + (search.length ? "?" + search.join("?") : "")
);
},
handler: "/uv/uv.handler.js",
client: "/uv/uv.client.js",
bundle: "/uv/uv.bundle.js",
config: "/uv/uv.config.js",
sw: "/uv/uv.sw.js"
};

View file

@ -0,0 +1,171 @@
importScripts("/workerware/WWError.js");
const dbg = console.log.bind(console, "[WorkerWare]");
const time = console.time.bind(console, "[WorkerWare]");
const timeEnd = console.timeEnd.bind(console, "[WorkerWare]");
/*
OPTS:
debug - Enables debug logging.
randomNames - Generate random names for middlewares.
timing - Logs timing for each middleware.
*/
const defaultOpt = {
debug: false,
randomNames: false,
timing: false
};
const validEvents = [
"abortpayment",
"activate",
"backgroundfetchabort",
"backgroundfetchclick",
"backgroundfetchfail",
"backgroundfetchsuccess",
"canmakepayment",
"contentdelete",
"cookiechange",
"fetch",
"install",
"message",
"messageerror",
"notificationclick",
"notificationclose",
"paymentrequest",
"periodicsync",
"push",
"pushsubscriptionchange",
"sync"
];
class WorkerWare {
constructor(opt) {
this._opt = Object.assign({}, defaultOpt, opt);
this._middlewares = [];
}
info() {
return {
version: "0.1.0",
middlewares: this._middlewares,
options: this._opt
};
}
use(middleware) {
let validateMW = this.validateMiddleware(middleware);
if (validateMW.error) throw new WWError(validateMW.error);
// This means the middleware is an anonymous function, or the user is silly and named their function "function"
if (middleware.function.name == "function") middleware.name = crypto.randomUUID();
if (!middleware.name) middleware.name = middleware.function.name;
if (this._opt.randomNames) middleware.name = crypto.randomUUID();
if (this._opt.debug) dbg("Adding middleware:", middleware.name);
this._middlewares.push(middleware);
}
// Run all middlewares for the event type passed in.
run(event) {
const middlewares = this._middlewares;
const returnList = [];
let fn = async () => {
for (let i = 0; i < middlewares.length; i++) {
if (middlewares[i].events.includes(event.type)) {
if (this._opt.timing) console.time(middlewares[i].name);
// Add the configuration to the event object.
event.workerware = {
config: middlewares[i].configuration || {}
};
if (!middlewares[i].explicitCall) {
let res = await middlewares[i].function(event);
if (this._opt.timing) console.timeEnd(middlewares[i].name);
returnList.push(res);
}
}
}
return returnList;
};
return fn;
}
deleteByName(middlewareID) {
if (this._opt.debug) dbg("Deleting middleware:", middlewareID);
this._middlewares = this._middlewares.filter((mw) => mw.name !== middlewareID);
}
deleteByEvent(middlewareEvent) {
if (this._opt.debug) dbg("Deleting middleware by event:", middlewareEvent);
this._middlewares = this._middlewares.filter((mw) => !mw.events.includes(middlewareEvent));
}
get() {
return this._middlewares;
}
/*
Run a single middleware by ID.
This assumes that the user knows what they're doing, and is running the middleware on an event that it's supposed to run on.
*/
runMW(name, event) {
const middlewares = this._middlewares;
if (this._opt.debug) dbg("Running middleware:", name);
// if (middlewares.includes(name)) {
// return middlewares[name](event);
// } else {
// throw new WWError("Middleware not found!");
// }
let didCall = false;
for (let i = 0; i < middlewares.length; i++) {
if (middlewares[i].name == name) {
didCall = true;
event.workerware = {
config: middlewares[i].configuration || {}
};
if (this._opt.timing) console.time(middlewares[i].name);
let call = middlewares[i].function(event);
if (this._opt.timing) console.timeEnd(middlewares[i].name);
return call;
}
}
if (!didCall) {
throw new WWError("Middleware not found!");
}
}
// type middlewareManifest = {
// function: Function,
// name?: string,
// events: string[], // Should be a union of validEvents.
// configuration?: Object // Optional configuration for the middleware.
// }
validateMiddleware(middleware) {
if (!middleware.function)
return {
error: "middleware.function is required"
};
if (typeof middleware.function !== "function")
return {
error: "middleware.function must be typeof function"
};
if (
typeof middleware.configuration !== "object" &&
middleware.configuration !== undefined
) {
return {
error: "middleware.configuration must be typeof object"
};
}
if (!middleware.events)
return {
error: "middleware.events is required"
};
if (!Array.isArray(middleware.events))
return {
error: "middleware.events must be an array"
};
if (middleware.events.some((ev) => !validEvents.includes(ev)))
return {
error: "Invalid event type! Must be one of the following: " + validEvents.join(", ")
};
if (middleware.explicitCall && typeof middleware.explicitCall !== "boolean") {
return {
error: "middleware.explicitCall must be typeof boolean"
};
}
return {
error: undefined
};
}
}

View file

@ -1,8 +0,0 @@
{ pkgs }: {
deps = [
pkgs.nodejs-16_x
pkgs.nodePackages.typescript-language-server
pkgs.yarn
pkgs.replitPackages.jest
];
}

95
server/config.ts Normal file
View file

@ -0,0 +1,95 @@
import { readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import chalk from "chalk";
import { TomlPrimitive, parse } from "smol-toml";
interface TomlData {
marketplace: {
enabled: boolean;
psk: String;
};
server: {
server: {
port: number;
wisp: boolean;
logging: boolean;
};
};
seo: {
enabled: boolean;
domain: string;
};
db: {
name: string;
username: string;
password: string;
postgres: boolean;
};
postgres: {
domain: string;
port: number;
};
}
interface Verify {
name: string;
typeOF: any;
type: any;
verifyExtras?: () => boolean | Error;
}
let doc = readFileSync(fileURLToPath(new URL("../config.toml", import.meta.url))).toString();
const parsedDoc = parse(doc) as unknown as TomlData;
function verify(t: Verify[]) {
for (let i: number = 0; i !== t.length; i++) {
if (typeof t[i].typeOF !== t[i].type) {
throw new Error(`Invalid structure: "${t[i].name}" should be a(n) ${t[i].type}`);
}
if (t[i].verifyExtras) {
const extra = t[i].verifyExtras();
if (extra !== true) {
throw extra;
}
}
}
}
verify([
{ name: "marketplace", typeOF: parsedDoc.marketplace, type: "object" },
{ name: "marketplace.enabled", typeOF: parsedDoc.marketplace.enabled, type: "boolean" },
{ name: "marketplace.psk", typeOF: parsedDoc.marketplace.psk, type: "string" },
{ name: "server", typeOF: parsedDoc.server, type: "object" },
{ name: "server.server", typeOF: parsedDoc.server.server, type: "object" },
{ name: "server.server.port", typeOF: parsedDoc.server.server.port, type: "number" },
{ name: "server.server.wisp", typeOF: parsedDoc.server.server.wisp, type: "boolean" },
{ name: "server.server.logging", typeOF: parsedDoc.server.server.logging, type: "boolean" },
{ name: "seo", typeOF: parsedDoc.seo, type: "object" },
{ name: "seo.enabled", typeOF: parsedDoc.seo.enabled, type: "boolean" },
{ name: "seo.domain", typeOF: parsedDoc.seo.domain, type: "string", verifyExtras: () => {
try {
new URL(parsedDoc.seo.domain);
}
catch (e) {
return Error(e);
}
return true;
}},
{ name: "db", typeOF: parsedDoc.db, type: "object" },
{ name: "db.name", typeOF: parsedDoc.db.name, type: "string" },
{ name: "db.username", typeOF: parsedDoc.db.username, type: "string" },
{ name: "db.password", typeOF: parsedDoc.db.password, type: "string" },
{ name: "db.postgres", typeOF: parsedDoc.db.postgres, type: "boolean" },
{ name: "postgres", typeOF: parsedDoc.postgres, type: "object" },
{ name: "postgres.domain", typeOF: parsedDoc.postgres.domain, type: "string" },
{ name: "postgres.port", typeOF: parsedDoc.postgres.port, type: "number" }
]);
if (parsedDoc.marketplace.psk === "CHANGEME") {
console.warn(chalk.yellow.bold('PSK should be changed from "CHANGEME"'));
}
if (parsedDoc.db.password === "password") {
console.warn(chalk.red.bold("You should change your DB password!!"));
}
export { TomlData, parsedDoc };

98
server/dbSetup.ts Normal file
View file

@ -0,0 +1,98 @@
import { fileURLToPath } from "node:url";
import chalk from "chalk";
import ora from "ora";
import { ModelStatic } from "sequelize";
import { Catalog, CatalogModel } from "./marketplace.js";
interface Items extends Omit<Catalog, "background_video" | "background_image"> {
background_video?: string;
background_image?: string;
}
async function installItems(db: ModelStatic<CatalogModel>, items: Items[]) {
items.forEach(async (item) => {
await db.create({
package_name: item.package_name,
title: item.title,
image: item.image,
author: item.author,
version: item.version,
description: item.description,
tags: item.tags,
payload: item.payload,
background_video: item.background_video,
background_image: item.background_image,
type: item.type
});
});
}
async function setupDB(db: ModelStatic<CatalogModel>) {
//We have some packages that need to be installed if they aren't.
const items: Items[] = [
{
package_name: "com.nebula.gruvbox",
title: "Gruvbox",
image: "gruvbox.jpg",
author: "Nebula Services",
version: "1.0.0",
description: "The gruvbox theme",
tags: ["Theme", "Simple"],
payload: "gruvbox.css",
type: "theme"
},
{
package_name: "com.nebula.oled",
title: "Oled theme",
image: "oled.jpg",
author: "Nebula Services",
version: "1.0.0",
description: "A sleek & simple Oled theme for Nebula",
tags: ["Theme", "Simple", "Sleek"],
payload: "oled.css",
type: "theme"
},
{
package_name: "com.nebula.lightTheme",
title: "Light Theme",
image: "light.png",
author: "Nebula Services",
version: "1.0.0",
description: "A sleek light theme for Nebula",
tags: ["Theme", "Simple", "Light"],
payload: "light.css",
type: "theme"
},
{
package_name: "com.nebula.retro",
title: "Retro Theme",
image: "retro.png",
author: "Nebula Services",
version: "1.0.0",
description: "Give a retro look to Nebula",
tags: ["Theme", "Simple", "Dark", "Retro"],
payload: "retro.css",
type: "theme"
},
/* {
package_name: 'gyatt',
title: 'gyatt',
image: 'gyatt',
author: "nebuka",
version: "2",
description: "e",
tags: [ "e" ],
payload: "gyatt.js",
type: "plugin-page"
} */
//To add plugins: plugin types consist of plugin-sw (workerware) & plugin-page (uv.config.inject)
];
const dbItems = await db.findAll();
if (dbItems.length === 0) {
const spinner = ora(chalk.hex("#7967dd")("Performing DB setup...")).start();
await installItems(db, items);
spinner.succeed(chalk.hex("#eb6f92")("DB setup complete!"));
}
}
export { setupDB };

1
server/env.d.ts vendored Normal file
View file

@ -0,0 +1 @@
declare module "@rubynetwork/rammerhead/src/server/index.js";

229
server/marketplace.ts Normal file
View file

@ -0,0 +1,229 @@
import { createWriteStream } from "node:fs";
import { constants, access, mkdir } from "node:fs/promises";
import { pipeline } from "node:stream/promises";
import { fileURLToPath } from "node:url";
import { FastifyInstance, FastifyRequest } from "fastify";
import { DataTypes, InferAttributes, InferCreationAttributes, Model, Sequelize } from "sequelize";
import { parsedDoc } from "./config.js";
const db = new Sequelize(parsedDoc.db.name, parsedDoc.db.username, parsedDoc.db.password, {
host: parsedDoc.db.postgres ? `${parsedDoc.postgres.domain}` : "localhost",
port: parsedDoc.db.postgres ? parsedDoc.postgres.port : undefined,
dialect: parsedDoc.db.postgres ? "postgres" : "sqlite",
logging: parsedDoc.server.server.logging,
storage: "database.sqlite" //this is sqlite only
});
type CatalogType = "theme" | "plugin-page" | "plugin-sw";
interface Catalog {
package_name: string;
title: string;
description: string;
author: string;
image: string;
tags: object;
version: string;
background_image: string;
background_video: string;
payload: string;
type: CatalogType;
}
interface CatalogModel
extends Catalog,
Model<InferAttributes<CatalogModel>, InferCreationAttributes<CatalogModel>> {}
const catalogAssets = db.define<CatalogModel>("catalog_assets", {
package_name: { type: DataTypes.STRING, unique: true },
title: { type: DataTypes.TEXT },
description: { type: DataTypes.TEXT },
author: { type: DataTypes.TEXT },
image: { type: DataTypes.TEXT },
tags: { type: DataTypes.JSON, allowNull: true },
version: { type: DataTypes.TEXT },
background_image: { type: DataTypes.TEXT, allowNull: true },
background_video: { type: DataTypes.TEXT, allowNull: true },
payload: { type: DataTypes.TEXT },
type: { type: DataTypes.TEXT }
});
function marketplaceAPI(app: FastifyInstance) {
app.get("/api/catalog-stats/", (request, reply) => {
reply.send({
version: "1.0.0",
spec: "Nebula Services",
enabled: true
});
});
// This API returns a list of the assets in the database (SW plugins and themes).
// It also returns the number of pages in the database.
// It can take a `?page=x` argument to display a different page, with a limit of 20 assets per page.
type CatalogAssetsReq = FastifyRequest<{ Querystring: { page: string } }>;
app.get("/api/catalog-assets/", async (request: CatalogAssetsReq, reply) => {
try {
const { page } = request.query;
const pageNum: number = parseInt(page, 10) || 1;
if (pageNum < 1) {
reply.status(400).send({ error: "Page must be a positive number!" });
}
const offset = (pageNum - 1) * 20;
const totalItems = await catalogAssets.count();
const dbAssets = await catalogAssets.findAll({ offset: offset, limit: 20 });
const assets = dbAssets.reduce((acc, asset) => {
acc[asset.package_name] = {
title: asset.title,
description: asset.description,
author: asset.author,
image: asset.image,
tags: asset.tags,
version: asset.version,
background_image: asset.background_image,
background_video: asset.background_video,
payload: asset.payload,
type: asset.type
};
return acc;
}, {});
return reply.send({ assets, pages: Math.ceil(totalItems / 20) });
} catch (error) {
return reply.status(500).send({ error: "An error occured" });
}
});
type PackageReq = FastifyRequest<{ Params: { package: string } }>;
app.get("/api/packages/:package", async (request: PackageReq, reply) => {
try {
const packageRow = await catalogAssets.findOne({
where: { package_name: request.params.package }
});
if (!packageRow) return reply.status(404).send({ error: "Package not found!" });
const details = {
title: packageRow.get("title"),
description: packageRow.get("description"),
image: packageRow.get("image"),
author: packageRow.get("author"),
tags: packageRow.get("tags"),
version: packageRow.get("version"),
background_image: packageRow.get("background_image"),
background_video: packageRow.get("background_video"),
payload: packageRow.get("payload"),
type: packageRow.get("type")
};
reply.send(details);
} catch (error) {
reply.status(500).send({ error: "An unexpected error occured" });
}
});
type UploadReq = FastifyRequest<{ Headers: { psk: string; packagename: string } }>;
type CreateReq = FastifyRequest<{
Headers: { psk: string };
Body: {
uuid: string;
title: string;
image: string;
author: string;
version: string;
description: string;
tags: object | any;
payload: string;
background_video: string;
background_image: string;
type: CatalogType;
};
}>;
interface VerifyStatus {
status: number;
error?: Error;
}
async function verifyReq(
request: UploadReq | CreateReq,
upload: Boolean,
data: any
): Promise<VerifyStatus> {
if (request.headers.psk !== parsedDoc.marketplace.psk) {
return { status: 403, error: new Error("PSK isn't correct!") };
} else if (upload && !request.headers.packagename) {
return { status: 500, error: new Error("No packagename defined!") };
} else if (upload && !data) {
return { status: 400, error: new Error("No file uploaded!") };
} else {
return { status: 200 };
}
}
app.post("/api/upload-asset", async (request: UploadReq, reply) => {
const data = await request.file();
const verify: VerifyStatus = await verifyReq(request, true, data);
if (verify.error !== undefined) {
reply.status(verify.status).send({ status: verify.error.message });
} else {
try {
await pipeline(
data.file,
createWriteStream(
fileURLToPath(
new URL(
`../database_assets/${request.headers.packagename}/${data.filename}`,
import.meta.url
)
)
)
);
} catch (error) {
return reply.status(500).send({
status: `File couldn't be uploaded! (Package most likely doesn't exist)`
});
}
return reply.status(verify.status).send({ status: "File uploaded successfully!" });
}
});
app.post("/api/create-package", async (request: CreateReq, reply) => {
const verify: VerifyStatus = await verifyReq(request, false, undefined);
if (verify.error !== undefined) {
reply.status(verify.status).send({ status: verify.error.message });
} else {
const body: Catalog = {
package_name: request.body.uuid,
title: request.body.title,
image: request.body.image,
author: request.body.author,
version: request.body.version,
description: request.body.description,
tags: request.body.tags,
payload: request.body.payload,
background_video: request.body.background_video,
background_image: request.body.background_image,
type: request.body.type as CatalogType
};
await catalogAssets.create({
package_name: body.package_name,
title: body.title,
image: body.image,
author: body.author,
version: body.version,
description: body.description,
tags: body.tags,
payload: body.payload,
background_video: body.background_video,
background_image: body.background_image,
type: body.type
});
const assets = fileURLToPath(new URL("../database_assets", import.meta.url));
try {
await access(`${assets}/${body.package_name}/`, constants.F_OK);
return reply.status(500).send({ status: "Package already exists!" });
} catch (err) {
await mkdir(`${assets}/${body.package_name}/`);
return reply
.status(verify.status)
.send({ status: "Package created successfully!" });
}
}
});
}
export { marketplaceAPI, db, catalogAssets, Catalog, CatalogModel };

93
server/server.ts Normal file
View file

@ -0,0 +1,93 @@
import { createWriteStream } from "node:fs";
import { constants, access, mkdir } from "node:fs/promises";
import { pipeline } from "node:stream/promises";
import { fileURLToPath } from "node:url";
import fastifyCompress from "@fastify/compress";
import fastifyHelmet from "@fastify/helmet";
import fastifyMiddie from "@fastify/middie";
import fastifyMultipart from "@fastify/multipart";
import fastifyStatic from "@fastify/static";
import chalk from "chalk";
import Fastify, { FastifyReply, FastifyRequest } from "fastify";
import gradient from "gradient-string";
//@ts-ignore WHY would I want this typechecked AT ALL
import { handler as ssrHandler } from "../dist/server/entry.mjs";
import { parsedDoc } from "./config.js";
import { setupDB } from "./dbSetup.js";
import { catalogAssets, marketplaceAPI } from "./marketplace.js";
import { serverFactory } from "./serverFactory.js";
const app = Fastify({
logger: parsedDoc.server.server.logging,
ignoreDuplicateSlashes: true,
ignoreTrailingSlash: true,
serverFactory: serverFactory
});
await app.register(fastifyCompress, {
encodings: ["br", "gzip", "deflate"]
});
await app.register(fastifyMultipart, {
limits: {
fileSize: 25 * 1024 * 1024,
parts: Infinity
},
});
await app.register(fastifyHelmet, {
xPoweredBy: false,
crossOriginEmbedderPolicy: true,
crossOriginOpenerPolicy: true,
contentSecurityPolicy: false //Disabled because astro DOES NOT LIKE IT
});
await app.register(fastifyStatic, {
root: fileURLToPath(new URL("../dist/client", import.meta.url))
});
//Our marketplace API. Not middleware as I don't want to deal with that LOL. Just a function that passes our app to it.
if (parsedDoc.marketplace.enabled) {
await app.register(fastifyStatic, {
root: fileURLToPath(new URL("../database_assets", import.meta.url)),
prefix: "/packages/",
decorateReply: false
});
marketplaceAPI(app);
}
await app.register(fastifyMiddie);
app.use(ssrHandler);
const port: number =
parseInt(process.env.PORT as string) || parsedDoc.server.server.port || parseInt("8080");
const titleText = `
_ _ _ _ ____ _
| \\ | | ___| |__ _ _| | __ _ / ___| ___ _ ____ _(_) ___ ___ ___
| \\| |/ _ \\ '_ \\| | | | |/ _' | \\___ \\ / _ \\ '__\\ \\ / / |/ __/ _ \\/ __|
| |\\ | __/ |_) | |_| | | (_| | ___) | __/ | \\ V /| | (_| __/\\__ \\
|_| \\_|\\___|_.__/ \\__,_|_|\\__,_| |____/ \\___|_| \\_/ |_|\\___\\___||___/
`;
const titleColors = {
purple: "#7967dd",
pink: "#eb6f92"
};
console.log(gradient(Object.values(titleColors)).multiline(titleText as string));
app.listen({ port: port, host: "0.0.0.0" }).then(async () => {
console.log(
chalk.hex("#7967dd")(
`Server listening on ${chalk.hex("#eb6f92").bold("http://localhost:" + port + "/")}`
)
);
console.log(
chalk.hex("#7967dd")(
`Server also listening on ${chalk.hex("#eb6f92").bold("http://0.0.0.0:" + port + "/")}`
)
);
if (parsedDoc.marketplace.enabled) {
await catalogAssets.sync();
await setupDB(catalogAssets);
}
});

29
server/serverFactory.ts Normal file
View file

@ -0,0 +1,29 @@
import { createServer } from "node:http";
import { FastifyServerFactory, FastifyServerFactoryHandler, RawServerDefault } from "fastify";
import wisp from "wisp-server-node";
import { LOG_LEVEL, WispOptions } from "wisp-server-node/dist/Types.js";
import { parsedDoc } from "./config.js";
const wispOptions: WispOptions = {
logLevel: parsedDoc.server.server.logging ? LOG_LEVEL.DEBUG : LOG_LEVEL.NONE,
pingInterval: 30
};
const serverFactory: FastifyServerFactory = (
handler: FastifyServerFactoryHandler
): RawServerDefault => {
const httpServer = createServer();
httpServer.on("request", (req, res) => {
handler(req, res);
});
httpServer.on("upgrade", (req, socket, head) => {
if (parsedDoc.server.server.wisp) {
if (req.url?.endsWith("/wisp/")) {
wisp.routeRequest(req, socket as any, head, wispOptions);
}
}
});
return httpServer;
};
export { serverFactory };

11
server/tsconfig.json Normal file
View file

@ -0,0 +1,11 @@
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"noEmit": false,
"esModuleInterop": true,
"skipLibCheck": true,
"paths": {}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
src/assets/credits/uv.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
src/assets/fortnite.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

61
src/components/Card.astro Normal file
View file

@ -0,0 +1,61 @@
---
interface Props {
title: string;
body: string;
href: string;
}
const { href, title, body } = Astro.props;
---
<li class="link-card">
<a href={href}>
<h2>
{title}
<span>&rarr;</span>
</h2>
<p>
{body}
</p>
</a>
</li>
<style>
.link-card {
list-style: none;
display: flex;
padding: 1px;
background-color: #23262d;
background-image: none;
background-size: 400%;
border-radius: 7px;
background-position: 100%;
transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1);
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
}
.link-card > a {
width: 100%;
text-decoration: none;
line-height: 1.4;
padding: calc(1.5rem - 1px);
border-radius: 8px;
color: white;
background-color: #23262d;
opacity: 0.8;
}
h2 {
margin: 0;
font-size: 1.25rem;
transition: color 0.6s cubic-bezier(0.22, 1, 0.36, 1);
}
p {
margin-top: 0.5rem;
margin-bottom: 0;
}
.link-card:is(:hover, :focus-within) {
background-position: 0;
background-image: var(--accent-gradient);
}
.link-card:is(:hover, :focus-within) h2 {
color: rgb(var(--accent-light));
}
</style>

View file

@ -0,0 +1,71 @@
---
import { MARKETPLACE_ENABLED } from "astro:env/client";
import { Icon } from "astro-icon/components";
import { getLangFromUrl, useTranslations } from "../i18n/utils";
import HeaderButton from "./HeaderButton.astro";
import Logo from "./Logo.astro";
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
---
<div
id="navbar"
class="flex h-16 flex-row items-center justify-end border-b-2 border-border-color bg-navbar-color px-4 z-30 relative"
>
<div class="w-1/8">
{/* Typical desktop menu */}
<div class="relative flex-row hidden lg:flex">
<HeaderButton text={t("header.home")} route={`/${lang}/`}>
<Icon
name="ph:house-bold"
class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6"
/>
</HeaderButton>
<HeaderButton text={t("header.games")} route={`/${lang}/games/`}>
<Icon
name="ph:cube"
class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6"
/>
{
/* Astro won't let us pass the icon as a prop so it's going into the outlet here. */
}
</HeaderButton>
<HeaderButton
text={t("header.settings")}
route={`/${lang}/settings/appearance`}
>
<Icon
name="ph:wrench-fill"
class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6"
/>
</HeaderButton>
{MARKETPLACE_ENABLED &&
<HeaderButton text={t("header.catalog")} route={`/${lang}/catalog/1`}>
<Icon
name="ph:shopping-bag-open-fill"
class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6"
/>
</HeaderButton>
}
<HeaderButton text={t("header.morelinks")}>
<Icon
name="ph:link-bold"
class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6"
/>
</HeaderButton>
</div>
{/* Mobile hamburger menu */}
<div class="flex lg:hidden cursor-pointer" id="mobileNavTrigger">
<Icon
name="ph:text-align-justify-bold"
class="h-9 w-9 text-text-color"
id="hamburger_menu"
/>
<Icon
name="ph:caret-right-bold"
class="h-9 w-9 text-text-color hidden"
id="right_caret"
/>
</div>
</div>
</div>

View file

@ -0,0 +1,16 @@
---
const { text, route } = Astro.props;
---
<a
class="group flex w-full flex-row items-center justify-center border-t-2 border-solid border-navbar-text-color p-4 lg:border-none h-1/3 lg:h-fit"
id="header_anchor"
href={route}
>
<slot />
<span
class="font-roboto pl-2 text-center text-3xl font-bold text-text-color roboto transition duration-500 group-hover:text-text-hover-color lg:text-xl text-nowrap"
>
{text}
</span>
</a>

View file

@ -0,0 +1,23 @@
<div class="w-full h-full bg-primary text-navbar-text-color flex justify-center items-center">
<svg xmlns="http://www.w3.org/2000/svg" version="1.2" viewBox="0 0 400 400" width="400" height="400" fill="#5e17eb" class="animate-pulse-brighter w-48 h-48">
<g id="svgg">
<path id="path0" fill="currentColor" fill-rule="evenodd" class="s0" d="m213.6 84c1 0.3 3.4 0.7 5.1 1 1.8 0.2 4.1 0.7 5.2 1 13.2 4.1 20.3 6.8 24.5 9.1 0.6 0.3 2.3 1.2 3.8 2 2.8 1.4 13.1 8 14.4 9.2 0.5 0.3 2.3 1.9 4.2 3.5 6.7 5.5 15.5 14.9 19.2 20.4 1 1.4 2 2.7 2.2 2.8 0.3 0.1 0.5 0.5 0.5 0.8 0 0.3 1.2 2.2 2.5 4.3 2.3 3.4 7.8 14.3 9.8 19.3 0.8 2.1 0.9 2.2 10 4.9 5.6 1.6 11.1 3.4 11.7 3.8 0.3 0.2 2.4 1.1 4.7 1.9 11.1 4.1 23 12.5 27.3 19.4 5.5 8.7 3.6 20.5-4.5 28.5-3.1 3-7.5 6.4-8.4 6.4-0.3 0-0.7 0.2-0.8 0.5-1.1 2.3-23.3 11.2-35.9 14.3-3.2 0.9-3.5 1.2-5.7 6.8-7.5 19-25.5 40.6-42.3 51.1-1.6 1-3.1 2-3.3 2.2-0.1 0.2-0.9 0.7-1.7 1.2-0.8 0.4-2.2 1.2-2.9 1.6-0.8 0.4-1.6 1-1.8 1.1-0.5 0.5-4.1 2.2-8.1 3.9-1.8 0.8-3.8 1.6-4.5 2-0.7 0.3-3.1 1.1-5.2 1.8-8.3 2.6-9.8 3-21 4.9-6.4 1.1-25.3 1.3-30.5 0.3-1.9-0.3-5.8-1.1-8.6-1.6-6.8-1.3-12.7-3-20-5.7-3.3-1.2-18-8.8-19.7-10.1-0.9-0.7-4.1-3.1-7.1-5.2-5.7-4.1-17.9-15.9-20.7-20-0.9-1.2-2-2.7-2.5-3.2-3.2-3.3-13.7-21.7-13.7-24.1 0-0.6-0.2-1.2-0.6-1.4-0.3-0.2-0.8-1.2-1-2.3-0.4-1.9-1.7-2.7-6.5-3.8-23.2-5.6-43.1-17.2-48.6-28.5-7.1-14.4 4.5-31.3 27.3-39.7 1.8-0.7 4.1-1.6 5.2-2 3.7-1.5 8-2.9 19.5-6.2 1.6-0.5 2.8-1.2 2.8-1.7 0-2.4 9.8-21.6 13.1-25.7 0.2-0.4 1.4-1.8 2.5-3.2 13.8-18.1 30.2-30.6 50.6-38.8 4.3-1.7 6-2.3 14.3-4.5 5.5-1.6 11.2-2.4 18.4-2.9 7.9-0.5 24-0.2 26.8 0.6zm-29.7 17.3c-0.2 0.1-7.3 1.7-12.9 2.7-1.7 0.4-4.3 1.2-5.8 1.9-1.5 0.6-3.9 1.5-5.5 2-1.5 0.4-3.3 1.3-4 2-0.7 0.7-1.7 1.2-2.3 1.2-1.2 0-9.5 4.5-9.8 5.3-0.2 0.3-0.5 0.6-0.9 0.6-1.9 0-19.6 16-23.8 21.6-9.3 12.2-16.1 27.4-19.2 42.7-2 10.1-1.1 37.5 1.4 41.4 0 0.1 3.7 0.9 8.1 1.8 9.5 1.9 12.8 2.4 34.6 4.9 38.5 4.5 107.9 2.2 138.3-4.5 1.4-0.3 4.1-0.9 6.1-1.3 4.2-0.8 3.4 0.2 4.9-7.1 1.6-8.3 1.7-27 0.1-34.6-1.5-7.1-3.2-13.4-3.7-14.2-0.3-0.4-0.7-1.5-0.9-2.6-2.8-12.1-19.2-34.1-33-44.3-2.9-2.1-5.5-4-5.8-4.3-2.8-2.2-4.9-3.1-7.2-3.1-2.1 0-2.6-0.2-2.7-1.3-0.2-1.5-5.7-4.5-6.3-3.5-0.7 1.1-2.4 0.6-2.7-0.7-0.4-1.3-1.2-1.6-5.8-2.1-1.6-0.2-4-0.9-5.5-1.6-3.9-1.8-5.3-2.2-10.2-2.6-4.6-0.4-25.2-0.7-25.5-0.3zm74.3 42.2c7.4 9.8 4.8 23.5-4.6 24.9-6.9 1-20.9-5.8-21-10.2 0-0.2-0.3-0.8-0.8-1.3-6.4-6.8-5-20.8 2.4-24.1 6.7-2.9 17.2 1.8 24 10.7zm-176.4 36.4c-0.1-0.1-4.6 1.1-5.9 1.6-0.7 0.3-3 1.2-5.1 2-9.9 3.8-15.1 6.8-19.6 11.5-3.4 3.5-3.3 4.5 0.5 8.7 1 1 11.3 7.6 12 7.6 0.2 0 1.7 0.6 3.4 1.3 1.6 0.8 3.6 1.6 4.3 1.9 1.8 0.8 9.3 3.3 9.9 3.3 0.3 0 0.3-2 0-4.4-0.6-5.6-0.6-24.5 0.1-29.6 0.3-2.1 0.5-3.9 0.4-3.9zm229.3-0.3c-0.2 0 0 1 0.2 2.1 0.6 2.8 0.6 31.3 0 34-0.5 2.2-0.4 2.2 1.3 1.8 3.1-0.7 12.9-4.5 18.3-7 8.5-4 14.3-10.1 12.6-13.3-1.1-2.1-6.7-7.2-7.9-7.2-0.4 0-0.9-0.2-1-0.5-0.4-1.1-11.8-6.1-19.2-8.5-2.3-0.7-4.2-1.4-4.3-1.4zm-199.4 63.4l-3.1-0.4 1.8 3.2c0.9 1.8 1.9 3.4 2.2 3.5 0.3 0.1 0.5 0.6 0.5 1.1 0 0.4 0.6 1.5 1.3 2.3 0.7 0.9 1.5 1.9 1.8 2.2 0.3 0.4 0.8 1.2 1.1 1.7 6.2 10.7 35.6 33.5 43.3 33.5 0.2 0 1.3 0.4 2.5 0.9 2.5 1.2 10.6 3.4 15.3 4.2 9.5 1.8 11.6 2.1 17.4 2.1 6.6 0 16.4-1.3 22.9-3 2.2-0.5 5.2-1.3 6.8-1.7 1.6-0.3 3.2-0.9 3.5-1.2 0.4-0.3 1.1-0.6 1.6-0.6 2.3 0 22-10.6 24-12.9 0.2-0.2 2.2-1.9 4.5-3.7 5.7-4.5 11.8-11 17.1-18.4 1.6-2.3 3.2-4.5 3.6-4.9 0.4-0.4 0.7-1 0.7-1.2 0-0.2 0.8-1.9 1.9-3.6 1.1-1.7 1.9-3.2 1.9-3.4 0-0.2-3.8 0.4-11 1.6-31.7 5.4-85.1 6.7-126.9 3.1-9.6-0.8-23.1-2.3-27.8-3.2-2.2-0.4-5.3-0.9-6.9-1.2z"/>
</g>
</svg>
</div>
<style>
@keyframes pulse-brighter {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
.animate-pulse-brighter {
animation: pulse-brighter 2s infinite;
height: 11rem;
}
</style>

15
src/components/Logo.astro Normal file
View file

@ -0,0 +1,15 @@
<svg
version="1.2"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 400 400"
width="400"
height="400"
style="width: 100%; height: 100%;"
><title>nebula</title><g id="svgg"
><path
id="path0"
fill-rule="evenodd"
d="m213.6 84c1 0.3 3.4 0.7 5.1 1 1.8 0.2 4.1 0.7 5.2 1 13.2 4.1 20.3 6.8 24.5 9.1 0.6 0.3 2.3 1.2 3.8 2 2.8 1.4 13.1 8 14.4 9.2 0.5 0.3 2.3 1.9 4.2 3.5 6.7 5.5 15.5 14.9 19.2 20.4 1 1.4 2 2.7 2.2 2.8 0.3 0.1 0.5 0.5 0.5 0.8 0 0.3 1.2 2.2 2.5 4.3 2.3 3.4 7.8 14.3 9.8 19.3 0.8 2.1 0.9 2.2 10 4.9 5.6 1.6 11.1 3.4 11.7 3.8 0.3 0.2 2.4 1.1 4.7 1.9 11.1 4.1 23 12.5 27.3 19.4 5.5 8.7 3.6 20.5-4.5 28.5-3.1 3-7.5 6.4-8.4 6.4-0.3 0-0.7 0.2-0.8 0.5-1.1 2.3-23.3 11.2-35.9 14.3-3.2 0.9-3.5 1.2-5.7 6.8-7.5 19-25.5 40.6-42.3 51.1-1.6 1-3.1 2-3.3 2.2-0.1 0.2-0.9 0.7-1.7 1.2-0.8 0.4-2.2 1.2-2.9 1.6-0.8 0.4-1.6 1-1.8 1.1-0.5 0.5-4.1 2.2-8.1 3.9-1.8 0.8-3.8 1.6-4.5 2-0.7 0.3-3.1 1.1-5.2 1.8-8.3 2.6-9.8 3-21 4.9-6.4 1.1-25.3 1.3-30.5 0.3-1.9-0.3-5.8-1.1-8.6-1.6-6.8-1.3-12.7-3-20-5.7-3.3-1.2-18-8.8-19.7-10.1-0.9-0.7-4.1-3.1-7.1-5.2-5.7-4.1-17.9-15.9-20.7-20-0.9-1.2-2-2.7-2.5-3.2-3.2-3.3-13.7-21.7-13.7-24.1 0-0.6-0.2-1.2-0.6-1.4-0.3-0.2-0.8-1.2-1-2.3-0.4-1.9-1.7-2.7-6.5-3.8-23.2-5.6-43.1-17.2-48.6-28.5-7.1-14.4 4.5-31.3 27.3-39.7 1.8-0.7 4.1-1.6 5.2-2 3.7-1.5 8-2.9 19.5-6.2 1.6-0.5 2.8-1.2 2.8-1.7 0-2.4 9.8-21.6 13.1-25.7 0.2-0.4 1.4-1.8 2.5-3.2 13.8-18.1 30.2-30.6 50.6-38.8 4.3-1.7 6-2.3 14.3-4.5 5.5-1.6 11.2-2.4 18.4-2.9 7.9-0.5 24-0.2 26.8 0.6zm-29.7 17.3c-0.2 0.1-7.3 1.7-12.9 2.7-1.7 0.4-4.3 1.2-5.8 1.9-1.5 0.6-3.9 1.5-5.5 2-1.5 0.4-3.3 1.3-4 2-0.7 0.7-1.7 1.2-2.3 1.2-1.2 0-9.5 4.5-9.8 5.3-0.2 0.3-0.5 0.6-0.9 0.6-1.9 0-19.6 16-23.8 21.6-9.3 12.2-16.1 27.4-19.2 42.7-2 10.1-1.1 37.5 1.4 41.4 0 0.1 3.7 0.9 8.1 1.8 9.5 1.9 12.8 2.4 34.6 4.9 38.5 4.5 107.9 2.2 138.3-4.5 1.4-0.3 4.1-0.9 6.1-1.3 4.2-0.8 3.4 0.2 4.9-7.1 1.6-8.3 1.7-27 0.1-34.6-1.5-7.1-3.2-13.4-3.7-14.2-0.3-0.4-0.7-1.5-0.9-2.6-2.8-12.1-19.2-34.1-33-44.3-2.9-2.1-5.5-4-5.8-4.3-2.8-2.2-4.9-3.1-7.2-3.1-2.1 0-2.6-0.2-2.7-1.3-0.2-1.5-5.7-4.5-6.3-3.5-0.7 1.1-2.4 0.6-2.7-0.7-0.4-1.3-1.2-1.6-5.8-2.1-1.6-0.2-4-0.9-5.5-1.6-3.9-1.8-5.3-2.2-10.2-2.6-4.6-0.4-25.2-0.7-25.5-0.3zm74.3 42.2c7.4 9.8 4.8 23.5-4.6 24.9-6.9 1-20.9-5.8-21-10.2 0-0.2-0.3-0.8-0.8-1.3-6.4-6.8-5-20.8 2.4-24.1 6.7-2.9 17.2 1.8 24 10.7zm-176.4 36.4c-0.1-0.1-4.6 1.1-5.9 1.6-0.7 0.3-3 1.2-5.1 2-9.9 3.8-15.1 6.8-19.6 11.5-3.4 3.5-3.3 4.5 0.5 8.7 1 1 11.3 7.6 12 7.6 0.2 0 1.7 0.6 3.4 1.3 1.6 0.8 3.6 1.6 4.3 1.9 1.8 0.8 9.3 3.3 9.9 3.3 0.3 0 0.3-2 0-4.4-0.6-5.6-0.6-24.5 0.1-29.6 0.3-2.1 0.5-3.9 0.4-3.9zm229.3-0.3c-0.2 0 0 1 0.2 2.1 0.6 2.8 0.6 31.3 0 34-0.5 2.2-0.4 2.2 1.3 1.8 3.1-0.7 12.9-4.5 18.3-7 8.5-4 14.3-10.1 12.6-13.3-1.1-2.1-6.7-7.2-7.9-7.2-0.4 0-0.9-0.2-1-0.5-0.4-1.1-11.8-6.1-19.2-8.5-2.3-0.7-4.2-1.4-4.3-1.4zm-199.4 63.4l-3.1-0.4 1.8 3.2c0.9 1.8 1.9 3.4 2.2 3.5 0.3 0.1 0.5 0.6 0.5 1.1 0 0.4 0.6 1.5 1.3 2.3 0.7 0.9 1.5 1.9 1.8 2.2 0.3 0.4 0.8 1.2 1.1 1.7 6.2 10.7 35.6 33.5 43.3 33.5 0.2 0 1.3 0.4 2.5 0.9 2.5 1.2 10.6 3.4 15.3 4.2 9.5 1.8 11.6 2.1 17.4 2.1 6.6 0 16.4-1.3 22.9-3 2.2-0.5 5.2-1.3 6.8-1.7 1.6-0.3 3.2-0.9 3.5-1.2 0.4-0.3 1.1-0.6 1.6-0.6 2.3 0 22-10.6 24-12.9 0.2-0.2 2.2-1.9 4.5-3.7 5.7-4.5 11.8-11 17.1-18.4 1.6-2.3 3.2-4.5 3.6-4.9 0.4-0.4 0.7-1 0.7-1.2 0-0.2 0.8-1.9 1.9-3.6 1.1-1.7 1.9-3.2 1.9-3.4 0-0.2-3.8 0.4-11 1.6-31.7 5.4-85.1 6.7-126.9 3.1-9.6-0.8-23.1-2.3-27.8-3.2-2.2-0.4-5.3-0.9-6.9-1.2z"
class="s0"></path></g
></svg
>

After

Width:  |  Height:  |  Size: 3.4 KiB

View file

@ -0,0 +1,102 @@
---
import { Icon } from "astro-icon/components";
import { getLangFromUrl, useTranslations } from "../i18n/utils";
import HeaderButton from "./HeaderButton.astro";
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
import { MARKETPLACE_ENABLED } from "astro:env/client";
---
<div class="h-full mt-16 flex w-full flex-col justify-evenly bg-navbar-color m-auto" id="mobilenav">
<HeaderButton text={t("header.home")} route={`/${lang}/`}>
<Icon
name="ph:house-bold"
class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6"
/>
</HeaderButton>
<HeaderButton text={t("header.games")} route={`/${lang}/games/`}>
<Icon
name="ph:cube"
class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6"
/>
</HeaderButton>
<HeaderButton
text={t("header.settings")}
route={`/${lang}/settings/appearance`}
>
<Icon
name="ph:wrench-fill"
class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6"
/>
</HeaderButton>
{MARKETPLACE_ENABLED &&
<HeaderButton text={t("header.catalog")} route={`/${lang}/catalog/1`}>
<Icon
name="ph:shopping-bag-open-fill"
class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6"
/>
</HeaderButton>
}
<HeaderButton text={t("header.morelinks")}>
<Icon
name="ph:link-bold"
class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6"
/>
</HeaderButton>
</div>
<style is:global>
#mobilenav {
-webkit-transition-duration: 600ms;
transition-duration: 600ms;
transform: translateX(100%);
}
#mobilenavwrapper {
-webkit-transition-duration: 600ms;
transition-duration: 600ms;
transform: translateX(100%);
}
</style>
<script>
import { EventHandler } from "@utils/events";
import { Elements } from "@utils/index";
const init = async () => {
const els = Elements.select([
{ type: 'id', val: 'mobileNavTrigger' },
{ type: 'id', val: 'right_caret' },
{ type: 'id', val: 'hamburger_menu' },
{ type: 'id', val: 'mobilenavwrapper' },
{ type: 'id', val: 'mobilenav' }
]);
const trigger = Elements.exists<HTMLDivElement>(await els.next());
const rightCaret = Elements.exists<SVGElement>(await els.next());
const hamburgerMenu = Elements.exists<SVGElement>(await els.next());
const wrapper = Elements.exists<HTMLDivElement>(await els.next());
const mnm = Elements.exists<HTMLDivElement>(await els.next());
let isOpen = false;
Elements.attachEvent(trigger, "click", async () => {
console.log(isOpen);
if (isOpen) {
rightCaret.style.display = "none";
hamburgerMenu.style.display = "block";
mnm.style.transform = "translateX(100%)";
wrapper.style.transform = "translateX(100%)";
isOpen = false;
}
else {
hamburgerMenu.style.display = "none";
rightCaret.style.display = "block";
mnm.style.display = "flex";
mnm.style.transform = "translateX(0%)";
wrapper.style.transform = "translateX(0%)";
isOpen = true;
}
});
}
new EventHandler({
events: {
"astro:page-load": init
},
logging: false
}).bind();
</script>

View file

@ -0,0 +1,17 @@
---
const { title, route } = Astro.props;
---
<a
href={route}
class="snap-center snap-always group flex flex-col items-center md:p-0 max-sm:p-3 sm:p-3 bg-navbar-color w-full rounded-3xl md:flex-row md:bg-none md:rounded-none"
>
<div class="xl:p-2 max-sm:p-2 sm:p-2 md:p-0">
<slot />
</div>
<div
class="max-md:min-w-24 font-roboto text-center font-bold text-text-color roboto transition duration-500 group-hover:text-text-hover-color md:text-xl text-nowrap"
>
{title}
</div>
</a>

View file

@ -0,0 +1,58 @@
---
interface Props {
page: number | string | undefined;
lang: string;
}
interface Asset {
title: string;
description: string;
author: string;
image: string;
tags: [];
version: string;
background_image: string | null;
background_video: string | null;
payload: string;
type: "theme" | "plugin-sw" | "plugin-page";
}
const { page, lang } = Astro.props;
const getAssets = async () => {
const res = await fetch(new URL(`/api/catalog-assets?page=${page}`, Astro.url));
const data = await res.json();
return data.assets;
};
const assets = await getAssets();
---
<div class="text-3xl font-roboto font-bold text-text-color p-10">
{Object.keys(assets).length > 0 && (
<div class="flex flex-row gap-6 flex-wrap justify-center">
{Object.entries(assets).map((asset) => {
const pName = asset[0];
const a = asset[1] as unknown as Asset;
return (
<a href={`/${lang}/catalog/package/${pName}`}>
<div class="bg-navbar-color w-64 rounded-3xl shadow-lg overflow-hidden transition-transform duration-300 hover:scale-105 text-text-color">
<img src={`/packages/${pName}/${a.image}`} alt={a.title} class="w-full h-40 object-cover" />
<div class="p-6 text-sm">
<p class="font-semibold text-2xl mb-2"> {a.title} </p>
<p class="mb-4"> {a.description} </p>
<div class="flex flex-wrap gap-2 mb-4 w-full">
{a.tags.map((tag) => (
<p class="bg-navbar-text-color text-navbar-color font-bold px-3 py-1 rounded-md text-center"> { tag } </p>
))}
</div>
<p>
<strong>Version: </strong> { a.version }
</p>
<p>
<strong>Type: </strong> { a.type === "plugin-page" || a.type === "plugin-sw" ? "plugin" : a.type }
</p>
</div>
</div>
</a>
)
}
)}
</div>
)}
</div>

View file

@ -0,0 +1,107 @@
<div id="parent" class="flex flex-row flex-wrap gap-4 items-center font-roboto justify-center">
</div>
<div class="w-0 h-0 visibility-none hidden"> <asset-loader1 /> </div>
<script>
import { Elements } from "@utils/index";
import { Marketplace } from "@utils/marketplace";
import { SettingsVals } from "@utils/values";
type Item = {
description: string,
image: string,
package_name: string,
payload: string,
tags: [],
background_video: string,
background_image: string,
title: string,
type: string,
version: string
}
const getItem = async (item: any) => {
try {
const res = await fetch(new URL(`/api/packages/${item.name}`, window.location.origin));
const data = await res.json();
return { ...data, package_name: item.name }
}
catch (err: any) {
console.log(`Err in themes: ${err}`);
return null;
}
}
const constructElements = async (item: Item, parent: HTMLDivElement, marketplace: Marketplace) => {
const main = document.createElement("div");
main.classList.add("rounded-3xl", "bg-navbar-color", "w-64", "flex", "flex-col", "cursor-pointer", "border-text-color");
main.dataset.name = item.package_name
const click = document.createElement("div");
click.classList.add("w-full");
const img = document.createElement("img");
img.classList.add("aspect-[16/9]", "rounded-t-3xl");
img.src = `/packages/${item.package_name}/${item.image}`;
img.alt = `${item.type}-${item.package_name}`;
img.loading = "lazy";
const info = document.createElement("div");
info.classList.add("h-2/6", "text-center", "content-center", "p-3", "font-semibold", "items-center", "flex", "flex-col");
const infoTitle = document.createElement("p");
infoTitle.classList.add("text-2xl");
infoTitle.innerHTML = item.title;
const infoInner = document.createElement("div");
infoInner.classList.add("flex", "flex-row");
const infoInnerDelete = document.createElement("div");
infoInnerDelete.classList.add("h-8", "w-8", "cursor-pointer");
// This is cursed yes. SVG's SUUUCK
infoInnerDelete.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 256 256"><path fill="currentColor" d="M216 48h-40v-8a24 24 0 0 0-24-24h-48a24 24 0 0 0-24 24v8H40a8 8 0 0 0 0 16h8v144a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16V64h8a8 8 0 0 0 0-16M112 168a8 8 0 0 1-16 0v-64a8 8 0 0 1 16 0Zm48 0a8 8 0 0 1-16 0v-64a8 8 0 0 1 16 0Zm0-120H96v-8a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8Z" /></svg>`;
const infoInnerOpen = document.createElement("a");
infoInnerOpen.classList.add("h-8", "w-8", "cursor-pointer");
infoInnerOpen.href = `../catalog/package/${item.package_name}`;
infoInnerOpen.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 256 256"><path fill="currentColor" d="M192 136v72a16 16 0 0 1-16 16H48a16 16 0 0 1-16-16V80a16 16 0 0 1 16-16h72a8 8 0 0 1 0 16H48v128h128v-72a8 8 0 0 1 16 0m32-96a8 8 0 0 0-8-8h-64a8 8 0 0 0-5.66 13.66L172.69 72l-42.35 42.34a8 8 0 0 0 11.32 11.32L184 83.31l26.34 26.35A8 8 0 0 0 224 104Z" /></svg>`;
click.appendChild(img);
infoInner.appendChild(infoInnerDelete);
infoInner.appendChild(infoInnerOpen);
info.appendChild(infoTitle);
info.appendChild(infoInner);
main.appendChild(click);
main.appendChild(info);
parent.appendChild(main);
Elements.attachEvent(infoInnerDelete, "click", async () => {
await marketplace.uninstallPlugin({ name: item.package_name, type: item.type as "page" | "serviceWorker" })
parent.removeChild(main);
});
}
const init = async () => {
await Marketplace.ready();
const mp = Marketplace.getInstances().next().value!;
const els = Elements.select([
{ type: 'id', val: 'parent' }
]);
const itemsJSON = JSON.parse(await mp.getValueFromStore(SettingsVals.marketPlace.plugins)) || [];
const filteredItems = itemsJSON.filter((dat: any) => dat.remove !== true);
const itemPromises = filteredItems.map(getItem);
const itemsArray = await Promise.all(itemPromises);
return {
items: itemsArray.filter((data) => data !== null),
elements: els,
marketplace: mp
}
}
Elements.createCustomElement("asset-loader1", async () => {
const { items, elements, marketplace } = await init();
const parentElem = Elements.exists<HTMLDivElement>(await elements.next());
const promises = items.map(item => constructElements(item, parentElem, marketplace));
await Promise.all(promises);
});
</script>

View file

@ -0,0 +1,138 @@
<div id="parent" class="flex flex-row flex-wrap gap-4 items-center font-roboto justify-center">
<div id="main-theme" class="rounded-3xl bg-navbar-color w-64 flex flex-col cursor-pointer">
<div class="w-full">
<img src="/classic_theme.png" alt="Classic nebula" class="aspect-[16/9] rounded-t-3xl" loading="eager" />
</div>
<div class="h-2/6 text-center content-center p-3 font-semibold items-center flex flex-col text-2xl">
Classic Nebula
</div>
</div>
</div>
<div class="w-0 h-0 visibility-none hidden">
<asset-loader />
</div>
<script>
import { Elements } from "@utils/index";
import { Marketplace } from "@utils/marketplace";
import { SettingsVals } from "@utils/values";
type Item = {
description: string,
image: string,
package_name: string,
payload: string,
tags: [],
background_video: string,
background_image: string,
title: string,
type: string,
version: string
}
const getItem = async (item: any) => {
try {
const res = await fetch(new URL(`/api/packages/${item}`, window.location.origin));
const data = await res.json();
return { ...data, package_name: item }
}
catch (err: any) {
console.log(`Err in themes: ${err}`);
return null;
}
}
const constructElements = async (item: Item, mainTheme: HTMLDivElement, parent: HTMLDivElement, marketplace: Marketplace) => {
const main = document.createElement("div");
main.classList.add("rounded-3xl", "bg-navbar-color", "w-64", "flex", "flex-col", "cursor-pointer", "border-text-color");
main.dataset.name = item.package_name
const click = document.createElement("div");
click.classList.add("w-full");
const img = document.createElement("img");
img.classList.add("aspect-[16/9]", "rounded-t-3xl");
img.src = `/packages/${item.package_name}/${item.image}`;
img.alt = `${item.type}-${item.package_name}`;
img.loading = "lazy";
const info = document.createElement("div");
info.classList.add("h-2/6", "text-center", "content-center", "p-3", "font-semibold", "items-center", "flex", "flex-col");
const infoTitle = document.createElement("p");
infoTitle.classList.add("text-2xl");
infoTitle.innerHTML = item.title;
const infoInner = document.createElement("div");
infoInner.classList.add("flex", "flex-row");
const infoInnerDelete = document.createElement("div");
infoInnerDelete.classList.add("h-8", "w-8", "cursor-pointer");
// This is cursed yes. SVG's SUUUCK
infoInnerDelete.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 256 256"><path fill="currentColor" d="M216 48h-40v-8a24 24 0 0 0-24-24h-48a24 24 0 0 0-24 24v8H40a8 8 0 0 0 0 16h8v144a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16V64h8a8 8 0 0 0 0-16M112 168a8 8 0 0 1-16 0v-64a8 8 0 0 1 16 0Zm48 0a8 8 0 0 1-16 0v-64a8 8 0 0 1 16 0Zm0-120H96v-8a8 8 0 0 1 8-8h48a8 8 0 0 1 8 8Z" /></svg>`;
const infoInnerOpen = document.createElement("a");
infoInnerOpen.classList.add("h-8", "w-8", "cursor-pointer");
infoInnerOpen.href = `../catalog/package/${item.package_name}`;
infoInnerOpen.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 256 256"><path fill="currentColor" d="M192 136v72a16 16 0 0 1-16 16H48a16 16 0 0 1-16-16V80a16 16 0 0 1 16-16h72a8 8 0 0 1 0 16H48v128h128v-72a8 8 0 0 1 16 0m32-96a8 8 0 0 0-8-8h-64a8 8 0 0 0-5.66 13.66L172.69 72l-42.35 42.34a8 8 0 0 0 11.32 11.32L184 83.31l26.34 26.35A8 8 0 0 0 224 104Z" /></svg>`;
click.appendChild(img);
infoInner.appendChild(infoInnerDelete);
infoInner.appendChild(infoInnerOpen);
info.appendChild(infoTitle);
info.appendChild(infoInner);
main.appendChild(click);
main.appendChild(info);
parent.appendChild(main);
Elements.attachEvent(mainTheme, "click", () => {
marketplace.theme({ type: 'remove' });
});
Elements.attachEvent(click, "click", async () => {
await marketplace.theme(
{
type: 'normal',
payload: item.payload,
sources: {
video: item.background_video,
bg: item.background_image
},
name: item.package_name
}
);
});
Elements.attachEvent(infoInnerDelete, "click", async () => {
await marketplace.uninstallTheme({ name: item.package_name });
parent.removeChild(main);
await marketplace.theme({ type: 'remove' });
});
}
const init = async () => {
await Marketplace.ready();
const mp = Marketplace.getInstances().next().value!;
const els = Elements.select([
{ type: 'id', val: 'main-theme' },
{ type: 'id', val: 'parent' }
]);
const itemsJSON = JSON.parse(await mp.getValueFromStore(SettingsVals.marketPlace.themes)) || [];
const itemPromises = itemsJSON.map(getItem);
const itemsArray = await Promise.all(itemPromises);
return {
items: itemsArray.filter((data) => data !== null),
elements: els,
marketplace: mp
}
}
Elements.createCustomElement("asset-loader", async () => {
const { items, elements, marketplace } = await init();
const mainTheme = Elements.exists<HTMLDivElement>(await elements.next());
const parentElem = Elements.exists<HTMLDivElement>(await elements.next());
const promises = items.map(item => constructElements(item, mainTheme, parentElem, marketplace));
await Promise.all(promises);
});
</script>

View file

@ -0,0 +1,19 @@
---
import { Image } from "astro:assets";
import { type ImageMetadata } from "astro";
const images = import.meta.glob<{ default: ImageMetadata }>(
"/src/assets/credits/*.{jpeg,jpg,png,gif,webp}"
);
interface Props {
image?: string;
name: string;
link: string;
}
const { image, name, link } = Astro.props;
---
<a class="rounded-md bg-navbar-color h-50 w-50 p-2 flex flex-col items-center" href={link} target="_blank" rel="noopener noreferrer">
{image && <Image loading='lazy' class='w-32 h-32 object-cover rounded-md' src={images[image]()} alt={name} />}
<p class="h-12 w-full text-text-color flex items-center justify-center text-xl font-semibold">{name}</p>
</a>

View file

@ -0,0 +1,70 @@
<script>
import { EventHandler } from "@utils/events";
import { SW, createProxyScripts, checkProxyScripts, createBareMuxConn, setTransport } from "@utils/serviceWorker";
import { Settings } from "@utils/settings";
import { log } from "@utils/index";
import { Marketplace } from "@utils/marketplace";
import { SettingsVals } from "@utils/values";
const titleText = `
_ _ _ _ ____ _
| \\ | | ___| |__ _ _| | __ _ / ___| ___ _ ____ _(_) ___ ___ ___
| \\| |/ _ \\ '_ \\| | | | |/ _' | \\___ \\ / _ \\ '__\\ \\ / / |/ __/ _ \\/ __|
| |\\ | __/ |_) | |_| | | (_| | ___) | __/ | \\ V /| | (_| __/\\__ \\
|_| \\_|\\___|_.__/ \\__,_|_|\\__,_| |____/ \\___|_| \\_/ |_|\\___\\___||___/
`;
const info = "Hello developer or curious individual & welcome to the console! \nThere isn't a whole lot here for you unless you have run into an error.";
const sysInfo = `In which case please include the info below when opening the issue: \n\nOS: ${navigator.platform} \nBrowser: ${navigator.userAgent} \nService workers: ${"serviceWorker" in navigator ? "Yes" : "No"}`
const init = async (): Promise<Marketplace> => {
log({ type: 'normal', bg: false, prefix: false }, titleText);
log({ type: 'normal', bg: true, prefix: false }, info);
log({ type: 'normal', bg: true, prefix: false }, sysInfo);
log({ type: 'info', bg: true, prefix: true }, "General init...");
for (const script of createProxyScripts()) {
document.body.appendChild(script);
}
await checkProxyScripts();
const conn = await createBareMuxConn("/baremux/worker.js");
const sw = new SW(conn);
const mp = new Marketplace();
const { serviceWorker, bareMuxConn, sj } = await sw.getSWInfo();
log({ type: 'info', bg: true, prefix: true }, `General init completed! \n\nServiceWorker: ${serviceWorker.active?.state} \nBareMuxConn: ${bareMuxConn ? 'Active': 'Not active'} \nScramjetController: ${sj ? 'Active' : 'Not active'}`);
return mp;
}
const handleTheme = async (marketplace: Marketplace) => {
const name = await marketplace.getValueFromStore(SettingsVals.marketPlace.appearance.theme.name);
const payload = await marketplace.getValueFromStore(SettingsVals.marketPlace.appearance.theme.payload);
const video = await marketplace.getValueFromStore(SettingsVals.marketPlace.appearance.video);
const image = await marketplace.getValueFromStore(SettingsVals.marketPlace.appearance.image);
if (name !== null) {
marketplace.theme({
type: 'normal',
name: name,
payload: payload,
sources: {
video: video,
bg: image
}
});
}
}
const initSettings = async (marketplace: Marketplace) => {
log({ type: 'info', bg: true, prefix: true }, "Initializing settings...");
for await (const _ of Settings.initDefaults());
await handleTheme(marketplace);
log({ type: 'info', bg: true, prefix: true }, "Initialized Settings!");
}
const eventHandler = new EventHandler({
events: {
"DOMContentLoaded": async () => {
const mp = await init();
await initSettings(mp);
}
},
logging: true
});
//bind the events
eventHandler.bind();
</script>

View file

@ -0,0 +1,67 @@
---
interface Inputs {
input: boolean;
required?: boolean;
placeholder?: string;
validate?: boolean;
validateString?: string;
}
interface SelectOptions {
value: string;
name: string;
disabled: boolean;
}
interface Both {
enabled: boolean;
showOnSelect?: {
value: string;
};
showOnInput?: boolean;
}
interface Selects {
select: boolean;
name?: string;
multiple?: boolean;
options?: SelectOptions[];
}
interface Buttons {
name: string;
id: string;
}
interface Props {
title: string;
description: string;
input: Inputs;
select: Selects;
both: Both;
button: Buttons;
}
const { title, description, input, select, both, button } = Astro.props;
---
<div class={`${both.enabled ? "h-72" : "h-64"} w-64 rounded-3xl bg-navbar-color flex flex-col items-center p-4`}>
<h1 class="text-3xl font-bold mb-2"> { title } </h1>
<p class="text-md w-full text-ellipsis text-center"> { description } </p>
<div class="w-full h-full flex-grow flex justify-center items-center flex-col gap-4">
<!-- We only want to render an input if it's enabled -->
{(input.input && !both.enabled) &&
<input class="text-md w-full h-10 p-2 bg-input border border-input-border-color rounded-md text-input-text" required={input.required} placeholder={input.placeholder}></input>
}
<!-- Same with dropdown selections -->
{select.select &&
<select id={select.name?.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()} class="text-md w-full h-10 p-2 bg-input border border-input-border-color rounded-md text-input-text" multiple={select.multiple} name={select.name}>
{select.options!.map((option) => (
<option id={option.value} disabled={option.disabled} value={option.value}>{option.name}</option>
))}
</select>
}
{(both.enabled && both.showOnSelect?.value) &&
<input id={'inputOnSelectValue' + both.showOnSelect?.value} class="hidden text-md w-full h-10 p-2 bg-input border border-input-border-color rounded-md text-input-text" required={input.required} placeholder={input.placeholder}></input>
}
<button id={button.id.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()} class="w-36 h-10 rounded-md border border-input-border-color text-input-text bg-input hover:border-input hover:bg-input-border-color hover:text-input hover:font-bold active:bg-input active:text-input-text transition-all duration-200">
{button.name}
</button>
</div>
</div>

View file

@ -0,0 +1,13 @@
---
const { image, title } = Astro.props;
import { Image } from "astro:assets";
---
<div class="rounded-3xl bg-navbar-color w-64 flex flex-col">
<div class="w-full">
<Image src={image} alt="Theme" class="aspect-[16/9] rounded-t-3xl" />
</div>
<div class="h-2/6 text-center content-center p-3 font-semibold">
{title}
</div>
</div>

View file

@ -0,0 +1,41 @@
<script lang="ts">
import { type ToastPosition, type Props, type TType } from "@utils/index";
import toast from "svelte-french-toast";
export let toastProp: Props;
function handleToast(toastProp: Props) {
switch (toastProp.toastType) {
case "success":
toast.success(toastProp.text, {
style: "background: var(--navbar-color); color: var(--input-text-color);",
icon: toastProp.emoji,
position: toastProp.position ?? "bottom-right",
duration: toastProp.duration
});
break;
case "error":
toast.error(toastProp.text, {
style: "background: var(--navbar-color); color: var(--input-text-color);",
icon: toastProp.emoji,
position: toastProp.position ?? "bottom-right",
duration: toastProp.duration
});
break;
case "promise":
throw new Error("Due to the way astro renders promise toasts are not available (ish)");
break;
case "multiline":
toast(toastProp.text, {
style: "background: var(--navbar-color); color: var(--input-text-color);",
icon: toastProp.emoji,
position: toastProp.position ?? "bottom-right",
duration: toastProp.duration
});
break;
default:
throw new Error("Something isn't right...");
break;
}
}
</script>
<!-- A hacky way to get this to be called. Just click this button (preferably via an EVENT) (see ../../utils/toast.ts) -->
<button id={toastProp.id} class:invisible={'invisible'} class:hidden={'hidden'} class={toastProp.class} on:click={() => {return handleToast(toastProp)}}>Auto clicked for toast notifs</button>

View file

@ -0,0 +1,8 @@
<script lang="ts">
import { Toaster } from "svelte-french-toast";
</script>
<div class="hidden" id="toastwrapper">
<Toaster />
<slot />
</div>

45
src/env.d.ts vendored Normal file
View file

@ -0,0 +1,45 @@
/// <reference path="../.astro/types.d.ts" />
/// <reference types="astro/client" />
/// <reference types="@titaniumnetwork-dev/ultraviolet/client" />
interface SJOptions {
prefix: string;
globals?: {
wrapfn: string;
wrapthisfn: string;
trysetfn: string;
importfn: string;
rewritefn: string;
metafn: string;
setrealmfn: string;
pushsourcemapfn: string;
};
files: {
wasm: string;
shared: string;
worker: string;
client: string;
sync: string;
};
flags?: {
serviceworkers?: boolean;
syncxhr?: boolean;
naiiveRewriter?: boolean;
strictRewrites?: boolean;
rewriterLogs?: boolean;
captureErrors?: boolean;
cleanErrors?: boolean;
scramitize?: boolean;
sourcemaps?: boolean;
};
siteFlags?: {};
codec?: {
encode: string;
decode: string;
};
}
declare class ScramjetController {
constructor(opts: SJOptions);
init(): Promise<void>;
encodeUrl(term: string): string;
}

12
src/i18n/en_US.json Normal file
View file

@ -0,0 +1,12 @@
{
"header.home": "Home",
"header.games": "Games",
"header.settings": "Settings",
"header.morelinks": "Want more links?",
"header.catalog": "Nebula Catalog",
"home.placeholder": "Search the web freely",
"settings.settings": "Settings",
"settings.appearance": "Appearance",
"settings.proxy": "Proxy",
"settings.tab": "Tab"
}

12
src/i18n/jp.json Normal file
View file

@ -0,0 +1,12 @@
{
"header.home": "ホーム",
"header.games": "ゲーム",
"header.settings": "設定",
"header.morelinks": "リンク一覧",
"header.catalog": "Nebula Catalog",
"home.placeholder": "検索欄",
"settings.settings": "Settings",
"settings.appearance": "Appearance",
"settings.proxy": "Proxy",
"settings.tab": "Tab"
}

9
src/i18n/ui.ts Normal file
View file

@ -0,0 +1,9 @@
import en_US from "./en_US.json";
import jp from "./jp.json";
export const defaultLang = "en_US";
export const ui = {
en_US,
jp
};

15
src/i18n/utils.ts Normal file
View file

@ -0,0 +1,15 @@
import { defaultLang, ui } from "./ui";
export const STATIC_PATHS = [{ params: { lang: "en_US" } }, { params: { lang: "jp" } }];
export function getLangFromUrl(url: URL) {
const [, lang] = url.pathname.split("/");
if (lang in ui) return lang as keyof typeof ui;
return defaultLang;
}
export function useTranslations(lang: keyof typeof ui) {
return function t(key: keyof (typeof ui)[typeof defaultLang]) {
return ui[lang][key] || ui[defaultLang][key];
};
}

167
src/layouts/Layout.astro Normal file
View file

@ -0,0 +1,167 @@
---
import { ClientRouter } from "astro:transitions";
import Header from "@components/Header.astro";
import MobileNavigation from "@components/MobileNavigation.astro";
import SettingsLoader from "@components/settings/Loader.astro";
import { SEO } from "astro-seo";
import { SEO as SEOC } from "astro:env/client";
interface Props {
title: string;
noHeader?: string;
description?: string;
image?: string;
}
const { title, noHeader, description, image } = Astro.props;
const SEOConfig = JSON.parse(SEOC);
const Host = Astro.url.host;
---
<!doctype html>
<html lang="en">
<head>
<SettingsLoader transition:persist />
<meta charset="UTF-8" />
<SEO
title={title},
titleTemplate={SEOConfig.enabled && Host === SEOConfig.domain ? 'Nebula | %s': '%s'},
titleDefault={SEOConfig.enabled && Host === SEOConfig.domain ? 'Nebula': ''},
description={SEOConfig.enabled && Host === SEOConfig.domain ? description ? description : 'A stunning and sleek web proxy with support for hundreds of popular sites.' : ''},
charset="UTF-8",
openGraph={{
basic: {
title: SEOConfig.enabled && Host === SEOConfig.domain ? 'Nebula' :'',
type: 'website',
url: SEOConfig.enabled && Host === SEOConfig.domain ? 'https://nebulaproxy.io' : '',
image: SEOConfig.enabled && Host === SEOConfig.domain ? image ? image : '/logo.png': ''
},
optional: {
description: SEOConfig.enabled && Host === SEOConfig.domain ? description ? description : 'A stunning and sleek web proxy with support for hundreds of popular sites.' : ''
}
}},
twitter={{
card: "summary_large_image",
title: SEOConfig.enabled && Host === SEOConfig.domain ? 'Nebula' : '',
description: SEOConfig.enabled && Host === SEOConfig.domain ? description ? description : 'A stunning and sleek web proxy with support for hundreds of popular sites.' : '',
image: SEOConfig.enabled && Host === SEOConfig.domain ? image ? image : '/logo.png': '',
imageAlt: image ? 'Catalog image' : `${SEOConfig.enabled && Host === SEOConfig.domain && "Nebula services's"} logo`
}},
extend={{
link: [
{ rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg', id: 'favicon' },
SEOConfig.enabled && Host === SEOConfig.domain && { rel: 'sitemap', href: '/sitemap-index.xml' },
{
rel: 'preload',
href: "https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap",
as: 'style',
crossorigin: 'anonymous'
},
{
rel: 'preload',
href: "https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4mxK.woff2",
as: 'font',
type: 'font/woff2',
crossorigin: 'anonymous'
}
],
meta: [
{ name: 'viewport', content: 'width=device-width, initial-scale=1.0' },
{ name: 'generator', content: `${Astro.generator}` }
]
}}
/>
{/* I left this out of the SEO component as we need it to persist properly : D */}
<link
rel="stylesheet"
href="/nebula.css"
id="stylesheet"
transition:persist
/>
<ClientRouter fallback="animate" />
</head>
<body class="h-full bg-primary">
{!noHeader && <Header />}
<div class="h-full z-10 w-full fixed">
<slot />
</div>
<div id="mobilenavwrapper" class="w-full fixed inset-0 h-[calc(100%-4rem)] z-20">
<MobileNavigation />
</div>
<video
autoplay
muted
loop
id="nebulaVideo"
class="absolute z-0 h-[calc(100%-4rem)] w-full object-cover"
transition:persist
>
<source type="video/mp4" id="videosource" transition:persist />
</video>
<img
src=""
class="absolute z-0 h-[calc(100%-4rem)] w-full object-cover hidden"
id="nebulaImage"
transition:persist
/>
<style is:global>
.roboto {
font-family: var(--font-family), Roboto, sans-serif;
font-weight: 200;
font-style: normal;
}
/* Custom scrollbar because the default ones look like ASS */
::-webkit-scrollbar {
width: 0.5rem;
height: 0.5rem;
}
::-webkit-scrollbar-track {
background: var(--navbar-color);
}
::-webkit-scrollbar-thumb {
background: var(--navbar-text-color);
}
::-webkit-scrollbar-thumb:hover {
background: var(--navbar-link-color);
}
::-moz-scrollbar {
width: 0.5rem;
height: 0.5rem;
}
::-moz-scrollbar-track {
background: var(--navbar-color);
}
::-moz-scrollbar-thumb {
background: var(--navbar-text-color);
}
::-moz-scrollbar-thumb:hover {
background: var(--navbar-link-color);
}
::-ms-scrollbar {
width: 0.5rem;
height: 0.5rem;
}
::-ms-scrollbar-track {
background: var(--navbar-color);
}
::-ms-scrollbar-thumb {
background: var(--navbar-text-color);
}
::-ms-scrollbar-thumb:hover {
background: var(--navbar-link-color);
}
::-o-scrollbar {
width: 0.5rem;
height: 0.5rem;
}
::-o-scrollbar-track {
background: var(--navbar-color);
}
::-o-scrollbar-thumb {
background: var(--navbar-text-color);
}
::-o-scrollbar-thumb:hover {
background: var(--navbar-link-color);
}
</style>
</body>
</html>

View file

@ -0,0 +1,35 @@
---
import { getLangFromUrl, useTranslations } from "../i18n/utils";
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
const { title } = Astro.props;
import SidebarButton from "@components/SidebarButton.astro";
import { Icon } from "astro-icon/components";
---
<div class="flex flex-row font-roboto">
<div class="text-text-color mt-16 fixed inset-0 h-[calc(100%-4rem)] z-0 bg-primary flex-col flex md:flex-row">
<div class="items-center md:p-3 sm:p-3 flex flex-row border-border-color md:gap-10 xl:gap-10 max-sm:gap-5 sm:gap-5 md:border-r-2 lg:w-2/12 md:w-3/12 md:flex-col md:bg-navbar-color md:gap-0 overflow-x-auto md:overflow-x-hidden overflow-y-hidden max-md:ml-1 max-md:mr-1 max-md:max-h-24 max-md:min-h-24 max-md:justify-left max-md:scroll-ml-3 max-md:scroll-mr-3 max-md:snap-x max-md:snap-mandatory">
<SidebarButton title={t("settings.appearance")} route={`/${lang}/settings/appearance`}>
<Icon name="ph:palette" class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6" />
</SidebarButton>
<SidebarButton title={t("settings.proxy")} route={`/${lang}/settings/pr`}>
<Icon name="ph:globe-hemisphere-east-fill" class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6" />
</SidebarButton>
<SidebarButton title={t("settings.tab")} route={`/${lang}/settings/tab/`}>
<Icon name="ph:laptop-fill" class="h-6 w-6 text-text-color transition duration-500 group-hover:text-text-hover-color md:h-6 md:w-6" />
</SidebarButton>
<SidebarButton title="Misc" route={`/${lang}/settings/misc`}>
<Icon name="ph:gear" class="h-6 w-6 text-text-color transistion duration-500 group-hover:text-text-hover-color md:h-6 md:w=6" />
</SidebarButton>
<SidebarButton title="Credits" route={`/${lang}/settings/credits`}>
<Icon name="ph:user" class="h-6 w-6 text-text-color transistion duration-500 group-hover:text-text-hover-color md:h-6 md:w=6" />
</SidebarButton>
</div>
<div class="p-8 md:pb-2 w-full flex-grow overflow-y-auto">
<p class="text-5xl font-semibold mb-5">{t("settings.settings")}</p>
<p class="text-2xl">{title}</p>
<slot />
</div>
</div>
</div>

View file

@ -0,0 +1,12 @@
---
const { title, subtitle } = Astro.props;
---
<div class="mt-5 font-roboto">
<hr />
<div class="mt-3">
<div class="text-2xl font-semibold">{title}</div>
<div class="text-lg mb-5">{subtitle}</div>
<slot />
</div>
</div>

View file

@ -0,0 +1,53 @@
---
import CatalogCard from "@components/catalog/CatalogCard.astro";
import Layout from "@layouts/Layout.astro";
import { getLangFromUrl, useTranslations } from "../../../i18n/utils";
import Pagination from "./pagination.astro";
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
const { page } = Astro.params;
const response = await fetch(new URL("/api/catalog-assets/", Astro.url));
const assetsJson = await response.json();
const nextPage = parseInt(page!) + 1;
const previousPage = parseInt(page!) - 1;
const lastPage = assetsJson.pages;
---
<Layout title="Catalog">
<div class="flex mt-16 w-full fixed inset-0 h-[calc(100%-4rem)] z-0 bg-primary flex-col items-center overflow-auto font-roboto">
<div class="w-full flex flex-col gap-4 jusitfy-center items-center text-text-color mt-9">
<h1 class="text-3xl md:text-5xl font-bold"> Nebula Catalog </h1>
<p class="text-l md:text-xl max-md:text-center max-md:p-2"> The Nebula Catalog is a place for you to find user-created themes and plugins. </p>
</div>
<CatalogCard page={page} lang={lang} />
<div class="flex flex-row pb-8 gap-4 font-roboto">
{/* The first page. If the user is on this page, or the one after it, don't show it. */}
{parseInt(page!) > 2 && (
<a href={`/${lang}/catalog/${1}`} class="w-8 h-8 bg-navbar-color items-center text-center content-center text-text-color rounded-md"> 1 </a>
)
}
{previousPage > 0 && (
<a href={`/${lang}/catalog/${previousPage}`} class="w-8 h-8 bg-navbar-color items-center text-center content-center text-text-color rounded-md">{previousPage}</a>
)
}
{/* The greyed out page the user is currently on */}
<a class="w-8 h-8 bg-lighter items-center text-center content-center text-text-color rounded-md">{page}</a>
{nextPage < lastPage && (
<a href={`/${lang}/catalog/${nextPage}`} class="w-8 h-8 bg-navbar-color items-center text-center content-center text-text-color rounded-md">{nextPage}</a>
)
}
{/* Pagination input */}
<Pagination />
{/* The last page. If the user is on this page, don't show it. */}
{page != lastPage && (
<a href={`/${lang}/catalog/${assetsJson.pages}`} class="w-8 h-8 bg-navbar-color items-center text-center content-center text-text-color rounded-md">
{assetsJson.pages}
</a>
)
}
</div>
</div>
</Layout>

View file

@ -0,0 +1,185 @@
---
const { packageName } = Astro.params;
import Layout from "@layouts/Layout.astro";
const response = await fetch(
new URL("/api/packages/" + packageName, Astro.url)
);
const assetsJson = await response.json();
---
<Layout
title={`Package: ${assetsJson.title}`}
description=`${assetsJson.title} is a package on Nebula. Start using this package on Nebula today!`
image={`/packages/${packageName}/${assetsJson.image}`}
>
<div
class="flex flex-wrap min-[1032px]:mt-16 mt-8 w-full fixed inset-0 h-full md:h-[calc(100%-4rem)] z-0 bg-primary flex-col items-center content-center justify-center lg:pb-64 font-roboto max-md:p-4"
>
{
assetsJson.error && (
<h1 class="text-text-color text-3xl font-bold">
{" "}
Unexpected error. Is the name right?{" "}
</h1>
)
}
{
!assetsJson.error && (
<div class="flex flex-col max-md:min-[1032px]:justify-center md:min-[1032px]:flex-row items-center text-text-color bg-navbar-color rounded-2xl">
{assetsJson.background_video && (
<video
src={`/packages/${packageName}/${assetsJson.background_video}`}
controls
class="md:w-[44rem] md:h-[25rem] h-[12rem] w-full object-cover rounded-xl"
>
Your browser does not support the video tag.
</video>
)}
{assetsJson.backgroundImage && (
<div
style={{
backgroundImage: `url(/packages/${packageName}/${assetsJson.backgroundImage})`,
}}
class="md:w-[44rem] md:h-[25rem] h-[12rem] w-full object-cover bg-center rounded-xl"
/>
)}
{!assetsJson.background_video && !assetsJson.backgroundImage && (
<img
loading="lazy"
src={`/packages/${packageName}/${assetsJson.image}`}
alt={assetsJson.title}
class="md:w-[44rem] md:h-[25rem] h-[12rem] w-full object-cover rounded-xl"
/>
)}
<div class="flex flex-col ml-7 md:p-16 p-10">
<p class="text-xl">
{assetsJson.type === "plugin-page" ||
assetsJson.type === "plugin-sw"
? "plugin"
: assetsJson.type}
</p>
<h1 class="text-4xl font-roboto font-semibold">
{assetsJson.title}
</h1>
<p class="text-xl">
{" "}
By: <strong>{assetsJson.author}</strong>
</p>
<p class="text-xl">{assetsJson.description}</p>
<button
class="bg-primary text-text-color border border-transparent rounded-lg px-6 py-3 hover:bg-navbar-color transition-colors duration-300 mt-9"
id="install"
>
Install
</button>
<button
class="hidden bg-primary text-text-color border border-transparent rounded-lg px-6 py-3 hover:bg-navbar-color transition-colors duration-300 mt-9"
id="uninstall"
>
Uninstall
</button>
<a
href="../1"
class="w-full bg-background text-text-color border-none rounded-lg text-l max-md:mt-7 px-4 py-4 h-full flex-grow md:text-right text-center font-bold underline underline-offset-4 decoration-2 hover:decoration-border-color transition-colors duration-300"
>
Go Back
</a>
</div>
</div>
)
}
</div>
<package-vars data-assets={JSON.stringify(assetsJson)} data-name={packageName} data-type={assetsJson.type}></package-vars>
</Layout>
<script>
import { Elements } from "@utils/index";
import { Marketplace } from "@utils/marketplace";
const init = async () => {
await Marketplace.ready();
const marketplace = Marketplace.getInstances().next().value!;
const elements = Elements.select([
{ type: 'id', val: 'install' },
{ type: 'id', val: 'uninstall' }
]);
return { marketplace, elements };
};
const handleThemes = async (marketplace: Marketplace, name: string, assets: any) => {
const { exists } = await marketplace.getThemes(name);
if (!exists) {
await marketplace.installTheme({ name: name });
await marketplace.theme({
type: 'normal',
payload: assets.payload,
name: name,
sources: {
video: assets.background_video,
bg: assets.background_image
}
});
}
else {
await marketplace.theme({ type: 'remove', name: name });
await marketplace.uninstallTheme({ name: name });
}
}
const handlePlugins = async (marketplace: Marketplace, name: string, assets: any) => {
const { plug } = await marketplace.getPlugins(name);
console.log(plug);
console.log(assets);
if (!plug || plug.remove === true) {
await marketplace.installPlugin({
name: name,
src: assets.payload,
type: assets.type === "plugin-page" ? "page": "serviceWorker"
});
return;
}
await marketplace.uninstallPlugin({
name: name,
type: assets.type === "plugin-page" ? "page": "serviceWorker"
});
}
Elements.createCustomElement("package-vars",
async(datasets) => {
const { marketplace, elements } = await init();
const { dataAssets, dataName, dataType } = { dataAssets: datasets![0].val, dataName: datasets![1].val, dataType: datasets![2].val };
const { exists: themeExists } = await marketplace.getThemes(dataName!);
const { plug } = await marketplace.getPlugins(dataName!);
console.log(dataName);
const installButton = Elements.exists<HTMLButtonElement>(await elements.next());
const uninstallButton = Elements.exists<HTMLButtonElement>(await elements.next());
Elements.attachEvent(installButton, "click", async () => {
dataType?.startsWith("plugin")
? await handlePlugins(marketplace, dataName!, JSON.parse(dataAssets!) || [])
: await handleThemes(marketplace, dataName!, JSON.parse(dataAssets!) || []);
installButton.classList.add("hidden");
uninstallButton.classList.remove("hidden");
});
Elements.attachEvent(uninstallButton, "click", async () => {
dataType?.startsWith("plugin")
? await handlePlugins(marketplace, dataName!, JSON.parse(dataAssets!) || [])
: await handleThemes(marketplace, dataName!, JSON.parse(dataAssets!) || []);
uninstallButton.classList.add("hidden");
installButton.classList.remove("hidden");
});
if (themeExists || (plug && plug.remove === false || plug.remove === undefined)) {
installButton.classList.add("hidden");
uninstallButton.classList.remove("hidden");
}
},
//Pull in the data elements.
[
{ name: 'assets' },
{ name: 'name' },
{ name: 'type' }
]
);
</script>

View file

@ -0,0 +1,27 @@
<input
class="w-10 h-8 bg-navbar-color items-center text-center content-center text-text-color rounded-md [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none"
type="number"
id="pageinationInput"
placeholder="..."
/>
<script>
import { EventHandler } from "@utils/events";
import { Elements } from "@utils/index";
import { navigate } from "astro:transitions/client";
new EventHandler({
events: {
"astro:page-load": async () => {
const el = Elements.select([
{ type: 'id', val: 'pageinationInput' }
]);
const input = Elements.exists<HTMLInputElement>(await el.next());
Elements.attachEvent(input, "keyup", (event?: Event) => {
const e = event as KeyboardEvent | undefined;
if (e?.key) return navigate(`${input.value}`);
});
}
},
logging: false
})
.bind();
</script>

View file

@ -0,0 +1,27 @@
---
import Layout from "@layouts/Layout.astro";
---
<Layout title="Chango Games">
<iframe id="chango" class="w-full h-full" src="/loading"></iframe>
</Layout>
<script>
import { EventHandler } from "@utils/events";
import { Elements } from "@utils/index";
const init = async () => {
const el = Elements.select([
{ type: 'id', val: 'chango' }
]);
const chango = Elements.exists<HTMLIFrameElement>(await el.next());
chango.src = `${__uv$config.prefix}${__uv$config.encodeUrl!("https://radon.games/games/")}`
};
new EventHandler({
events: {
"astro:page-load": init
},
logging: false
})
.bind();
</script>

View file

@ -0,0 +1,217 @@
---
import Logo from "@components/Logo.astro";
import Layout from "@layouts/Layout.astro";
import { getLangFromUrl, useTranslations } from "../../i18n/utils";
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
import { VERSION } from "astro:env/client";
---
<Layout title="Home">
<div class="flex flex-wrap mt-16 justify-center content-center w-full bg-primary fixed inset-0 h-[calc(100%-4rem)] z-0 flex-col items-center">
<div class="w-full flex flex-col justify-center items-center content-center h-2/4">
<div class="flex flex-row items-center mb-8">
<div class="h-32 w-32 fill-navbar-text-color">
<Logo />
</div>
<h1 class="font-roboto whitespace-nowrap text-navbar-text-color sm:visible text-5xl sm:text-7xl roboto">
nebula.
</h1>
</div>
<input
id="nebula-input"
class="transition-all duration-300 font-roboto h-14 rounded-t-2xl w-10/12 rounded-b-2xl border border-input-border-color bg-input p-2 text-center text-xl text-input-text placeholder:text-input-text roboto focus:outline-none md:w-3/12"
placeholder={t("home.placeholder")}
/>
<div
id="omnibox"
class="hidden p-1 transition-all duration-300 flex flex-col w-10/12 md:w-3/12 h-full flex-grow bg-input text-center items-center rounded-b-2xl border-input-border-color border-b border-r border-l"
>
</div>
</div>
<iframe
id="neb-iframe"
class="hidden z-100 w-full h-full absolute top-0 bottom-0 bg-primary"
src="/loading"></iframe>
<div
id="version"
class="flex flex-row w-full absolute bottom-4 pr-4 pl-4 text-text-color h-6 justify-between items-center font-roboto"
>
<p>Version: {VERSION}</p>
<div class="hidden md:flex gap-2 flex-grow ml-16 justify-center items-center">
<p> Having problems? </p>
<button id="reset" class="underline underline-offset-4 hover:decoration-input-border-color active:decoration-input-text">
Click here to reset your instance
</button>
</div>
<p>&copy; Nebula Services 2024</p>
</div>
</div>
</Layout>
<script>
import { EventHandler } from "@utils/events";
import { SupportedSites, SearchEngines, SettingsVals } from "@utils/values";
import { search, Elements } from "@utils/index";
import { BareClient } from "@mercuryworkshop/bare-mux";
import { defaultStore } from "@utils/storage";
import { SW } from "@utils/serviceWorker";
import { Marketplace } from "@utils/marketplace";
type Suggestion = {
phrase: string;
};
const init = async (): Promise<void> => {
const bc = new BareClient();
const se = Elements.select([
{ type: 'id', val: 'reset' },
{ type: 'id', val: 'nebula-input' },
{ type: 'id', val: 'omnibox' },
{ type: 'id', val: 'version' },
{ type: 'id', val: 'neb-iframe' }
]);
const reset = Elements.exists<HTMLButtonElement>(await se.next());
Elements.attachEvent(reset, "click", async () => {
const t = await navigator.serviceWorker.getRegistrations();
t.map(async (reg) => {
await reg.unregister();
});
localStorage.clear();
window.location.href = "/";
});
const input = Elements.exists<HTMLInputElement>(await se.next());
const omnibox = Elements.exists<HTMLDivElement>(await se.next());
const copyright = Elements.exists<HTMLDivElement>(await se.next());
const iframe = Elements.exists<HTMLIFrameElement>(await se.next());
const prox = async (input: string, prox: "uv" | "sj") => {
await Marketplace.ready();
const mp = Marketplace.getInstances().next().value!;
const sw = SW.getInstances().next().value as SW;
iframe.classList.remove("hidden");
const val = search(
input,
defaultStore.getVal(SettingsVals.proxy.searchEngine)
? SearchEngines[defaultStore.getVal(SettingsVals.proxy.searchEngine)]
: SearchEngines.ddg
);
const { serviceWorker } = await sw.getSWInfo();
mp.handlePlugins(serviceWorker);
switch(prox) {
case "uv": {
iframe.src = `${__uv$config.prefix}${__uv$config.encodeUrl!(val)}`;
break;
}
case "sj": {
const { sj } = await sw.getSWInfo();
iframe.src = sj.encodeUrl(val);
break;
}
}
}
input.addEventListener("keypress", async (event: any) => {
if (event.key === "Enter") {
copyright.classList.add("hidden");
if (defaultStore.getVal(SettingsVals.proxy.proxy.key) === SettingsVals.proxy.proxy.available.automatic) {
switch(SupportedSites[input.value]) {
case "uv": {
prox(input.value, "uv");
break;
}
case "sj": {
prox(input.value, "sj");
break;
}
default: {
prox(input.value, "uv");
}
}
}
switch(defaultStore.getVal("proxy") as "uv" | "sj") {
case "uv": {
prox(input.value, "uv");
break;
}
case "sj": {
prox(input.value, "sj");
break;
}
}
}
});
input.addEventListener("input", async () => {
if (input.value.length < 3) {
omnibox.innerHTML = "";
omnibox.classList.add("hidden");
input.classList.add("rounded-b-2xl");
return;
}
omnibox.classList.remove("hidden");
input.classList.remove("rounded-b-2xl");
const data = await bc.fetch(`https://api.duckduckgo.com/ac?q=${encodeURIComponent(input.value)}&format=json`);
const res = await data.json();
const fData = res.slice(0, 6); // Trim to only the first 6 results.
if (fData.length <= 0) {
omnibox.classList.add("hidden");
input.classList.add("rounded-b-2xl");
return;
}
omnibox.innerHTML = "";
fData.map((res: Suggestion) => {
const span = document.createElement("span") as HTMLSpanElement;
const p = document.createElement("p") as HTMLParagraphElement;
p.classList.add(
"cursor-pointer",
"text-ellipsis",
"text-center",
"w-full",
"overflow-hidden",
"whitespace-nowrap"
);
p.innerText = res.phrase;
span.classList.add(
"cursor-pointer",
"font-roboto",
"border-b",
"border-input-border-color",
"last:rounded-b-xl",
"last:border-none",
"text-ellipsis",
"whitespace-nowrap",
"w-full",
"text-input-text",
"h-9",
"text-xl",
"text-align-center",
"overflow-hidden",
"flex",
"items-center",
"justify-center",
"hover:bg-lighter",
"active:bg-primary"
);
span.addEventListener("click", () => {
input.value = res.phrase;
input.dispatchEvent(
new KeyboardEvent("keypress", { key: "Enter", code: "Enter" })
);
});
span.appendChild(p);
omnibox.appendChild(span);
});
});
}
new EventHandler({
events: {
"astro:page-load": init
},
logging: false
})
.bind();
</script>

View file

@ -0,0 +1,36 @@
---
import InstalledThemes from "@components/catalog/InstalledThemes.astro";
import Layout from "@layouts/Layout.astro";
import SettingsLayout from "@layouts/SettingsLayout.astro";
import SettingsSection from "@layouts/SettingsSection.astro";
import { Icon } from "astro-icon/components";
import { getLangFromUrl, useTranslations } from "../../../i18n/utils";
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
import { MARKETPLACE_ENABLED } from "astro:env/client";
---
<Layout title="Settings">
<SettingsLayout title={t("settings.appearance")}>
<SettingsSection
title="Theme"
subtitle="Choose a theme so your eyes don't hate us.">
<div class="flex flex-row flex-wrap gap-4 items-center font-roboto">
<div class="justify-center flex flex-row gap-6 flex-wrap md:justify-normal">
<InstalledThemes />
{MARKETPLACE_ENABLED &&
<a href={`/${lang}/catalog/1`} class="rounded-3xl bg-navbar-color w-64 flex flex-col">
<div class="w-full items-center justify-center flex aspect-[16/9]">
<Icon name="ph:plus-bold" class="h-16 w-16" />
</div>
<div class="h-2/6 text-center content-center p-3 font-semibold">
Get more themes in the <strong>Nebula Catalog!</strong>
</div>
</a>
}
</div>
<div class="text-3xl font-roboto font-bold text-text-color"></div>
</div>
</SettingsSection>
</SettingsLayout>
</Layout>

View file

@ -0,0 +1,32 @@
---
import Layout from "@layouts/Layout.astro";
import SettingsLayout from "@layouts/SettingsLayout.astro";
import SettingsSection from "@layouts/SettingsSection.astro";
import { getLangFromUrl, useTranslations } from "../../../i18n/utils";
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
import CreditsCard from "@components/settings/CreditsCard.astro";
---
<Layout title="Settings">
<SettingsLayout title="Credits">
<SettingsSection title="Site Developers & Maintainers" subtitle="Thank you to all of the devs and maintainers!">
<div class="flex flex-row flex-wrap gap-4 items-center font-roboto">
<div class="justify-center flex flex-row gap-6 flex-wrap md:justify-normal">
<CreditsCard image="/src/assets/credits/rift.jpeg" name="Rifting" link="https://github.com/rifting" />
<CreditsCard image="/src/assets/credits/motortruck1221.png" name="MotorTruck1221" link="https://motortruck1221.com" />
</div>
</div>
</SettingsSection>
<SettingsSection title="Tools & Projects" subtitle="Nebula wouldn't be possible without these tools & projects">
<div class="flex flex-row flex-wrap gap-6 items-center font-roboto">
<CreditsCard image="/src/assets/credits/uv.png" name="Ultraviolet" link="https://github.com/titaniumnetwork-dev/ultraviolet" />
<CreditsCard image="/src/assets/credits/rammerhead.png" name="Rammerhead" link="https://github.com/binary-person/rammerhead" />
<CreditsCard image="/src/assets/credits/libcurl.png" name="Libcurl.js" link="https://github.com/ading2210/libcurl.js" />
<CreditsCard image="/src/assets/credits/mercury.png" name="Epoxy TLS" link="https://github.com/mercuryworkshop/epoxy-tls" />
</div>
</SettingsSection>
<SettingsSection title="Translators" subtitle="Translations are made possible by these lovely individuals">
</SettingsSection>
</SettingsLayout>
</Layout>

View file

@ -0,0 +1,84 @@
---
import SettingsCard from "@components/settings/SettingsCard.astro";
import Toast from "@components/toasts/Toast.svelte";
import ToastWrapper from "@components/toasts/ToastWrapper.svelte";
import Layout from "@layouts/Layout.astro";
import SettingsLayout from "@layouts/SettingsLayout.astro";
import SettingsSection from "@layouts/SettingsSection.astro";
import { getLangFromUrl, useTranslations } from "../../../i18n/utils";
const origin = Astro.url.origin;
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
---
<Layout title="Settings">
<SettingsLayout title="Miscellaneous">
<SettingsSection title="Misc" subtitle="All of our miscellaneous settings">
<div class="w-full h-full flex flex-col items-center justify-center flex-wrap md:flex-row md:items-start md:justify-start gap-4">
<SettingsCard
title="Language"
description="Choose your language"
input={{input:false}}
button={{name: 'Change Language', id: 'setlang'}}
select={{
select: true,
name: 'lang',
options: [
{name: 'English', value: 'en_US', disabled: false},
{name: 'Japanese', value: 'jp', disabled: false},
]
}}
both={{enabled: false}}
/>
<SettingsCard
title="Reset instance"
description="Reset your instance if your having troubles or problems."
input={{ input: false }}
button={{ name: 'Reset', id: 'resetinstance' }}
select={{ select: false }}
both={{ enabled: false }}
/>
</SettingsSection>
</SettingsLayout>
<script>
import { EventHandler } from "@utils/events";
import { navigate } from "astro:transitions/client";
import { defaultStore } from "@utils/storage";
import { SettingsVals } from "@utils/values";
import { Elements } from "@utils/index";
const handler = async () => {
const els = Elements.select([
{ type: 'id', val: 'lang' },
{ type: 'id', val: 'setlang' },
{ type: 'id', val: 'resetinstance' }
]);
const lang = defaultStore.getVal(SettingsVals.i18n.lang);
const val = Elements.exists<HTMLSelectElement>(await els.next());
const button = Elements.exists<HTMLButtonElement>(await els.next());
val.value = lang || "en_US";
Elements.attachEvent(button, "click", () => {
defaultStore.setVal(SettingsVals.i18n.lang, val.value);
navigate(`${window.location.origin}/${val.value}/settings/misc`);
});
const resetButton = Elements.exists<HTMLButtonElement>(await els.next());
Elements.attachEvent(resetButton, "click", async () => {
const t = await navigator.serviceWorker.getRegistrations();
t.map(async (reg) => {
await reg.unregister();
});
localStorage.clear();
window.location.href = "/";
});
}
new EventHandler({
events: {
"astro:page-load": handler
},
logging: false
})
.bind();
</script>

View file

@ -0,0 +1,267 @@
---
import InstalledPlugins from "@components/catalog/InstalledPlugins.astro";
import SettingsCard from "@components/settings/SettingsCard.astro";
import Toast from "@components/toasts/Toast.svelte";
import ToastWrapper from "@components/toasts/ToastWrapper.svelte";
import Layout from "@layouts/Layout.astro";
import SettingsLayout from "@layouts/SettingsLayout.astro";
import SettingsSection from "@layouts/SettingsSection.astro";
import { Icon } from "astro-icon/components";
import { getLangFromUrl, useTranslations } from "../../../i18n/utils";
const lang = getLangFromUrl(Astro.url);
const t = useTranslations(lang);
import { MARKETPLACE_ENABLED } from "astro:env/client";
---
<Layout title="Settings">
<SettingsLayout title={t("settings.proxy")}>
<SettingsSection
title="Proxy"
subtitle="A wide variety of settings for the proxy/rewriter itself."
>
<div
class="w-full h-full flex flex-col items-center justify-center flex-wrap md:flex-row md:items-start md:justify-start gap-4"
>
<SettingsCard
title="Proxy"
description="Choose the proxy/rewriter that fits your needs"
input={{ input: false }}
button={{ name: "Change", id: "setproxy" }}
select={{
select: true,
name: "proxy",
options: [
{ name: "Automatic", value: "automatic", disabled: false },
{ name: "Ultraviolet", value: "uv", disabled: false },
{ name: "Scramjet (BETA)", value: "sj", disabled: false },
],
}}
both={{enabled: false}}
/>
<!-- SettingsCard
title="Open in"
description="Choose how to open your sites"
input={{ input: false }}
button={{ name: "Set", id: "setopenin" }}
select={{
select: true,
name: "openin",
options: [
{ name: "Embed", value: "embed", disabled: false },
{ name: "Direct", value: "direct", disabled: false },
{ name: "About:Blank", value: "a:b", disabled: false },
{ name: "Blob", value: "blob", disabled: false },
],
}}
both={{enabled: false}}
/ -->
<SettingsCard
title="Search Engine"
description="Choose your search engine"
input={{ input: false }}
button={{ name: "Set Search Engine", id: "setsearchengine" }}
select={{
select: true,
name: "searchengine",
options: [
{ name: "DuckDuckGo", value: "ddg", disabled: false },
{ name: "Google", value: "google", disabled: false },
{ name: "Bing", value: "bing", disabled: false },
],
}}
both={{enabled: false}}
/>
<SettingsCard
title="Wisp Server"
description="Choose the wisp server you feel is the fastest"
input={{ input: true, required: false, placeholder: 'wss://nebulaproxy.io/wisp' }}
button={{ name: "Select", id: "setwispurl" }}
select={{
select: true,
name: "wispurl",
options: [
{ name: "Default", value: "default", disabled: false },
{ name: "Ruby Network (US)", value: "ruby", disabled: false },
{ name: "Custom", value: "custom", disabled: false }
],
}}
both={{
enabled: true,
showOnSelect: {value: 'custom'}
}}
/>
<SettingsCard
title="Transport"
description="Select the transport to use"
input={{ input: false }}
button={{ name: "Set transport", id: "settransport" }}
select={{
select: true,
name: "transport",
options: [
{ name: "Libcurl", value: "libcurl", disabled: false },
{ name: "Epoxy", value: "epoxy", disabled: false },
],
}}
both={{enabled: false}}
/>
</div>
</SettingsSection>
{
MARKETPLACE_ENABLED && (
<SettingsSection
title="Plugins"
subtitle="Plugins allow you to modify the way the proxy works (UV only, plugins are auto applied)"
>
<div class="flex flex-row gap-6 justify-center md:justify-normal">
<InstalledPlugins />
<a
href={`/${lang}/catalog/1`}
class="rounded-3xl bg-navbar-color w-64 flex flex-col"
>
<div class="w-full items-center justify-center flex aspect-[16/9]">
<Icon name="ph:plus-bold" class="h-16 w-16" />
</div>
<div class="h-2/6 text-center content-center p-3 font-semibold">
Get more plugins in the <strong>Nebula Catalog!</strong>
</div>
</a>
</div>
</SettingsSection>
)
}
</SettingsLayout>
<ToastWrapper client:load>
<Toast
toastProp={{
toastType: "success",
text: "Successfully changed proxy!",
class: "proxyMessage",
}}
client:load
/>
<!-- Toast
toastProp={{
toastType: "success",
text: "Saved selection!",
class: "openInMessage",
}}
client:load
/-->
<Toast
toastProp={{
toastType: "success",
text: "Saved Search Engine Selection!",
class: "searchEngineMessage",
}}
client:load
/>
<Toast
toastProp={{
toastType: "success",
text: "Wisp server selected!",
class: "wispUrlMessage",
}}
client:load
/>
<Toast
toastProp={{
toastType: "success",
text: "Transport set!",
class: "transportMessage",
}}
client:load
/>
</ToastWrapper>
</Layout>
<script>
import { EventHandler } from "@utils/events";
import { Elements, toast } from "@utils/index";
import { defaultStore } from "@utils/storage";
import { SettingsVals } from "@utils/values";
import { Settings } from "@utils/settings";
import { setTransport, SW } from "@utils/serviceWorker";
const init = async (): Promise<AsyncGenerator> => {
return Elements.select([
{ type: 'id', val: 'setproxy' },
{ type: 'id', val: 'proxy' },
{ type: 'id', val: 'setsearchengine' },
{ type: 'id', val: 'searchengine' },
{ type: 'id', val: 'setwispurl' },
{ type: 'id', val: 'wispurl' },
{ type: 'id', val: 'inputOnSelectValuecustom' },
{ type: 'id', val: 'settransport' },
{ type: 'id', val: 'transport' },
]);
}
const handleProxy = async (vals: AsyncGenerator) => {
const button = Elements.exists<HTMLButtonElement>(await vals.next());
const selectEl = Elements.exists<HTMLSelectElement>(await vals.next());
selectEl.value = defaultStore.getVal(SettingsVals.proxy.proxy.key);
Elements.attachEvent(button, "click", () => {
Settings.proxy.change(selectEl.value as "uv" | "sj" | "automatic");
toast(".proxyMessage");
});
}
const handleSearchEngine = async (vals: AsyncGenerator) => {
const button = Elements.exists<HTMLButtonElement>(await vals.next());
const selectEl = Elements.exists<HTMLSelectElement>(await vals.next());
selectEl.value = defaultStore.getVal(SettingsVals.proxy.searchEngine);
Elements.attachEvent(button, "click", () => {
Settings.proxy.searchEngine(selectEl.value);
toast(".searchEngineMessage");
});
}
const handleWispServers = async (vals: AsyncGenerator) => {
const handleCustom = async (c: HTMLInputElement, removeClass: boolean) => {
if (!removeClass) return c.classList.add("hidden");
const sw = SW.getInstances().next().value as SW;
const { bareMuxConn } = await sw.getSWInfo();
c.classList.remove("hidden");
if (c.value === "") return c.value = defaultStore.getVal("customWispUrl");
defaultStore.setVal("customWispUrl", c.value);
await setTransport(bareMuxConn);
toast(".wispUrlMessage");
}
const button = Elements.exists<HTMLButtonElement>(await vals.next());
const selectEl = Elements.exists<HTMLSelectElement>(await vals.next());
const custom = Elements.exists<HTMLInputElement>(await vals.next());
selectEl.value = defaultStore.getVal(SettingsVals.proxy.wispServer);
Elements.attachEvent(button, "click", () => {
Settings.proxy.wisp(selectEl.value);
selectEl.value === "custom" ? handleCustom(custom, true) : handleCustom(custom, false)
toast(".wispUrlMessage");
});
};
const handleTransports = async (vals: AsyncGenerator) => {
const button = Elements.exists<HTMLButtonElement>(await vals.next());
const selectEl = Elements.exists<HTMLSelectElement>(await vals.next());
selectEl.value = defaultStore.getVal(SettingsVals.proxy.transport.key);
Elements.attachEvent(button, "click", () => {
Settings.proxy.transport(selectEl.value as "libcurl" | "epoxy");
toast(".transportMessage");
});
};
new EventHandler({
events: {
"astro:page-load": async () => {
const v = await init();
await handleProxy(v);
await handleSearchEngine(v);
await handleWispServers(v);
await handleTransports(v);
}
},
logging: false
})
.bind();
</script>

Some files were not shown because too many files have changed in this diff Show more