From 0d7355bd4660544f51f5ca7b9a06969037edd4ba Mon Sep 17 00:00:00 2001 From: Nebula <109485589+privacytime101@users.noreply.github.com> Date: Sun, 17 Mar 2024 23:34:09 -0700 Subject: [PATCH 01/53] Update whatever.social locations (#94) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index de92739..a6b13d0 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ This project is super lightweight by design. The UI is simple and the frontend i | Instance URL | Region | Notes | | ----------------------------------------------------------------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------ | -| [code.whatever.social](https://code.whatever.social) | United States & The Netherlands | Operated by [Whatever Social](https://whatever.social) and [http.james](https://httpjames.space) | +| [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/) | From 89126a73779407aa9228857826275a0bd6ed3dfd Mon Sep 17 00:00:00 2001 From: Solomon Date: Mon, 25 Mar 2024 16:47:59 +0000 Subject: [PATCH 02/53] fix: keep HTML escaped (#96) --- src/routes/question.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/question.go b/src/routes/question.go index 25293ad..5a70c7f 100644 --- a/src/routes/question.go +++ b/src/routes/question.go @@ -246,7 +246,7 @@ func extractAnswersData(doc *goquery.Document, domain string) ([]types.FilteredA // Process code blocks within the answer. processedAnswerBody := utils.ProcessHTMLBody(answerBodyHTML) - answer.Body = template.HTML(html.UnescapeString(processedAnswerBody)) + answer.Body = template.HTML(processedAnswerBody) // Extract author information and timestamp. extractAnswerAuthorInfo(s, &answer, domain) From 94032f4f9033ee052b68d1a9f87ce97210b4fda4 Mon Sep 17 00:00:00 2001 From: Matt Fellenz Date: Mon, 25 Mar 2024 10:05:24 -0700 Subject: [PATCH 03/53] Implement external exchanges (#99) * Implement external exchanges * test: translateUrl test cases * fix: double slash bug in translateUrl --------- Co-authored-by: httpjamesm --- src/routes/home.go | 58 +++++++++++++++++++++++++++-------------- src/routes/home_test.go | 32 +++++++++++++++++++++++ src/routes/question.go | 4 ++- 3 files changed, 73 insertions(+), 21 deletions(-) create mode 100644 src/routes/home_test.go diff --git a/src/routes/home.go b/src/routes/home.go index 306d41c..5c546cd 100644 --- a/src/routes/home.go +++ b/src/routes/home.go @@ -20,7 +20,41 @@ type urlConversionRequest struct { URL string `form:"url" binding:"required"` } -var stackExchangeRegex = regexp.MustCompile(`https://(.+).stackexchange.com/questions/`) +var coreRegex = regexp.MustCompile(`(?:https?://)?(?:www\.)?([^/]+)(/(?:questions|q|a)/.+)`) + +// Will return `nil` if `rawUrl` is invalid. +func translateUrl(rawUrl string) string { + coreMatches := coreRegex.FindStringSubmatch(rawUrl) + if coreMatches == nil { + return "" + } + + domain := coreMatches[1] + rest := coreMatches[2] + + exchange := "" + if domain == "stackoverflow.com" { + // No exchange parameter needed. + } else if sub, found := strings.CutSuffix(domain, ".stackexchange.com"); found { + if sub == "" { + return "" + } else if strings.Contains(sub, ".") { + // Anything containing dots is interpreted as a full domain, so we use the correct full domain. + exchange = domain + } else { + exchange = sub + } + } else { + exchange = domain + } + + // Ensure we properly format the return string to avoid double slashes + if exchange == "" { + return rest + } else { + return fmt.Sprintf("/exchange/%s%s", exchange, rest) + } +} func PostHome(c *gin.Context) { body := urlConversionRequest{} @@ -33,16 +67,9 @@ func PostHome(c *gin.Context) { return } - soLink := body.URL + translated := translateUrl(body.URL) - // remove the www. - soLink = strings.ReplaceAll(soLink, "www.", "") - - // validate URL - isStackOverflow := strings.HasPrefix(soLink, "https://stackoverflow.com/questions/") - isShortenedStackOverflow := strings.HasPrefix(soLink, "https://stackoverflow.com/a/") || strings.HasPrefix(soLink, "https://stackoverflow.com/q/") - isStackExchange := stackExchangeRegex.MatchString(soLink) - if !isStackExchange && !isStackOverflow && !isShortenedStackOverflow { + if translated == "" { c.HTML(400, "home.html", gin.H{ "errorMessage": "Invalid stack overflow/exchange URL", "theme": c.MustGet("theme").(string), @@ -50,14 +77,5 @@ func PostHome(c *gin.Context) { return } - // if stack overflow, trim https://stackoverflow.com - if isStackOverflow || isShortenedStackOverflow { - c.Redirect(302, strings.TrimPrefix(soLink, "https://stackoverflow.com")) - return - } - - // if stack exchange, extract the subdomain - sub := stackExchangeRegex.FindStringSubmatch(soLink)[1] - - c.Redirect(302, fmt.Sprintf("/exchange/%s/%s", sub, strings.TrimPrefix(soLink, fmt.Sprintf("https://%s.stackexchange.com", sub)))) + c.Redirect(302, translated) } diff --git a/src/routes/home_test.go b/src/routes/home_test.go new file mode 100644 index 0000000..eda6d64 --- /dev/null +++ b/src/routes/home_test.go @@ -0,0 +1,32 @@ +package routes + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestTranslateUrl(t *testing.T) { + assert := assert.New(t) + + // Test with a Valid StackOverflow URL + assert.Equal("/questions/example-question", translateUrl("https://stackoverflow.com/questions/example-question"), "StackOverflow URL should not be modified") + + // Test with Complex Subdomain + assert.Equal("/exchange/meta.math.stackexchange.com/q/example-question", translateUrl("https://meta.math.stackexchange.com/q/example-question"), "Complex StackExchange subdomain should be used as full exchange") + + // Test with Non-StackExchange Domain + assert.Equal("/exchange/example.com/questions/example-question", translateUrl("https://example.com/questions/example-question"), "Non-StackExchange domain should be detected as exchange") + + // Test with Invalid URL + assert.Equal("", translateUrl("This is not a URL"), "Invalid URL should return an empty string") + + // Test with Empty String + assert.Equal("", translateUrl(""), "Empty string should return an empty string") + + // Test with Missing Path + assert.Equal("", translateUrl("https://stackoverflow.com"), "URL without path should return an empty string") + + // Test with Valid URL but Root Domain for StackExchange + assert.Equal("", translateUrl("https://stackexchange.com"), "Root StackExchange domain without subdomain should return an empty string") +} diff --git a/src/routes/question.go b/src/routes/question.go index 5a70c7f..f4f99f3 100644 --- a/src/routes/question.go +++ b/src/routes/question.go @@ -47,7 +47,9 @@ func ViewQuestion(c *gin.Context) { domain := "stackoverflow.com" - if params.Sub != "" { + if strings.Contains(params.Sub, ".") { + domain = params.Sub + } else if params.Sub != "" { domain = fmt.Sprintf("%s.stackexchange.com", params.Sub) } From 2ade374482a762a7f481ba7b5b6209e889b79e94 Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Mon, 25 Mar 2024 13:07:29 -0400 Subject: [PATCH 04/53] docs: #74 update bloatcat instance info --- README.md | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index a6b13d0..1c2f2b6 100644 --- a/README.md +++ b/README.md @@ -14,31 +14,31 @@ This project is super lightweight by design. The UI is simple and the frontend i ## Clearnet 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, France, 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.bloatcat.tk](https://ao.bloatcat.tk) | Iceland | Operated by [bloatcat.tk](https://bloatcat.tk) | -| [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) | -| [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) | -| [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) | +| 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, France, 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 [bloatcat.tk](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) | +| [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) | +| [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) | ## Other Instances From 1e659c550a5e9cdb5ea9ca75659447d339b8e4c7 Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Mon, 25 Mar 2024 13:08:39 -0400 Subject: [PATCH 05/53] docs: #75 update r4fo instance info + onion --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 1c2f2b6..3f56be7 100644 --- a/README.md +++ b/README.md @@ -42,14 +42,15 @@ This project is super lightweight by design. The UI is simple and the frontend i ## 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/) | Luxembourg | 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/) | +| 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/) | Luxembourg | 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) | ## Why use AnonymousOverflow over StackOverflow? From bf5300706e07c27271b747131113d7e7eaa9ef51 Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Mon, 25 Mar 2024 13:09:36 -0400 Subject: [PATCH 06/53] docs: #82 add snine --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3f56be7..885f8b1 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ This project is super lightweight by design. The UI is simple and the frontend i | [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) | ## Other Instances From 23b8ed8899cc79a51fc4fb78aa8332921f68aa91 Mon Sep 17 00:00:00 2001 From: Solomon Date: Thu, 28 Mar 2024 23:59:28 +0000 Subject: [PATCH 07/53] improvement: use lang-* classes declared in snippet markup (#97) * improvement: use lang-* classes declared in snippet markup * fix: don't require snippet lang classes in code blocks * fix: constrain greedy code block match --- src/utils/syntax.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/utils/syntax.go b/src/utils/syntax.go index 24c5d38..369f114 100644 --- a/src/utils/syntax.go +++ b/src/utils/syntax.go @@ -14,13 +14,15 @@ import ( // highlightSyntaxViaContent uses Chroma to lex code content and apply the appropriate tokenizer engine. // If it can't find one, it defaults to JavaScript syntax highlighting. -func highlightSyntaxViaContent(content string) (htmlOut string) { +func highlightSyntaxViaContent(content string, lang string) (htmlOut string) { content = html.UnescapeString(content) fallbackOut := html.EscapeString(content) - // identify the language - lexer := lexers.Analyse(content) + lexer := lexers.Get(lang) + if lexer == nil { + lexer = lexers.Analyse(content) + } if lexer == nil { lexer = lexers.Get(".js") } @@ -71,19 +73,20 @@ func stripBlockTags(content string) (result string) { return } -var codeBlockRegex = regexp.MustCompile(`(?s)
(.*?)<\/code><\/pre>`)
+var codeBlockRegex = regexp.MustCompile(`(?s)]+?lang-(.+?)[\s"'])?.*?>(.*?)<\/code><\/pre>`)
 
 // HighlightCodeBlocks uses both highlightSyntaxViaContent stripCodeBlocks and returns the newly highlighted code HTML.
 func HighlightCodeBlocks(html string) string {
 	// Replace each code block with the highlighted version
 	highlightedHTML := codeBlockRegex.ReplaceAllStringFunc(html, func(codeBlock string) string {
 		// Extract the code content from the code block
-		codeContent := codeBlockRegex.FindStringSubmatch(codeBlock)[1]
+		matches := codeBlockRegex.FindStringSubmatch(codeBlock)
+		lang, codeContent := matches[1], matches[2]
 
 		codeContent = stripBlockTags(codeContent)
 
 		// Highlight the code content
-		highlightedCode := highlightSyntaxViaContent(codeContent)
+		highlightedCode := highlightSyntaxViaContent(codeContent, lang)
 
 		// Replace the original code block with the highlighted version
 		highlightedCodeBlock := "
" + highlightedCode + "
" From a701810e115c05b185e592cbf48770fa5f0f1eb9 Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Thu, 28 Mar 2024 20:03:17 -0400 Subject: [PATCH 08/53] fix: set font-src to 'self' on questions (#101) --- templates/question.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/question.html b/templates/question.html index fa575e9..32f60a9 100644 --- a/templates/question.html +++ b/templates/question.html @@ -7,7 +7,7 @@ {{ template "sharedHead.html" }} From 4c3996542c89ae1a903aa1a76b8d6deaa63ef20b Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Thu, 28 Mar 2024 20:03:34 -0400 Subject: [PATCH 09/53] docs: version 1.12.0 --- config/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/version.go b/config/version.go index 8c30736..ab0dccc 100644 --- a/config/version.go +++ b/config/version.go @@ -1,3 +1,3 @@ package config -var Version = "1.11.0" +var Version = "1.12.0" From bca87a89ad5831e114f23824f24287aeece4dec0 Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Thu, 28 Mar 2024 20:11:38 -0400 Subject: [PATCH 10/53] docs: new readme screenshots --- README.md | 6 +++--- docs/screenshots/answers_light.webp | Bin 0 -> 51746 bytes docs/screenshots/home_dark.webp | Bin 0 -> 31762 bytes docs/screenshots/question_dark.webp | Bin 0 -> 60178 bytes 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 docs/screenshots/answers_light.webp create mode 100644 docs/screenshots/home_dark.webp create mode 100644 docs/screenshots/question_dark.webp diff --git a/README.md b/README.md index 885f8b1..299eded 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ This project is super lightweight by design. The UI is simple and the frontend i ## Screenshots -![Home](https://files.horizon.pics/e2b9275c-1409-4978-801b-de981a8d3ae9?a=1&mime1=image&mime2=png) +![Home](./docs/screenshots/home_dark.webp) -![Question](https://files.horizon.pics/0f6b0036-87f0-4acd-9a0f-936b5c397a73?a=1&mime1=image&mime2=png) +![Question](./docs/screenshots/question_dark.webp) -![Answer](https://files.horizon.pics/861ec510-644b-43f2-9439-0a2cae841422?a=1&mime1=image&mime2=png) +![Answer](./docs/screenshots/answers_light.webp) ## Clearnet Instances diff --git a/docs/screenshots/answers_light.webp b/docs/screenshots/answers_light.webp new file mode 100644 index 0000000000000000000000000000000000000000..b07efb48c892da0b72810261835b2b79298c595c GIT binary patch literal 51746 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 GqW}Ojo5t7x literal 0 HcmV?d00001 diff --git a/docs/screenshots/home_dark.webp b/docs/screenshots/home_dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..d07324e5586e9c349b441a77726aba09d7e86078 GIT binary patch literal 31762 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/question_dark.webp b/docs/screenshots/question_dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..fbe20f81ef84f9b1dcdf86d3ad9b1d8603cc4f69 GIT binary patch literal 60178 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�G(oBcA2*w+>CG@VzfM%Q~AInp6|rM{mb#RF5GFzh+N2m(jbHTH z&dI{rzc3#MHgm1|62W!QKOVr@Wq#V-z9o%z4g}4eO`qYopO#LfJsMJuesQovNbfw; zEK$sG3s~q4t_}yU1za&5Bg(47aM-mDcTkJBTqSwgNUBCHL3PM{!n{OurY7u#>gn;N z?S$XIKz#hzaP|K>bF5Tl^R-)NnY*^6T&i*w?THl=c}-(v4{kn}Vzk7KzQ()cA)ozl z_2>2M|B;%n(5A8*BlNt3V0x2%S%%>*=ve)m<#jCOy$*;AG;lGr!(s)o1VQ*G%QG^p zQ!NQ0X@$QHLaGOz$nVn%!Luhr5PR(r&Z3^+p9~E-1`HvYyu9XB3B5qSwQUXjFd8hx zqn1ChqMW2N3uy|FIHLrWwOknSf|&32rU7;;fyq*w{QqN==xc{xBF}l9B_mBGpbKlY zd87oM^_A*Iumvd2OW1r1M#T%* zkMLmIA0TTacpk3xIAC>59!DU#>`h}kbr8v)Tc6UHdS(?a2%~F(0?(jM!DKFcAOHX> Cu-=vc literal 0 HcmV?d00001 From 07d819a84965a3fd2262535f5516c336ee24139d Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Thu, 28 Mar 2024 20:17:22 -0400 Subject: [PATCH 11/53] fix: upgrade to 1.22.1-alpine3.19 (#103) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f70df7e..df6bb71 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19-alpine as build +FROM golang:1.22.1-alpine3.19 as build WORKDIR /app From 6d2830fcc21f5fb56128be578082b10ea11e9a00 Mon Sep 17 00:00:00 2001 From: Achraf RRAMI <51409801+rramiachraf@users.noreply.github.com> Date: Sat, 6 Apr 2024 04:45:06 +0000 Subject: [PATCH 12/53] Add redirect endpoint for shortened urls with answer id (#105) --- config/version.go | 2 +- main.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/config/version.go b/config/version.go index ab0dccc..45201be 100644 --- a/config/version.go +++ b/config/version.go @@ -1,3 +1,3 @@ package config -var Version = "1.12.0" +var Version = "1.12.1" diff --git a/main.go b/main.go index 49c87ee..625b161 100644 --- a/main.go +++ b/main.go @@ -51,6 +51,7 @@ func main() { r.POST("/", routes.PostHome) r.GET("/a/:id", routes.RedirectShortenedOverflowURL) + r.GET("/a/:id/:answerId", routes.RedirectShortenedOverflowURL) r.GET("/q/:id", routes.RedirectShortenedOverflowURL) r.GET("/q/:id/:answerId", routes.RedirectShortenedOverflowURL) From b4da9d56a58e4a9aae18aed6447d049e36384238 Mon Sep 17 00:00:00 2001 From: httpjamesm <51917118+httpjamesm@users.noreply.github.com> Date: Sat, 6 Apr 2024 11:46:39 -0400 Subject: [PATCH 13/53] chore: upgrade deps (#106) --- go.mod | 47 ++++++++++++++----------- go.sum | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 823e3de..fa77182 100644 --- a/go.mod +++ b/go.mod @@ -3,37 +3,44 @@ module anonymousoverflow go 1.19 require ( - github.com/PuerkitoBio/goquery v1.8.0 + github.com/PuerkitoBio/goquery v1.9.1 github.com/alecthomas/chroma v0.10.0 - github.com/gin-gonic/gin v1.8.2 - github.com/go-resty/resty/v2 v2.7.0 - github.com/golang-jwt/jwt/v4 v4.4.3 - github.com/joho/godotenv v1.4.0 + github.com/gin-gonic/gin v1.9.1 + 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 ) require ( - github.com/andybalholm/cascadia v1.3.1 // indirect + github.com/andybalholm/cascadia v1.3.2 // indirect + github.com/bytedance/sonic v1.11.3 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect + github.com/chenzhuoyu/iasm v0.9.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dlclark/regexp2 v1.7.0 // 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.0 // indirect - github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-playground/validator/v10 v10.11.1 // indirect - github.com/goccy/go-json v0.10.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/goccy/go-json v0.10.2 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/leodido/go-urn v1.2.1 // indirect - github.com/mattn/go-isatty v0.0.16 // 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.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/testify v1.9.0 // indirect - github.com/ugorji/go/codec v1.2.8 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - google.golang.org/protobuf v1.28.1 // 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 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 61fbcb1..67eb02b 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,24 @@ github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= 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/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/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/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= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= +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/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= @@ -11,32 +26,57 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs 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= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= 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/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= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= 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-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= +github.com/go-resty/resty/v2 v2.12.0/go.mod h1:o0yGPrkS3lOe1+eFajk6kBW8ScXzwU3hD69/gt2yB/0= github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +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/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/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/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= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= @@ -47,8 +87,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -56,6 +100,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 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/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= @@ -65,6 +111,7 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po 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= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -72,36 +119,95 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +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/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/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +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/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= golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +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/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= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +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/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/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= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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/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= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +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.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/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= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= 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= +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= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -113,3 +219,5 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= From 2a30a7d27022eb4c980dcb67d0dcb93e7bfc2c51 Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Sat, 6 Apr 2024 15:47:47 +0000 Subject: [PATCH 14/53] docs: update bloat.cat notes #74 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 299eded..ea3a817 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ This project is super lightweight by design. The UI is simple and the frontend i | [overflow.projectsegfau.lt](https://overflow.projectsegfau.lt/) | United States, France, 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 [bloatcat.tk](https://bloat.cat) | +| [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) | From be3535eef29ac161a39ae246be532a2011e156ef Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Sat, 6 Apr 2024 15:50:20 +0000 Subject: [PATCH 15/53] docs: add instances #98 #100 --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ea3a817..73c1add 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ This project is super lightweight by design. The UI is simple and the frontend i | [overflow.projectsegfau.lt](https://overflow.projectsegfau.lt/) | United States, France, 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) | +| [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) | @@ -40,6 +40,8 @@ This project is super lightweight by design. The UI is simple and the frontend i | [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 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 16/53] 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 17/53] 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 18/53] 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 19/53] 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 20/53] 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 21/53] 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 22/53] 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 23/53] 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 24/53] 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 25/53] 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 26/53] 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 27/53] 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 28/53] 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 29/53] 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 30/53] 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 31/53] 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 32/53] 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 33/53] 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 34/53] 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 35/53] 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 36/53] 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 37/53] 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 38/53] 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 39/53] 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 40/53] 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 41/53] 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 42/53] 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 43/53] 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 44/53] 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 45/53] 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 46/53] 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 47/53] 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 48/53] 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 49/53] 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 50/53] 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 zcmZ`-bySpJv>iYsrKLp}O1eZ+2I*#yW+-Xt2I-bYkdW>katNinOOzbC8zhEu;Elhx z*8A`M@vU{wKIiVU*FN7}>$~53ML9V-3IIS?Rtl^G7S_WB002a&XCDo)iUxS60#=ZJ z1^}SZVt%CItqNQh!v&h5M~?T5iJi1zP#qFJf;8j*KKeGbnxBlu&d%!n7(j&C!B^<8 zc$lfGys*|s&EY>eNL6d)vhX)fst+?xB+4o@C+BW?fJ}TzMG8r`bZ)fQzY%}gmS;Wf z<4;C(9pFt4a8HV_O};k$O(O1aD|>i#bR5qrk_N#E%&LuJQY2_en>-p5(j#gJ!h8Z3o+|}Qj?RWQFapb6{duq~yl_KxgjV_B=1!5)}iE$gVxkmiV z-jmVYuaEf18z4Gzv9AJ_GE;n7pC=%B$&&V#R^=(*7-qm;QKRCEi%a!G9Kufr5{ma! zboU?n+~*Eim%>VI`AN9Ek3Nr@JZI})4(n}+P73`qPlyw*pIJlVc(|HF9y=J&V{LMI zEz$F-y&uos`-s(b&bonA^*6HH0TmogcCJb{XzrT_qXOf)L!ZcjgW;Hdb5LE29W2I% z_ZlH1jv!^(gnpHQrIe)qnO6@ROL$GHI(L~zm4FPp79kfT8o!<~XF*j_^+F$s8MHF3 zddxu|(v4-qG`6)+@YkDTnODc1I0?u;Msf2m*d_Ud1!wc>ypI4CJ7)BXi%$Y{_c(nH zyODVnZ8Ql;neKI3V2`aZD-nv{ROKzPf$CRO`F)SXAENHgv z6Npz!B$1n?9;ycR;GBdFb93=ND%D6ZWJW)B6{WlXn20n7&c6{u<=q0@;<200L2Grn z11dJm=+)-@sC?AA2L-V!cPViKvcYYkF$}vET?_@wZ1Dll)Z{noa#{KenWSpi&`^2j z<;FPdj)^+&qrvuK44IoNo<4KX#M=WF>@6S41mt%_^5?uSyO`pL&G|zauS<#MESb;A z-Q}G`M$@_98#4Bib)5Gc3LrkAVv{5MFGMrrSP@&dS`&FvJt#w+h%$REkuq=;~T&l@YoUb@OVuB)ujZP%CE@t(XAS zBB=+8t1EiC-#_-*3P|&?=-N?t@xv5_C`G}F+;6P#5pS~4t&C)&K#ZHIQW%Ar@R`+pn95g z@KE;Z$*W(yipttnVddr{1Om*qLhL^kwVRUQj8)n*j+(CJ*^NKWJDj!Y54#+yeK5Ag zb8EShFB+jFR9H@FGc-(9{2w9g4rNt-`=rr!4jvgyxse<$t?K8uP97q~DpMYEJ$1}R zCx?G$n4A9>d-Z&9cu4cf~w~8Nu6qILn)gbbEMML z>P#%)+S@+CqAQ~8Gq(U!%@S!98>QKRt`S<_vj}r!??Zh$U<1Vy9p!Gb_1*e&Z>-y8 zt+_u=^AvRgk@C~J_C+;4N~`*b9gw?LSbJ#pwwGHfe175nRM@wqXW{*Rb|8h+>CRh# z&*y;O9QQb8_!mqs{QbS4IwLyLZ6!wr}EA$G2n}_hpXa+F6}e4JG`h#^+4h^9I1YJ8+3b5cW1d1)IhiE_!c)O2 znZ5^P$08H0!oFKGh<*Pjyc7sNvQ@w4pkRFc0`qy!)N4pwkD>CFoM1s>u@<=i;T;m3tyxY6R`l#p;{Dc1XXp&$#5apc^*ky;{UFaWo8Q*v5lEdAV ze;XpENowvsQI@gA&bSRIs2jG8PMjS}!pJ>!0NVFsd97Ynr5uiI-QzTL7!8NVRv2Kf zAt}LehRgnEvJHW>Xq>k8J8w-3{KCGGvb@>2j5CFZ1`jr<#+SP=-SP!Fb{ zxMJaQHKoy-V29?@2!rkfjM?_xEoRed`@AHsrwFrCP~w|Sc+ltgZ|d$KX4;!t@Q~0? z!+9@n5|5>c;QIV1t>EDHgs8&vAtEI(%=U=@{^sx(JN13LjEv$EttLI>~*T2P{ zoi6a^(+}!Nh1;?xhi&0;JBqWeERLKRE(zvqQ~go1y7`w^%1v)HyzGYKtVt~I$5p>m z)4DgRwdiPi40DV1dQG+I2r&E+bt>2$-#T=$C8)gqMJ}hj`{ZacIjdQD3XJ{&#QXtX z{vAY|sj_K!%OtBUca@_!uv6JteDnXGeel(=IRbnlC5RQ@#F2Zf%fqm=CnoqOpa4L zUCerdrJV{P@WcfUTuQ`bls(bq%u~Pp-8B2xrsC;{#gR0L{O_|mrHUh}QE>nF8T+nE z>3N5-Vdly$OLMoCiYrNfpPgL=cP?~PAZhi_x1-Lk6wrlwPa}GJW^bsukIEAKoA3@{ zK1Qj1%eX`u=A8YNRdp&gCUM6I1Iwd(yLhFo0{Rp18@de-%Y=6gI!#Z_BJ2Gk>qgY1 ze{Vi-ShZRqY zJ#vSwjQavE36N#F2+}^v9YxW*yA!>t4T^4U&xc-e&ZT6C2@R8@HvCR5tmaVS*OHp(o%gWC-1K2?h0 zv3MR5Yi%)}274seO?%;L7I{=-`F7tnzODUGk7sUvOBPF8Kdq1DAJ`$y3DI_G`xPgxFe=K2M?g9pn3)89gq5_tGhEW9&u9)6M-z zL+oPJt|KU*0+IgC>vT*_cjqOS)4Y=};kFsldoeW8Hjl#SdcWt#e7j_BvH4h4?ECg z(g!`k2@mrXp^hLLyf$~Inw6hI=rE>JpPa4lL@(0Zs_inya_ddGDJ%f`f_!Z{tp3M__b5n(X9yTJRuYbA9 zbtJzw9J~vxe|fq*$L{l@kZ2*{@j;K(GtMRQs5BfHAGtLAN(S*ut_eN(C9)1!pR2%k`Df;cE} z;WPp7(khS-MLRQALx^*}Iz&Z|Vs^e3jGme+BwkR5hX>HNVWq#Nkw(#7#E~y~91cW9 z9T9rdk|rYi68WlR6%uGcPEr=2e6lTCqPYAlundA!&86S0 z?okf4djEA4^L$Sl2)vJC?}fVZl^I(|T7ZHr4YhcJXuw73s4mXw(=-iL5;I{#0qA4G zcAXKA5~>0W^|`NF-C!&xLcQ(&Ou&1b#&1iGRr?dSjHtB`yZ~w7qgQcRCy8p|_J^u! zaq6m@3nlXm>V{W+elpS|qJzr#BT(PqXO)4z21LO7b@0^mUjlCRStkfdM$Q5h7Oixbx7gc1ITEfq3M5`2tP3H{zQ6w_q4e(pK$3_g8gqrX?wp+N z-#hBcomZiJlWvT}NvL8IUY6=rFTI!(7nMLyM4nB!Y;F}JroTovY`f&xatGQC<7 z9BaqFe(5m-0en6fwP-D92sGc=$UqLr>FD{ShlTSR*Op0}+bB}#uI>!&uKO3q7}kl< z5muXg{>!6>f_7j>&`X#^cE?cXV&I=`NrdKH2LVKUT`b{dfJ%n~O&cJ^fj)fpJ@7zG zOl&jwBQ_N8)k}jWIU%EjoU{_n(Q~x%mKl)IZXD^C=&t(UtL$*K*hU_Um{hR(`6Ho; z+N$k8v{Io8w>d3Dis%Wjmi`;zMbr%2e>?>MlBC<0bdC0jt}PsepRDoO^RQ(#tOS1K znH?p%j$px%eZ_AVW6(#iW*xa^!YMfO{B0M2ghrjHEwKc-zd!+RQStWImFW_yd*cNq%+Em_9Gv!UrJ>%;F}j(v42i-}-UdUY^(3c3rcpTz2#W zx04B>zkmi&hms;jUKo3Ehl#QqJ|(W*_-tdeiZmAg=!40OY07$)oi+pxxQJ0+VkEOo zB8Y2=SaooWA)hzi@y(^-v6a^(7&LJx$qQ>s5=FTSx+$?51UmiDnp%;Lv$3k6P5LKD z;-5)F1HPsU6QH#3u^T03Q|FaTIIo+;+wUQdr%VdAcz;|Db%s$MnMt{h8pGm?z0&$rQ66j12a)&IIEBhrH!WKBkPFFnoXe`ZQBTxN9DhX7Ku3H^&tkN?Sq1u?$< zi<*<<$b-&ETb;ziOfZU8i&&vo@>y=$<}8duSE-wmg%dT2yP1+bolX;#w+*dKhSdY> zTZ9@R5v%{Jw&nrO*B8V@o8f}yv=A8Td)uLT&(5K@%)e+}bjP?2%|_tK z$DU?)T%YD&gjVLvA7ptjG27~jLXvR{OQa4PNyUq#eB{8ci=y9GbFUuzs_}CQXeXle zw~oh~a%LQ;h46nKr=~<&;k7LX!xjn10yFZCkHIGezY*5j*(YuyEtSvncp-Q%Xt(Zv zjUULLR)E`RC@2y{&VKwD(ZjkiA5DJjgEcx7sRelDFk$Kq$b90(!onT$gnCSR0iaP& zElJ4;P+v9i*M!Ax7$(TmM(Nt%jGd=Wpb_m)GD|SE97EPb@h6>S-zBg^fWo4-eO}XV z4GoqH3D@bfTHoleebk=1xUt!y@7v~$NgD-S>1*Bah9D#<1sAx*vNyri+wku+U1(li zx5Q!iDgw@bXfo>ACeY;lmM5|JS9MJ%@@xoSoQmV_#T~S95A^;rrx^0yWSGr&GX)EJ zvXQ8jGihBr#YVoA5AIdoo{{^EgRMy7RzDusq-H45jV{Jt@Quq(s?g_pvA{yi*J*)D z-=Dl;?In6^c-^AAm2id@q)b)Akbgb$BY}M~bLf?6o1=_Ku52`#P5z+R=2A0X{uoCe z+E9-@6&3eMKxgz+EOjY-{r;;pVf*khCId)6O8?S!^^V}7jBqm4onGQ|_$zqdFcjwu z9Py)6HtTNG;~Dcp9MP&f&9Ta6_W*<5%~X#@Yq($ZOLd_>KQ;SD^rB&b*k(Cz@`EfL z`|fTj`PB^nGy5|1#7}!r?wDC+!4g4RTKOfHVPV)`{HkeCbd{kb|FGW-r{;((mN@H{Rz_H>CUQ#&I&0Qh}5_R|4lAiJQ{wsx%64JgW)nBt#Vm zZ1N$2uTFsy8Q(#*?M4zq*DCi`@22YIvy25!9 z5PYl@Zk7_6*CdjF<`=~kA7F}IGTc0)^~(&=2w?}Emif-U25qt2%j z#iycvqOz|$(`JsJ?KZjo3gW`qAK^MxKZp38fivuRpTM(Ujy_Vc{tOAiRd?EMC6O^A zF{I>1H>%^i@f0IcwfRDkaocUR=XK5&ql61jEUf*w(U&|vr0M_>l_Ew)IOh~`&Jg~A z_N;0?6Zu<-g~N&~&jQV&DtnYv*|SD*@%w z3XNaM-Zk<$KDj0$VKId8VqtznR5HOoNvVjIy5N>6J=J>#o9pb_4HdQI;F&o1q&pS5A2W%TiFOS*2ptb!PRs)~yz zuZ95)q|&@Q-cVb?}GeUVDVZm+@ugC(Cr5IA7w@1B+n07VSerR#{yB{WTR~+XgN^ zXIKX=^_C5<&N1j)TAyCk}7j!#)307CcSm2ja*f7K^qN z6U?>uyk22L@^_inxGLXM_K{ocx6(J~bTA1uJTmRdtfUhdM*2f-w1n8t!S$*- zCYlM`>pbQm44CHS3i}%&SDBD2zhvvVHvlgCTLUYoZ>-2(sQ=pR--Ja-p9p!5ByJ%SrzYw2^EKgM@Mq&WMRzS-2c<13uC*syt(fyN>Bv{tJXms_tErXVC0& z0O*^pxYrZRYYG3iO94YvGW^TmFF z3$nktzPh?>c+hC4*W2X4wGrHM>#S@%H9CI0o^ZYWU*Z4h0jq=6PPhjQ(+d-*f^pTX z(cbP`RsZ1S{p9I&f9zdWRd?ocS~`YRZqOXt9lO09V4#Y7b64k~=|i6-pr_{t*8Ah(~tWfsD;%#R|%!Z^Ymg@iPO4v6i%$42GGdhabzI#?HPr#j?qZt^)8sSdG+DWS537>ixZG@LlwazlUpRBE5`p?ZpvaH=H? z*QhEFPR|%O%5zt8a#s|`N#?7l^*H9nR;^KY+C}YE`^0{FZ##fGxf{9FJx^LYO|FY_kGyosU%NruWuY55kmwy% zk>e*lTrywWMYlSa+xIs04FxmJRH|9%(qJLqrK92st|J{mI+l4BWU?jkU@AgN6fXkS z|8tR`d7Yydx=a|TWxFPpJX|W2QxlHilBPKk$BzMc+Y_n4iq>TAqjZ~YKA=r9j>KjR z=S@M8p+UQL``O~I!;HAb`zi8DbU_4_LP->E!nrU`c`QX$;%1HCx#7zX!w;!uPQRRXu* zCzJaQfOYitXDk`sAR;JQ>fviU&-^b=5xt3;(1}7B`avt4`#1zzJ@fRbAQ5r;$rMdN z>&UXenh!@6C77mzVD;)`8Mt~QJ;tP@AK7cV+foEg+?}0{SKP+^K5tbWbb)*DZ%v~J z=?eD+FB{iYC-VX&k=1{Vil2DP4`p-LhXqEQr{^?NJalUj(^+sRI`oiZ?|pdVrcYF5 z$p9VN2k#>>gStN7| zzQ3~8r1z~Kd?yo*(L7@qOsmt~hJBj>P0bQ%iq2W#_A2FY)S(Nrk!g?zp#(AhMuLD{ z{&?WPqRg|%#^|So9HcbRkk4)86dXYX)aZe=JM`%HUV&(ne2(|2mYp?~ zfC8788x6!xuDuF!)s`=txIUH=9j$|pyU^Wtcq3d#8=l@cmS6Ce)fEO6&l%~NlU}X~ zNPDyk3~gimJ>q8J!GuoL+dr#i*;2IO0ZLus+)K+4Sb0CSJ6s)D#kOgVrTBY!2ZN#s zxJ^eiT(%)fWGE_!h(W$IN4WQGnV;cE-g%0GYFlxka5st*fP+`H3*fKq)&Sy&>YGTHrN?4k8=jdRUOU~D) z$i_gNg>RW)s}P6?1x2<`X1-VR0D5f{?ib(@OaoZ7JF9x9Q8Q(?QL>I%c~B_8j6!J} zJd@q7zC1aD8cHDDD^%n(#NCt3b|m8vqa~$G&njqwhIaLv&Dk9c!>PR^$+~liSPNt|j>BO` z8jWwJJvhY9Kl=tHWM+6n25>T+J!ED$Lxyqqoqx#8u!bBb5(T`U^B*$HMf2~W%2TLH z)x<+=)J*edIXf7k-hFutS~SNrm@l%{f&RYPO9M|*y3lV$%N0D9XsRV~>xWdJwVHyO z=4FVRmCs%R_6y5d5Ia?=zLSTpz94B(W5_)g3(z3!s``8yfiRvo1%#u0Gzrv7&nQnm77ZbQ_?Gct;%STcAw@ z*BjDUTiAKm;JT<9TELDCd0pUTkl(G4e+_DcIm{E35ARRDZ|=Bv*_Sad#gdSNKF&bv zN?O4!hr?@q(si%rPiQ3igFDAVT%Z?YzwN_GuJv_p^jso=#Goq-_w_E+EHCbk$?RefDi>AQK zxkT&ElnSy)5{LJ*(-96JMeGA9_ckr}+*b6B2e=aC970tgRe}w!H!9!fqMjH(y(kh( zangRB+vpgv!zYBwctb&0{Bu|Co{A86v8AeNIT_A|Cv^KcpDyk)hJ<{h)Gp=N=E~12 zz{h+n)CzsA|&v{uk$H6ON$9|^7OwH5J8h46VN_B4pk z2*0+TI`Pzg1g5x1EK{uXkoZU=Q>-XKap#QF(82FJIQiX}QN)*3u+8Od#Fs4!cYHk$ z%gk{g6p`HB87G;&Iq~*GTl_I1*4C>XA(0)2vJxwnR5_-_@?0gnm4tOQ^=dgHsgL;D zwj*50LCXu?3vt}Lm}0iPeyWt23#sd3<%RWkD}-UT5QS-P;-k(-VAufC?YBjWhq=`> zw=(njc4M5c3jDg$B9^}h+|?*w?i(CEZgH?>O^lqF;I?{`Z#!z;=HxSLL%n+aWMVinHJcSIqR-9PMNHYqOL64Nc$ zGDlfMCcoYYv&L7B+SR_qbM}IG01@#u_DR}xkITL$4n?&_HRg1!IdL$4|4G_sw5i{t z89URUej8m(KkTqeUI&AS%#!8leDu-3PHRp=`wV_a<}sigjj@Xq{`p)Ur5NckuqFoS z*OA9wDGTQCy|z^HkgM{dCa~3gO+?*nN>x%FrTB%zu&#TfkBUH+52!V`*TtNIgyN^h z%C)wt34Xa3i@%$svgMufojWjtk;I>EvL&e@-QXHU2CSY0x9t;(a=mb1m|sVqvwXL! z<^=qznFS!47(zeGxj6ml2eEn@jddB&43bE9*ml4a6W&d>4hD23Iojm zuGm~_^#lYpN$q>~m^g&im^Sjvt~Ck~52*6X7Yl zOztp?ZV`P@z8N=U5uGBcQr1IQZa4{EO%?qr|3yC^9OH@}sxUUo$J+kvC5Cxlea?P$ zG><6BT8TcVWLpt{kX5r>4oJcR?KlRz|FuaU4wMbOt+wXMS`Mb zJ0ESf5c%<|poK>SMTMgDFwhjk8hFiAvd0QPzB@R?S+Q>Ho>1J5BIGu{`()7!sQ^PE{I!fJzrRl6VTxPq(#VAVdw*v0;sC>u*xx2Pl z;M{QIKnBb5zKylDw}aPPY&=@R0fsGu=MLTEm=$UHA=c?E5!+`(D=e@t|8u#x;q9Dqr>CQ=RsTNBmI3g|5nQ(u$> z#MzLyV+mmZ5y0IX?H!Y@qF25arxA`CtdC+ExIhx{QJVlFKD^xrLfy1(nsTguPMv2h zp_bblLn49B$iAf*#|KA0p~sLm!e19TeElg`82Y21=@UsFSkcf&d7Ye#K><#>Im%b2 zf7vNM{~Pfk(?Q~tbOL;MtyTKSKCf;Mi4X)J8AGJ~fo@&k^;~3M862~p!Gh1*rNA^W zqB!e5ng0z15o$5C&VikOmZg1bm>mdd{yzWJPffWtN(zWvyGKGHq5di`w|;na+TP@d z@_feF_`}U1Cqn5OgtnxS*XVKG#d}`8bEM~{Ha^IbnkV#*nn&Y~I)OTj>MhCZP445{ z^dw0(6~~PBCCsQmm+;!2R|{qOlmRjiBY%GyvWqw<9v!x4j)8<5lWhEfM9_+?fgALO zd;7;oQp{r#yjy8*ogZwjLkoop<+Jz=Y4bv+qG%Cyu#Qcm?>+`S0(b1~zb<;WMSEB= zxu=GsAZ>Fz9f1)^6Y`o!N6jz=#y(;|D&{TB#j^LC?l!UEal&!;4%sYOSv2v!j zbZ3lBsaA}z)KpoA+SZ?OX|U`rJvY&)UQMeS9HrE5Sy*@}KM?V)3G1}q$qX|bZZ*u; zmpgp&uJ!$V5koPy^KH&u-&EhQ4ct>~dR@1O=3EYN|DfOQ7qs4#rP4D=Ysg;~s{J1< zv~xO{e2HeIiNaOd^J8RR2AF5ghcc#*sKYXu<0JEre8HItZoEH6s+FxPM4}Xxqjfbz zaJ4E$S@$y>hTN{OO0~ltWi2}LHmko;nnvuha@aeh)%vYC*H$oRM_2cBvCDd81zd;e z*h&k*Q6Nf$W^+b8X})FknLua_Db$ztnfkwNRC)Cyq-$9=0Kv3?!9B>h=-dfd7Lw9$ z0C7Dt!_QmI{=9I>X_8WG0;4E_Z4L;g!kd{l3uF5>V3(k|+I*_Oj~I04e7+}fxdqBJ z=p#tQl2%yLCSB#Kq8RT8$-3*~yA+!h@Id7iG1$-`b1f_Y3CuTa!Db#TM6cOBBCo*u zfXmkdu|>eLbV$H~XP>1|STK*%3V+27huR)9d%^gxy}ax$nun={*anJy#~`n*-)yuk zwjBq+qv00TG0F9u^(n@Q7&knTb24lc+mABsGvvvksBGwO;|_>u9|YgQQ_YLXZ}2kC zb_uH6x-~PQdt1a~FBfx8$b*jLn?0mn;B{qc$Ui-%4J=7@2Bu(*v-ZZQ+uWx-p*{^6 z6f#OT-6eX#K?rP$nEm(@|*P_XSvFA6@owM>TG%rBpxU&ks-yys%Um zgfGq@wJjtFILEr!Ps=sNi>=JNlf+m5Zq^v{fWr@9{ki{BlA}VFJ-`05-gvyt@`IbI zF-Me$LOYpInc=F+L^j7=qR)>~ya?cCWP5voQ3O`-!pIwaLWTz zyDZEWf81>oaqHb}X?9r?w{e?5Cam8lE}$wU`wSk6*u9*ova~Og;o`C#nu^0SoRjg! zxv$c6&~la8+sUtlwQI7^mI&>DF0pk?nmq6CczK-Yv#v)e)KhIYE60`9Vdtvw>bvSb zj?h_0cG5GAKhLI7R9DnWxyDMwgX(T%;`Nht;`fpZ-Q(BmUREiR5`S|j zNySSg??SKspeQw2psO@ANo2cErPnO!c8w5J-L+LvT1T-|aTwXJOQ7XJ!V_cxs=Yyh zJjBCD&7(@Mwoq6d*g9H`-(u89C-b7deiWmm6!}*PUn+d$9Pb!*L#X9nSm^2MwfUyr*7+M3fw-bz$W!Y9_&DPM#xXe`cTO(Ii@G)D(x=(M_1=YJYm3 zL5-zqg!{ASVjNnH&T4fPm&DpGrmj8nxeY8r+&ECjl20FkDju!a`5zaZ2IRQzT0U}In^b#%!n#&StV5!6_42$)7_yL3hw*`>qn!kRONI~e|G$J@(Ylzil0rt_m7krmmal!eE5Aq z^a6N-5zX1?TIp+RX=_?*Y1&Lp4NdI2Ewo)o9O`P>+?txFMwi!@cURZ9ca0B^Ufz#S zIgP)3yrrGBrM;!EAMX}_bI_<@yq*V>a-hGS2m1pup=fWQj-dqNBywda3-UjFm_szE z!FpqE_wvQy?~~RCk}c9tOf3 zVA%Asoq*+2a>vBdf{{|nQ&c&7uS;aPvoE_NTFeRtCIJ_Yt2}zsVnlE=iJ)a35`l(q z+Rv+Gi%bfLq1la8w>&QM1xQ=6I-hxzcw>bfK2W(6t!%}IhCM6!E0>#)O{KfP z{-))RTy5IO-!>IoSyZ&6&1cUat#8Q`mkCwgEcCOMDlD|-U;et9*nj>2s7Z|e=XDnH z){(27eNh!zrquULzpSr7*P*G^gr`hxbJSMqzjHTp&Z%jMnE#dFHB@CQd;~04Iq~Os+J{)YTV_oBCK`>Wiw;E%{z9|v(ss>qXqs{X0`Kh z_%C|A=;RInZD<2BT*A?)ZY%Cf!`(NV!(&%5_HQNvV68O)WNJ7<4 z7y3slw%T@vKVtmLx0zc-iPc}E;eNu#>H9P3?%Vm-t_9X)=P0(-$#?&xeLOG1{)he7 zh&gJMhltUC#N^c0{8v<0TGUz%1l)Re0j_^iNWZU6_-|qP2#Xsf=eaol#`42&Y2@#< z;7W_h5vd^dWHN3u%|1c%chRz9vJ(H05oZ8tNSRYdQ@m3IlD0F8ya4x4C2Kz0R|e#y zPEw-%#rT!6&weJxpU(#6Tyi#qo=-C*n=`G9U-!mO*kiFWSMrNmq=kG)znr@FSG5@_ zQk$6qkNFbIX~4^^3ARS}SximGB-}0PWDjh0`AZZAbU)roel5S?+{ezN?`N!nIZ|{Hm;RRTn*Td%^JZr2oU3e$O zcZCN5=0uw>OyMEGA9~P+=>0Bgq)R{VdELgcc^f7Yw9%?pnn4cf*(Pc`4jo_pG7e%BZ_kjS=B-GoDyZO|v(GGOL~5YXd>8 ztpWp;a2#oBX&WAoi!@k2+>^?xS`5#ALx{(Yv0#v9?!n#jZ@}pb3D-c6sx7Su98BR$ zqoCCvHM793Guzz~1v`k3?p2ihTmG8@Zoe2=Iwh_h^wR)<2NC|fqoAktIcT8jg^Jo9BacSRTqq*7F4fjM`=0vUwA`v`Vp5Axt(`DK1y#H& zg9PxKpn5J>NFbfy8|n;|GUd{iH#{Ce7de8EC}c^*m(!0@Y3MJU8vFr8uls-mv^UqI@mi$uV{K z)zVwE8r;$F>kcz*%1Aso$>)r?3Ppu&Il5vnfY(6?B%yzu{u3=^T4Bm;Y`T`_CR*hb zUZ#<_{YO>ejDS8HdhxRkN#4s;_!lN>swqCtpCmk0$W7+Mlw{H=!U$2Z%_y#n5<{-W zZe;R;a3^sv<7nc~6?FCD6vbbLEYvCQ5egAbXP!;m>n`pu#q^HhzFe>>%kVaT^X}CQ zaUAABv*&(xI?oTUXqpr>8c=sFrb%$w>H3IiBS=<~xdiPCA$LmS;g%yL{FwJUmdLsI_xP~&?_MLLjLp%w}^)Ig8BXs)^=mNfFZAT=O&Y3SG=RK0i ztdXM|fm>TgpsSYEw(O(NTY@_i@aKhX7L=#tUP4Le@{5kfeSObpyK3A| zdTz7~4%Z|cyurS7rQiq7=&4(PZuX(|{Aa9(4;#N*mR1vKjVHnGi&O)&AyYg>lSR2;H=ND0C`osG@9R*3s!0x zYGx79Qz^84@w6HbW}P}C=LgYGx*)FG!#D6!BP?jiBw4cf?o)3=Co5lV15+V_vC#f$ z0?dV7o6aUlv>Z}XhShLaNk3n{Qd&toUQ@kGCCQApXIHw}{`qbfeecpmBRG_-EZK@? zApb_T8lt}|kilT;-|aessine(b~krsR`5^7Ut*0h-`4lRc_B|4YV$`u@+XtNBwOtbq?N1@mxj%W$XdhE z+4O)_`pJ^v(y#(hyc20y?%G-F~vV?uaa;Z%EHQDP1xCC}wp<@?1aPvOs;U@g0 z4!mHqS_Dl>Ypbk9$aq~{mSIn+w;|llo^Km0ud2&|Cq`{6yS%)^twlbsNqy&*?7wk*w554r6WG^2NsTahYv6J=t zz?Um8d_b!%hRcV+Snj>mSL}-O@BHuxN;|oMO5NRZH(R^~m`>;2_Z5N=-l${}Z*P!R zTGRS1^%U@Cc#DaQ!_&1>9i=wb3Kh z5?)=eXXWALgyDVQDQj;LW9{dd;h}N&_LLr_#stk+ENPh2##sGx@%PI1M&5*4p6d9@ zFUyJV0Af^Iu{IxX>S9}doNSWb3;DW53<{Wu(47tcR^a0uX*zsVM6~O2+o7VmpylVq z&Ty{43uVm*cQ$D44Est$4yp`QlmgFPUdVz;U07m49ZM3*kP~hb8mCV_yUXQm`-Y}% zhsaLB8`JmY)w|GNKiT^~oKNV9-*4qf#8jlgRxrsJ-_&dU=$m>RhJS9yZV1geO?GHL z>)YaC3SRlA&ZT%}?tp7n^F`*kCFh=PDSKfGC|cs9j+ohJ zYwt$wWTmSmN9v~%(3k%GT#q>jAV}(B9>>J&Y}s|gr+-s)LyNgk;Wz1=u`}M>=Ozxz zseYG=i4e`f`_X@cxLN*JP|y8NFq@-QhsAN+eeDrHBKp|1Dh$2ph-N>Jw&e>^+b8l7_62(rNKSr zO;TDR-B5b6-oUZ;6t)1=Z|uYO+aF#W&@gIZ<&2Kt?r-t7F0T&xR;zrIH^L^|s^2m; z%=8n`Z~VYliF;Ht1@*)hYV2V5>y6ZFO&rLph1{Gg-Q3YV(3K$9O1;~nQ*%G{%zBYu zuqSyy=*rGzpeDUQ(NStV(sO@&kjQni!g&D}6?V&c1~A69e%oYLb)QOY3*MuvP1!dGYh z*v|&Y=9TCJjt^N~H=QQ6nNHeaf%{@Wdu6{UCf*u0r={mBydX_zi_Wa&)DV``$Am|Z zb>)}sJ7=bcxYLuCEvOQu;ibNbHx?HUJCgU`GujgN^P3FMpYzS`?ZrF!TBn~(DR^*SDd!@ zHoT9(I}e|GzPbE3)RCw0{gEfmX^y8Ym?BOwF&^{+qEZ_L$L&=60)-MF5LJZzZCb0V z0+FmVbUF6tp + {{ 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 51/53] 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 52/53] 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 53/53] 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"] }, {