@mdguggenbichler/slugbase-core 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/frontend/index.tsx +3 -3
  2. package/frontend/public/favicon.svg +1 -0
  3. package/frontend/public/slugbase_icon_blue.svg +1 -0
  4. package/frontend/public/slugbase_icon_white.png +0 -0
  5. package/frontend/public/slugbase_icon_white.svg +1 -0
  6. package/frontend/src/App.tsx +179 -0
  7. package/frontend/src/api/client.ts +134 -0
  8. package/frontend/src/components/AppSidebar.tsx +214 -0
  9. package/frontend/src/components/EmptyState.tsx +33 -0
  10. package/frontend/src/components/Favicon.tsx +76 -0
  11. package/frontend/src/components/FilterChips.tsx +60 -0
  12. package/frontend/src/components/FolderIcon.tsx +207 -0
  13. package/frontend/src/components/GlobalSearch.tsx +275 -0
  14. package/frontend/src/components/Layout.tsx +60 -0
  15. package/frontend/src/components/PageHeader.tsx +31 -0
  16. package/frontend/src/components/ScopeSegmentedControl.tsx +42 -0
  17. package/frontend/src/components/SentryDebug.tsx +32 -0
  18. package/frontend/src/components/StatCard.tsx +66 -0
  19. package/frontend/src/components/TopBar.tsx +63 -0
  20. package/frontend/src/components/UserDropdown.tsx +86 -0
  21. package/frontend/src/components/admin/AdminAI.tsx +207 -0
  22. package/frontend/src/components/admin/AdminOIDCProviders.tsx +183 -0
  23. package/frontend/src/components/admin/AdminSettings.tsx +413 -0
  24. package/frontend/src/components/admin/AdminTeams.tsx +177 -0
  25. package/frontend/src/components/admin/AdminUsers.tsx +225 -0
  26. package/frontend/src/components/bookmarks/BookmarkCard.tsx +312 -0
  27. package/frontend/src/components/bookmarks/BookmarkListItem.tsx +159 -0
  28. package/frontend/src/components/bookmarks/BookmarkTableView.tsx +419 -0
  29. package/frontend/src/components/bookmarks/BulkActionModals.tsx +162 -0
  30. package/frontend/src/components/bookmarks/FilterChips.tsx +5 -0
  31. package/frontend/src/components/modals/BookmarkModal.tsx +493 -0
  32. package/frontend/src/components/modals/FolderModal.tsx +306 -0
  33. package/frontend/src/components/modals/ImportModal.tsx +232 -0
  34. package/frontend/src/components/modals/OIDCProviderModal.tsx +284 -0
  35. package/frontend/src/components/modals/SharingModal.tsx +96 -0
  36. package/frontend/src/components/modals/TagModal.tsx +101 -0
  37. package/frontend/src/components/modals/TeamAssignmentModal.tsx +354 -0
  38. package/frontend/src/components/modals/TeamModal.tsx +117 -0
  39. package/frontend/src/components/modals/UserModal.tsx +225 -0
  40. package/frontend/src/components/profile/CreateTokenModal.tsx +172 -0
  41. package/frontend/src/components/sharing/ShareResourceDialog.tsx +422 -0
  42. package/frontend/src/components/ui/Autocomplete.tsx +155 -0
  43. package/frontend/src/components/ui/Button.tsx +68 -0
  44. package/frontend/src/components/ui/ConfirmDialog.tsx +79 -0
  45. package/frontend/src/components/ui/FormFieldWrapper.tsx +36 -0
  46. package/frontend/src/components/ui/ModalFooterActions.tsx +49 -0
  47. package/frontend/src/components/ui/ModalSection.tsx +34 -0
  48. package/frontend/src/components/ui/PageLoadingSkeleton.tsx +24 -0
  49. package/frontend/src/components/ui/Select.tsx +61 -0
  50. package/frontend/src/components/ui/SharingField.tsx +298 -0
  51. package/frontend/src/components/ui/Toast.tsx +47 -0
  52. package/frontend/src/components/ui/Tooltip.tsx +21 -0
  53. package/frontend/src/components/ui/alert-dialog.tsx +139 -0
  54. package/frontend/src/components/ui/badge.tsx +36 -0
  55. package/frontend/src/components/ui/button-base.tsx +57 -0
  56. package/frontend/src/components/ui/card.tsx +76 -0
  57. package/frontend/src/components/ui/command.tsx +161 -0
  58. package/frontend/src/components/ui/dialog.tsx +120 -0
  59. package/frontend/src/components/ui/dropdown-menu.tsx +199 -0
  60. package/frontend/src/components/ui/input.tsx +22 -0
  61. package/frontend/src/components/ui/label.tsx +24 -0
  62. package/frontend/src/components/ui/popover.tsx +33 -0
  63. package/frontend/src/components/ui/progress.tsx +26 -0
  64. package/frontend/src/components/ui/scroll-area.tsx +48 -0
  65. package/frontend/src/components/ui/select-base.tsx +159 -0
  66. package/frontend/src/components/ui/separator.tsx +29 -0
  67. package/frontend/src/components/ui/sheet.tsx +140 -0
  68. package/frontend/src/components/ui/sidebar.tsx +783 -0
  69. package/frontend/src/components/ui/skeleton.tsx +15 -0
  70. package/frontend/src/components/ui/sonner.tsx +46 -0
  71. package/frontend/src/components/ui/switch.tsx +28 -0
  72. package/frontend/src/components/ui/table.tsx +120 -0
  73. package/frontend/src/components/ui/tooltip-base.tsx +30 -0
  74. package/frontend/src/config/api.ts +16 -0
  75. package/frontend/src/config/mode.ts +6 -0
  76. package/frontend/src/contexts/AppConfigContext.tsx +39 -0
  77. package/frontend/src/contexts/AuthContext.tsx +137 -0
  78. package/frontend/src/contexts/SearchCommandContext.tsx +28 -0
  79. package/frontend/src/hooks/use-mobile.tsx +19 -0
  80. package/frontend/src/hooks/useConfirmDialog.ts +63 -0
  81. package/frontend/src/hooks/useMarketingTheme.ts +47 -0
  82. package/frontend/src/i18n.ts +39 -0
  83. package/frontend/src/index.css +117 -0
  84. package/frontend/src/instrument.ts +20 -0
  85. package/frontend/src/lib/utils.ts +6 -0
  86. package/frontend/src/locales/de.json +899 -0
  87. package/frontend/src/locales/en.json +937 -0
  88. package/frontend/src/locales/es.json +884 -0
  89. package/frontend/src/locales/fr.json +550 -0
  90. package/frontend/src/locales/it.json +535 -0
  91. package/frontend/src/locales/ja.json +535 -0
  92. package/frontend/src/locales/nl.json +550 -0
  93. package/frontend/src/locales/pl.json +535 -0
  94. package/frontend/src/locales/pt.json +535 -0
  95. package/frontend/src/locales/ru.json +535 -0
  96. package/frontend/src/locales/zh.json +535 -0
  97. package/frontend/src/main.tsx +44 -0
  98. package/frontend/src/pages/Bookmarks.tsx +1004 -0
  99. package/frontend/src/pages/Dashboard.tsx +427 -0
  100. package/frontend/src/pages/Folders.tsx +578 -0
  101. package/frontend/src/pages/GoPreferences.tsx +134 -0
  102. package/frontend/src/pages/Login.tsx +196 -0
  103. package/frontend/src/pages/PasswordReset.tsx +242 -0
  104. package/frontend/src/pages/Profile.tsx +593 -0
  105. package/frontend/src/pages/SearchEngineGuide.tsx +135 -0
  106. package/frontend/src/pages/Setup.tsx +210 -0
  107. package/frontend/src/pages/Signup.tsx +199 -0
  108. package/frontend/src/pages/Tags.tsx +421 -0
  109. package/frontend/src/pages/VerifyEmail.tsx +254 -0
  110. package/frontend/src/pages/admin/AdminAIPage.tsx +5 -0
  111. package/frontend/src/pages/admin/AdminLayout.tsx +40 -0
  112. package/frontend/src/pages/admin/AdminMembersPage.tsx +5 -0
  113. package/frontend/src/pages/admin/AdminOIDCPage.tsx +5 -0
  114. package/frontend/src/pages/admin/AdminSettingsPage.tsx +5 -0
  115. package/frontend/src/pages/admin/AdminTeamsPage.tsx +5 -0
  116. package/frontend/src/utils/favicon.ts +36 -0
  117. package/frontend/src/utils/formatRelativeTime.ts +37 -0
  118. package/frontend/src/utils/safeHref.ts +31 -0
  119. package/frontend/src/vite-env.d.ts +10 -0
  120. package/package.json +9 -1
