diff --git a/apps/memoro/apps/server/src/routes/meetings-webhooks.ts b/apps/memoro/apps/server/src/routes/meetings-webhooks.ts
index c0bb6aa65..99a1f51b3 100644
--- a/apps/memoro/apps/server/src/routes/meetings-webhooks.ts
+++ b/apps/memoro/apps/server/src/routes/meetings-webhooks.ts
@@ -48,14 +48,14 @@ meetingWebhookRoutes.post('/bot-events', async (c) => {
const signature = c.req.header('x-webhook-signature') ?? '';
if (WEBHOOK_SECRET && !verifySignature(rawBody, signature)) {
- return c.json({ error: 'Invalid webhook signature' }, 401);
+ return c.json({ success: false, error: 'Invalid webhook signature' }, 401);
}
let payload: WebhookEvent;
try {
payload = JSON.parse(rawBody) as WebhookEvent;
} catch {
- return c.json({ error: 'Invalid JSON payload' }, 400);
+ return c.json({ success: false, error: 'Invalid JSON payload' }, 400);
}
const key = idempotencyKey(payload);
@@ -116,6 +116,6 @@ meetingWebhookRoutes.post('/bot-events', async (c) => {
// Remove from processed set so it can be retried
processedEvents.delete(key);
console.error('[meetings-webhook] Error processing event:', err);
- return c.json({ error: 'Failed to process webhook event' }, 500);
+ return c.json({ success: false, error: 'Failed to process webhook event' }, 500);
}
});
diff --git a/apps/memoro/apps/server/src/routes/meetings.test.ts b/apps/memoro/apps/server/src/routes/meetings.test.ts
index 1cd2905c5..3055263e5 100644
--- a/apps/memoro/apps/server/src/routes/meetings.test.ts
+++ b/apps/memoro/apps/server/src/routes/meetings.test.ts
@@ -127,7 +127,7 @@ describe('POST /api/v1/meetings/bots', () => {
expect(res.status).toBe(402);
const data = await res.json();
- expect(data.error).toBe('InsufficientCredits');
+ expect(data.error).toContain('Insufficient credits');
});
});
diff --git a/apps/memoro/apps/server/src/routes/meetings.ts b/apps/memoro/apps/server/src/routes/meetings.ts
index 2eacd5a46..d510bb76f 100644
--- a/apps/memoro/apps/server/src/routes/meetings.ts
+++ b/apps/memoro/apps/server/src/routes/meetings.ts
@@ -35,12 +35,9 @@ meetingRoutes.post('/bots', async (c) => {
return c.json(
{
success: false,
- error: 'InsufficientCredits',
- message: `Not enough credits to start recording. Need at least ${MINIMUM_RECORDING_CREDITS} credits.`,
- details: {
- requiredCredits: MINIMUM_RECORDING_CREDITS,
- availableCredits: creditCheck.availableCredits,
- },
+ error: `Insufficient credits: need at least ${MINIMUM_RECORDING_CREDITS}`,
+ requiredCredits: MINIMUM_RECORDING_CREDITS,
+ availableCredits: creditCheck.availableCredits,
},
402
);
diff --git a/apps/memoro/apps/web/src/lib/i18n/index.ts b/apps/memoro/apps/web/src/lib/i18n/index.ts
index 14fe96ccd..57702cf7c 100644
--- a/apps/memoro/apps/web/src/lib/i18n/index.ts
+++ b/apps/memoro/apps/web/src/lib/i18n/index.ts
@@ -13,13 +13,13 @@ export const supportedLocales = ['de', 'en', 'fr', 'it', 'es'] as const;
export type SupportedLocale = (typeof supportedLocales)[number];
// Default locale
-const defaultLocale = 'en';
+const defaultLocale = 'de';
// Get initial locale from browser or localStorage
function getInitialLocale(): SupportedLocale {
if (browser) {
// Check localStorage first
- const stored = localStorage.getItem('locale');
+ const stored = localStorage.getItem('memoro_locale');
if (stored && supportedLocales.includes(stored as SupportedLocale)) {
return stored as SupportedLocale;
}
@@ -46,7 +46,7 @@ export function initI18n() {
export function setLocale(newLocale: SupportedLocale) {
locale.set(newLocale);
if (browser) {
- localStorage.setItem('locale', newLocale);
+ localStorage.setItem('memoro_locale', newLocale);
}
}
diff --git a/apps/memoro/apps/web/src/routes/offline/+page.svelte b/apps/memoro/apps/web/src/routes/offline/+page.svelte
new file mode 100644
index 000000000..1ddaa36c1
--- /dev/null
+++ b/apps/memoro/apps/web/src/routes/offline/+page.svelte
@@ -0,0 +1,9 @@
+
+
+