SPB Git forge

spb/groupe-ka

Public

Groupe KA — site du holding + KA ID (compte unique & SSO des 7 plateformes). Next.js 16, SQLite, Google & Apple login.

81commits 1branches 0releases
89.2 MBsize
maindefault branch
22 days agolast push
TypeScript 70.4% HTML 18.4% JavaScript 4% Python 3.8% CSS 3.4%

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>
Simon-Pierre Boucher committed 1 mo ago (Aug 28, 2026) parent fb0f129

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