From 5a304fb94c40c7c184133b04b6525e4c8d1efbd0 Mon Sep 17 00:00:00 2001 From: extremelyonline <100532901+extremelyonline@users.noreply.github.com> Date: Tue, 23 Apr 2024 07:20:41 +0800 Subject: [PATCH 01/38] Update README.md (#110) Remove a.opnxng.com as it is rate-limited --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 73c1add..9ec228a 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,6 @@ This project is super lightweight by design. The UI is simple and the frontend i | [overflow.freedit.eu](overflow.freedit.eu) | United States | Operated by [freedit.eu](https://freedit.eu) | | [ao.ftw.lol](https://ao.ftw.lol) | Germany | Operated by [ftw.lol](https://ftw.lol) | | [anonoverflow.hyperreal.coffee](https://anonoverflow.hyperreal.coffee) | United States | Operated by [hyperreal.coffee](https://hyperreal.coffee) | -| [a.opnxng.com](a.opnxng.com) | Singapore | Operated by [opnxng.com](https://about.opnxng.com) | | [overflow.sudovanilla.com](https://overflow.sudovanilla.com) | United States | Operated by [SudoVanilla](https://sudovanilla.com) | | [anonymousoverflow.privacyfucking.rocks](https://anonymousoverflow.privacyfucking.rocks/) | Germany | Operated by [privacyfucking.rocks](https://privacyfucking.rocks) | | [exchange.seitan-ayoub.lol](https://exchange.seitan-ayoub.lol) | Germany | Operated by [Seitan Ayoub](https://seitan-ayoub.lol) | From 42b1c9373768eb1e0b04f1a0e78676b341cd33d9 Mon Sep 17 00:00:00 2001 From: Arya K Date: Tue, 23 Apr 2024 04:50:53 +0530 Subject: [PATCH 02/38] Update Location for Project Segfault instances (#109) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9ec228a..9268dad 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ This project is super lightweight by design. The UI is simple and the frontend i | [overflow.lunar.icu](https://overflow.lunar.icu) | Germany | Operated by [lunar.icu](https://lunar.icu/) | | [overflow.adminforge.de](https://overflow.adminforge.de/) | Germany | Operated by [adminForge](https://adminforge.de/) | | [overflow.hostux.net](https://overflow.hostux.net/) | France | Operated by [Hostux](https://hostux.net/) | -| [overflow.projectsegfau.lt](https://overflow.projectsegfau.lt/) | United States, France, India | Operated by [Project Segfault](https://projectsegfau.lt/) | +| [overflow.projectsegfau.lt](https://overflow.projectsegfau.lt/) | United States, Germany, India | Operated by [Project Segfault](https://projectsegfau.lt/) | | [code.xbdm.fun](https://code.xbdm.fun) | Germany | Operated by [xbdm.fun](https://xbdm.fun) | | [overflow.fascinated.cc](https://overflow.fascinated.cc/) | Germany | Operated by [fascinated.cc](https://fascinated.cc/) | | [ao.bloat.cat](https://ao.bloat.cat) | Romania | Operated by [bloat.cat](https://bloat.cat) | @@ -48,7 +48,7 @@ This project is super lightweight by design. The UI is simple and the frontend i | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | --------------------------------------------------------- | | [ao.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion](http://ao.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion) | United States | Operated by [vern.cc](https://vern.cc) | | [vernmzgraj6aaoafmehupvtkkynpaa67rxcdj2kinwiy6konn6rq.b32.i2p](http://vernmzgraj6aaoafmehupvtkkynpaa67rxcdj2kinwiy6konn6rq.b32.i2p) | United States | Operated by [vern.cc](https://vern.cc) | -| [overflow.pjsfkvpxlinjamtawaksbnnaqs2fc2mtvmozrzckxh7f3kis6yea25ad.onion](http://overflow.pjsfkvpxlinjamtawaksbnnaqs2fc2mtvmozrzckxh7f3kis6yea25ad.onion/) | Luxembourg | Operated by [Project Segfault](https://projectsegfau.lt/) | +| [overflow.pjsfkvpxlinjamtawaksbnnaqs2fc2mtvmozrzckxh7f3kis6yea25ad.onion](http://overflow.pjsfkvpxlinjamtawaksbnnaqs2fc2mtvmozrzckxh7f3kis6yea25ad.onion/) | Germany | Operated by [Project Segfault](https://projectsegfau.lt/) | | [overflow.daturab6drmkhyeia4ch5gvfc2f3wgo6bhjrv3pz6n7kxmvoznlkq4yd.onion](http://overflow.daturab6drmkhyeia4ch5gvfc2f3wgo6bhjrv3pz6n7kxmvoznlkq4yd.onion/) | Germany | Operated by [datura.network](https://datura.network) | | [ao.pk47sgwhncn5cgidm7bofngmh7lc7ukjdpk5bjwfemmyp27ovl25ikyd.onion](http://ao.pk47sgwhncn5cgidm7bofngmh7lc7ukjdpk5bjwfemmyp27ovl25ikyd.onion/) | Germany | Operated by [owo.si](https://owo.si/) | | [ay7akchgdh76r4lc62hzd52z6xqoh67loototsetvqxo5o7ngo5q.b32.i2p](http://ay7akchgdh76r4lc62hzd52z6xqoh67loototsetvqxo5o7ngo5q.b32.i2p/) | Germany | Operated by [owo.si](https://owo.si/) | From 3a508ddbd4f273f2f33d1f622db4b0e9f6284315 Mon Sep 17 00:00:00 2001 From: Patrick Wu Date: Thu, 25 Apr 2024 00:49:26 +0800 Subject: [PATCH 03/38] A fix and a small refactor (#114) 1. fix code not visible in light theme; 2. use hex code instead of rgb code for all. --- public/globals.css | 12 +++++++----- public/home.css | 4 ++-- public/question.css | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/public/globals.css b/public/globals.css index 72a84a4..ddd179a 100644 --- a/public/globals.css +++ b/public/globals.css @@ -3,21 +3,23 @@ --text-color: #fff; --muted-text-color: #b3b3b3; --code-bg: #36383d; + --code-fg: #ffffff; --input-bg: #2b303b; --input-bg-hover: #3b404b; - --meta-bg: rgb(82, 82, 98); + --meta-bg: #525262; --divider-color: #42464e; --link-color: #92adff; } [data-theme='light'] { - --main-bg: rgb(219, 219, 219); + --main-bg: #dbdbdb; --text-color: #000; --muted-text-color: #636363; --code-bg: #36383d; - --input-bg: rgb(188, 188, 188); - --input-bg-hover: rgb(168, 168, 168); - --meta-bg: rgb(170, 168, 168); + --code-fg: #ffffff; + --input-bg: #bcbcbc; + --input-bg-hover: #a8a8a8; + --meta-bg: #aaa8a8; --divider-color: #b5b5b5; --link-color: #335ad0; } diff --git a/public/home.css b/public/home.css index e499a09..dd33e93 100644 --- a/public/home.css +++ b/public/home.css @@ -44,7 +44,7 @@ body { .view-input:focus { outline: none; - border: 2px solid rgb(168, 168, 168); + border: 2px solid #a8a8a8; } .view-button { @@ -71,7 +71,7 @@ body { } .error { - background-color: rgb(255, 129, 129); + background-color: #ff8181; } .error, diff --git a/public/question.css b/public/question.css index ada56f3..35ded1f 100644 --- a/public/question.css +++ b/public/question.css @@ -55,14 +55,14 @@ code { background-color: var(--code-bg); padding: 0.15rem; border-radius: 5px; - color: white; + color: var(--code-fg); } pre { background-color: var(--code-bg); padding: 1rem; border-radius: 5px; - color: var(--text-color); + color: var(--code-fg); overflow-x: auto; line-height: 1.35; } From e020639a3bccbcb3b2ea701629d0402c3bfd1016 Mon Sep 17 00:00:00 2001 From: McSinyx Date: Thu, 25 Apr 2024 14:09:43 +0900 Subject: [PATCH 04/38] Set maximum width to 40rem across screen sizes (#111) * Set maximum width to 40rem across screen sizes Some rules are removed to correct the bounding box size in browser inspector and fix the overflow on the x-axis. * Remove unused div.parent (The diff should be viewed --ignore-all-space) --- public/globals.css | 19 ++++- public/home.css | 20 +---- public/question.css | 37 --------- templates/question.html | 168 ++++++++++++++++++++-------------------- 4 files changed, 100 insertions(+), 144 deletions(-) diff --git a/public/globals.css b/public/globals.css index ddd179a..1655a96 100644 --- a/public/globals.css +++ b/public/globals.css @@ -29,10 +29,23 @@ a { } html { + margin: auto; + max-width: 40rem; +} + +@media only screen and (max-width: calc(40rem + 2rem)) { + body { + padding-left: 1rem; + padding-right: 1rem; + } +} + +body { + background-color: var(--main-bg); + color: var(--text-color); + font-family: sans-serif; + margin: 0; - padding: 0; - width: 100vw; - height: 100vh; } .icon { diff --git a/public/home.css b/public/home.css index dd33e93..d947c81 100644 --- a/public/home.css +++ b/public/home.css @@ -1,21 +1,10 @@ body { - background-color: var(--main-bg); - font-family: sans-serif; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - width: 100vw; - - margin: 0; - - color: var(--text-color); } .container { - width: 40rem; + margin: auto; } .footer { @@ -104,10 +93,3 @@ body { width: 2rem; height: 2rem; } - -@media screen and (max-width: 800px) { - body { - padding: 1rem; - box-sizing: border-box; - } -} diff --git a/public/question.css b/public/question.css index 35ded1f..85cbcae 100644 --- a/public/question.css +++ b/public/question.css @@ -1,35 +1,5 @@ body { - margin: 0; - width: 100vw; - height: 100vh; - - overflow-x: hidden; - - background-color: var(--main-bg); - color: var(--text-color); - font-family: sans-serif; - - display: flex; - justify-content: center; - - padding-left: 5rem; - padding-right: 5rem; padding-top: 2rem; - - box-sizing: border-box; -} - -@media (orientation: landscape) { - .parent { - max-width: 50%; - width: fit-content; - } -} -@media (orientation: portrait) { - .parent { - max-width: 90%; - width: fit-content; - } } .header { @@ -195,10 +165,3 @@ img { justify-content: center; align-items: center; } - -@media only screen and (max-width: 800px) { - body { - padding-left: 1rem; - padding-right: 1rem; - } -} diff --git a/templates/question.html b/templates/question.html index 32f60a9..f0bf96c 100644 --- a/templates/question.html +++ b/templates/question.html @@ -21,91 +21,89 @@ -
-
- - - - {{ template "themeSwitcher.html" . }} -
-
-
-

{{ .question.Title }}

-

- Asked {{ .question.Timestamp }} by - {{ .question.AuthorName }}. -

-
-
{{ .question.Body }}
-
- {{ range .question.Tags }} -
{{ . }}
- {{ end }} -
- {{ if .question.Comments }} {{ template "comments.html" - .question }} {{end}} -
-
-
-

Answers

-
-
- - -
-
-
- {{ range $answer := .answers }} -
-
-

- {{ if $answer.IsAccepted }} Accepted - {{ end }} - {{$answer.Upvotes}} Votes -

- -
- Paperclip icon -
-
-
- {{ $answer.Body }} -
-
- Answered {{ $answer.Timestamp }} by - {{ $answer.AuthorName }} -
-
- {{ if $answer.Comments }} {{ template "comments.html" $answer }} - {{end}} -
- {{ end }} +
+ + + + {{ template "themeSwitcher.html" . }}
+
+
+

{{ .question.Title }}

+

+ Asked {{ .question.Timestamp }} by + {{ .question.AuthorName }}. +

+
+
{{ .question.Body }}
+
+ {{ range .question.Tags }} +
{{ . }}
+ {{ end }} +
+ {{ if .question.Comments }} {{ template "comments.html" + .question }} {{end}} +
+
+
+

Answers

+
+
+ + +
+
+
+ {{ range $answer := .answers }} +
+
+

+ {{ if $answer.IsAccepted }} Accepted - {{ end }} + {{$answer.Upvotes}} Votes +

+ +
+ Paperclip icon +
+
+
+ {{ $answer.Body }} +
+
+ Answered {{ $answer.Timestamp }} by + {{ $answer.AuthorName }} +
+
+ {{ if $answer.Comments }} {{ template "comments.html" $answer }} + {{end}} +
+ {{ end }} From 84991a648640e3af2ce295a306952f6a9186db49 Mon Sep 17 00:00:00 2001 From: McSinyx Date: Thu, 25 Apr 2024 14:11:25 +0900 Subject: [PATCH 05/38] Wrap Answers heading on narrow screens (#112) Otherwise it would overflow on the x-axis. --- public/question.css | 1 + 1 file changed, 1 insertion(+) diff --git a/public/question.css b/public/question.css index 85cbcae..a9b8bae 100644 --- a/public/question.css +++ b/public/question.css @@ -132,6 +132,7 @@ img { .answers-header { display: flex; + flex-wrap: wrap; justify-content: space-between; align-items: center; } From b568c529996c3251a22d0e5c0602c40e66af4659 Mon Sep 17 00:00:00 2001 From: McSinyx Date: Thu, 25 Apr 2024 14:12:43 +0900 Subject: [PATCH 06/38] Let title hyphenate to avoid x-overflow on mobile (#113) --- templates/home.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/home.html b/templates/home.html index 2189aca..036524b 100644 --- a/templates/home.html +++ b/templates/home.html @@ -22,7 +22,7 @@ src="/static/codecircles.webp" alt="4 circles with alternating colors between green and white" /> -

AnonymousOverflow

+

Anonymous­Overflow

Get programming help without compromising your privacy.

From 8174f2ee441bf4224665271eeea99c20c9e295ea Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Sun, 5 May 2024 15:23:09 -0400 Subject: [PATCH 07/38] fix: remove alt from homepage logo, add "logo" alt to question header (#116) * fix: remove alt from homepage logo, add "logo" alt to question header * fix: set logo alt on question.html to "AnonymousOverflow home" --- templates/home.html | 137 +++++++++++++++------------------ templates/question.html | 163 ++++++++++++++++++---------------------- 2 files changed, 133 insertions(+), 167 deletions(-) diff --git a/templates/home.html b/templates/home.html index 036524b..057e062 100644 --- a/templates/home.html +++ b/templates/home.html @@ -1,81 +1,62 @@ - - AnonymousOverflow - Private frontend for StackOverflow - - - - - {{ template "sharedHead.html" }} - - -

-
- -

Anonymous­Overflow

-
-

Get programming help without compromising your privacy.

-

- AnonymousOverflow allows you to view StackOverflow threads - without the cluttered interface and exposing your IP address, - browsing habits and other browser fingerprint data to - StackOverflow. -

- {{ if .successMessage }} -
-

Success: {{ .successMessage }}

-
- {{ else}} {{ if .errorMessage }} -
-

Error: {{ .errorMessage }}

-
- {{end}} {{ end }} -
-
- - -
-
-
-
- - Toggle theme - -
- {{ template "themeSwitcher.html" .}} -
- + + + AnonymousOverflow - Private frontend for StackOverflow + + + + + {{ template "sharedHead.html" }} + + + +
+
+ +

Anonymous­Overflow

- - +

Get programming help without compromising your privacy.

+

+ AnonymousOverflow allows you to view StackOverflow threads + without the cluttered interface and exposing your IP address, + browsing habits and other browser fingerprint data to + StackOverflow. +

+ {{ if .successMessage }} +
+

Success: {{ .successMessage }}

+
+ {{ else}} {{ if .errorMessage }} +
+

Error: {{ .errorMessage }}

+
+ {{end}} {{ end }} +
+
+ + +
+
+
+
+ + Toggle theme + +
+ {{ template "themeSwitcher.html" .}} +
+ +
+ + + \ No newline at end of file diff --git a/templates/question.html b/templates/question.html index f0bf96c..8c1ac96 100644 --- a/templates/question.html +++ b/templates/question.html @@ -1,84 +1,73 @@ - - {{ .question.Title }} | AnonymousOverflow - - - - - - {{ template "sharedHead.html" }} - - - + + {{ .question.Title }} | AnonymousOverflow + + + + + + {{ template "sharedHead.html" }} + - - - + + + + + + - -
- - - - {{ template "themeSwitcher.html" . }} + + +
+ + + + {{ template "themeSwitcher.html" . }} +
+
+
+

{{ .question.Title }}

+

+ Asked {{ .question.Timestamp }} by + {{ .question.AuthorName + }}. +

-
-
-

{{ .question.Title }}

-

- Asked {{ .question.Timestamp }} by - {{ .question.AuthorName }}. -

-
-
{{ .question.Body }}
-
- {{ range .question.Tags }} -
{{ . }}
- {{ end }} -
- {{ if .question.Comments }} {{ template "comments.html" - .question }} {{end}} +
{{ .question.Body }}
+
+ {{ range .question.Tags }} +
{{ . }}
+ {{ end }}
-
-
-

Answers

-
-
- - -
-
+ {{ if .question.Comments }} {{ template "comments.html" + .question }} {{end}} +
+
+
+

Answers

+
+
+ + +
- {{ range $answer := .answers }} -
-
+
+ {{ range $answer := .answers }} +
+

{{ if $answer.IsAccepted }} Accepted - {{ end }} {{$answer.Upvotes}} Votes @@ -89,21 +78,17 @@

- {{ $answer.Body }} -
-
- Answered {{ $answer.Timestamp }} by - {{ $answer.AuthorName }} -
+ {{ $answer.Body }} +
+
+ Answered {{ $answer.Timestamp }} by + {{ $answer.AuthorName }}
- {{ if $answer.Comments }} {{ template "comments.html" $answer }} - {{end}}
- {{ end }} - - + {{ if $answer.Comments }} {{ template "comments.html" $answer }} + {{end}} +
+ {{ end }} + + + \ No newline at end of file From 67c09e5e89763f8203a661950a2337bbb07d98ac Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Sun, 5 May 2024 15:39:07 -0400 Subject: [PATCH 08/38] chore: version 1.13.0 --- config/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/version.go b/config/version.go index 45201be..d2a1fa2 100644 --- a/config/version.go +++ b/config/version.go @@ -1,3 +1,3 @@ package config -var Version = "1.12.1" +var Version = "1.13.0" From c2a9b4368a2a4b8b4cec5923cafe7b8dd1ef5fcf Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Sun, 5 May 2024 15:40:01 -0400 Subject: [PATCH 09/38] feat: only show question answers if they exist (#119) --- templates/question.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/question.html b/templates/question.html index 8c1ac96..8af2f03 100644 --- a/templates/question.html +++ b/templates/question.html @@ -45,6 +45,7 @@ {{ if .question.Comments }} {{ template "comments.html" .question }} {{end}}
+ {{ if .answers }}

Answers

@@ -89,6 +90,7 @@ {{end}}
{{ end }} + {{ end }} \ No newline at end of file From a4d9402a57a701becf82b8e05997f4d7d3335dc5 Mon Sep 17 00:00:00 2001 From: SudoVanilla Date: Sat, 18 May 2024 13:51:06 -0400 Subject: [PATCH 10/38] Update link to SudoVanilla instance (#124) --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9268dad..ad35629 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,8 @@ This project is super lightweight by design. The UI is simple and the frontend i | [overflow.freedit.eu](overflow.freedit.eu) | United States | Operated by [freedit.eu](https://freedit.eu) | | [ao.ftw.lol](https://ao.ftw.lol) | Germany | Operated by [ftw.lol](https://ftw.lol) | | [anonoverflow.hyperreal.coffee](https://anonoverflow.hyperreal.coffee) | United States | Operated by [hyperreal.coffee](https://hyperreal.coffee) | -| [overflow.sudovanilla.com](https://overflow.sudovanilla.com) | United States | Operated by [SudoVanilla](https://sudovanilla.com) | +| [o.sudovanilla.org](https://o.sudovanilla.org) | United States | Operated by [SudoVanilla](https://sudovanilla.org) | +| [overflow.sudovanilla.org](https://overflow.sudovanilla.org) | United States | Operated by [SudoVanilla](https://sudovanilla.org) | | [anonymousoverflow.privacyfucking.rocks](https://anonymousoverflow.privacyfucking.rocks/) | Germany | Operated by [privacyfucking.rocks](https://privacyfucking.rocks) | | [exchange.seitan-ayoub.lol](https://exchange.seitan-ayoub.lol) | Germany | Operated by [Seitan Ayoub](https://seitan-ayoub.lol) | | [overflow.r4fo.com](https://overflow.r4fo.com) | The Netherlands | Operated by [r4fo.com](https://r4fo.com) | From 215f24cd53e77125995adee8e8c44f8e60e08c39 Mon Sep 17 00:00:00 2001 From: Solomon Date: Fri, 7 Jun 2024 19:50:33 +0000 Subject: [PATCH 11/38] fix: scrape answer comments (#128) --- src/routes/question.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/routes/question.go b/src/routes/question.go index f4f99f3..b4c230c 100644 --- a/src/routes/question.go +++ b/src/routes/question.go @@ -250,6 +250,8 @@ func extractAnswersData(doc *goquery.Document, domain string) ([]types.FilteredA processedAnswerBody := utils.ProcessHTMLBody(answerBodyHTML) answer.Body = template.HTML(processedAnswerBody) + answer.Comments = utils.FindAndReturnComments(answerBodyHTML, domain, postLayout) + // Extract author information and timestamp. extractAnswerAuthorInfo(s, &answer, domain) From 7596516574963ff8b98ca804bc97fd7a5eba4f50 Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Tue, 11 Jun 2024 01:47:46 -0400 Subject: [PATCH 12/38] Instance Hub (#131) * feat: instances.json file * feat: rename admins to operators * feat: onion array of instances * feat: i2p section * fix: rename to operators * docs: ao hub link in readme * Merge branch 'main' into feature/instance-hub --- README.md | 43 +------------ instances.json | 170 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 41 deletions(-) create mode 100644 instances.json diff --git a/README.md b/README.md index ad35629..7296b33 100644 --- a/README.md +++ b/README.md @@ -12,48 +12,9 @@ This project is super lightweight by design. The UI is simple and the frontend i ![Answer](./docs/screenshots/answers_light.webp) -## Clearnet Instances +## Instances -| Instance URL | Region | Notes | -| ----------------------------------------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------ | -| [code.whatever.social](https://code.whatever.social) | Germany | Operated by [Whatever Social](https://whatever.social) and [http.james](https://httpjames.space) | -| [ao.vern.cc](https://ao.vern.cc) | United States | Operated by [vern.cc](https://vern.cc) | -| [overflow.smnz.de](https://overflow.smnz.de) | Germany | Operated by [smnz.de](https://smnz.de) | -| [overflow.lunar.icu](https://overflow.lunar.icu) | Germany | Operated by [lunar.icu](https://lunar.icu/) | -| [overflow.adminforge.de](https://overflow.adminforge.de/) | Germany | Operated by [adminForge](https://adminforge.de/) | -| [overflow.hostux.net](https://overflow.hostux.net/) | France | Operated by [Hostux](https://hostux.net/) | -| [overflow.projectsegfau.lt](https://overflow.projectsegfau.lt/) | United States, Germany, India | Operated by [Project Segfault](https://projectsegfau.lt/) | -| [code.xbdm.fun](https://code.xbdm.fun) | Germany | Operated by [xbdm.fun](https://xbdm.fun) | -| [overflow.fascinated.cc](https://overflow.fascinated.cc/) | Germany | Operated by [fascinated.cc](https://fascinated.cc/) | -| [ao.bloat.cat](https://ao.bloat.cat) | Romania | Operated by [bloat.cat](https://bloat.cat) | -| [anonoverflow.frontendfriendly.xyz](https://anonoverflow.frontendfriendly.xyz/) | United States | Operated by [frontendfriendly.xyz](https://frontendfriendly.xyz/) | -| [ao.owo.si](https://ao.owo.si/) | Germany | Operated by [owo.si](https://owo.si/) | -| [overflow.datura.network](https://overflow.datura.network/) | Germany | Operated by [datura.network](https://datura.network) | -| [overflow.freedit.eu](overflow.freedit.eu) | United States | Operated by [freedit.eu](https://freedit.eu) | -| [ao.ftw.lol](https://ao.ftw.lol) | Germany | Operated by [ftw.lol](https://ftw.lol) | -| [anonoverflow.hyperreal.coffee](https://anonoverflow.hyperreal.coffee) | United States | Operated by [hyperreal.coffee](https://hyperreal.coffee) | -| [o.sudovanilla.org](https://o.sudovanilla.org) | United States | Operated by [SudoVanilla](https://sudovanilla.org) | -| [overflow.sudovanilla.org](https://overflow.sudovanilla.org) | United States | Operated by [SudoVanilla](https://sudovanilla.org) | -| [anonymousoverflow.privacyfucking.rocks](https://anonymousoverflow.privacyfucking.rocks/) | Germany | Operated by [privacyfucking.rocks](https://privacyfucking.rocks) | -| [exchange.seitan-ayoub.lol](https://exchange.seitan-ayoub.lol) | Germany | Operated by [Seitan Ayoub](https://seitan-ayoub.lol) | -| [overflow.r4fo.com](https://overflow.r4fo.com) | The Netherlands | Operated by [r4fo.com](https://r4fo.com) | -| [overflow.ducks.party](https://overflow.ducks.party) | The Netherlands | Operated by [ducks.party](https://ducks.party) | -| [ao.ngn.tf](https://ao.ngn.tf) | Turkey | Operated by [ngn](https://ngn.tf) | -| [overflow.snine.nl](https://overflow.snine.nl) | The Netherlands | Operated by [snine](https://snine.nl) | -| [anonymousoverflow.privacyredirect.com](https://anonymousoverflow.privacyredirect.com) | Finland | Operated by [privacyredirect.com](https://privacyredirect.com/) | -| [soflow.nerdvpn.de](https://soflow.nerdvpn.de) | Ukraine | Operated by [Sommerwiesel](https://github.com/Sommerwiesel) | - -## Other Instances - -| Instance URL | Region | Notes | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | --------------------------------------------------------- | -| [ao.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion](http://ao.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion) | United States | Operated by [vern.cc](https://vern.cc) | -| [vernmzgraj6aaoafmehupvtkkynpaa67rxcdj2kinwiy6konn6rq.b32.i2p](http://vernmzgraj6aaoafmehupvtkkynpaa67rxcdj2kinwiy6konn6rq.b32.i2p) | United States | Operated by [vern.cc](https://vern.cc) | -| [overflow.pjsfkvpxlinjamtawaksbnnaqs2fc2mtvmozrzckxh7f3kis6yea25ad.onion](http://overflow.pjsfkvpxlinjamtawaksbnnaqs2fc2mtvmozrzckxh7f3kis6yea25ad.onion/) | Germany | Operated by [Project Segfault](https://projectsegfau.lt/) | -| [overflow.daturab6drmkhyeia4ch5gvfc2f3wgo6bhjrv3pz6n7kxmvoznlkq4yd.onion](http://overflow.daturab6drmkhyeia4ch5gvfc2f3wgo6bhjrv3pz6n7kxmvoznlkq4yd.onion/) | Germany | Operated by [datura.network](https://datura.network) | -| [ao.pk47sgwhncn5cgidm7bofngmh7lc7ukjdpk5bjwfemmyp27ovl25ikyd.onion](http://ao.pk47sgwhncn5cgidm7bofngmh7lc7ukjdpk5bjwfemmyp27ovl25ikyd.onion/) | Germany | Operated by [owo.si](https://owo.si/) | -| [ay7akchgdh76r4lc62hzd52z6xqoh67loototsetvqxo5o7ngo5q.b32.i2p](http://ay7akchgdh76r4lc62hzd52z6xqoh67loototsetvqxo5o7ngo5q.b32.i2p/) | Germany | Operated by [owo.si](https://owo.si/) | -| [overflow.r4focoma7gu2zdwwcjjad47ysxt634lg73sxmdbkdozanwqslho5ohyd.onion](http://overflow.r4focoma7gu2zdwwcjjad47ysxt634lg73sxmdbkdozanwqslho5ohyd.onion) | The Netherlands | Operated by [r4fo.com](https://r4fo.com) | +Visit the [AnonymousOverflow Hub](https://aohub.httpjames.space) for a list of instances. ## Why use AnonymousOverflow over StackOverflow? diff --git a/instances.json b/instances.json new file mode 100644 index 0000000..6a2ef11 --- /dev/null +++ b/instances.json @@ -0,0 +1,170 @@ +{ + "clearnet": [ + { + "url": "https://code.whatever.social", + "regions": ["Germany"], + "operators": ["https://whatever.social", "https://httpjames.space"] + }, + { + "url": "https://ao.vern.cc", + "regions": ["United States"], + "operators": ["https://vern.cc"] + }, + { + "url": "https://overflow.smnz.de", + "regions": ["Germany"], + "operators": ["https://smnz.de"] + }, + { + "url": "https://overflow.lunar.icu", + "regions": ["Germany"], + "operators": ["https://lunar.icu/"] + }, + { + "url": "https://overflow.adminforge.de/", + "regions": ["Germany"], + "operators": ["https://adminforge.de/"] + }, + { + "url": "https://overflow.hostux.net/", + "regions": ["France"], + "operators": ["https://hostux.net/"] + }, + { + "url": "https://overflow.projectsegfau.lt/", + "regions": ["United States", "Germany", "India"], + "operators": ["https://projectsegfau.lt/"] + }, + { + "url": "https://code.xbdm.fun", + "regions": ["Germany"], + "operators": ["https://xbdm.fun"] + }, + { + "url": "https://overflow.fascinated.cc/", + "regions": ["Germany"], + "operators": ["https://fascinated.cc/"] + }, + { + "url": "https://ao.bloat.cat", + "regions": ["Romania"], + "operators": ["https://bloat.cat"] + }, + { + "url": "https://anonoverflow.frontendfriendly.xyz/", + "regions": ["United States"], + "operators": ["https://frontendfriendly.xyz/"] + }, + { + "url": "https://ao.owo.si/", + "regions": ["Germany"], + "operators": ["https://owo.si/"] + }, + { + "url": "https://overflow.datura.network/", + "regions": ["Germany"], + "operators": ["https://datura.network"] + }, + { + "url": "https://overflow.freedit.eu", + "regions": ["United States"], + "operators": ["https://freedit.eu"] + }, + { + "url": "https://ao.ftw.lol", + "regions": ["Germany"], + "operators": ["https://ftw.lol"] + }, + { + "url": "https://anonoverflow.hyperreal.coffee", + "regions": ["United States"], + "operators": ["https://hyperreal.coffee"] + }, + { + "url": "https://overflow.sudovanilla.com", + "regions": ["United States"], + "operators": ["https://sudovanilla.com"] + }, + { + "url": "https://anonymousoverflow.privacyfucking.rocks/", + "regions": ["Germany"], + "operators": ["https://privacyfucking.rocks"] + }, + { + "url": "https://exchange.seitan-ayoub.lol", + "regions": ["Germany"], + "operators": ["https://seitan-ayoub.lol"] + }, + { + "url": "https://overflow.r4fo.com", + "regions": ["The Netherlands"], + "operators": ["https://r4fo.com"] + }, + { + "url": "https://overflow.ducks.party", + "regions": ["The Netherlands"], + "operators": ["https://ducks.party"] + }, + { + "url": "https://ao.ngn.tf", + "regions": ["Turkey"], + "operators": ["https://ngn.tf"] + }, + { + "url": "https://overflow.snine.nl", + "regions": ["The Netherlands"], + "operators": ["https://snine.nl"] + }, + { + "url": "https://anonymousoverflow.privacyredirect.com", + "regions": ["Finland"], + "operators": ["https://privacyredirect.com/"] + }, + { + "url": "https://soflow.nerdvpn.de", + "regions": ["Ukraine"], + "operators": ["https://github.com/Sommerwiesel"] + } + ], + + "onion": [ + { + "url": "http://ao.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion", + "regions": ["United States"], + "operators": ["https://vern.cc"] + }, + { + "url": "http://overflow.pjsfkvpxlinjamtawaksbnnaqs2fc2mtvmozrzckxh7f3kis6yea25ad.onion/", + "regions": ["Germany"], + "operators": ["https://projectsegfau.lt/"] + }, + { + "url": "http://overflow.daturab6drmkhyeia4ch5gvfc2f3wgo6bhjrv3pz6n7kxmvoznlkq4yd.onion/", + "regions": ["Germany"], + "operators": ["https://datura.network"] + }, + { + "url": "http://ao.pk47sgwhncn5cgidm7bofngmh7lc7ukjdpk5bjwfemmyp27ovl25ikyd.onion/", + "regions": ["Germany"], + "operators": ["https://owo.si/"] + }, + { + "url": "http://overflow.r4focoma7gu2zdwwcjjad47ysxt634lg73sxmdbkdozanwqslho5ohyd.onion", + "regions": ["The Netherlands"], + "operators": ["https://r4fo.com"] + } + ], + + "i2p": [ + { + "url": "http://vernmzgraj6aaoafmehupvtkkynpaa67rxcdj2kinwiy6konn6rq.b32.i2p", + "regions": ["United States"], + "operators": ["https://vern.cc"] + }, + { + "url": "http://ay7akchgdh76r4lc62hzd52z6xqoh67loototsetvqxo5o7ngo5q.b32.i2p/", + "regions": ["Germany"], + "operators": ["https://owo.si/"] + } + ] +} From b2a675b94cc0a0d6a1a8169ea520cfcd19416901 Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Tue, 11 Jun 2024 01:57:46 -0400 Subject: [PATCH 13/38] docs: new instances #120 #122 #125 #127 #129 --- instances.json | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/instances.json b/instances.json index 6a2ef11..5d922eb 100644 --- a/instances.json +++ b/instances.json @@ -76,9 +76,9 @@ "operators": ["https://ftw.lol"] }, { - "url": "https://anonoverflow.hyperreal.coffee", - "regions": ["United States"], - "operators": ["https://hyperreal.coffee"] + "url": "https://anonoverflow.nirn.quest", + "regions": ["Canada"], + "operators": ["https://nirn.quest", "https://hyperreal.coffee"] }, { "url": "https://overflow.sudovanilla.com", @@ -124,6 +124,26 @@ "url": "https://soflow.nerdvpn.de", "regions": ["Ukraine"], "operators": ["https://github.com/Sommerwiesel"] + }, + { + "url": "https://overflow.einfachzocken.eu/", + "regions": ["Germany"], + "operators": ["https://einfachzocken.eu"] + }, + { + "url": "https://overflow.seasi.dev/", + "regions": ["Singapore"], + "operators": ["https://seasi.dev/"] + }, + { + "url": "https://anonymousoverflow.catsarch.com", + "regions": ["United States"], + "operators": ["https://catsarch.com"] + }, + { + "url": "https://overflow.darkness.services/", + "regions": ["United States"], + "operators": ["https://zzz.darkness.services"] } ], @@ -152,6 +172,18 @@ "url": "http://overflow.r4focoma7gu2zdwwcjjad47ysxt634lg73sxmdbkdozanwqslho5ohyd.onion", "regions": ["The Netherlands"], "operators": ["https://r4fo.com"] + }, + { + "url": "http://anonymousoverflow.catsarchywsyuss6jdxlypsw5dc7owd5u5tr6bujxb7o6xw2hipqehyd.onion/", + "regions": ["United States"], + "operators": ["https://catsarch.com"] + }, + { + "url": "http://overflow.darknessrdor43qkl2ngwitj72zdavfz2cead4t5ed72bybgauww5lyd.onion/", + "regions": ["United States"], + "operators": [ + "http://darknessrdor43qkl2ngwitj72zdavfz2cead4t5ed72bybgauww5lyd.onion/" + ] } ], @@ -165,6 +197,11 @@ "url": "http://ay7akchgdh76r4lc62hzd52z6xqoh67loototsetvqxo5o7ngo5q.b32.i2p/", "regions": ["Germany"], "operators": ["https://owo.si/"] + }, + { + "url": "http://ocp7zhdsbl2mjabv5ma5jvbzg2dqzglieayjvyj4j2r7qvsqlboa.b32.i2p/", + "regions": ["United States"], + "operators": ["https://catsarch.com"] } ] } From 6ce48174898e67e7ac93bb91decafd4b77277137 Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Thu, 13 Jun 2024 01:45:46 -0400 Subject: [PATCH 14/38] docs: feature request issue template --- .github/ISSUE_TEMPLATE/feature_request.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..287182e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,15 @@ +--- +name: Feature Request +about: 'Suggest a specific feature or enhancement' +title: '' +labels: 'enhancement' +assignees: '' +--- + +# What does the feature entail? + + + +# Why is this feature important? + + From e19717ff3254f2d766f3f4e1585793619457618a Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Thu, 13 Jun 2024 01:46:22 -0400 Subject: [PATCH 15/38] docs: add default label to bug report issue template --- .github/ISSUE_TEMPLATE/bug_report.md | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 0f97088..cd460eb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,34 +2,32 @@ name: Bug report about: 'Create a report to help us improve' title: '' -labels: '' +labels: 'bug' assignees: '' - --- Please make sure you're on the latest version before submitting. - # What's Happening? - + ## How to reproduce: - + ## Affected Platforms: -- [ ] macOS -- [ ] Windows -- [ ] Linux (Specify) -- [ ] iOS -- [ ] Android +- [ ] macOS +- [ ] Windows +- [ ] Linux (Specify) +- [ ] iOS +- [ ] Android -Version: +Version: ## Browser: -- [ ] Chromium-based (ex: Brave or Chrome) -- [ ] Webkit-based (ex: Safari) -- [ ] Gecko-based (ex: Firefox) +- [ ] Chromium-based (ex: Brave or Chrome) +- [ ] Webkit-based (ex: Safari) +- [ ] Gecko-based (ex: Firefox) From bcc932bd225d7fdb162632fd74d717d1fecd98d0 Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Thu, 13 Jun 2024 01:46:28 -0400 Subject: [PATCH 16/38] docs: remove deprecated new instance issue template --- .github/ISSUE_TEMPLATE/new_instance.md | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/new_instance.md diff --git a/.github/ISSUE_TEMPLATE/new_instance.md b/.github/ISSUE_TEMPLATE/new_instance.md deleted file mode 100644 index 287c5f5..0000000 --- a/.github/ISSUE_TEMPLATE/new_instance.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -name: New Instance -about: 'Add my public instance to the list' -title: "[INSTANCE] New public instance" -labels: '' -assignees: '' - ---- - -Instance URL: -Region (Written Out - ex United States): -Operated by (Link to your site): From 80b45bf034d451144791259d4397620497550cda Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Thu, 13 Jun 2024 02:18:51 -0400 Subject: [PATCH 17/38] Support exchange shortened URLs (#133) * feat: support shortened exchange urls * feat: add shortener processing for exchange /a/:id conventions --- main.go | 26 +++++++++++++++++--------- src/routes/shortened.go | 17 +++++++++++++++-- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/main.go b/main.go index 625b161..f423cd1 100644 --- a/main.go +++ b/main.go @@ -55,6 +55,23 @@ func main() { r.GET("/q/:id", routes.RedirectShortenedOverflowURL) r.GET("/q/:id/:answerId", routes.RedirectShortenedOverflowURL) + exchangeRouter := r.Group("/exchange/:sub") + { + exchangeRouter.GET("/questions/:id/:title", routes.ViewQuestion) + exchangeRouter.GET("/questions/:id", func(c *gin.Context) { + // redirect user to the question with the title + c.Redirect(302, fmt.Sprintf("/exchange/%s/questions/%s/placeholder", c.Param("sub"), c.Param("id"))) + }) + exchangeRouter.GET("/questions/:id/:title/:answerId", func(c *gin.Context) { + // redirect user to the answer with the title + c.Redirect(302, fmt.Sprintf("/exchange/%s/questions/%s/%s#%s", c.Param("sub"), c.Param("id"), c.Param("title"), c.Param("answerId"))) + }) + exchangeRouter.GET("/q/:id/:answerId", routes.RedirectShortenedOverflowURL) + exchangeRouter.GET("/q/:id", routes.RedirectShortenedOverflowURL) + exchangeRouter.GET("/a/:id/:answerId", routes.RedirectShortenedOverflowURL) + exchangeRouter.GET("/a/:id", routes.RedirectShortenedOverflowURL) + } + r.GET("/questions/:id", func(c *gin.Context) { // redirect user to the question with the title c.Redirect(302, fmt.Sprintf("/questions/%s/placeholder", c.Param("id"))) @@ -64,15 +81,6 @@ func main() { // redirect user to the answer with the title c.Redirect(302, fmt.Sprintf("/questions/%s/%s#%s", c.Param("id"), c.Param("title"), c.Param("answerId"))) }) - r.GET("/exchange/:sub/questions/:id/:title", routes.ViewQuestion) - r.GET("/exchange/:sub/questions/:id", func(c *gin.Context) { - // redirect user to the question with the title - c.Redirect(302, fmt.Sprintf("/exchange/%s/questions/%s/placeholder", c.Param("sub"), c.Param("id"))) - }) - r.GET("/exchange/:sub/questions/:id/:title/:answerId", func(c *gin.Context) { - // redirect user to the answer with the title - c.Redirect(302, fmt.Sprintf("/exchange/%s/questions/%s/%s#%s", c.Param("sub"), c.Param("id"), c.Param("title"), c.Param("answerId"))) - }) r.GET("/proxy", routes.GetImage) diff --git a/src/routes/shortened.go b/src/routes/shortened.go index 9f608f8..07b5445 100644 --- a/src/routes/shortened.go +++ b/src/routes/shortened.go @@ -4,6 +4,7 @@ import ( "fmt" "net/http" "os" + "strings" "github.com/gin-gonic/gin" "github.com/go-resty/resty/v2" @@ -12,6 +13,7 @@ import ( func RedirectShortenedOverflowURL(c *gin.Context) { id := c.Param("id") answerId := c.Param("answerId") + sub := c.Param("sub") // fetch the stack overflow URL client := resty.New() @@ -21,7 +23,13 @@ func RedirectShortenedOverflowURL(c *gin.Context) { }), ) - resp, err := client.R().Get(fmt.Sprintf("https://www.stackoverflow.com/a/%s/%s", id, answerId)) + domain := "www.stackoverflow.com" + if strings.Contains(sub, ".") { + domain = sub + } else if sub != "" { + domain = fmt.Sprintf("%s.stackexchange.com", sub) + } + resp, err := client.R().Get(fmt.Sprintf("https://%s/a/%s/%s", domain, id, answerId)) if err != nil { c.HTML(400, "home.html", gin.H{ "errorMessage": "Unable to fetch stack overflow URL", @@ -41,5 +49,10 @@ func RedirectShortenedOverflowURL(c *gin.Context) { // get the redirect URL location := resp.Header().Get("Location") - c.Redirect(302, fmt.Sprintf("%s%s", os.Getenv("APP_URL"), location)) + redirectPrefix := os.Getenv("APP_URL") + if sub != "" { + redirectPrefix += fmt.Sprintf("/exchange/%s", sub) + } + + c.Redirect(302, fmt.Sprintf("%s%s", redirectPrefix, location)) } From e278368ab7ddb42d0ce806d18734829508b7c731 Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Sun, 16 Jun 2024 14:05:02 -0400 Subject: [PATCH 18/38] fix: set answer ID to data-answerid value (#135) --- src/routes/question.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/routes/question.go b/src/routes/question.go index b4c230c..e184ba8 100644 --- a/src/routes/question.go +++ b/src/routes/question.go @@ -231,6 +231,8 @@ func extractAnswersData(doc *goquery.Document, domain string) ([]types.FilteredA doc.Find("div.answer").Each(func(i int, s *goquery.Selection) { var answer types.FilteredAnswer + answer.ID = s.AttrOr("data-answerid", "") + postLayout := s.Find("div.post-layout").First() // Extract upvotes. From b0ae8a50b5b0a1459b063dd7c25572e667553748 Mon Sep 17 00:00:00 2001 From: jan Tawi Akemi <49637097+aketawi@users.noreply.github.com> Date: Thu, 20 Jun 2024 00:05:10 +0800 Subject: [PATCH 19/38] add instance: https://anonflow.aketawi.space/ (#138) Co-authored-by: jan Tawi Akemi --- instances.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/instances.json b/instances.json index 5d922eb..b277810 100644 --- a/instances.json +++ b/instances.json @@ -144,6 +144,11 @@ "url": "https://overflow.darkness.services/", "regions": ["United States"], "operators": ["https://zzz.darkness.services"] + }, + { + "url": "https://anonflow.aketawi.space/", + "regions": ["Russia"], + "operators": ["https://www.aketawi.space/"] } ], From e409176642a0f4cc5a05c726da2652076b608349 Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Thu, 20 Jun 2024 00:18:22 -0400 Subject: [PATCH 20/38] media query theme (#139) * feat: use css media query to derive theme * fix: rename alt for toggle images * feat: remove no-cache middleware --- main.go | 1 - public/globals.css | 26 ++++++++++++++------------ src/middleware/noCache.go | 12 ------------ src/middleware/options.go | 8 -------- src/middleware/ratelimit.go | 1 - src/routes/home.go | 3 --- src/routes/options.go | 20 -------------------- src/routes/question.go | 7 ------- src/routes/shortened.go | 2 -- templates/home.html | 5 ++--- templates/question.html | 3 +-- templates/themeSwitcher.html | 6 ------ 12 files changed, 17 insertions(+), 77 deletions(-) delete mode 100644 src/middleware/noCache.go delete mode 100644 templates/themeSwitcher.html diff --git a/main.go b/main.go index f423cd1..3730e9d 100644 --- a/main.go +++ b/main.go @@ -35,7 +35,6 @@ func main() { r.Use(gin.Recovery()) r.Use(middleware.XssPreventionHeaders()) - r.Use(middleware.NoCacheMiddleware()) r.Use(middleware.OptionsMiddleware()) r.Use(middleware.Ratelimit()) diff --git a/public/globals.css b/public/globals.css index 1655a96..8470cd0 100644 --- a/public/globals.css +++ b/public/globals.css @@ -11,17 +11,19 @@ --link-color: #92adff; } -[data-theme='light'] { - --main-bg: #dbdbdb; - --text-color: #000; - --muted-text-color: #636363; - --code-bg: #36383d; - --code-fg: #ffffff; - --input-bg: #bcbcbc; - --input-bg-hover: #a8a8a8; - --meta-bg: #aaa8a8; - --divider-color: #b5b5b5; - --link-color: #335ad0; +@media (prefers-color-scheme: light) { + :root { + --main-bg: #dbdbdb; + --text-color: #000; + --muted-text-color: #636363; + --code-bg: #36383d; + --code-fg: #ffffff; + --input-bg: #bcbcbc; + --input-bg-hover: #a8a8a8; + --meta-bg: #aaa8a8; + --divider-color: #b5b5b5; + --link-color: #335ad0; + } } a { @@ -76,4 +78,4 @@ details { .fw-nowrap { flex-wrap: nowrap; -} +} \ No newline at end of file diff --git a/src/middleware/noCache.go b/src/middleware/noCache.go deleted file mode 100644 index 0b5c8a5..0000000 --- a/src/middleware/noCache.go +++ /dev/null @@ -1,12 +0,0 @@ -package middleware - -import "github.com/gin-gonic/gin" - -func NoCacheMiddleware() gin.HandlerFunc { - return func(c *gin.Context) { - c.Header("Cache-Control", "no-cache, no-store, must-revalidate") - c.Header("Pragma", "no-cache") - c.Header("Expires", "0") - c.Next() - } -} diff --git a/src/middleware/options.go b/src/middleware/options.go index 95b9d94..a0fea14 100644 --- a/src/middleware/options.go +++ b/src/middleware/options.go @@ -7,7 +7,6 @@ import ( func OptionsMiddleware() gin.HandlerFunc { return func(c *gin.Context) { c.Set("disable_images", false) - c.Set("theme", "dark") imagesCookie, err := c.Cookie("disable_images") if err == nil { @@ -16,13 +15,6 @@ func OptionsMiddleware() gin.HandlerFunc { } } - themeCookie, err := c.Cookie("theme") - if err == nil { - if themeCookie == "light" { - c.Set("theme", "light") - } - } - c.Next() } } diff --git a/src/middleware/ratelimit.go b/src/middleware/ratelimit.go index bc0bf47..d83c901 100644 --- a/src/middleware/ratelimit.go +++ b/src/middleware/ratelimit.go @@ -47,7 +47,6 @@ func Ratelimit() gin.HandlerFunc { if val.(int) > 30 { c.HTML(429, "home.html", gin.H{ "errorMessage": "You have exceeded the request limit. Please try again in a minute.", - "theme": c.MustGet("theme").(string), "version": config.Version, }) c.Abort() diff --git a/src/routes/home.go b/src/routes/home.go index 5c546cd..a45b4f7 100644 --- a/src/routes/home.go +++ b/src/routes/home.go @@ -12,7 +12,6 @@ import ( func GetHome(c *gin.Context) { c.HTML(200, "home.html", gin.H{ "version": config.Version, - "theme": c.MustGet("theme").(string), }) } @@ -62,7 +61,6 @@ func PostHome(c *gin.Context) { if err := c.ShouldBind(&body); err != nil { c.HTML(400, "home.html", gin.H{ "errorMessage": "Invalid request body", - "theme": c.MustGet("theme").(string), }) return } @@ -72,7 +70,6 @@ func PostHome(c *gin.Context) { if translated == "" { c.HTML(400, "home.html", gin.H{ "errorMessage": "Invalid stack overflow/exchange URL", - "theme": c.MustGet("theme").(string), }) return } diff --git a/src/routes/options.go b/src/routes/options.go index a665be2..1bafa59 100644 --- a/src/routes/options.go +++ b/src/routes/options.go @@ -3,8 +3,6 @@ package routes import ( "anonymousoverflow/config" "fmt" - "os" - "strings" "github.com/gin-gonic/gin" ) @@ -21,26 +19,8 @@ func ChangeOptions(c *gin.Context) { c.SetCookie("disable_images", fmt.Sprintf("%t", !c.MustGet("disable_images").(bool)), 60*60*24*365*10, "/", "", false, true) c.HTML(200, "home.html", gin.H{ "successMessage": "Images are now " + text, - "theme": c.MustGet("theme").(string), "version": config.Version, }) - - case "theme": - text := "dark" - if c.MustGet("theme").(string) == "dark" { - text = "light" - } - - c.SetCookie("theme", text, 60*60*24*365*10, "/", "", false, true) - // get redirect url from query - redirectUrl := c.Query("redirect_url") - - if !strings.HasPrefix(redirectUrl, os.Getenv("APP_URL")) { - redirectUrl = os.Getenv("APP_URL") - } - - c.Redirect(302, redirectUrl) - default: c.String(400, "400 Bad Request") } diff --git a/src/routes/question.go b/src/routes/question.go index e184ba8..7d5f7bf 100644 --- a/src/routes/question.go +++ b/src/routes/question.go @@ -34,7 +34,6 @@ func ViewQuestion(c *gin.Context) { if _, err := strconv.Atoi(questionId); err != nil { c.HTML(400, "home.html", gin.H{ "errorMessage": "Invalid question ID", - "theme": c.MustGet("theme").(string), "version": config.Version, }) return @@ -60,7 +59,6 @@ func ViewQuestion(c *gin.Context) { if resp.StatusCode() != 200 { c.HTML(500, "home.html", gin.H{ "errorMessage": fmt.Sprintf("Received a non-OK status code %d", resp.StatusCode()), - "theme": c.MustGet("theme").(string), "version": config.Version, }) return @@ -74,7 +72,6 @@ func ViewQuestion(c *gin.Context) { if err != nil { c.HTML(500, "home.html", gin.H{ "errorMessage": "Unable to parse question data", - "theme": c.MustGet("theme").(string), "version": config.Version, }) return @@ -84,7 +81,6 @@ func ViewQuestion(c *gin.Context) { if err != nil { c.HTML(500, "home.html", gin.H{ "errorMessage": "Failed to extract question data", - "theme": c.MustGet("theme").(string), "version": config.Version, }) return @@ -94,7 +90,6 @@ func ViewQuestion(c *gin.Context) { if err != nil { c.HTML(500, "home.html", gin.H{ "errorMessage": "Failed to extract answer data", - "theme": c.MustGet("theme").(string), "version": config.Version, }) return @@ -110,7 +105,6 @@ func ViewQuestion(c *gin.Context) { "question": newFilteredQuestion, "answers": answers, "imagePolicy": imagePolicy, - "theme": c.MustGet("theme").(string), "currentUrl": fmt.Sprintf("%s%s", os.Getenv("APP_URL"), c.Request.URL.Path), "sortValue": params.SoSortValue, "domain": domain, @@ -132,7 +126,6 @@ func parseAndValidateParameters(c *gin.Context) (inputs viewQuestionInputs, err if _, err = strconv.Atoi(questionId); err != nil { c.HTML(400, "home.html", gin.H{ "errorMessage": "Invalid question ID", - "theme": c.MustGet("theme").(string), "version": config.Version, }) return diff --git a/src/routes/shortened.go b/src/routes/shortened.go index 07b5445..494b5bc 100644 --- a/src/routes/shortened.go +++ b/src/routes/shortened.go @@ -33,7 +33,6 @@ func RedirectShortenedOverflowURL(c *gin.Context) { if err != nil { c.HTML(400, "home.html", gin.H{ "errorMessage": "Unable to fetch stack overflow URL", - "theme": c.MustGet("theme").(string), }) return } @@ -41,7 +40,6 @@ func RedirectShortenedOverflowURL(c *gin.Context) { if resp.StatusCode() != 302 { c.HTML(400, "home.html", gin.H{ "errorMessage": fmt.Sprintf("Unexpected HTTP status from origin: %d", resp.StatusCode()), - "theme": c.MustGet("theme").(string), }) return } diff --git a/templates/home.html b/templates/home.html index 057e062..cb47709 100644 --- a/templates/home.html +++ b/templates/home.html @@ -1,5 +1,5 @@ - + AnonymousOverflow - Private frontend for StackOverflow @@ -43,10 +43,9 @@
- {{ template "themeSwitcher.html" .}}
diff --git a/templates/themeSwitcher.html b/templates/themeSwitcher.html deleted file mode 100644 index a34b512..0000000 --- a/templates/themeSwitcher.html +++ /dev/null @@ -1,6 +0,0 @@ - From 6a2ce509c16ef6cf3aa3b39a0c012e98700d3a1f Mon Sep 17 00:00:00 2001 From: Nuno Date: Wed, 3 Jul 2024 20:40:40 +0200 Subject: [PATCH 21/38] feat: add healthcheck (#141) * feat: add healtcheck app Signed-off-by: rare-magma * feat: add healthz endpoint Signed-off-by: rare-magma * ci: add healthcheck directive to dockerfile Signed-off-by: rare-magma --------- Signed-off-by: rare-magma --- Dockerfile | 5 ++- go.mod | 41 ++++++++++++++++----- go.sum | 67 ++++++++++++++++++++++++++++++++++ main.go | 7 ++++ src/healthcheck/healthcheck.go | 20 ++++++++++ 5 files changed, 129 insertions(+), 11 deletions(-) create mode 100644 src/healthcheck/healthcheck.go diff --git a/Dockerfile b/Dockerfile index df6bb71..dddfe66 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,15 +11,18 @@ COPY . . ENV CGO_ENABLED=0 -RUN go build -o anonymousoverflow +RUN go build -o anonymousoverflow && go build -o healthcheck ./src/healthcheck FROM scratch COPY --from=build /app/anonymousoverflow /anonymousoverflow +COPY --from=build /app/healthcheck /healthcheck COPY templates /templates COPY public /public COPY --from=build /etc/ssl/certs /etc/ssl/certs +HEALTHCHECK --interval=60s --timeout=5s --start-period=2s --retries=3 CMD [ "/healthcheck","http://localhost:8080/healthz" ] + EXPOSE 8080 CMD ["/anonymousoverflow"] \ No newline at end of file diff --git a/go.mod b/go.mod index fa77182..b5fb1e7 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/PuerkitoBio/goquery v1.9.1 github.com/alecthomas/chroma v0.10.0 - github.com/gin-gonic/gin v1.9.1 + github.com/gin-gonic/gin v1.10.0 github.com/go-resty/resty/v2 v2.12.0 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/joho/godotenv v1.5.1 @@ -13,34 +13,55 @@ require ( require ( github.com/andybalholm/cascadia v1.3.2 // indirect - github.com/bytedance/sonic v1.11.3 // indirect + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect + github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.1 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dlclark/regexp2 v1.11.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.19.0 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.3.1 // indirect + github.com/influxdata/influxdb-client-go/v2 v2.13.0 // indirect + github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.2.0 // indirect + github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/oapi-codegen/runtime v1.0.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/redis/go-redis/v9 v9.5.3 // indirect github.com/stretchr/testify v1.9.0 // indirect + github.com/tavsec/gin-healthcheck v1.6.2 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect - golang.org/x/arch v0.7.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.33.0 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + go.mongodb.org/mongo-driver v1.15.0 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 67eb02b..4ec3994 100644 --- a/go.sum +++ b/go.sum @@ -2,16 +2,26 @@ github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0g github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= github.com/PuerkitoBio/goquery v1.9.1 h1:mTL6XjbJTZdpfL+Gwl5U2h1l9yEkJjhmlTeV9VPW7UI= github.com/PuerkitoBio/goquery v1.9.1/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.11.3 h1:jRN+yEjakWh8aK5FzrciUHG8OFXK+4/KrAX/ysEtHAA= github.com/bytedance/sonic v1.11.3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= @@ -19,10 +29,16 @@ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpV github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0= github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= @@ -36,6 +52,8 @@ github.com/gin-gonic/gin v1.8.2 h1:UzKToD9/PoFj/V4rvlKqTRKnQYyz8Sc1MJlv4JHPtvY= github.com/gin-gonic/gin v1.8.2/go.mod h1:qw5AYuDrzRTnhvusDsrov+fDIxp9Dleuu12h8nfB398= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= @@ -51,6 +69,8 @@ github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJ github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-resty/resty/v2 v2.12.0 h1:rsVL8P90LFvkUYq/V5BTVe203WfRIU4gvcf+yfzJzGA= @@ -64,15 +84,26 @@ github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xGjpABD7j65pI8kFphDM= +github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -98,16 +129,25 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= +github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo= github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/redis/go-redis/v9 v9.5.3 h1:fOAp1/uJG+ZtcITgZOfYFmTKPE7n4Vclj1wZFgRciUU= +github.com/redis/go-redis/v9 v9.5.3/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -122,16 +162,30 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tavsec/gin-healthcheck v1.6.2 h1:F89IFXXtYOy3p4gne8WFkos3r7vjMbE+R3C/v70dTW0= +github.com/tavsec/gin-healthcheck v1.6.2/go.mod h1:VcZ4f44KqMnwbzRBrr7VYni2GmkMErd/44QuM5Dy/YI= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.8 h1:sgBJS6COt0b/P40VouWKdseidkDgHxYGm0SAglUHfP0= github.com/ugorji/go/codec v1.2.8/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= +go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -141,6 +195,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -158,9 +214,13 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -178,6 +238,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -189,11 +251,14 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -207,6 +272,8 @@ google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175 google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/main.go b/main.go index 3730e9d..c580c48 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,9 @@ import ( "os" "github.com/gin-gonic/gin" + healthcheck "github.com/tavsec/gin-healthcheck" + "github.com/tavsec/gin-healthcheck/checks" + "github.com/tavsec/gin-healthcheck/config" ) func main() { @@ -83,5 +86,9 @@ func main() { r.GET("/proxy", routes.GetImage) + soPingCheck := checks.NewPingCheck("https://stackoverflow.com", "GET", 5000, nil, nil) + sePingCheck := checks.NewPingCheck("https://stackexchange.com", "GET", 5000, nil, nil) + healthcheck.New(r, config.DefaultConfig(), []checks.Check{soPingCheck, sePingCheck}) + r.Run(fmt.Sprintf("%s:%s", host, port)) } diff --git a/src/healthcheck/healthcheck.go b/src/healthcheck/healthcheck.go new file mode 100644 index 0000000..24b2318 --- /dev/null +++ b/src/healthcheck/healthcheck.go @@ -0,0 +1,20 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "os" +) + +func main() { + if len(os.Args) < 2 { + log.Fatal("Expected URL as command-line argument") + os.Exit(1) + } + url := os.Args[1] + fmt.Println(url) + if _, err := http.Get(url); err != nil { + os.Exit(1) + } +} From e35ffdcc072480437a2d784eb4c1ac4b8a2dddec Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:46:55 -0700 Subject: [PATCH 22/38] Instance domain change (#144) --- instances.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instances.json b/instances.json index b277810..f77e42b 100644 --- a/instances.json +++ b/instances.json @@ -71,9 +71,9 @@ "operators": ["https://freedit.eu"] }, { - "url": "https://ao.ftw.lol", + "url": "https://ao.rootdo.com", "regions": ["Germany"], - "operators": ["https://ftw.lol"] + "operators": ["https://rootdo.com"] }, { "url": "https://anonoverflow.nirn.quest", From 4c971f312174a3a5b38baff15d2c19b1356006cf Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Thu, 25 Jul 2024 10:50:06 -0700 Subject: [PATCH 23/38] Add theme support using environment variable (#145) * Add theme support using environment variable * Propagate theme variable to template in options.go Propagate the `theme` variable from the environment to the template in `src/routes/options.go` * Retrieve the `theme` variable from the environment using `os.Getenv("THEME")` * Set the `theme` variable in the `gin.H` map when rendering the `home.html` template --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/httpjamesm/AnonymousOverflow/pull/145?shareId=6397c9b4-9450-425c-bbbe-019425965d2b). * Move all theme environment variable logic to a utils function Move theme environment variable logic to a utils function and update routes to use it. * Add `GetThemeFromEnv` function in `src/utils/theme.go` to derive the theme from environment variables and default to "auto" if not set. * Update `src/routes/home.go` to import and use `GetThemeFromEnv` in the `GetHome` function. * Update `src/routes/options.go` to import and use `GetThemeFromEnv` in the `ChangeOptions` function. * Update `src/routes/question.go` to import and use `GetThemeFromEnv` in the `ViewQuestion` function. --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/httpjamesm/AnonymousOverflow/pull/145?shareId=a0dab6f3-027c-4f6e-85fe-60e7675d0e70). * fix: imports removed by copilot * fix: override theme in posthome * style: reduced repetition in themes with common vars --- public/globals.css | 23 ++++++++++++++++++----- src/routes/home.go | 5 +++++ src/routes/options.go | 3 +++ src/routes/question.go | 3 +++ src/utils/theme.go | 11 +++++++++++ templates/home.html | 4 ++-- templates/question.html | 4 ++-- 7 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 src/utils/theme.go diff --git a/public/globals.css b/public/globals.css index 8470cd0..4912ddd 100644 --- a/public/globals.css +++ b/public/globals.css @@ -1,9 +1,13 @@ :root { + --code-bg: #36383d; + --code-fg: #ffffff; +} + +:root, +[data-theme="dark"] { --main-bg: #1b1f26; --text-color: #fff; --muted-text-color: #b3b3b3; - --code-bg: #36383d; - --code-fg: #ffffff; --input-bg: #2b303b; --input-bg-hover: #3b404b; --meta-bg: #525262; @@ -12,12 +16,10 @@ } @media (prefers-color-scheme: light) { - :root { + :root:not([data-theme="dark"]) { --main-bg: #dbdbdb; --text-color: #000; --muted-text-color: #636363; - --code-bg: #36383d; - --code-fg: #ffffff; --input-bg: #bcbcbc; --input-bg-hover: #a8a8a8; --meta-bg: #aaa8a8; @@ -26,6 +28,17 @@ } } +[data-theme="light"] { + --main-bg: #dbdbdb; + --text-color: #000; + --muted-text-color: #636363; + --input-bg: #bcbcbc; + --input-bg-hover: #a8a8a8; + --meta-bg: #aaa8a8; + --divider-color: #b5b5b5; + --link-color: #335ad0; +} + a { color: var(--link-color); } diff --git a/src/routes/home.go b/src/routes/home.go index a45b4f7..78202e1 100644 --- a/src/routes/home.go +++ b/src/routes/home.go @@ -2,6 +2,7 @@ package routes import ( "anonymousoverflow/config" + "anonymousoverflow/src/utils" "fmt" "regexp" "strings" @@ -10,8 +11,10 @@ import ( ) func GetHome(c *gin.Context) { + theme := utils.GetThemeFromEnv() c.HTML(200, "home.html", gin.H{ "version": config.Version, + "theme": theme, }) } @@ -68,8 +71,10 @@ func PostHome(c *gin.Context) { translated := translateUrl(body.URL) if translated == "" { + theme := utils.GetThemeFromEnv() c.HTML(400, "home.html", gin.H{ "errorMessage": "Invalid stack overflow/exchange URL", + "theme": theme, }) return } diff --git a/src/routes/options.go b/src/routes/options.go index 1bafa59..c0c8718 100644 --- a/src/routes/options.go +++ b/src/routes/options.go @@ -2,6 +2,7 @@ package routes import ( "anonymousoverflow/config" + "anonymousoverflow/src/utils" "fmt" "github.com/gin-gonic/gin" @@ -17,9 +18,11 @@ func ChangeOptions(c *gin.Context) { text = "enabled" } c.SetCookie("disable_images", fmt.Sprintf("%t", !c.MustGet("disable_images").(bool)), 60*60*24*365*10, "/", "", false, true) + theme := utils.GetThemeFromEnv() c.HTML(200, "home.html", gin.H{ "successMessage": "Images are now " + text, "version": config.Version, + "theme": theme, }) default: c.String(400, "400 Bad Request") diff --git a/src/routes/question.go b/src/routes/question.go index 7d5f7bf..3b6274b 100644 --- a/src/routes/question.go +++ b/src/routes/question.go @@ -101,6 +101,8 @@ func ViewQuestion(c *gin.Context) { imagePolicy = "'self'" } + theme := utils.GetThemeFromEnv() + c.HTML(200, "question.html", gin.H{ "question": newFilteredQuestion, "answers": answers, @@ -108,6 +110,7 @@ func ViewQuestion(c *gin.Context) { "currentUrl": fmt.Sprintf("%s%s", os.Getenv("APP_URL"), c.Request.URL.Path), "sortValue": params.SoSortValue, "domain": domain, + "theme": theme, }) } diff --git a/src/utils/theme.go b/src/utils/theme.go new file mode 100644 index 0000000..b78d9c4 --- /dev/null +++ b/src/utils/theme.go @@ -0,0 +1,11 @@ +package utils + +import "os" + +func GetThemeFromEnv() string { + theme := os.Getenv("THEME") + if theme == "" { + theme = "auto" + } + return theme +} diff --git a/templates/home.html b/templates/home.html index cb47709..48bae31 100644 --- a/templates/home.html +++ b/templates/home.html @@ -1,5 +1,5 @@ - + AnonymousOverflow - Private frontend for StackOverflow @@ -58,4 +58,4 @@
- \ No newline at end of file + diff --git a/templates/question.html b/templates/question.html index a0b41f0..6cff3aa 100644 --- a/templates/question.html +++ b/templates/question.html @@ -1,5 +1,5 @@ - + {{ .question.Title }} | AnonymousOverflow @@ -92,4 +92,4 @@ {{ end }} - \ No newline at end of file + From 1a7635ccef08d311e8a7bff83365d1a2931ad17f Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Thu, 25 Jul 2024 10:51:05 -0700 Subject: [PATCH 24/38] Add version endpoint (#146) --- main.go | 2 ++ src/routes/version.go | 10 ++++++++++ 2 files changed, 12 insertions(+) create mode 100644 src/routes/version.go diff --git a/main.go b/main.go index c580c48..c9cc96c 100644 --- a/main.go +++ b/main.go @@ -86,6 +86,8 @@ func main() { r.GET("/proxy", routes.GetImage) + r.GET("/version", routes.GetVersion) + soPingCheck := checks.NewPingCheck("https://stackoverflow.com", "GET", 5000, nil, nil) sePingCheck := checks.NewPingCheck("https://stackexchange.com", "GET", 5000, nil, nil) healthcheck.New(r, config.DefaultConfig(), []checks.Check{soPingCheck, sePingCheck}) diff --git a/src/routes/version.go b/src/routes/version.go new file mode 100644 index 0000000..d7dc5c5 --- /dev/null +++ b/src/routes/version.go @@ -0,0 +1,10 @@ +package routes + +import ( + "anonymousoverflow/config" + "github.com/gin-gonic/gin" +) + +func GetVersion(c *gin.Context) { + c.String(200, config.Version) +} From 4ce99662f3f9ab0015b5dcf6b79bf8d99766cecd Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Thu, 25 Jul 2024 12:56:46 -0700 Subject: [PATCH 25/38] Update README link to Proxy_Redirect (#147) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7296b33..be2437d 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ StackOverflow has a cluttered UI that might distract you from the content you're The open-source [Libredirect](https://github.com/libredirect/libredirect) extension for Firefox and Chromium-based desktop browsers has support for redirections to AnonymousOverflow. To enable this, simply open the extension settings, click on Stack Overflow, then toggle "Enable". That's it, now Stack Overflow links will go to AnonymousOverflow. -The open-source [FREEdirector](https://openuserjs.org/scripts/sjehuda/FREEdirector) user.js script for web browsers with userscript support. You can install it with a web extension like [Greasemonkey](https://greasespot.net/), [Tampermonkey](https://tampermonkey.net/) or [Violentmonkey](https://violentmonkey.github.io/). Once installed, Stack Overflow links will go to AnonymousOverflow. +The open-source [Proxy_Redirect](https://openuserjs.org/scripts/sjehuda/Proxy_Redirect) user.js script for web browsers with userscript support. You can install it with a web extension like [Greasemonkey](https://greasespot.net/), [Tampermonkey](https://tampermonkey.net/) or [Violentmonkey](https://violentmonkey.github.io/). Once installed, Stack Overflow links will go to AnonymousOverflow. ## How it works From 455b9c1ec6da09cf6b7dce31fd8d379e3ec178dc Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Thu, 25 Jul 2024 13:00:47 -0700 Subject: [PATCH 26/38] Instance operator change - soflow.nerdvpn.de (#148) --- instances.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instances.json b/instances.json index f77e42b..91f5ce2 100644 --- a/instances.json +++ b/instances.json @@ -123,7 +123,7 @@ { "url": "https://soflow.nerdvpn.de", "regions": ["Ukraine"], - "operators": ["https://github.com/Sommerwiesel"] + "operators": ["https://nerdvpn.de"] }, { "url": "https://overflow.einfachzocken.eu/", From 9babb62afc777b8d33268cf00afadcf7e4585f7a Mon Sep 17 00:00:00 2001 From: Aleksandr <44833369+flexxxxer@users.noreply.github.com> Date: Thu, 22 Aug 2024 00:55:14 +0000 Subject: [PATCH 27/38] add support for arm64 docker builds using Buildx+QEMU (#152) Co-authored-by: flexxxxer --- .github/workflows/docker-image.yml | 13 +++++++++---- Dockerfile | 7 +++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 5b0d110..c7d3ceb 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -22,9 +22,13 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here. - name: Log in to the Container registry - uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -32,16 +36,17 @@ jobs: # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels. - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages. # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository. # It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step. - name: Build and push Docker image - uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4 + uses: docker/build-push-action@v6 with: context: . push: true + platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index dddfe66..59c477b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.22.1-alpine3.19 as build +FROM golang:1.22.1-alpine3.19 AS build WORKDIR /app @@ -9,7 +9,10 @@ RUN go mod download COPY . . -ENV CGO_ENABLED=0 +# Architecture and OS are set dynamically (by BuildKit) +ARG TARGETOS +ARG TARGETARCH +ENV CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH RUN go build -o anonymousoverflow && go build -o healthcheck ./src/healthcheck From 57ba13ce8a58d9c51115b1e3aa39512080189ca2 Mon Sep 17 00:00:00 2001 From: SudoVanilla <51213244+SudoVanilla@users.noreply.github.com> Date: Sat, 24 Aug 2024 14:41:48 -0400 Subject: [PATCH 28/38] Update SudoVanilla URL (#154) --- instances.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instances.json b/instances.json index 91f5ce2..babc29f 100644 --- a/instances.json +++ b/instances.json @@ -81,9 +81,9 @@ "operators": ["https://nirn.quest", "https://hyperreal.coffee"] }, { - "url": "https://overflow.sudovanilla.com", + "url": "https://o.sudovanilla.org", "regions": ["United States"], - "operators": ["https://sudovanilla.com"] + "operators": ["https://sudovanilla.org"] }, { "url": "https://anonymousoverflow.privacyfucking.rocks/", From 4d49513aa15bacc9f54be77b2e3728fa0b2d633b Mon Sep 17 00:00:00 2001 From: Gitro <108683123+GitGitro@users.noreply.github.com> Date: Wed, 9 Oct 2024 08:09:36 +0000 Subject: [PATCH 29/38] docs: new instance (#158) --- instances.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/instances.json b/instances.json index babc29f..3840e3a 100644 --- a/instances.json +++ b/instances.json @@ -149,6 +149,11 @@ "url": "https://anonflow.aketawi.space/", "regions": ["Russia"], "operators": ["https://www.aketawi.space/"] + }, + { + "url": "https://anonymousoverflow.gitro.xyz", + "regions": ["Germany"], + "operators": ["https://gitro.xyz"] } ], From 6e0d2d8a64aa7a1d79a1c4c1eda13c7113481694 Mon Sep 17 00:00:00 2001 From: vlnst <77411099+Ftonans@users.noreply.github.com> Date: Wed, 9 Oct 2024 11:09:52 +0300 Subject: [PATCH 30/38] Update instances.json (#157) Update bloat.cat instance location --- instances.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instances.json b/instances.json index 3840e3a..2c77f71 100644 --- a/instances.json +++ b/instances.json @@ -47,7 +47,7 @@ }, { "url": "https://ao.bloat.cat", - "regions": ["Romania"], + "regions": ["Germany"], "operators": ["https://bloat.cat"] }, { From 137a553596ebde0d48d407dadf2f2aae7ebcd3e9 Mon Sep 17 00:00:00 2001 From: Jeffrey Serio <23226432+hyperreal64@users.noreply.github.com> Date: Wed, 9 Oct 2024 03:10:15 -0500 Subject: [PATCH 31/38] anonoverflow.nirn.quest --> anonoverflow.hyperreal.coffee (#156) --- instances.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instances.json b/instances.json index 2c77f71..28b846d 100644 --- a/instances.json +++ b/instances.json @@ -76,9 +76,9 @@ "operators": ["https://rootdo.com"] }, { - "url": "https://anonoverflow.nirn.quest", - "regions": ["Canada"], - "operators": ["https://nirn.quest", "https://hyperreal.coffee"] + "url": "https://anonoverflow.hyperreal.coffee", + "regions": ["United States"], + "operators": ["https://hyperreal.coffee"] }, { "url": "https://o.sudovanilla.org", From 9e94534530cdd216e20eab86da12539eab03890e Mon Sep 17 00:00:00 2001 From: Emppu <83163481+emppu-dev@users.noreply.github.com> Date: Mon, 21 Oct 2024 07:38:41 +0000 Subject: [PATCH 32/38] Add ao.bunk.lol (#163) --- instances.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/instances.json b/instances.json index 28b846d..af25465 100644 --- a/instances.json +++ b/instances.json @@ -154,6 +154,11 @@ "url": "https://anonymousoverflow.gitro.xyz", "regions": ["Germany"], "operators": ["https://gitro.xyz"] + }, + { + "url": "https://ao.bunk.lol", + "regions": ["Iceland"], + "operators": ["https://bunk.lol"] } ], From 4e14f432f5cf4387712c30a6984df572cc38c513 Mon Sep 17 00:00:00 2001 From: Nebula <109485589+privacytime101@users.noreply.github.com> Date: Mon, 21 Oct 2024 01:18:05 -0700 Subject: [PATCH 33/38] Update whatever.social, add iii.st (#165) * Update whatever.social, add iii.st * Update instances.json --- instances.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/instances.json b/instances.json index af25465..46077c9 100644 --- a/instances.json +++ b/instances.json @@ -2,7 +2,7 @@ "clearnet": [ { "url": "https://code.whatever.social", - "regions": ["Germany"], + "regions": ["Canada", "United States"], "operators": ["https://whatever.social", "https://httpjames.space"] }, { @@ -159,6 +159,11 @@ "url": "https://ao.bunk.lol", "regions": ["Iceland"], "operators": ["https://bunk.lol"] + }, + { + "url": "https://o.iii.st/", + "regions": ["Germany"], + "operators": ["https://iii.st/"] } ], @@ -199,6 +204,11 @@ "operators": [ "http://darknessrdor43qkl2ngwitj72zdavfz2cead4t5ed72bybgauww5lyd.onion/" ] + }, + { + "url": "http://o.zx56doutynmbgezxtpccduajwcblzx7fgio2yuy57a3jingco2c6fvqd.onion/", + "regions": ["Germany"], + "operators": ["https://iii.st/"] } ], From 4160cec21d588df08e031cc01f1f9d24cd62d7f2 Mon Sep 17 00:00:00 2001 From: Nebula <109485589+privacytime101@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:51:13 -0700 Subject: [PATCH 34/38] Add canine.tools (#166) * Update whatever.social, add iii.st * Update instances.json * Add canine.tools --- instances.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/instances.json b/instances.json index 46077c9..99532fc 100644 --- a/instances.json +++ b/instances.json @@ -164,6 +164,11 @@ "url": "https://o.iii.st/", "regions": ["Germany"], "operators": ["https://iii.st/"] + }, + { + "url": "https://overflow.canine.tools/", + "regions": ["United States"], + "operators": ["https://canine.tools/"] } ], From 0eda3031e0556baf1394bd0d0831fb838d9d9931 Mon Sep 17 00:00:00 2001 From: Leo Heitmann Ruiz Date: Mon, 28 Oct 2024 23:47:31 +0100 Subject: [PATCH 35/38] Add SVG logo (#149) * Add codecircles.svg * Regenerate codecircles.webp from codecircles.svg * Add SVG favicon * Use SVG logo instead of WebP --- public/codecircles.svg | 6 ++++++ public/codecircles.webp | Bin 9562 -> 5926 bytes templates/home.html | 3 ++- templates/question.html | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 public/codecircles.svg diff --git a/public/codecircles.svg b/public/codecircles.svg new file mode 100644 index 0000000..58fd99b --- /dev/null +++ b/public/codecircles.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/codecircles.webp b/public/codecircles.webp index 774456994591300bb2f9c2147476c7ebd2ec5fad..01f747cdc4c2396c02f7a9a556b7489a901bed28 100644 GIT binary patch literal 5926 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 + {{ template "sharedHead.html" }} @@ -14,7 +15,7 @@
- +

Anonymous­Overflow

Get programming help without compromising your privacy.

diff --git a/templates/question.html b/templates/question.html index 6cff3aa..54e8893 100644 --- a/templates/question.html +++ b/templates/question.html @@ -23,7 +23,7 @@
From 6f984fe7fd1c5d5cc4f11844ff707927bb248c0e Mon Sep 17 00:00:00 2001 From: vlnst Date: Fri, 15 Nov 2024 11:08:31 +0300 Subject: [PATCH 36/38] Add "word-wrap: break-word" for links (#159) Co-authored-by: Ftonans <77411099+Ftonans@users.noreply.github.com> --- public/globals.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/globals.css b/public/globals.css index 4912ddd..1592648 100644 --- a/public/globals.css +++ b/public/globals.css @@ -41,6 +41,7 @@ a { color: var(--link-color); + word-wrap: break-word; } html { @@ -91,4 +92,4 @@ details { .fw-nowrap { flex-wrap: nowrap; -} \ No newline at end of file +} From 61edc78787306fb6bcf7ac39314c4ca8421d7ca9 Mon Sep 17 00:00:00 2001 From: Gitro <108683123+GitGitro@users.noreply.github.com> Date: Fri, 14 Mar 2025 19:06:23 +0000 Subject: [PATCH 37/38] Remove instance (#170) --- instances.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/instances.json b/instances.json index 99532fc..a4e9c3c 100644 --- a/instances.json +++ b/instances.json @@ -150,11 +150,6 @@ "regions": ["Russia"], "operators": ["https://www.aketawi.space/"] }, - { - "url": "https://anonymousoverflow.gitro.xyz", - "regions": ["Germany"], - "operators": ["https://gitro.xyz"] - }, { "url": "https://ao.bunk.lol", "regions": ["Iceland"], From f13ed3387321931cea434fa3c4b7f83420a29ece Mon Sep 17 00:00:00 2001 From: Jeffrey Serio <23226432+hyperreal64@users.noreply.github.com> Date: Wed, 26 Mar 2025 01:39:47 -0500 Subject: [PATCH 38/38] Update anonoverflow.hyperreal.coffee location (#172) --- instances.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instances.json b/instances.json index a4e9c3c..5d15b83 100644 --- a/instances.json +++ b/instances.json @@ -77,7 +77,7 @@ }, { "url": "https://anonoverflow.hyperreal.coffee", - "regions": ["United States"], + "regions": ["Germany"], "operators": ["https://hyperreal.coffee"] }, {