feat(rent-ka): Rent-Ka dans l ecosysteme + client KA ID + surfaces marketing
- ecosystem.json + SSO_CLIENTS (KA_SSO_SECRET_RENT_KA) + ka-agent.js ECO - mon-ka/compte accents & URLs, alerts (ADAPTERS/APP_LABELS), live.ts rentka - homepage carte num 13 + socle + liveChips, layout (JSON-LD + footer), recherche, figures, marque (Cobalt continental), loi-25, agents (ka6) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
14 changed files +86 −2
modified
public/ka-agent.js
+2 −1
@@ -159,7 +159,8 @@ | ||
| 159 | 159 | "crea-ka": ["Créa·Ka", "#7048e8", "#ffffff"], |
| 160 | 160 | "api-ka": ["API·Ka", "#3b5bdb", "#ffffff"], |
| 161 | 161 | "job-ka": ["Job·Ka", "#0c8599", "#ffffff"], |
| 162 | − "valoplex": ["ValoPlex", "#ff9f45", "#141814"] | |
| 162 | + "valoplex": ["ValoPlex", "#ff9f45", "#141814"], | |
| 163 | + "rent-ka": ["Rent·Ka", "#2456e6", "#ffffff"] | |
| 163 | 164 | }; |
| 164 | 165 | function httpUrl(u) { return typeof u === "string" && /^https:\/\//.test(u) ? u : ""; } |
| 165 | 166 | /* Extrait chaque objet JSON de premier niveau d'un bloc ka-card, quelle que |
modified
src/app/agents/page.tsx
+1 −0
@@ -65,6 +65,7 @@ const GUARDIANS: Guardian[] = [ | ||
| 65 | 65 | { app: "Fabri·Ka", url: "https://www.fabri-ka.com" }, |
| 66 | 66 | { app: "Job·Ka", url: "https://www.job-ka.com" }, |
| 67 | 67 | { app: "Créa·Ka", url: "https://www.crea-ka.com" }, |
| 68 | + { app: "Rent·Ka", url: "https://www.rent-ka.com" }, | |
| 68 | 69 | ], |
| 69 | 70 | extra: "+ agent par défaut de toute nouvelle plateforme", |
| 70 | 71 | }, |
modified
src/app/compte/page.tsx
+2 −0
@@ -36,6 +36,7 @@ const PLATFORM_URLS: Record<string, string> = { | ||
| 36 | 36 | "lou-ka": "https://www.lou-ka.com", |
| 37 | 37 | "immo-ka": "https://www.immo-ka.com", |
| 38 | 38 | "house-ka": "https://www.house-ka.com", |
| 39 | + "rent-ka": "https://www.rent-ka.com", | |
| 39 | 40 | "vrai-prix": "https://www.vrai-prix.com", |
| 40 | 41 | valoplex: "https://www.valoplex.com", |
| 41 | 42 | "auto-ka": "https://www.auto-ka.com", |
@@ -68,6 +69,7 @@ const APP_ACCENTS: Record<string, string> = { | ||
| 68 | 69 | "lou-ka": "#d9f26b", |
| 69 | 70 | "immo-ka": "#e23744", |
| 70 | 71 | "house-ka": "#0f6b4f", |
| 72 | + "rent-ka": "#2456e6", | |
| 71 | 73 | "vrai-prix": "#ff5148", |
| 72 | 74 | valoplex: "#ff9f45", |
| 73 | 75 | "auto-ka": "#ff5a2a", |
modified
src/app/figures.tsx
+1 −0
@@ -15,6 +15,7 @@ export const FIG_PLATFORMS: { | ||
| 15 | 15 | { name: "Lou·Ka", accent: "#ff6a00", domain: "lou-ka.com" }, |
| 16 | 16 | { name: "Immo·Ka", accent: "#e23744", domain: "immo-ka.com" }, |
| 17 | 17 | { name: "House·Ka", accent: "#0f6b4f", domain: "house-ka.com" }, |
| 18 | + { name: "Rent·Ka", accent: "#2456e6", domain: "rent-ka.com" }, | |
| 18 | 19 | { name: "Vrai-Prix", accent: "#ff5148", domain: "vrai-prix.com" }, |
| 19 | 20 | { name: "ValoPlex", accent: "#ff9f45", domain: "valoplex.com" }, |
| 20 | 21 | { name: "Auto·Ka", accent: "#ff5a2a", domain: "auto-ka.com" }, |
modified
src/app/layout.tsx
+2 −0
@@ -74,6 +74,7 @@ const PLATEFORMES: [string, string][] = [ | ||
| 74 | 74 | ["API·Ka", "https://www.api-ka.com"], |
| 75 | 75 | ["Job·Ka", "https://www.job-ka.com"], |
| 76 | 76 | ["Ka·Stats", "https://www.ka-stats.com"], |
| 77 | + ["Rent·Ka", "https://www.rent-ka.com"], | |
| 77 | 78 | ]; |
| 78 | 79 | const JSON_LD = { |
| 79 | 80 | "@context": "https://schema.org", |
@@ -350,6 +351,7 @@ export default async function RootLayout({ | ||
| 350 | 351 | ["Créa·Ka", "https://www.crea-ka.com"], |
| 351 | 352 | ["API·Ka", "https://www.api-ka.com"], |
| 352 | 353 | ["Job·Ka", "https://www.job-ka.com"], |
| 354 | + ["Rent·Ka", "https://www.rent-ka.com"], | |
| 353 | 355 | ["Ka·Stats", "https://www.ka-stats.com"], |
| 354 | 356 | ["Ka2", "https://www.ka2.bot"], |
| 355 | 357 | ["Ka4", "https://www.ka4.bot"], |
modified
src/app/loi-25/page.tsx
+7 −0
@@ -25,6 +25,13 @@ const APPS_ROWS: [string, string, string, string, string][] = [ | ||
| 25 | 25 | "Annonces de logements provenant de 108 sources publiques, synchronisées à chaque heure", |
| 26 | 26 | "Coordonnées de propriétaires ou de locateurs rendues publiques dans les annonces sources", |
| 27 | 27 | ], |
| 28 | + [ | |
| 29 | + "Rent·Ka", | |
| 30 | + "www.rent-ka.com", | |
| 31 | + "Location résidentielle — Canada hors Québec", | |
| 32 | + "Annonces de logements provenant de gestionnaires immobiliers et de portails canadiens publics, synchronisées à chaque heure", | |
| 33 | + "Coordonnées de gestionnaires immobiliers rendues publiques dans les annonces sources", | |
| 34 | + ], | |
| 28 | 35 | [ |
| 29 | 36 | "Immo·Ka", |
| 30 | 37 | "www.immo-ka.com", |
modified
src/app/marque/page.tsx
+5 −0
@@ -72,6 +72,11 @@ const INK = "#141814"; | ||
| 72 | 72 | // --------------------------------------------------------------------------- |
| 73 | 73 | |
| 74 | 74 | const COLOR_STORIES: Record<string, { name: string; story: string }> = { |
| 75 | + "rent-ka": { | |
| 76 | + name: "Cobalt continental", | |
| 77 | + story: | |
| 78 | + "Un bleu franc et travailleur, celui des portes qui s'ouvrent d'un océan à l'autre. Le cobalt tranche avec l'orange de Lou·Ka comme l'anglais tranche avec le français : même métier, autre horizon. Posé sur le papier crème du système KA, il signe le sérieux du bail — net, direct, sans détour.", | |
| 79 | + }, | |
| 75 | 80 | "groupe-ka": { |
| 76 | 81 | name: "Lime KA", |
| 77 | 82 | story: |
modified
src/app/mon-ka/page.tsx
+1 −0
@@ -29,6 +29,7 @@ const APP_ACCENTS: Record<string, string> = { | ||
| 29 | 29 | "lou-ka": "#d9f26b", |
| 30 | 30 | "immo-ka": "#e23744", |
| 31 | 31 | "house-ka": "#0f6b4f", |
| 32 | + "rent-ka": "#2456e6", | |
| 32 | 33 | "vrai-prix": "#ff5148", |
| 33 | 34 | valoplex: "#ff9f45", |
| 34 | 35 | "auto-ka": "#ff5a2a", |
modified
src/app/page.tsx
+33 −0
@@ -283,6 +283,27 @@ const PRODUCTS: Product[] = [ | ||
| 283 | 283 | ], |
| 284 | 284 | isNew: true, |
| 285 | 285 | }, |
| 286 | + { | |
| 287 | + num: "13", | |
| 288 | + markLeft: "Rent", | |
| 289 | + markBoxed: "Ka", | |
| 290 | + accent: "#2456e6", | |
| 291 | + inkbox: "#0b1330", | |
| 292 | + field: "Locations — Canada hors Québec", | |
| 293 | + domain: "www.rent-ka.com", | |
| 294 | + url: "https://www.rent-ka.com", | |
| 295 | + tagline: "Tous les logements à louer du reste du Canada.", | |
| 296 | + description: | |
| 297 | + "Le pendant canadien de Lou·Ka, en anglais : agrégation continue des logements à louer de l'Ontario, de l'Alberta, de la Colombie-Britannique, des Prairies et de l'Atlantique — gestionnaires immobiliers, grands propriétaires et portails, avec juste valeur estimée, KA Scores et lien direct vers l'annonce originale.", | |
| 298 | + chips: ["8 000+ annonces", "8 provinces", "600+ connecteurs", "EN"], | |
| 299 | + features: [ | |
| 300 | + "Ontario, Alberta, C.-B., Prairies et Atlantique — synchronisation horaire", | |
| 301 | + "Juste valeur estimée et historique de prix sur chaque fiche", | |
| 302 | + "KA Scores (marche, transport, calme, services) calculés par immeuble", | |
| 303 | + "Chaque annonce renvoie à la source originale du gestionnaire", | |
| 304 | + ], | |
| 305 | + isNew: true, | |
| 306 | + }, | |
| 286 | 307 | ]; |
| 287 | 308 | |
| 288 | 309 | type Bot = { |
@@ -382,6 +403,12 @@ const socleRows = (m: LiveMetrics): [string, string, string, string][] => [ | ||
| 382 | 403 | `${m.louka.sources} connecteurs sources + synchronisation horaire`, |
| 383 | 404 | "www.lou-ka.com", |
| 384 | 405 | ], |
| 406 | + [ | |
| 407 | + "Rent·Ka", | |
| 408 | + "Location résidentielle — Canada hors Québec", | |
| 409 | + `${m.rentka.sources} connecteurs — 8 provinces, MàJ horaire`, | |
| 410 | + "www.rent-ka.com", | |
| 411 | + ], | |
| 385 | 412 | [ |
| 386 | 413 | "Immo·Ka", |
| 387 | 414 | "Propriétés à vendre", |
@@ -646,6 +673,12 @@ function liveChips(m: LiveMetrics): Record<string, string[]> { | ||
| 646 | 673 | `Loyer moyen ${fmtInt(m.louka.avgPrice)} $`, |
| 647 | 674 | "MàJ horaire", |
| 648 | 675 | ], |
| 676 | + "www.rent-ka.com": [ | |
| 677 | + `${fmtPlus(m.rentka.total)} annonces`, | |
| 678 | + `${m.rentka.sources} connecteurs`, | |
| 679 | + `Loyer moyen ${fmtInt(m.rentka.avgPrice)} $`, | |
| 680 | + "8 provinces", | |
| 681 | + ], | |
| 649 | 682 | "www.immo-ka.com": [ |
| 650 | 683 | `${fmtPlus(m.immoka.total)} propriétés`, |
| 651 | 684 | `${m.immoka.sources} connecteurs`, |
modified
src/app/recherche/page.tsx
+1 −0
@@ -20,6 +20,7 @@ const SITES: [string, string][] = [ | ||
| 20 | 20 | ["www.lou-ka.com", "Lou·Ka"], |
| 21 | 21 | ["www.immo-ka.com", "Immo·Ka"], |
| 22 | 22 | ["www.house-ka.com", "House·Ka"], |
| 23 | + ["www.rent-ka.com", "Rent·Ka"], | |
| 23 | 24 | ["www.vrai-prix.com", "Vrai-Prix"], |
| 24 | 25 | ["www.toit-ka.com", "Toit·Ka"], |
| 25 | 26 | ["www.auto-ka.com", "Auto·Ka"], |
modified
src/ka/ecosystem.json
+10 −0
@@ -94,6 +94,16 @@ | ||
| 94 | 94 | "onAccent": "#ffffff", |
| 95 | 95 | "tagline": "Maisons à vendre — Canada hors Québec (EN)" |
| 96 | 96 | }, |
| 97 | + { | |
| 98 | + "id": "rent-ka", | |
| 99 | + "wordmark": "Rent·Ka", | |
| 100 | + "domain": "www.rent-ka.com", | |
| 101 | + "accent": "#2456e6", | |
| 102 | + "accentSoft": "#e9efff", | |
| 103 | + "accentDeep": "#1738a8", | |
| 104 | + "onAccent": "#ffffff", | |
| 105 | + "tagline": "Locations résidentielles — Canada hors Québec (EN)" | |
| 106 | + }, | |
| 97 | 107 | { |
| 98 | 108 | "id": "vrai-prix", |
| 99 | 109 | "wordmark": "Vrai-Prix", |
modified
src/lib/alerts.ts
+2 −0
@@ -21,6 +21,7 @@ const ADAPTERS: Record<string, Adapter> = { | ||
| 21 | 21 | "resto-ka": { base: "https://www.resto-ka.com", path: "/api/restaurants", small: { limit: "1" }, total: "total" }, |
| 22 | 22 | "sorti-ka": { base: "https://www.sorti-ka.com", path: "/api/events", small: { limit: "1" }, total: "total" }, |
| 23 | 23 | "job-ka": { base: "https://www.job-ka.com", path: "/api/jobs", small: { limit: "1" }, total: "total" }, |
| 24 | + "rent-ka": { base: "https://www.rent-ka.com", path: "/api/listings", small: { limit: "1" }, total: "total" }, | |
| 24 | 25 | "crea-ka": { base: "https://www.crea-ka.com", path: "/api/creators", small: { limit: "1" }, total: "total" }, |
| 25 | 26 | }; |
| 26 | 27 | |
@@ -28,6 +29,7 @@ const APP_LABELS: Record<string, string> = { | ||
| 28 | 29 | "lou-ka": "Lou·Ka", "immo-ka": "Immo·Ka", "auto-ka": "Auto·Ka", |
| 29 | 30 | "food-ka": "Food·Ka", "fabri-ka": "Fabri·Ka", "resto-ka": "Resto·Ka", |
| 30 | 31 | "sorti-ka": "Sorti·Ka", "job-ka": "Job·Ka", "crea-ka": "Créa·Ka", |
| 32 | + "rent-ka": "Rent·Ka", | |
| 31 | 33 | }; |
| 32 | 34 | |
| 33 | 35 | type AlertRow = { |
modified
src/lib/live.ts
+14 −1
@@ -110,6 +110,12 @@ export type LiveMetrics = { | ||
| 110 | 110 | avgPrice: number; |
| 111 | 111 | syncs: SyncHealth; |
| 112 | 112 | }; |
| 113 | + rentka: { | |
| 114 | + total: number; | |
| 115 | + sources: number; | |
| 116 | + avgPrice: number; | |
| 117 | + syncs: SyncHealth; | |
| 118 | + }; | |
| 113 | 119 | autoka: { |
| 114 | 120 | total: number; |
| 115 | 121 | sources: number; |
@@ -208,7 +214,7 @@ const topCities = (o: Json | null): { city: string; n: number }[] => { | ||
| 208 | 214 | }; |
| 209 | 215 | |
| 210 | 216 | export async function getLiveMetrics(): Promise<LiveMetrics> { |
| 211 | − const [lou, immo, auto, fab, food, resto, sorti, crea, trouve, vp, job, house] = | |
| 217 | + const [lou, immo, auto, fab, food, resto, sorti, crea, trouve, vp, job, house, rent] = | |
| 212 | 218 | await Promise.all([ |
| 213 | 219 | fetchJson("https://www.lou-ka.com/api/stats"), |
| 214 | 220 | fetchJson("https://www.immo-ka.com/api/stats"), |
@@ -222,6 +228,7 @@ export async function getLiveMetrics(): Promise<LiveMetrics> { | ||
| 222 | 228 | fetchJson("https://www.vrai-prix.com/api/stats"), |
| 223 | 229 | fetchJson("https://www.job-ka.com/api/stats"), |
| 224 | 230 | fetchJson("https://www.house-ka.com/api/stats"), |
| 231 | + fetchJson("https://www.rent-ka.com/api/stats"), | |
| 225 | 232 | ]); |
| 226 | 233 | |
| 227 | 234 | const m: LiveMetrics = { |
@@ -257,6 +264,12 @@ export async function getLiveMetrics(): Promise<LiveMetrics> { | ||
| 257 | 264 | avgPrice: num(house, "avg_price", 934000), |
| 258 | 265 | syncs: syncSummary(house), |
| 259 | 266 | }, |
| 267 | + rentka: { | |
| 268 | + total: num(rent, "total", 8955), | |
| 269 | + sources: num(rent, "sources", 78), | |
| 270 | + avgPrice: num(rent, "avg_price", 1974), | |
| 271 | + syncs: syncSummary(rent), | |
| 272 | + }, | |
| 260 | 273 | autoka: { |
| 261 | 274 | total: num(auto, "total", 17098), |
| 262 | 275 | sources: num(auto, "sources", 125), |
modified
src/lib/sso.ts
+5 −0
@@ -22,6 +22,11 @@ export const SSO_CLIENTS: Record< | ||
| 22 | 22 | redirectPrefixes: ["https://www.house-ka.com/"], |
| 23 | 23 | secretEnv: "KA_SSO_SECRET_HOUSE_KA", |
| 24 | 24 | }, |
| 25 | + "rent-ka": { | |
| 26 | + label: "Rent·Ka", | |
| 27 | + redirectPrefixes: ["https://www.rent-ka.com/", "http://localhost:8125/"], | |
| 28 | + secretEnv: "KA_SSO_SECRET_RENT_KA", | |
| 29 | + }, | |
| 25 | 30 | "crea-ka": { |
| 26 | 31 | label: "Créa·Ka", |
| 27 | 32 | redirectPrefixes: ["https://www.crea-ka.com/", "http://localhost:8160/"], |
| 28 | 33 | |