diff --git a/internal/handler/home.go b/internal/handler/home.go
index 4d150c2..42d6dd5 100644
--- a/internal/handler/home.go
+++ b/internal/handler/home.go
@@ -24,6 +24,14 @@ func (h *homeHandler) HomePage(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/app/dashboard", http.StatusSeeOther)
}
+func (h *homeHandler) PrivacyPage(w http.ResponseWriter, r *http.Request) {
+ ui.Render(w, r, pages.Privacy())
+}
+
+func (h *homeHandler) TermsPage(w http.ResponseWriter, r *http.Request) {
+ ui.Render(w, r, pages.Terms())
+}
+
func (home *homeHandler) NotFoundPage(w http.ResponseWriter, r *http.Request) {
ui.Render(w, r, pages.NotFound())
}
diff --git a/internal/routes/routes.go b/internal/routes/routes.go
index 35d115c..1612132 100644
--- a/internal/routes/routes.go
+++ b/internal/routes/routes.go
@@ -29,6 +29,8 @@ func SetupRoutes(a *app.App) http.Handler {
// Home
mux.HandleFunc("GET /{$}", home.HomePage)
mux.HandleFunc("GET /forbidden", home.ForbiddenPage)
+ mux.HandleFunc("GET /privacy", home.PrivacyPage)
+ mux.HandleFunc("GET /terms", home.TermsPage)
// Auth pages
authRateLimiter := middleware.RateLimitAuth()
diff --git a/internal/ui/components/icon/icon_data.go b/internal/ui/components/icon/icon_data.go
index b703eaf..b2823e8 100644
--- a/internal/ui/components/icon/icon_data.go
+++ b/internal/ui/components/icon/icon_data.go
@@ -122,7 +122,7 @@ var internalSvgData = map[string]string{
+ By continuing, you agree to our
+
+ Terms of Service
+ and
+ Privacy Policy.
+
+ By continuing, you agree to our
+
+ Terms of Service
+ and
+ Privacy Policy.
+
Last updated: January 30, 2026
++ Welcome to { cfg.AppName } ("we," "our," or "us"). We are committed to protecting your personal information and your right to privacy. + This Privacy Policy applies to our website and any related services (collectively, the "Service"). +
++ { cfg.AppName } is operated by an individual developer based in Canada as a hobby project. +
+We collect information that you provide directly to us when you use the Service:
+We use the information we collect to:
++ We use cookies and similar technologies primarily for essential functions, such as keeping you logged in. + By using the Service, you consent to the use of these essential cookies. +
++ Our Service is hosted on virtual private servers provided by Hostinger located in the United States. + While we are based in Canada, your data may be processed and stored in the United States and subject to its laws. +
++ We self-host our email delivery system. We do not sell, trade, or otherwise transfer your personally identifiable information to outside parties for marketing purposes. +
++ Our Service is not directed to anyone under the age of 13. We do not knowingly collect personal information from children under 13. +
++ Depending on your location, you may have rights regarding your personal data, including the right to access, correct, or delete your data. + You can delete your data by deleting your account within the application or by contacting us. +
++ If you have any questions about this Privacy Policy, please contact us at { cfg.SupportEmail }. +
++ Need help? Contact { cfg.SupportEmail } +
+ } } diff --git a/internal/ui/pages/terms.templ b/internal/ui/pages/terms.templ new file mode 100644 index 0000000..ce1e47e --- /dev/null +++ b/internal/ui/pages/terms.templ @@ -0,0 +1,97 @@ +package pages + +import ( + "git.juancwu.dev/juancwu/budgit/internal/ctxkeys" + "git.juancwu.dev/juancwu/budgit/internal/ui/layouts" + "git.juancwu.dev/juancwu/budgit/internal/ui/components/button" + "git.juancwu.dev/juancwu/budgit/internal/ui/components/icon" +) + +templ Terms() { + {{ cfg := ctxkeys.Config(ctx) }} + @layouts.Auth(layouts.SEOProps{ + Title: "Terms and Conditions", + Description: "Terms and Conditions for " + cfg.AppName, + Path: "/terms", + }) { +Last updated: January 30, 2026
++ By accessing or using { cfg.AppName } (the "Service"), you agree to be bound by these Terms and Conditions. + If you disagree with any part of the terms, you may not access the Service. +
++ { cfg.AppName } is a personal budgeting and expense tracking tool provided as a hobby project. + It allows users to manually input and track financial data, shopping lists, and related information. +
+Disclaimer: Not Financial Advice
++ The Service is for informational and organizational purposes only. It is not intended to provide legal, tax, or financial advice. + We are not responsible for any financial decisions you make based on the information you track within the Service. +
++ When you create an account with us, you must provide accurate and complete information. + You are responsible for safeguarding the password or magic link used to access the Service and for any activities or actions under your account. +
++ The Service is provided on an "AS IS" and "AS AVAILABLE" basis. The Service is provided without warranties of any kind, whether express or implied, including, but not limited to, implied warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance. +
++ As a hobby project, we do not warrant that the Service will function uninterrupted, secure, or available at any particular time or location, or that any errors or defects will be corrected. +
++ In no event shall the operator, nor any partners, agents, suppliers, or affiliates, be liable for any indirect, incidental, special, consequential or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from your access to or use of or inability to access or use the Service. +
++ You agree not to use the Service for any unlawful purpose or in any way that interrupts, damages, or impairs the service. + We reserve the right to terminate or suspend your account immediately, without prior notice or liability, for any reason whatsoever, including without limitation if you breach the Terms. +
++ These Terms shall be governed and construed in accordance with the laws of Canada, without regard to its conflict of law provisions. +
++ We reserve the right, at our sole discretion, to modify or replace these Terms at any time. By continuing to access or use our Service after those revisions become effective, you agree to be bound by the revised terms. +
+