@@ -0,0 +1,937 @@
1
+ {
2
+ "app": {
3
+ "name": "SlugBase",
4
+ "tagline": "Your links. Your structure. Your language. Your rules."
5
+ },
6
+ "contact": {
7
+ "title": "Contact Us",
8
+ "description": "Have a question or feedback? We'd love to hear from you.",
9
+ "name": "Name",
10
+ "namePlaceholder": "Your name",
11
+ "email": "Email",
12
+ "emailPlaceholder": "your@email.com",
13
+ "message": "Message",
14
+ "messagePlaceholder": "How can we help you?",
15
+ "submit": "Send Message",
16
+ "successMessage": "Thank you! Your message has been sent. We'll get back to you soon.",
17
+ "confirmationNote": "A confirmation email has been sent to your email address.",
18
+ "backToLogin": "Back to Login",
19
+ "submitError": "Failed to submit. Please try again later."
20
+ },
21
+ "auth": {
22
+ "login": "Login",
23
+ "logout": "Logout",
24
+ "loginWith": "Login with {{provider}}",
25
+ "notAuthenticated": "Not authenticated",
26
+ "authFailed": "Authentication failed",
27
+ "loginFailed": "Login failed",
28
+ "oidcAuthFailed": "OIDC authentication failed. Please try again.",
29
+ "oidcAutoCreateDisabled": "User auto-creation is disabled for this OIDC provider. Please contact an administrator.",
30
+ "noProviders": "No OIDC providers configured",
31
+ "noProvidersDescription": "Please configure an OIDC provider in the admin settings to enable OIDC login.",
32
+ "email": "Email",
33
+ "emailPlaceholder": "your@email.com",
34
+ "password": "Password",
35
+ "passwordPlaceholder": "Enter your password",
36
+ "forgotPassword": "Forgot password?",
37
+ "or": "Or continue with",
38
+ "verifyEmailRequired": "Please verify your email before logging in. Check your inbox for the verification link.",
39
+ "createAccount": "Create account",
40
+ "signUp": "Sign up"
41
+ },
42
+ "invitations": {
43
+ "tokenRequired": "Invitation token is required",
44
+ "notAvailable": "Organization invitations are not available",
45
+ "invalidOrExpired": "This invitation is invalid or has expired",
46
+ "verifying": "Verifying invitation...",
47
+ "accepting": "Accepting invitation...",
48
+ "accepted": "Invitation accepted",
49
+ "redirecting": "Redirecting...",
50
+ "error": "Unable to accept",
51
+ "loginRequired": "Log in to accept",
52
+ "loginRequiredDescription": "Please log in with the email this invitation was sent to in order to join {{org}}."
53
+ },
54
+ "signup": {
55
+ "title": "Create your account",
56
+ "subtitle": "Sign up with email and password.",
57
+ "email": "Email",
58
+ "name": "Name",
59
+ "namePlaceholder": "Your name",
60
+ "password": "Password",
61
+ "passwordHint": "At least 8 characters",
62
+ "confirmPassword": "Confirm password",
63
+ "submit": "Sign up",
64
+ "successTitle": "Check your email",
65
+ "successMessage": "We sent a verification link to your email. Click the link to verify your account, then you can log in.",
66
+ "backToLogin": "Back to login",
67
+ "alreadyHaveAccount": "Already have an account?",
68
+ "logIn": "Log in",
69
+ "noAccount": "Don't have an account?",
70
+ "acceptTermsPrefix": "I have read and accept the ",
71
+ "acceptTermsTerms": "Terms and Conditions",
72
+ "acceptTermsAnd": " and the ",
73
+ "acceptTermsPrivacy": "Privacy Policy",
74
+ "acceptTermsSuffix": ".",
75
+ "acceptTermsRequired": "You must accept the Terms and Conditions and Privacy Policy to sign up."
76
+ },
77
+ "setup": {
78
+ "title": "Initial Setup",
79
+ "description": "Welcome to SlugBase! Create your first admin user to get started.",
80
+ "email": "Email",
81
+ "emailPlaceholder": "admin@example.com",
82
+ "name": "Name",
83
+ "namePlaceholder": "Admin User",
84
+ "password": "Password",
85
+ "passwordPlaceholder": "Minimum 8 characters",
86
+ "confirmPassword": "Confirm Password",
87
+ "confirmPasswordPlaceholder": "Re-enter your password",
88
+ "passwordMismatch": "Passwords do not match",
89
+ "passwordTooShort": "Password must be at least 8 characters long",
90
+ "adminNote": "This user will be created as an administrator. You can configure OIDC providers later in the admin settings.",
91
+ "submit": "Create Admin User",
92
+ "alreadyInitialized": "System already initialized",
93
+ "success": "Setup completed successfully!",
94
+ "redirecting": "Redirecting to login...",
95
+ "redirectingToDashboard": "Redirecting to dashboard..."
96
+ },
97
+ "bookmarks": {
98
+ "title": "Bookmarks",
99
+ "create": "Create Bookmark",
100
+ "edit": "Edit Bookmark",
101
+ "delete": "Delete Bookmark",
102
+ "deleteBookmark": "Delete Bookmark",
103
+ "sharingSummary": "{{teamCount}} {{teams}}, {{userCount}} {{users}}",
104
+ "name": "Title",
105
+ "url": "URL",
106
+ "slug": "Slug",
107
+ "slugOptionalHint": "Leave empty if you don't need a custom slug",
108
+ "forwardingEnabled": "Enable Forwarding",
109
+ "forwardingUrl": "Forwarding URL",
110
+ "copyUrl": "Copy URL",
111
+ "copied": "Copied!",
112
+ "folder": "Folder",
113
+ "folders": "Folders",
114
+ "tags": "Tags",
115
+ "noFolder": "No Folder",
116
+ "noFoldersAvailable": "No folders available. Create folders to organize your bookmarks.",
117
+ "foldersDescription": "Select one or more folders to organize this bookmark",
118
+ "noTags": "No Tags",
119
+ "save": "Save",
120
+ "cancel": "Cancel",
121
+ "deleteConfirm": "Are you sure you want to delete this bookmark? This cannot be undone.",
122
+ "deleteConfirmWithName": "Are you sure you want to delete \"{{name}}\"? This cannot be undone.",
123
+ "empty": "No bookmarks yet. Create your first one!",
124
+ "emptyDescription": "Get started by creating your first bookmark or importing existing ones.",
125
+ "emptyCreateFirst": "Create your first bookmark",
126
+ "emptyImport": "Import bookmarks",
127
+ "emptyLearnForwarding": "Learn how forwarding works",
128
+ "filterByFolder": "Filter by Folder",
129
+ "filterByTag": "Filter by Tag",
130
+ "allFolders": "All Folders",
131
+ "allTags": "All Tags",
132
+ "open": "Open",
133
+ "shareWithTeams": "Share with Teams",
134
+ "shareWithTeamsDescription": "Select teams to share this bookmark with. All members of selected teams will be able to view this bookmark.",
135
+ "shareAllTeams": "Share with All My Teams",
136
+ "shareAllTeamsDescription": "Share with all teams you are a member of",
137
+ "shareWithUsers": "Share with Users",
138
+ "shareWithUsersDescription": "Select specific users to share with",
139
+ "sharedWith": "Shared with:",
140
+ "users": "users",
141
+ "shared": "Shared",
142
+ "sharedWithTeam": "Shared with team",
143
+ "sharedWithTeams": "Shared · {{count}} {{teams}}",
144
+ "teams": "teams",
145
+ "optional": "Optional",
146
+ "slugRequired": "Slug is required when forwarding is enabled",
147
+ "slugAlreadyExists": "Slug already exists. Slugs must be unique across all bookmarks.",
148
+ "aiSuggesting": "AI suggesting…",
149
+ "aiSuggestionsLabel": "Suggested:",
150
+ "searchEngineNote": "Want to quickly access your bookmarks from your browser's address bar?",
151
+ "searchEngineGuideLink": "Learn how to set up a custom search engine",
152
+ "viewMode": "View Mode",
153
+ "viewCard": "Card View",
154
+ "viewList": "List View",
155
+ "compactMode": "Compact Mode",
156
+ "sortBy": "Sort By",
157
+ "sortRecentlyAdded": "Recently Added",
158
+ "sortAlphabetical": "Alphabetical",
159
+ "sortMostUsed": "Most Used",
160
+ "sortRecentlyAccessed": "Recently Accessed",
161
+ "resetFilters": "Reset Filters",
162
+ "clearFilters": "Clear filters",
163
+ "clearAllFilters": "Clear all",
164
+ "showingXOfY": "Showing {{x}} of {{y}}",
165
+ "noMatches": "No matches",
166
+ "scopeAll": "All",
167
+ "scopeMine": "Mine",
168
+ "scopeShared": "Shared",
169
+ "pinned": "Pinned",
170
+ "clicks": "Clicks",
171
+ "lastOpened": "Last opened",
172
+ "never": "Never",
173
+ "deleteConfirmCannotUndo": "This cannot be undone.",
174
+ "forwardingPreview": "Forwarding URL",
175
+ "forwardingPreviewDescription": "This is the URL that will forward to your bookmark",
176
+ "bulkSelect": "Select Multiple",
177
+ "bulkActions": "Bulk Actions",
178
+ "bulkMoveToFolder": "Move to Folder",
179
+ "bulkAddTags": "Add Tags",
180
+ "bulkShare": "Share with Teams",
181
+ "bulkDelete": "Delete Selected",
182
+ "selectedCount": "{{count}} selected",
183
+ "selectAll": "Select All",
184
+ "deselectAll": "Deselect All",
185
+ "selectAllOnPageAndRemaining": "All {{pageCount}} on this page selected. Select all {{total}} bookmarks?",
186
+ "selectAllRemaining": "Select all {{total}}",
187
+ "allSelected": "All {{total}} selected",
188
+ "paginationShowing": "Showing {{from}}-{{to}} of {{total}}",
189
+ "paginationPrevious": "Previous",
190
+ "paginationNext": "Next",
191
+ "perPage": "Per page",
192
+ "pin": "Pin",
193
+ "unpinned": "Unpinned",
194
+ "favorites": "Favorites",
195
+ "import": "Import",
196
+ "export": "Export",
197
+ "importBrowser": "Import Browser Bookmarks",
198
+ "importJson": "Import JSON",
199
+ "importHtml": "Import HTML",
200
+ "exportJson": "Export as JSON",
201
+ "exportHtml": "Export as HTML",
202
+ "importDescription": "Import bookmarks from a JSON or HTML file. JSON files should contain an array of bookmark objects with title and url fields.",
203
+ "selectFile": "Select File",
204
+ "supportedFormats": "Supported formats: JSON, HTML (Netscape bookmark format)",
205
+ "importSuccess": "Imported {{success}} bookmark(s), {{failed}} failed"
206
+ },
207
+ "folders": {
208
+ "title": "Folders",
209
+ "create": "Create Folder",
210
+ "edit": "Edit Folder",
211
+ "delete": "Delete Folder",
212
+ "deleteFolder": "Delete Folder",
213
+ "name": "Name",
214
+ "folderName": "Folder Name",
215
+ "icon": "Icon",
216
+ "searchIcons": "Search icons by name...",
217
+ "noIcon": "No Icon",
218
+ "selectedIcon": "Selected Icon",
219
+ "clearIcon": "Clear Icon",
220
+ "showingPopular": "Showing {{count}} popular icons",
221
+ "showingAllIcons": "Showing all {{count}} icons",
222
+ "showAllIcons": "Show All Icons",
223
+ "showPopularOnly": "Show Popular Only",
224
+ "noIconsFound": "No icons found matching your search",
225
+ "useIcon": "Use Icon",
226
+ "typeIconName": "Type an icon name to use any Lucide icon",
227
+ "empty": "No folders yet",
228
+ "emptyDescription": "Create folders to group your bookmarks.",
229
+ "deleteConfirm": "Are you sure you want to delete this folder?",
230
+ "deleteConfirmWithName": "Are you sure you want to delete \"{{name}}\"?",
231
+ "sharedWith": "Shared with:",
232
+ "shareWithTeams": "Share with Teams",
233
+ "shareWithTeamsDescription": "Select teams to share this folder with. All bookmarks in this folder will be shared with selected teams.",
234
+ "shared": "Shared",
235
+ "viewCard": "Card View",
236
+ "viewList": "List View",
237
+ "compactMode": "Compact Mode",
238
+ "sortAlphabetical": "Alphabetical",
239
+ "sortRecentlyAdded": "Recently Added",
240
+ "clearFilters": "Clear filters",
241
+ "noMatchesDescription": "No folders match the current filters. Clear filters to see all."
242
+ },
243
+ "tags": {
244
+ "title": "Tags",
245
+ "create": "Create Tag",
246
+ "edit": "Edit Tag",
247
+ "delete": "Delete Tag",
248
+ "deleteTag": "Delete Tag",
249
+ "name": "Name",
250
+ "tagName": "Tag Name",
251
+ "empty": "No tags yet",
252
+ "emptyDescription": "Create tags to organize and filter your bookmarks.",
253
+ "deleteConfirm": "Are you sure you want to delete this tag?",
254
+ "deleteConfirmWithName": "Are you sure you want to delete \"{{name}}\"?",
255
+ "viewCard": "Card View",
256
+ "viewList": "List View",
257
+ "compactMode": "Compact Mode",
258
+ "sortAlphabetical": "Alphabetical",
259
+ "sortRecentlyAdded": "Recently Added",
260
+ "clearFilters": "Clear filters"
261
+ },
262
+ "profile": {
263
+ "title": "Profile",
264
+ "description": "Manage your account settings and preferences",
265
+ "signedInAs": "Signed in as",
266
+ "admin": "Admin",
267
+ "account": "Account",
268
+ "accountDescription": "Your account details and quick access.",
269
+ "accountInformation": "Account Information",
270
+ "preferencesDescription": "Language, theme, and display options.",
271
+ "developerApiTitle": "Developer / API Access",
272
+ "developerApiDescription": "Create and manage personal API tokens for REST API authentication.",
273
+ "advanced": "Advanced",
274
+ "noTokensEmpty": "No API tokens yet. Create one to use the REST API from scripts, CLI, or CI/CD.",
275
+ "manageQuickAccess": "Manage remembered slug choices",
276
+ "unsavedChanges": "Unsaved changes",
277
+ "preferences": "Preferences",
278
+ "userKey": "User key",
279
+ "userKeyDescription": "Your unique identifier for bookmark forwarding. Share this with others so they can access your shared bookmarks.",
280
+ "quickAccess": "Quick Access",
281
+ "quickAccessDescription": "Use /go/<slug> in your browser for quick access to bookmarks. Manage your remembered choices when multiple bookmarks share the same slug.",
282
+ "email": "Email",
283
+ "emailPlaceholder": "your@email.com",
284
+ "name": "Name",
285
+ "namePlaceholder": "Your name",
286
+ "language": "Language",
287
+ "theme": "Theme",
288
+ "themeAuto": "Auto",
289
+ "themeLight": "Light",
290
+ "themeDark": "Dark",
291
+ "save": "Save Settings",
292
+ "languageEnglish": "English",
293
+ "languageGerman": "Deutsch",
294
+ "languageFrench": "Français",
295
+ "languageSpanish": "Español",
296
+ "languageItalian": "Italiano",
297
+ "languagePortuguese": "Português",
298
+ "languageDutch": "Nederlands",
299
+ "languageRussian": "Русский",
300
+ "languageJapanese": "日本語",
301
+ "languageChinese": "中文",
302
+ "languagePolish": "Polski",
303
+ "emailManagedByOIDC": "Email is managed by your identity provider and cannot be changed here.",
304
+ "yourOrganizations": "Your organizations",
305
+ "current": "Current",
306
+ "switch": "Switch",
307
+ "orgSwitched": "Organization switched",
308
+ "apiAccess": "API Access",
309
+ "apiAccessDescription": "Create and manage personal API tokens for REST API authentication.",
310
+ "apiTokenWarning": "API tokens grant full access to your account. Store them securely and never share them.",
311
+ "createToken": "Create token",
312
+ "tokenName": "Token name",
313
+ "tokenNamePlaceholder": "e.g. CLI, CI/CD",
314
+ "tokenCreated": "Token created",
315
+ "tokenRevealWarning": "This token will not be shown again. Copy it now.",
316
+ "copyToken": "Copy token",
317
+ "revokeToken": "Revoke",
318
+ "revokeTokenConfirm": "Are you sure you want to revoke this token? It will stop working immediately.",
319
+ "lastUsed": "Last used",
320
+ "neverUsed": "Never used",
321
+ "createdAt": "Created",
322
+ "viewApiDocs": "View API documentation",
323
+ "noTokens": "No API tokens yet",
324
+ "noTokensDescription": "Create a token to authenticate with the REST API from scripts, CLI, or CI/CD.",
325
+ "yourTokens": "Your tokens",
326
+ "aiSuggestions": "AI suggestions",
327
+ "aiSuggestionsDescription": "Suggest title, tags, and slug when creating bookmarks"
328
+ },
329
+ "common": {
330
+ "loading": "Loading...",
331
+ "reload": "Reload",
332
+ "error": "An error occurred",
333
+ "notFoundOrNoAccess": "Not found or you don't have access",
334
+ "success": "Success",
335
+ "close": "Close",
336
+ "delete": "Delete",
337
+ "edit": "Edit",
338
+ "create": "Create",
339
+ "save": "Save",
340
+ "cancel": "Cancel",
341
+ "clearFilter": "Clear Filter",
342
+ "yes": "Yes",
343
+ "no": "No",
344
+ "view": "View",
345
+ "confirm": "Confirm",
346
+ "back": "Back",
347
+ "bookmark": "bookmark",
348
+ "bookmarks": "bookmarks",
349
+ "tag": "tag",
350
+ "tags": "tags",
351
+ "folder": "folder",
352
+ "folders": "folders",
353
+ "user": "user",
354
+ "users": "users",
355
+ "team": "team",
356
+ "teams": "teams",
357
+ "setting": "setting",
358
+ "settings": "settings",
359
+ "provider": "provider",
360
+ "scopeSharedWithMe": "Shared with me",
361
+ "scopeSharedByMe": "Shared by me",
362
+ "providers": "providers",
363
+ "search": "Search",
364
+ "searchPlaceholder": "Search bookmarks, folders, tags...",
365
+ "searchShortcut": "Ctrl+K",
366
+ "searchShortcutHint": "Search (Ctrl+K)",
367
+ "noResults": "No results found",
368
+ "copy": "Copy",
369
+ "copied": "Copied!",
370
+ "goTo": "Go to",
371
+ "open": "Open",
372
+ "remove": "Remove",
373
+ "actions": "Actions",
374
+ "navigation": "Navigation",
375
+ "quickActions": "Quick Actions",
376
+ "collapseSidebar": "Collapse sidebar",
377
+ "expandSidebar": "Expand sidebar"
378
+ },
379
+ "sharing": {
380
+ "shareBookmark": "Share bookmark",
381
+ "shareFolder": "Share folder",
382
+ "inviteDescription": "Invite people or share with a team.",
383
+ "peopleWithAccess": "People with access",
384
+ "addAccess": "Add access",
385
+ "people": "People",
386
+ "teams": "Teams",
387
+ "notSharedYet": "Not shared yet",
388
+ "emailNotAssociated": "This email is not associated with a SlugBase user yet.",
389
+ "removeAccess": "Remove access",
390
+ "add": "Add"
391
+ },
392
+ "plan": {
393
+ "limitBookmarks": "You've reached the Free plan limit ({{limit}} bookmarks). Upgrade to add more.",
394
+ "shareToTeam": "Sharing to teams is available on the Team plan.",
395
+ "folderSharing": "Folder sharing is available on the Team plan.",
396
+ "upgradeCta": "Upgrade",
397
+ "bookmarksUsed": "Bookmarks used: {{count}}/{{limit}}",
398
+ "importLimitWarning": "You can import up to {{remaining}} more bookmarks (Free plan limit: {{limit}}).",
399
+ "gracePeriodBanner": "You have {{count}} bookmarks (Free plan limit: {{limit}}). Delete bookmarks or upgrade before {{date}} to keep using SlugBase.",
400
+ "gracePeriodExpired": "Your grace period has ended. Delete bookmarks to get under {{limit}} or upgrade to continue."
401
+ },
402
+ "dashboard": {
403
+ "searchPlaceholder": "Search for a bookmark or navigate through SlugBase",
404
+ "bookmarksDescription": "Manage your bookmarks",
405
+ "foldersDescription": "Organize with folders",
406
+ "tagsDescription": "Tag your bookmarks",
407
+ "overview": "Overview",
408
+ "overviewSubtitle": "Quick access and recent activity",
409
+ "newBookmarkHint": "Add a link to save and open later",
410
+ "yourLibrary": "Your library",
411
+ "sharedWithYou": "Shared with you",
412
+ "totalBookmarks": "Total Bookmarks",
413
+ "totalFolders": "Total Folders",
414
+ "totalTags": "Total Tags",
415
+ "sharedBookmarks": "Shared Bookmarks",
416
+ "sharedFolders": "Shared Folders",
417
+ "recentBookmarks": "Recent Bookmarks",
418
+ "topTags": "Most Used Tags",
419
+ "noRecentBookmarks": "No bookmarks yet",
420
+ "noRecentBookmarksHint": "Create a bookmark to see it here.",
421
+ "noTags": "No tags yet",
422
+ "noTagsHint": "Tags appear when you tag bookmarks.",
423
+ "goToBookmarks": "Go to Bookmarks",
424
+ "editBookmark": "Edit bookmark",
425
+ "openBookmark": "Open link",
426
+ "copyUrl": "Copy link",
427
+ "deleteBookmark": "Delete bookmark",
428
+ "shareBookmark": "Share",
429
+ "lastOpened": "Last opened {{time}}",
430
+ "filterByTagHint": "Click to filter bookmarks by this tag",
431
+ "tagBookmarkCount": "{{count}} bookmarks",
432
+ "denseView": "Dense view",
433
+ "createFolder": "Create Folder",
434
+ "createTag": "Create Tag",
435
+ "quickAccess": "Quick access",
436
+ "pinned": "Pinned",
437
+ "noPinnedBookmarks": "No pinned bookmarks",
438
+ "pinFromBookmarks": "Pin bookmarks from the Bookmarks page to see them here.",
439
+ "pinFromBookmarksLink": "Go to Bookmarks",
440
+ "viewAll": "View all",
441
+ "noQuickAccessBookmarks": "No bookmarks with shortcuts yet",
442
+ "noQuickAccessBookmarksHint": "Add a slug to a bookmark to see it here and use go/slug in your browser.",
443
+ "statsBookmarks": "bookmarks",
444
+ "statsFolders": "folders",
445
+ "statsTags": "tags",
446
+ "proTipBody": "Pro tip: Set up SlugBase as a custom search engine in your browser, then type go github directly in your URL bar to open bookmarks instantly.",
447
+ "proTipLink": "Set up search engine",
448
+ "dismiss": "Dismiss",
449
+ "onboardingTitle": "Get started",
450
+ "onboardingImport": "Import browser bookmarks",
451
+ "onboardingSearchEngine": "Set up browser search engine shortcut",
452
+ "onboardingFolder": "Create your first folder",
453
+ "onboardingTag": "Tag a bookmark",
454
+ "onboardingDismiss": "Dismiss checklist"
455
+ },
456
+ "apiDocs": {
457
+ "title": "API Documentation",
458
+ "description": "Complete API reference for SlugBase. All endpoints require authentication via JWT tokens except where noted."
459
+ },
460
+ "admin": {
461
+ "title": "Admin",
462
+ "description": "Manage users, groups, OIDC providers, and system settings",
463
+ "users": "Users",
464
+ "teams": "Teams",
465
+ "userGroups": "Teams",
466
+ "oidcProviders": "OIDC Providers",
467
+ "settings": "Settings",
468
+ "addUser": "Add User",
469
+ "editUser": "Edit User",
470
+ "addTeam": "Add Team",
471
+ "editTeam": "Edit Team",
472
+ "addGroup": "Add Team",
473
+ "editGroup": "Edit Team",
474
+ "addProvider": "Add Provider",
475
+ "editProvider": "Edit Provider",
476
+ "addSetting": "Add Setting",
477
+ "admin": "Admin",
478
+ "user": "User",
479
+ "oidcUser": "OIDC User",
480
+ "teamName": "Team Name",
481
+ "groupName": "Team Name",
482
+ "description": "Description",
483
+ "providerKey": "Provider Key",
484
+ "issuerUrl": "Issuer URL",
485
+ "clientId": "Client ID",
486
+ "clientIdRequired": "Client ID is required when creating a new provider",
487
+ "clientSecret": "Client Secret",
488
+ "scopes": "Scopes",
489
+ "callbackUrl": "Callback URL",
490
+ "customEndpoints": "Custom OIDC Endpoints",
491
+ "customEndpointsDescription": "Override default OIDC endpoint paths. Leave empty to use standard paths based on issuer URL.",
492
+ "authorizationUrl": "Authorization URL",
493
+ "tokenUrl": "Token URL",
494
+ "userinfoUrl": "UserInfo URL",
495
+ "autoCreate": "Auto Create Users",
496
+ "defaultRole": "Default Role",
497
+ "settingKey": "Key",
498
+ "settingValue": "Value",
499
+ "leaveBlank": "Leave blank to keep current",
500
+ "leaveBlankToKeep": "Leave blank to keep current value",
501
+ "confirmDeleteUser": "Are you sure you want to delete this user?",
502
+ "confirmDeleteTeam": "Are you sure you want to delete this team?",
503
+ "confirmDeleteGroup": "Are you sure you want to delete this team?",
504
+ "confirmDeleteProvider": "Are you sure you want to delete this provider?",
505
+ "confirmDeleteSetting": "Are you sure you want to delete this setting?",
506
+ "manageMembers": "Manage Members",
507
+ "currentMembers": "Current Members",
508
+ "currentTeams": "Current Teams",
509
+ "addMembers": "Add Members",
510
+ "addTeams": "Add Teams",
511
+ "noMembers": "No members in this team",
512
+ "noTeams": "No teams assigned to this user",
513
+ "noTeamsYet": "No teams yet",
514
+ "add": "Add",
515
+ "members": "Members",
516
+ "manageTeams": "Manage Teams",
517
+ "searchTeams": "Search teams by name or description...",
518
+ "createUserWith": "Create user with",
519
+ "sendInviteEmail": "Send invite email",
520
+ "setPassword": "Set password",
521
+ "inviteSent": "Invite sent",
522
+ "userCreatedInviteSent": "User created; invite sent.",
523
+ "userCreatedInviteNotSent": "User created; invite could not be sent (check SMTP).",
524
+ "searchUsers": "Search users by name or email...",
525
+ "noTeamsAvailable": "All teams are already assigned",
526
+ "noUsersAvailable": "All users are already members",
527
+ "noSearchResults": "No results match your search",
528
+ "apiDocsNote": "API documentation is available as a standalone page",
529
+ "viewApiDocs": "View API Documentation",
530
+ "noUserEmailAvailable": "No user email available",
531
+ "manageTeamsTitle": "Manage Teams - {{userName}}",
532
+ "manageMembersTitle": "Manage Members - {{teamName}}",
533
+ "billing": "Billing & Plan",
534
+ "billingCurrentPlan": "Current plan",
535
+ "billingUpgrade": "Upgrade",
536
+ "billingManageSubscription": "Manage subscription",
537
+ "billingOrgMembers": "Organization members",
538
+ "billingSeatsUsed": "{{count}} of {{total}} seats used",
539
+ "seatsUsed": "{{used}} of {{total}} seats",
540
+ "billingInviteMember": "Invite member",
541
+ "billingUpgradeToInvite": "Upgrade to Team plan to invite more members.",
542
+ "billingTeamAtLimit": "You've reached the 5-member limit. Additional seats are €1/user/month.",
543
+ "billingNotConfigured": "Billing is not configured. Contact support to enable upgrades.",
544
+ "billingPersonalMonthly": "Personal (monthly)",
545
+ "billingPersonalYearly": "Personal (yearly)",
546
+ "billingTeamMonthly": "Team (monthly)",
547
+ "billingTeamYearly": "Team (yearly)",
548
+ "billingEarlySupporter": "Early Supporter (one-time)",
549
+ "billingInvoices": "Invoice history",
550
+ "billingInvoicesEmpty": "No invoices yet",
551
+ "billingInvoiceDownload": "Download PDF",
552
+ "billingInvoiceView": "View",
553
+ "billingInvoiceDate": "Date",
554
+ "billingInvoiceNumber": "Invoice",
555
+ "billingInvoiceAmount": "Amount",
556
+ "billingInvoiceStatus": "Status",
557
+ "ai": {
558
+ "nav": "AI Suggestions",
559
+ "title": "AI Bookmark Suggestions",
560
+ "description": "Configure AI to suggest title, tags, and slug when creating bookmarks. Uses OpenAI GPT-4o-mini.",
561
+ "enabled": "Enable AI suggestions",
562
+ "provider": "Provider",
563
+ "providerOpenAI": "OpenAI",
564
+ "apiKey": "API Key",
565
+ "apiKeyPlaceholder": "Enter new key to change",
566
+ "apiKeyHint": "Get your API key from platform.openai.com",
567
+ "apiKeyChangeHint": "Leave blank to keep current key",
568
+ "model": "Model",
569
+ "modelPlaceholderNoKey": "Set and save API key to load models",
570
+ "modelPlaceholderLoading": "Loading models…",
571
+ "modelsLoadError": "Could not load models. Check your API key and try again.",
572
+ "orgTitle": "AI Suggestions",
573
+ "orgDescription": "Enable AI to suggest title, tags, and slug when creating bookmarks. Users can disable in their profile.",
574
+ "orgEnabled": "Enable AI suggestions for organization"
575
+ }
576
+ },
577
+ "passwordReset": {
578
+ "title": "Reset Password",
579
+ "description": "Enter your email address to receive a password reset link",
580
+ "email": "Email",
581
+ "emailPlaceholder": "your@email.com",
582
+ "requestReset": "Send Reset Link",
583
+ "resetToken": "Reset Token",
584
+ "newPassword": "New Password",
585
+ "confirmPassword": "Confirm Password",
586
+ "resetPassword": "Reset Password",
587
+ "requestSent": "If an account with this email exists, a password reset link has been sent.",
588
+ "resetSuccess": "Password reset successfully! You can now log in with your new password.",
589
+ "invalidToken": "Invalid or expired reset token",
590
+ "passwordMismatch": "Passwords do not match",
591
+ "backToLogin": "Back to Login"
592
+ },
593
+ "emailVerification": {
594
+ "verifying": "Verifying Email",
595
+ "verifyingDescription": "Please wait while we verify your email address...",
596
+ "success": "Email Verified",
597
+ "successDescription": "Your email address has been successfully changed to {{email}}.",
598
+ "error": "Verification Failed",
599
+ "errorDescription": "The verification link is invalid or has expired.",
600
+ "tokenRequired": "Verification token is required",
601
+ "invalidToken": "Invalid or expired verification token",
602
+ "invalidLink": "This verification link is invalid or has expired.",
603
+ "alreadyVerified": "This account has already been verified. You can log in.",
604
+ "verifyFailed": "Failed to verify token",
605
+ "confirmFailed": "Failed to confirm email verification",
606
+ "redirecting": "Redirecting to profile...",
607
+ "backToProfile": "Back to Profile",
608
+ "emailSent": "Verification email sent! Please check your new email address.",
609
+ "pendingTitle": "Email Verification Pending",
610
+ "pendingDescription": "A verification email has been sent to {{email}}. Please check your inbox and click the verification link to complete the change.",
611
+ "signupSuccess": "Email verified. You can log in.",
612
+ "signupSuccessDescription": "Your account is verified. Redirecting to login...",
613
+ "resendTitle": "Resend Verification Email",
614
+ "resendDescription": "Your verification link has expired. You can correct your email if you had a typo, then we'll send a new verification link.",
615
+ "resendNoTokenDescription": "Enter the email you used to sign up. We'll send a new verification link.",
616
+ "editEmailLabel": "Email address",
617
+ "resendButton": "Resend verification email",
618
+ "resendSuccess": "Verification email sent",
619
+ "resendSuccessDescription": "Check your inbox for the new verification link. It may take a few minutes to arrive."
620
+ },
621
+ "smtp": {
622
+ "title": "SMTP Email Configuration",
623
+ "description": "Configure SMTP settings for sending emails (e.g., password reset emails)",
624
+ "enabled": "Enable SMTP",
625
+ "host": "SMTP Host",
626
+ "hostPlaceholder": "smtp.gmail.com",
627
+ "port": "Port",
628
+ "portPlaceholder": "587",
629
+ "secure": "Use TLS/SSL",
630
+ "user": "Username/Email",
631
+ "userPlaceholder": "your-email@gmail.com",
632
+ "password": "Password",
633
+ "passwordPlaceholder": "Enter password to set or change",
634
+ "passwordChangeHint": "Enter a new password to change it, or leave empty to keep current password",
635
+ "from": "From Email",
636
+ "fromPlaceholder": "noreply@example.com",
637
+ "fromName": "From Name",
638
+ "fromNamePlaceholder": "SlugBase",
639
+ "testEmail": "Test Email",
640
+ "testEmailPlaceholder": "test@example.com",
641
+ "sendTest": "Send Test Email",
642
+ "testSent": "Test email sent successfully!",
643
+ "testFailed": "Failed to send test email",
644
+ "save": "Save SMTP Settings"
645
+ },
646
+ "shared": {
647
+ "title": "Shared",
648
+ "description": "Bookmarks and folders shared with you",
649
+ "bookmarks": "Bookmarks",
650
+ "folders": "Folders",
651
+ "noBookmarks": "No shared bookmarks yet",
652
+ "noFolders": "No shared folders yet",
653
+ "unknownUser": "Unknown User",
654
+ "sharedWithYou": "Shared with you"
655
+ },
656
+ "goPreferences": {
657
+ "title": "Remembered Slug Choices",
658
+ "description": "Manage your saved preferences for /go slug resolution. When multiple bookmarks share the same slug, your choice here determines which one opens.",
659
+ "empty": "No saved preferences. Visit /go/<slug> when multiple bookmarks match to save a preference."
660
+ },
661
+ "searchEngineGuide": {
662
+ "title": "Custom Search Engine Setup Guide",
663
+ "description": "Learn how to set up a custom search engine in your browser to quickly access your bookmarks",
664
+ "howItWorks": "How It Works",
665
+ "howItWorksDescription": "By setting up a custom search engine, you can type a keyword (like 'go') followed by a bookmark slug in your browser's address bar to instantly navigate to that bookmark.",
666
+ "yourSearchUrl": "Your Search URL",
667
+ "urlNote": "Use this URL template when setting up your custom search engine. The %s will be replaced with your bookmark slug.",
668
+ "chromiumTitle": "Chromium-based Browsers (Chrome, Edge, Brave, etc.)",
669
+ "chromiumDescription": "Follow these steps to add SlugBase as a custom search engine:",
670
+ "chromiumStep1": "Open your browser settings",
671
+ "chromiumStep2": "Navigate to 'Search engine' or 'Search' settings",
672
+ "chromiumStep3": "Click 'Manage search engines' or 'Add'",
673
+ "chromiumStep4": "Fill in the form with:",
674
+ "chromiumStep4a": "Name: SlugBase (or any name you prefer)",
675
+ "chromiumStep4b": "Keyword: go (or any keyword you prefer)",
676
+ "chromiumStep4c": "URL: Use the search URL shown above",
677
+ "chromiumStep5": "Click 'Add' or 'Save' to complete the setup",
678
+ "firefoxTitle": "Firefox",
679
+ "firefoxDescription": "Follow these steps to add SlugBase as a custom search engine:",
680
+ "firefoxStep1": "Open Firefox settings",
681
+ "firefoxStep2": "Navigate to 'Search' in the settings menu",
682
+ "firefoxStep3": "Scroll down and click 'Add' under 'One-Click Search Engines'",
683
+ "firefoxStep4": "Fill in the form with:",
684
+ "firefoxStep4a": "Name: SlugBase (or any name you prefer)",
685
+ "firefoxStep4b": "Keyword: go (or any keyword you prefer)",
686
+ "firefoxStep4c": "URL: Use the search URL shown above",
687
+ "firefoxStep5": "Click 'Add' to complete the setup",
688
+ "usageExample": "Usage Example",
689
+ "usageStep1": "After setup, simply type in your browser's address bar:",
690
+ "usageStep2": "Press Enter, and you'll be redirected to the bookmark with the slug 'test'",
691
+ "usageNote": "Replace 'test' with any bookmark slug you've created in SlugBase!"
692
+ },
693
+ "landing": {
694
+ "heroHeadline": "The structured bookmark system for power users and teams.",
695
+ "heroSubheadline": "Find links fast. Reduce chaos. Keep control. Folders, tags, and personal shortcuts—without the mess.",
696
+ "heroBadges": "Open-source • Self-hosted or Cloud • Team-ready • No credit card required",
697
+ "ctaStartFree": "Start for free",
698
+ "ctaSignUp": "Sign up",
699
+ "ctaLogin": "Log in",
700
+ "exampleSnippet": "yourkey/gh yourkey/docs yourkey/vite yourkey/notion yourkey/figma",
701
+ "proofOpenSource": "Open Source",
702
+ "proofApiDocs": "API docs available",
703
+ "trustOpenSource": "Open source on GitHub",
704
+ "trustDocs": "Docs",
705
+ "trustActiveDev": "Active development",
706
+ "trustApiDocs": "API documentation available",
707
+ "howItWorksTitle": "How it works",
708
+ "howItWorksStep1": "Save once",
709
+ "howItWorksStep1Detail": "Organize with folders and tags.",
710
+ "howItWorksStep2": "Create your shortcut",
711
+ "howItWorksStep2Detail": "Your key/slug forwards to your bookmark.",
712
+ "howItWorksStep3": "Use anywhere",
713
+ "howItWorksStep3Detail": "Browser bar, phone, or shared with teams.",
714
+ "problemTitle": "Why browser bookmarks aren't enough",
715
+ "problem1": "Hard to share",
716
+ "problem2": "No structure across devices and contexts",
717
+ "problem3": "No shortcut or URL system",
718
+ "solutionTitle": "SlugBase fixes this",
719
+ "solution1": "Share with teams and individuals",
720
+ "solution2": "Same structure everywhere",
721
+ "solution3": "Personal shortcut URLs",
722
+ "featuresTitle": "Why SlugBase?",
723
+ "feature1Title": "Find faster",
724
+ "feature1Desc": "Never wonder where you saved that link again.",
725
+ "feature2Title": "Share reliably",
726
+ "feature2Desc": "Type two words. Get exactly what you need.",
727
+ "feature3Title": "Control your stack",
728
+ "feature3Desc": "You own your data and infrastructure.",
729
+ "featureAiTitle": "AI-powered title, tag and slug suggestions",
730
+ "featureAiDesc": "Paid plans include AI suggestions when adding bookmarks—paste a URL and get smart title, tag, and slug suggestions instantly.",
731
+ "footerPricing": "Pricing",
732
+ "footerContact": "Contact",
733
+ "footerDocs": "Documentation",
734
+ "footerApp": "App",
735
+ "footerCopyright": "© 2024–2025 SlugBase",
736
+ "pricingTitle": "Simple pricing",
737
+ "pricingSubtitle": "Start free. Upgrade when you need more.",
738
+ "pricingUpgradeHint": "When to upgrade?",
739
+ "pricingUpgradeBenefits": "Unlimited bookmarks, forwarding URLs, backups, and email support.",
740
+ "viewAllPlans": "View all plans",
741
+ "pricingTeaser": "Start free. Upgrade when structure becomes essential.",
742
+ "useCaseTitle": "Built for modern workflows",
743
+ "useCaseDevTitle": "Developers juggling docs, dashboards, repos daily",
744
+ "useCaseDevDesc": "Instant access to docs, dashboards, and repos. Personal shortcut system via browser keyword.",
745
+ "useCaseProductTitle": "Product & Ops teams sharing internal tools",
746
+ "useCaseProductDesc": "Shared structured link directories. Avoid Slack link chaos.",
747
+ "useCaseFounderTitle": "Founders organizing research and vendor links",
748
+ "useCaseFounderDesc": "Organize everything once. Access from anywhere.",
749
+ "useCaseSelfHostTitle": "Self-hosters who want control",
750
+ "useCaseSelfHostDesc": "Full control over your data. Deploy on your own infrastructure."
751
+ },
752
+ "pricing": {
753
+ "title": "Pricing",
754
+ "subtitle": "Simple plans for individuals and teams.",
755
+ "positioning": "Simple plans for individuals and teams.",
756
+ "docsPlans": "For full plan details and limits, see the documentation.",
757
+ "billingMonthly": "Monthly",
758
+ "billingYearly": "Yearly",
759
+ "mostPopular": "Most popular",
760
+ "free": "Free",
761
+ "freePrice": "€0",
762
+ "freeUsers": "1 user",
763
+ "freeWorkspace": "1 workspace",
764
+ "freeBookmarks": "50 bookmarks",
765
+ "freeFeatures": "Core features",
766
+ "freeSupport": "Community support",
767
+ "freeValue1": "Up to 50 bookmarks with folders, tags, and search.",
768
+ "freeValue2": "Community support",
769
+ "freeValue3": "Core features",
770
+ "personal": "Personal",
771
+ "personalPrice": "€3/mo",
772
+ "personalYearly": "or €30/year",
773
+ "personalUsers": "1 user",
774
+ "personalBookmarks": "Unlimited bookmarks",
775
+ "personalFeatures": "Backups, email support",
776
+ "personalUpdates": "Priority updates",
777
+ "personalValue1": "Unlimited bookmarks",
778
+ "personalValue2": "Personal forwarding URLs",
779
+ "personalValue3": "Backups and priority support",
780
+ "personalValue4": "AI-powered title, tag and slug suggestions",
781
+ "team": "Team",
782
+ "teamPrice": "€9/mo",
783
+ "teamPriceYearly": "€90/yr",
784
+ "teamUsers": "5 users included",
785
+ "teamExtraUser": "+€1 per additional user/mo",
786
+ "teamExtraUserYearly": "+€10 per additional user/yr",
787
+ "teamFeatures": "Team sharing, roles, shared folders",
788
+ "teamAudit": "Light audit log",
789
+ "teamValue1": "Shared folders",
790
+ "teamValue2": "Roles & permissions",
791
+ "teamValue3": "Light audit log. Designed for collaboration.",
792
+ "teamValue4": "AI-powered title, tag and slug suggestions",
793
+ "earlySupporter": "Early Supporter",
794
+ "earlySupporterLifetime": "Lifetime",
795
+ "earlySupporterPrice": "€69 one-time",
796
+ "earlySupporterSeats": "Limited seats",
797
+ "earlySupporterIncludes": "Lifetime Personal plan",
798
+ "earlySupporterValue4": "AI auto-suggestions included",
799
+ "earlySupporterHelp": "Help shape SlugBase",
800
+ "earlySupporterNote": "No Team, no SLA. Billing integration coming soon.",
801
+ "ctaSignUp": "Sign up",
802
+ "ctaStartFree": "Start for free",
803
+ "ctaChoosePlan": "Choose plan",
804
+ "ctaContact": "Contact us",
805
+ "ctaBecomeEarlySupporter": "Become an early supporter",
806
+ "comparisonTitle": "What you get",
807
+ "comparisonFree": "Free: Core features, 50 bookmarks.",
808
+ "comparisonPersonal": "Personal: Unlimited bookmarks, sharing to individuals, backups, AI suggestions.",
809
+ "comparisonTeam": "Team: 5 seats included, + per additional seat. Team sharing, roles, audit log, AI suggestions.",
810
+ "comparisonEarlySupporter": "Early Supporter: Lifetime Personal, limited slots."
811
+ },
812
+ "contact": {
813
+ "title": "Contact",
814
+ "subtitle": "Get in touch with us.",
815
+ "trustParagraph": "Questions about self-hosting, teams, or billing? We usually reply within a few business days.",
816
+ "linksDocs": "Docs",
817
+ "linksGitHub": "GitHub",
818
+ "linksPricing": "Pricing",
819
+ "linksDemo": "Try SlugBase",
820
+ "name": "Name",
821
+ "email": "Email",
822
+ "message": "Message",
823
+ "send": "Send",
824
+ "success": "Message sent. We'll get back to you soon.",
825
+ "error": "Something went wrong. Please try again or email us directly.",
826
+ "privacyNotice": "By submitting, you agree to your data being processed for this request in accordance with our Privacy Policy."
827
+ },
828
+ "legal": {
829
+ "imprintTitle": "Imprint",
830
+ "imprintProviderTitle": "Service provider (ECG §5)",
831
+ "imprintChamber": "Member of {{chamber}}",
832
+ "imprintCourtTitle": "Competent court",
833
+ "imprintCourtBody": "Place of jurisdiction for disputes: Landesgericht Linz, Austria. Austrian law applies.",
834
+ "imprintOdrTitle": "EU Online Dispute Resolution",
835
+ "imprintOdrBody": "The European Commission provides a platform for online dispute resolution (ODR). Consumers may use it at",
836
+ "imprintAppliesTo": "The information above applies to both consumer and business use of our services.",
837
+ "uid": "UID",
838
+ "backToHome": "Back to home",
839
+ "termsTitle": "Terms and Conditions",
840
+ "termsScopeTitle": "Scope",
841
+ "termsScopeBody": "These Terms and Conditions (\"Terms\") apply to your use of SlugBase Cloud (the \"Service\") at slugbase.app, operated by the provider stated in the Imprint. By signing up or using the Service you agree to these Terms. If you are a consumer (Verbraucher), mandatory statutory rights remain unaffected.",
842
+ "termsScopeB2BBody": "If you use the Service in the course of your trade, business, or profession (\"Business user\"), you are not a Consumer; the sections that refer specifically to Consumers do not apply to you.",
843
+ "termsB2BBindingBody": "If you are a Business user, you represent that you have authority to bind your organization, and by using the Service or creating an account on its behalf you agree to these Terms on its behalf.",
844
+ "termsServiceTitle": "Description of the Service",
845
+ "termsServiceBody": "SlugBase Cloud is a hosted bookmark management and link-forwarding service. It allows you to save, organize, and share bookmarks; create folders and tags; and optionally expose bookmarks as short redirect URLs (link forwarding). The Service is provided in the form of software as a service (SaaS) at https://slugbase.app.",
846
+ "termsPlansTitle": "Plans",
847
+ "termsPlansBody": "SlugBase Cloud offers several plans: Free (limited usage for trying the Service), Personal (for individual users with more capacity), Team (for teams with shared folders and collaboration), and Early Supporter Lifetime (one-time purchase). Current plan details, limits, and pricing are shown on the Pricing page and in the application.",
848
+ "termsUserContentTitle": "User content and ownership",
849
+ "termsUserContentBody": "You retain all rights to bookmarks and other content you store in the Service. SlugBase receives only a limited license to process, store, and transmit your content solely to provide the Service. SlugBase does not review, endorse, or control the content of stored URLs. You are responsible for ensuring that the content you store, share, or forward is lawful.",
850
+ "termsAccountTitle": "Account and eligibility",
851
+ "termsAccountBody": "You must provide accurate information when creating an account and keep it up to date. You are responsible for keeping your credentials secure. The Service is intended for lawful use by individuals and teams. You must be at least 16 years old to use the Service.",
852
+ "termsUseTitle": "Acceptable use",
853
+ "termsUseBody": "You may use SlugBase to save, organize, and share bookmarks and to use short links (forwarding). You must not use the Service for:",
854
+ "termsUseProhibited1": "Phishing, spam campaigns, deceptive redirects, or misleading users",
855
+ "termsUseProhibited2": "Distributing malware or harmful software",
856
+ "termsUseProhibited3": "Infringing third-party rights (copyright, trademark, privacy, etc.)",
857
+ "termsUseProhibited4": "Harassment, abuse, or illegal content",
858
+ "termsUseProhibited5": "Attempts to bypass security measures or rate limits",
859
+ "termsUseProhibited6": "Hosting or distributing illegal content via forwarding links",
860
+ "termsUseAction": "We may investigate suspected abuse and take action, including suspending forwarding, removing specific redirects, or terminating accounts.",
861
+ "termsShortLinksTitle": "Short links and forwarding",
862
+ "termsShortLinksBody": "Short links (e.g. /go/your-slug) forward to the URL you set. Forwarding is optional and user-controlled. SlugBase is not responsible for the content of destination pages; you must ensure that destination URLs are lawful and not misleading. We may disable forwarding, remove specific redirects, or suspend accounts for abuse. Report abuse to hello@slugbase.app or via the Contact page.",
863
+ "termsAvailabilityTitle": "Availability and maintenance",
864
+ "termsAvailabilityBody": "The Service may be unavailable due to maintenance, updates, or outages. There is no guaranteed uptime or SLA unless explicitly agreed in writing. Planned maintenance may occur and will be communicated where practicable. We are not liable for interruptions, performance limits, or outages of third-party providers (e.g. hosting, database, payment processing).",
865
+ "termsDataLossTitle": "Data loss and backups",
866
+ "termsDataLossBody": "We do not guarantee permanent availability of stored content. You are responsible for your own exports and backups. We make reasonable efforts to maintain backups but do not guarantee restoration in case of data loss.",
867
+ "termsLifetimeTitle": "Early Supporter Lifetime plan",
868
+ "termsLifetimeBody": "\"Lifetime\" refers to the lifetime of the SlugBase Cloud service, not your lifetime. Plan benefits apply while the service is offered. If the service is discontinued, we are not obliged to continue providing it; no refunds apply except where required by law. There is no entitlement to feature parity with future plans, no entitlement to future features, and we may change plan structures and pricing for new offerings; existing lifetime benefits remain as described.",
869
+ "termsBillingTitle": "Billing and payment",
870
+ "termsBillingBody": "Paid plans are billed in advance (monthly or annually, as applicable). Payment is due upon invoicing. For the Early Supporter Lifetime plan, payment is one-time. Payments are processed by Stripe. Price changes will be communicated in advance and apply from the next billing period.",
871
+ "termsThirdPartyTitle": "Third-party services",
872
+ "termsThirdPartyBody": "SlugBase Cloud relies on the following third-party services to operate the Service: (1) Fly.io: Application hosting (EU region only). (2) Neon: PostgreSQL database hosting (EU region). (3) Stripe: Payment processing for subscriptions and one-time purchases. (4) All Quiet (EU): Incident and alerting (if applicable). (5) Sentry: Error tracking and monitoring (planned for implementation). (6) OpenAI: AI-powered suggestions for titles, tags, and slugs on paid plans (when enabled by the user; URLs are sent to generate suggestions). Some services may be based outside the EEA.",
873
+ "termsBetaTitle": "Beta and experimental features",
874
+ "termsBetaBody": "Beta or experimental features may change or be discontinued. They are provided \"as is\". Do not rely on them for critical use.",
875
+ "termsCancellationTitle": "Cancellation and renewal",
876
+ "termsCancellationBody": "You may cancel your subscription at any time. Cancellation takes effect at the end of the current billing period. Until then, you retain full access to the Service. There is no minimum contract term. For subscriptions that renew automatically, you may cancel before each renewal date to avoid being charged for the next period. Cancellation can be done in your account settings or by contacting us.",
877
+ "termsWithdrawalTitle": "Right of withdrawal (consumers)",
878
+ "termsWithdrawalBody": "If you are a consumer (Verbraucher) within the meaning of Austrian law, you have a 14-day right of withdrawal from the contract without giving reasons. The withdrawal period begins on the day of contract conclusion. To exercise your right, inform us of your decision (e.g. by email to hello@slugbase.app). If you have requested the start of the Service during the withdrawal period, you expressly agree that performance begins before the withdrawal period ends and acknowledge that you will lose your right of withdrawal once the Service has been fully performed.",
879
+ "termsWithdrawalB2BNote": "This right of withdrawal applies only to Consumers; Business users have no statutory right of withdrawal under these Terms.",
880
+ "termsIPTitle": "Intellectual property",
881
+ "termsIPBody": "The SlugBase software, service, UI, branding, and documentation are owned by the provider or licensors. You receive a limited right to use the Service during your subscription term. You must not copy, resell, or attempt to reverse engineer the Service beyond reasonable interoperability needs.",
882
+ "termsIndemnifyTitle": "Indemnification",
883
+ "termsIndemnifyBody": "You will indemnify and hold harmless the provider against third-party claims arising from your content, misuse of the Service, illegal activity, or forwarding links (including phishing, spam, or infringement). This applies to the extent permitted by law.",
884
+ "termsLiabilityTitle": "Limitation of liability",
885
+ "termsLiabilityBody": "To the extent permitted by law, the Service is provided \"as is\". We are not liable for indirect, incidental, or consequential damages, lost profits, or data loss, except in cases of intent or gross negligence, or where liability is mandatory under applicable law (e.g. product liability, personal injury). Mandatory statutory liability for consumers remains unaffected. Our liability is limited to the amount of fees paid by you in the 12 months preceding the claim, where legally valid.",
886
+ "termsLiabilityB2BNote": "For Business users, the liability limits and exclusions in these Terms apply to the full extent permitted by law.",
887
+ "termsTerminationTitle": "Suspension and termination by us",
888
+ "termsTerminationBody": "We may suspend or terminate your account immediately if you materially breach these Terms, use the Service illegally, or fail to pay amounts due. We will give you reasonable notice where possible. Upon termination, your right to use the Service ends. You may export your data before or upon termination. Data is deleted in line with our Privacy Policy (typically within 30 days). We retain data as required by law.",
889
+ "termsChangesTitle": "Changes to Terms",
890
+ "termsChangesBody": "We may update these Terms from time to time. Material changes will be communicated via the Service or by email. Continued use after the effective date of changes indicates acceptance. If you disagree with the changes, you may cancel your subscription.",
891
+ "termsForceMajeureTitle": "Force majeure",
892
+ "termsForceMajeureBody": "We are not liable for failure or delay in performing our obligations due to events beyond our reasonable control (e.g. force majeure, natural disasters, war, pandemic, strikes, third-party or critical infrastructure outages).",
893
+ "termsLawTitle": "Governing law",
894
+ "termsLawBody": "To the extent permitted by law, these terms are governed by the laws of Austria. Any disputes shall be subject to the competent courts in Austria.",
895
+ "termsSeverabilityTitle": "Severability",
896
+ "termsSeverabilityBody": "If any provision of these Terms is invalid or unenforceable, the remaining provisions shall remain in force.",
897
+ "termsContactTitle": "Contact",
898
+ "termsContactBody": "For questions about these terms, contact us at hello@slugbase.app or via the address in the Imprint.",
899
+ "privacyTitle": "Privacy Policy",
900
+ "privacyScopeTitle": "Scope",
901
+ "privacyScopeBody": "This Privacy Policy applies to SlugBase Cloud at https://slugbase.app. It describes how we process your personal data when you use the hosted SaaS service. It does not apply if you self-host SlugBase; in that case, you are the data controller. This policy is based on the EU General Data Protection Regulation (GDPR) and the Austrian Data Protection Act (DSG).",
902
+ "privacyB2BTitle": "Business users (B2B)",
903
+ "privacyB2BBody": "When the Service is used in a professional or business capacity (e.g. on behalf of a company or organization), that organization may be the data controller for personal data processed in the context of the Service, and SlugBase acts as processor for such processing. A Data Processing Agreement (DPA) is available on request (e.g. hello@slugbase.app).",
904
+ "privacyControllerTitle": "Controller",
905
+ "privacyControllerBody": "The controller for data processing is Guggernbichler Michael David, Linzer Str. 17, 4100 Ottensheim, Austria. Contact: hello@slugbase.app (see Imprint).",
906
+ "privacyDataTitle": "Data we process",
907
+ "privacyDataBody": "We process: (1) Account data: email, name, password (stored as hash), and, if you use OIDC, the provider identifier. (2) Content data: bookmarks (URLs, titles, slugs), folders, tags, and sharing settings. (3) Usage data: session tokens, IP addresses for security, access logs, and bookmark access counts. (4) Contact data: if you use the contact form, we process name, email, and message. We do not sell your data or use it for advertising.",
908
+ "privacyRecipientsTitle": "Recipients",
909
+ "privacyRecipientsBody": "Data is processed on our infrastructure and by service providers necessary to operate the service. We do not share your data with third parties for their own purposes.",
910
+ "privacyProcessorsTitle": "Processors and service providers",
911
+ "privacyProcessorsBody": "We use the following processors: (1) Fly.io: Application hosting (EU region only). (2) Neon: PostgreSQL database hosting (EU region). (3) Stripe: Payment processing; payment card data is handled by Stripe, we do not store card details. (4) All Quiet (EU): Incident and alerting (if applicable). (5) Sentry: Error tracking and monitoring (planned for implementation). (6) OpenAI: AI-powered suggestions for titles, tags, and slugs on paid plans (see \"AI suggestions\" section). Some processors may be based outside the EEA. Data Processing Agreements (DPAs) are in place where required by law.",
912
+ "privacyAITitle": "AI suggestions (OpenAI)",
913
+ "privacyAIBody": "When the AI feature is enabled, only the sanitized URL you provide and optionally fetched page titles and descriptions (meta tags) are used for suggestion generation. SlugBase does not crawl or scrape page content. AI suggestions are optional and user-controlled (feature toggle); saving bookmarks does not depend on suggestions.",
914
+ "privacyTransfersTitle": "International data transfers",
915
+ "privacyTransfersBody": "We aim for EU/EEA hosting. Some processors may be headquartered outside the EEA (e.g. USA). For transfers outside the EEA, we use appropriate safeguards where required (e.g. Standard Contractual Clauses approved by the European Commission or other recognised mechanisms).",
916
+ "privacyBasisTitle": "Legal basis",
917
+ "privacyBasisBody": "We process data on the following bases: (1) Contract performance (Art. 6(1)(b) GDPR): providing the Service, account management, support. (2) Legitimate interests (Art. 6(1)(f) GDPR): security, abuse prevention, logs, improving the service. (3) Consent (Art. 6(1)(a) GDPR): where you have given consent (e.g. optional features). (4) Legal obligation (Art. 6(1)(c) GDPR): where required by law (e.g. retention).",
918
+ "privacyRetentionTitle": "Retention",
919
+ "privacyRetentionBody": "Account and content data are retained while your account exists. After account deletion, we remove or anonymize data within a reasonable period (typically 30 days). Security and access logs are retained as long as necessary, typically 30–90 days. Under Austrian law, certain business records may be retained for up to 7 years.",
920
+ "privacySecurityTitle": "Security",
921
+ "privacySecurityBody": "We use TLS for data in transit, hash passwords (bcrypt), apply access controls and rate limiting, and maintain regular updates and backups. We do not store payment card details; payment data is handled by our payment provider.",
922
+ "privacyRightsTitle": "Your rights",
923
+ "privacyRightsBody": "Under GDPR and Austrian DSG you have: right of access (Art. 15), rectification (Art. 16), erasure (Art. 17), restriction (Art. 18), data portability (Art. 20), objection (Art. 21), and the right not to be subject to automated decision-making (Art. 22). You may export your data via the built-in export tools (JSON/HTML) in the Bookmarks section, or request a copy by contacting us. You may withdraw consent at any time. To exercise your rights, contact us at hello@slugbase.app. You may lodge a complaint with the Austrian Data Protection Authority (see below).",
924
+ "privacyDPATitle": "Data Processing Agreement (B2B)",
925
+ "privacyDPABody": "A Data Processing Agreement (DPA) is available upon request for Team or Business users. In team contexts, your organization may act as the data controller and SlugBase as processor for stored content.",
926
+ "privacyAutomatedTitle": "Automated decision-making",
927
+ "privacyAutomatedBody": "We do not use automated decision-making that produces legal or similarly significant effects (Art. 22 GDPR).",
928
+ "privacyCookiesTitle": "Cookies and authentication",
929
+ "privacyCookiesBody": "We use session and authentication cookies necessary for the Service to function. We do not use marketing or analytics trackers.",
930
+ "privacyHostingTitle": "Hosting (CLOUD vs self-hosted)",
931
+ "privacyHostingBody": "On slugbase.app (CLOUD), we host your data on our infrastructure within the EU/EEA. If you self-host SlugBase, you are the data controller and control where data is stored and processed.",
932
+ "privacySupervisoryTitle": "Supervisory authority",
933
+ "privacySupervisoryBody": "You have the right to lodge a complaint with the Austrian Data Protection Authority (Österreichische Datenschutzbehörde), Barichgasse 40-42, 1030 Vienna, Austria (dsb@dsb.gv.at, +43 1 52 152-0). Under Austrian DSG, complaints must generally be filed within one year of becoming aware of the issue.",
934
+ "privacyChangesTitle": "Changes",
935
+ "privacyChangesBody": "We may update this Privacy Policy from time to time. We will notify you of material changes via the Service or by email. The current version is always available on this page."
936
+ }
937
+ }