Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· kamo-marketing
Unità video eroina polacca con animazioni e ottimizzazioni moderne
- Aggiungi immagine poster per feedback visivo istantaneo durante il carico video - Scheletro di carico di implementazione con animazione pulente - Avviare il video disattivato (conformità della politica di autoplay del browser) - Aggiungi preload="metadata" per un caricamento video efficiente - Migliorare lo styling del pulsante: più grande (h-12 w-12), migliore raggio di confine (rotondato-xl) - Migliorare l'ombra con effetto a doppio strato (24px + 8px) - Implementare il contenitore liscia fade-in animazione (0.8s easyOut) - Aggiungi AnimatePresence per transizioni mute/unmute dell'icona liscia - Migliorare gli effetti hover con scale, ombre e transizioni di sfondo - Aggiungi l'animazione del rubinetto per un feedback tattile (scala 0.95) - Traccia lo stato di carico video per transizioni opacità lisce
· KlusterServices
Cartella condivisa KAMOTEAM su ogni desktop
desktop-1 host /srv/kamoteam e lo esporta su NFSv4; ogni utente di VM ottiene ~/Desktop/KAMOTEAM come symlink (via /etc/skel per nuovi account e l'agente per quelli esistenti/adottati), e la workstation monta la stessa directory. La VM detiene i dati perché è il lato sempre attivo — la workstation è una portatile WiFi su DHCP, quindi l'hosting là avrebbe lasciato la cartella per gli utenti di VM ogni tempo che dorme e rompere il loro supporto ogni volta che il suo indirizzo si sposta. La lettura completa/scrittura ha bisogno di tre cose insieme, e l'omissione di uno dà una parte che sembra giusto fino a quando la seconda persona scrive: il gruppo kamoteam, setgid plus a DEFAULT POSIX ACL (senza di esso un 022 umask rende i file di ogni utente in sola lettura a tutti gli altri), e NFS all squash a un'identità fissa in modo da uid della workstation 1000 non è silenziosamente trattato come uid 1000 della VM. NFSv4 solo: una porta, nessuna rpcbind, che è ciò che la rende inoltrabile attraverso Masquerade KubeVirt. Esposta alla LAN come NodePort 32049.
· kamo-marketing
Sostituire unità di testo eroe con autoplay video promozionale
Passare la copia dell'eroe di homepage, CTA e statistiche per un video muto looping mantenendo il trattamento di sfondo rotante.
· KlusterServices
Avviso su OOMKills, e sull'occupazione che li precede
Niente stava guardando la memoria. MediaService è stato OOMKilled ogni poche ore per la maggior parte di un giorno e EmailService sei volte, e il modo in cui chiunque ha scoperto era una chat finestra che aveva tranquillamente smesso di caricare messaggi — un contenitore che muore e riavviarsi all'interno di un secondo legge come una funzione rotta, non come un'interruzione. Tre regole. ContainerOOMKilled fuochi sull'evento; ContainerOOMKillLoop separa un one-off da un pod che viene ucciso ripetutamente, che riavvia veloce abbastanza per mostrare ancora 1/1 Corsa. ContainerMemoryNearLimit è quello che sarebbe hanno preso in anticipo questi giorni: > 85% del limite tenuto per 30 minuti. Per un JVM su MaxRAMPercentage che non è un pod occupato, è un baccello seduto al suo soffitto di mucchio con non-sapone impilato in cima, che è lo stato costante immediatamente prima kernel interviene. Un quarto, informativo, bandiere contenitori senza limiti tutti — non possono essere OOMKilled dal proprio gruppo, ma possono prendere un nodo giù. Verificato contro dati reali piuttosto che assunti: le espressioni sono state valutate su questo cluster, e querying le ultime 12 ore mostra il motivo="OOMKilled" serie per esattamente kamowsemail (18:33-01:28 UTC) e kamowsmedia (21:28-01:03 UTC) — i due baccelli che stavano fallendo. Le regole avrebbero sparato critica su entrambi. Un avviso che silenziosamente non corrisponde nulla è lo stesso fallimento di nessun avviso, in modo che il controllo contava più del YAML. Applicato a mano; il monitoraggio/ non è un obiettivo di applicazione CI.
· KlusterServices
Bloccare SSH in uscita tranne salvia, risolvere k1m1/k3m1, in bundle l'agente dir
Tcp/22 è respinto per ogni uid tranne radice e salvia, keyed su socket proprietario così i conti futuri sono coperti senza re-running nulla. Riapplicato avvio da un'unità sistemata, dal momento che le regole nftables non sopravvivono a un riavvio. È un guardrail, non un confine: kamodev ha sudo apt senza password, che è radice-equivalente — i due requisiti sono in tensione e che è documentato. k1m1/k3m1 le voci degli host vanno nel cloud-init TEMPLATE così come /etc/hosts, perché Manage etc hosts rigenera il file su ogni boot e un semplice append silenziosamente scompare. Utilizza gli IP LAN; gli overlay WireGuard/CGNAT sono in pensione e 10.0.50.1 è solo il link nodo-to-nodo. cloud-init ora trasporta desktop/agent/ come un tarball deterministico piuttosto che un placeholder per file — il set è passato da tre file a dieci, e ogni aggiunta altrimenti significava modificare il modello e la resa CI passo troppo.
· KlusterServices
Standard toolchain, perni della barra delle applicazioni e installazioni senza password per tutti gli utenti
Aggiunge krita e maven # Erano gia' presenti # perni Chrome, VS Code, Kate, Spectacle e Krita alla barra delle applicazioni per ogni utente, e consente agli utenti sviluppatori di installare software senza una password di amministratore. L'installazione senza password ha bisogno di BOTH halves: i sudoers coprono il terminale, polkit copertine Discover e ogni altro installatore grafico. Passato al pacchetto gestione tramite il gruppo kamodev piuttosto che radice coperta — vedere i commenti in ogni file per il motivo che questo è un raggio di esplosione più piccolo, ma non un limite di sicurezza. Barra delle applicazioni: i nuovi account ereditano il modello da /etc/skel a useradd time; i conti esistenti ottengono solo i loro lanciatori = riga riscritta, quindi un personalizzato pannello non viene buttato via per fissare un elenco di icone.
· kamo-internal
Portare l'icona desktop Linux su una disposizione, non su Dio
L'icona ora appare esattamente quando la connessione dietro di esso funzionerà — il SSO endpoint applica la stessa regola, quindi i due non possono essere d'accordo. Windows e Master condividono ancora una credenziale, quindi rimangono su isGod.
· kamo-internal
Finestra di dialogo Dev Machine sulla scheda di amministratore
Mantenga tre stati a parte che uno scambio collasserebbe: mai previsto (necessario una password), fornito ma bloccato (necessario solo l'interruttore), e fallito (necessario l'errore e una riprovazione). L'interruttore non può inventare una password che nessuno ha scelto.
· kamo-internal
Modulo client e percorsi proxy
*** è inoltrato esplicitamente — costruireForwardHeaders imposta X-OTK ma non token di sessione, e gli endpoint dev-machine risolvono il chiamante da esso. Il segmento di azione è controllato contro un set fisso piuttosto che passare attraverso.
· SecurityService
Per-member SSO credenziali e un preflight che spiega guasti
Linux è gated su una disposizione abilitata piuttosto che Dio, e servito con il Le credenziali del membro. Il collegamento è omesso dal token interamente quando non hanno nessuno — offrendo uno che sarà rifiutato superfici come di Guacamole Errore generico, che è il guasto inevitabile che questo rimuove.
· SecurityService
Servizio macchine Dev e controller
Il nome utente deriva dall'email del membro ACCOUNT, non dall'email di lavoro TeamMember — un indirizzo di lavoro può sedersi su un altro dominio e produrre silenziosamente un diverso Nome dell'account. Reset-password richiede GD e GodModeActive insieme.
· SecurityService
Client HTTP per l'agente di provisioning della macchina dev
salute() ingoia i guasti di trasporto e le risposte false così il preflight SSO può restituire un 503 azione piuttosto che un 500.
· SecurityService
AES-GCM codice segreto e derivazione del nome utente POSIX
Codec è deliberatamente reversibile — RDP autologin ha bisogno di una password reale — e utilizza GCM in modo da una riga manomessa o chiave sbagliata non riesce ad alta voce piuttosto che decifrare a rumore che sarebbe stato consegnato a Guacamole.
· kamo-shared-library
Dev machine accounts entità, stato enum e repository
stato e abilitato sono deliberatamente separati: un account provvisto ma disabilitato mantiene la sua home directory, in modo da ripristinare l'accesso piuttosto che la ricostruzione.
· KlusterServices
Segreti dell'agente in CI, liveness guacamole, avvisi di disponibilità
Espressioni allerte verificate contro il Prometeo dal vivo. Utilizza kube-state-metrics piuttosto che kubevirt * — il punto finale delle metriche KubeVirt non è raschiato qui, quindi regole scritte contro di esso leggerebbe come copertura mentre mai sparare. Selezionatore etichetta è release=kps per abbinare la regola di Prometheus CRSelector. La gestione segreta funziona con xtrace off quindi i valori rimangono fuori dal registro CI.
· KlusterServices
Installatore agente Idempotent, condiviso da cloud-init e live installs
Staged sotto /opt/kamo-desktop-agent in modo install-agent.sh ha una fonte distinta e destinazione. Copre netplan-by-driver, rete cloud-init disattivare, xrdp politica di sessione, /etc/skel/.xsession e l'agente stesso.
· KlusterServices
Aggiungere l'agente di approvvigionamento e i suoi test unitari
Python 3 stdlib solo. Ogni mutazione funziona sottoprocesso con un elenco argv, mai un stringa shell; le password vanno a chpasswd su stdin in modo da rimanere fuori /proc.
· SecurityService
Invia ids int64 al browser come stringhe, senza toccare sessioni
CockroachDB Unique rowid() ids sono 19 cifre, passato Numero. MAX SAFE INTEGER, quindi un id inviato come numero JSON arriva nel browser con le sue basse cifre arrotondate e ogni ricerca fatta con esso manca. 163 risposte del handler messo grezzo lungo org e ids membri in ad-hoc Maps, quindi questo non era qualcosa DTO-by-DTO lavoro potrebbe chiudere. Il motivo per cui è rimasto aperto è che la fissa ovvia abbatte la piattaforma. Il mapper che serve risposte è lo stesso fagiolo KSessionService scrive la mappa di sessione *** Redis with, and ids are read back from that map by ((Number) ...).longValue() -- 65 tempi in questo servizio, e ancora in DocsService, MediaService e ConversionService, che leggono lo stesso carico. Cita a lungo su quel fagiolo e tutti quei lanci. Quindi la regola è attaccata ai convertitori di messaggio MVC invece, su una copia. Le risposte ottengono le sessioni, gli editori NATS e i client service-to-service mantengono il mapper numerico hanno sempre avuto. Non è anche una coperta Lunga -> String. Lungo non è un sinonimo di id qui: epoca millis su SecurityRoleDTO e i DTO di tipo branch e modello di sicurezza, LeadIntakeEndpointDTO contatori, Page.getTotalElements(), byte taglie e durate sono tutti Longs il browser fa aritmetico e nuovo Data() su, e la maggior parte arrivano dentro Mappe dove un mix-in non ha chiave a cui attaccare. Il serializzatore si accende invece il valore: sopra la gamma di sicurezza JS scrive una stringa, sotto un numero. Ogni singola rowid è sopra, ogni timestamp, conteggio e le dimensioni sono sotto, e i campi nessuno ha ancora classificato sono gestiti dalla stessa regola. Verificato contro i pari che leggono queste risposte: KamoJwtService e DavAuthFilter già accettano o forma (instanza del numero ? ... : Long.parseLong(...)).
· kamo-login
Sostituire l'avviso di riserva con un piatto di stato animato
I messaggi di accesso in linea ("Login successo! Ridirezione...", "Non valido nome utente e / o password.") usato Alert predefinito di MUI, il cui riempimento pastello plus corrispondente testo pastello letto come generico contro la carta di accesso di vetro. StatusMessage inverte che la formula: una piastra smerigliata quasi bianca nella stessa famiglia di vetro come la carta, con il colore di gravità concentrato in un'icona chip, un lavaggio che sbiadisce prima del testo, una linea di capelli e un morbido Halo. Inchiostro rimane vicino-nero con un sussurro dell'accento mescolato in, quindi mantiene contrasto contro qualsiasi org --colore-primario. I messaggi Neutral/info prendono in prestito Org è proprio primario invece di uno stock blu. Il movimento è un ingresso orchestrato -- il piatto si apre, l'icona disegna il proprio ictus, e un singolo highlight speculare attraversa. "In attesa" aggiunge una linea di capelli di viaggio per lavoro ancora in volo, cablata all'esistente `redirecting` state in modo "Redirect..." mostra il progresso piuttosto che semplicemente sostenendolo. Gli errori ottengono un breve impulso di impostazione. preferisce-ridotta-mozione crolla tutto a una semplice dissolvenza. Annuncio di errori come ruolo="alert"/assertive, tutto il resto rimane educato. Applicato alle pagine di errore di login, ripristino, reset-password e OAuth.
· kamo-marketing
Aggiungi il sigillo di 25 anni
Due posizionamenti, entrambi scelti per dove il reclamo è già stato fatto: Footer — 60px, accanto a "© 2001– ♥year> ... stabilito 2025". In tutto il sito, raggruppato con il marchio fatto come un altro marchio di fiducia. Circa — 168px, apertura della sezione missione. Quella pagina è dove La storia di 25 anni è l'argomento piuttosto che una nota di passaggio. Non nell'eroe di casa: quell'intestazione è stata appena spogliata a uno deliberato effetto, e un medaglione d'oro accanto a esso avrebbe annullato il restringimento. Un componente AnniversaryBadge dietro entrambi, quindi il bene, il suo testo alt, e l'anno commemora il ritiro da un unico file. La fonte PNG era di 2,4 MB a 1254px. Ridimensionato a 512px e codificato a WebP è 95 KB, e dal momento che l'ottimizzazione successiva/immagine è su, che cosa realmente le navi è un AVIF derivato per posizionamento: 8.3 KB per il piè di pagina a 2x, 35 KB per Circa.
· kamo-marketing
Mostra la gamma 2001 di copyright e l'anno di incorporazione
Renders "© 2001 – >anno> KamoCRM. KamoCRM Inc. fondata 2025. Tutti i diritti riservato." L'inizio dell'intervallo è codificato in modo rigido accanto all'anno finale dinamico piuttosto che vivere nella stringa tradotta, quindi nessun locale può danneggiarla.
· kamo-marketing
Aggiungi le integrazioni di meeting e payroll
Zoom e Microsoft Team per le riunioni, e i dieci venditori payroll — ADP Forza di lavoro Ora, BambooHR, Dayforce, Gusto, Paychex Flex, Paycor, Paylocity, Rippling, UKG, Workday. 33 integrazioni a 45, con una nuova Payroll & HR categoria e Video Conferencing promosso accanto a Voice. Ogni pagina riflette ciò che il suo fornitore implementa in realtà piuttosto che un modello uniforme. La paylocity non ha il calendario pay-period o il saldo PTO, Dayforce non ha calendario pay-period, e né Paychex né Rippling pushs l'assegnazione del lavoro, quindi nessuna di quelle pagine sostiene altrimenti; la storia auth differisce anche per venditore (OAuth for Gusto, Paycor, Rippling e BambooHR, a certificato per ADP, un token di aggiornamento per Workday, conti di servizio per UKG e Dayforce) e ogni flusso di configurazione lo dice. I loghi sono i beni del fornitore dal pubblico/logo/{meet,payroll} di kamo-internal. Il set payroll è WORDMARKS in esecuzione da 0.72:1 (Dayforce) a 6.2:1 (Paychex): reso nella piastra quadrata i loghi dell'icona usano, viene un segno 6:1 su pochi pixel. L'integrazione ora porta l'intrinseca logoWidth/logoHeight, e dove questi sono impostati la scheda hub e la pagina dei dettagli rendere ad un'altezza fissa con larghezza automatica su un piatto che cresce per adattarsi — lo stesso fix kamo-internal fatto per gli stessi beni. I loghi quadrati sono intatto. Hub metadati nominati solo le vecchie cinque categorie e hardcoded "31 nativi integrazioni"; ora copre riunioni e payroll e conta il registro.
· kamo-marketing
Conta app e integrazioni separatamente con numeri reali
"Apps & Integrations" è stata una lettura di piastrelle 31+. Ora è due, ciascuno con un figura che può essere ridisegnata piuttosto che stimata: Apps 64 — Progetti di Forgejo di proprietà di `kamo`, ratetack escluso Integrazioni 64 — distinte API di terze parti con il codice client di lavoro Il conteggio di integrazione esce dai registri dei fornitori (AiProviderType, BulkTextProviderTipo, SocialProviderType, VoipProviderType, IdentityProviderType, RetailProviderType, MlosIntegration) più il libro paga, adattatori di chiusura MLOS e meeting. Le voci di Enum con nulla dietro di loro sono esclusi, quindi i 18 fornitori di calendari non implementati, Encompass e Xbox fanno Non conta. Entrambe le cifre sono mantenute a mano; il commento riporta come ricontrollali. Quattro piastrelle hanno bisogno di una griglia di quattro piani, quindi la riga delle statistiche ora va 1/2/4 attraverso il punti di rottura con l'imbottitura di piastrelle e tipo scalato per abbinare.
· kamolos
Abilitare ProxyHmacFilter — passo 2, X-Org-Id è ora un testata collaudata
los.proxy-hmac.enabled sta cadendo al suo falso default da questo servizio schierato, così ProxyHmacFilter esisteva e non correva mai. X-Org-Id — l'intestazione ogni domanda org-scoped in questo servizio trusts — era senza firma e a forma di cliente su un live multi-tenant prestito API. Sicuro per consentire ora perché passo 1 atterrato prima: kamo-internal monta lo stesso los-proxy-hmac segreto e il suo pod in esecuzione sta firmando, verificato prima che questo era spinta. L'ordine inverso avrebbe respinto ogni richiesta di prestito nella piattaforma. Controllato prima di lanciarlo: - il filtro bypass /actuator/**, quindi le sonde di avvio e prontezza ancora Passo. Se li beccasse, il baccello non sarebbe mai diventato pronto. E' tornato. - bypassa /api/los/webhooks/**, così Stripe continua a lavorare — quelli sono verificati invece della firma di Stripe. - kamo-internal è l'unico chiamante di kamowslos-service, quindi non c'è segno percorso di servizio-servizio lasciato dietro. Questo non sostituisce i controlli org in LoanService e LoanScope. Cresce ciò che X-Org-Id significa "un intestazione che qualcuno ha inviato" a "un intestazione questo proxy inviato", mentre quelli decidono se il nome org può vedere la riga. Difendere in profondità: né è sufficiente da solo.
· kamo-internal
Firmare le intestazioni di identità proxy — passo 1 di abilitare ProxyHmacFilter
KamoLOS si fida di X-Org-Id e X-Member-Id da questo proxy. ProxyHmacFilter esiste prova che le intestazioni provenivano da qui, ma è disabilitato in produzione: distribuzione non imposta LOS PROXY HMAC ENABLED e nessun segreto condiviso esisteva fino ad ora, quindi los.proxy-hmac.enabled cade attraverso a falso e le intestazioni sono senza firma su un live API prestito multi-tenant con 15 prestiti reali su di esso. Il percorso LOS calcola già la firma — salta appena quando LOS PROXY HMAC SECRET è assente. Montare il nuovo segreto los-proxy-hmac è ciò passa la firma. Questo lato va prima di proposito. KamoLOS ignora la firma fino alla sua los.proxy-hmac.enabled è vero, quindi questo commit non cambia alcun comportamento da nessuna parte; solo inizia ad attaccare X-Proxy-Signature e X-Proxy-Timestamp. Fare il contrario — la convalida prima della firma — respingerebbe ogni richiesta di prestito nella piattaforma. Passo 2 imposta LOS PROXY HMAC ENABLED=true e lo stesso segreto su kamowslos-deployment, dopo che questo rollout è confermato.
· SecurityService
Risolvere il logo KamoMeet overlay in config.json
KamoMeet è una forchetta Meet senza accesso a OrgContext, quindi impara org branding dal tema config.json questo servizio cuoce. L'org memorizza un overlay TOKEN; questo lo risolve contro la tavolozza e scrive di quel org l'esa finito come kamomeetLogoOverlayColor. Risolvere qui piuttosto che spedire il tavolo di tredici token nella forchetta è il punto: quel repo porta già lo slideshow di sfondo di org come uno di nove copie indipendenti, e una seconda tale tabella andrebbe alla deriva Via. Cuocere un colore risolto non è anche l'"hex congelato" questa caratteristica evita nel database — config.json è rigenerato su ogni risparmio di branding, variazioni di colore incluse. Il prefisso è esplicito piuttosto che "non SECONDARY significa PRIMARY". A test catturato quello che la versione sciolta ha fatto: "#FF0000" è esattamente fino a quando "PRIMARY", così ha lasciato un passo vuoto e risolto alla base primaria — una colore nessuno ha scelto, arrivando su uno schermo nessuno sul lato piattaforma mai Guarda. Token sconosciuti e ombre non set sono omessi da config.json del tutto, che è come ogni cliente legge "nessun sovrapposizione". Il tavolo token deve rimanere in passo con il logo di kamo-internalOverlay.ts; il i test sono ciò che rende una divergenza un fallimento di costruzione.
· InitializerService
Aggiungi la colonna kamomeet logo overlay
Terza superficie di sovrapposizione: lo schermo pre-meeting KamoMeet. La stessa forma della altri due — nullable, no backfill, no DEFAULT. La guardia alla deriva aveva bisogno solo del suo nome di campo aggiungendo, perché itera il I campi di sovrapposizione dell'entità piuttosto che nominarli uno alla volta. Questo è tutto il punto di averlo scritto in quel modo.
· kamo-shared-library
Portare il logo KamoMeet overlay su Organizzazione
Terzo e ultimo sovrapposizione, stesso vocabolario dei suoi due fratelli, più il suo ramo nel percorso generico patch. Questo e' diverso da dove finisce. La home page e lo schermo di caricamento leggere il loro token direttamente fuori OrgContext; KamoMeet è una forchetta Meet senza accesso a questo, così SecurityService risolve questo token contro l'org tavolozza e cuocere il colore finito nel tema config.json la forchetta già fetches. Il token quindi non lascia mai la piattaforma, e il tredici opzioni esistono in un posto piuttosto che essere copiato in una forchetta che ha già accumulato nove copie indipendenti dello sfondo slideshow. Null si risolve a NONE, quindi ogni org esistente inizia senza sovrapposizione. The la colonna kamomeet logo overlay è già applicata (KamoInitializer).
· kamo-internal
Un logo sovrapposto per lo schermo pre-incontro KamoMeets
Terza e ultima superficie, offerta accanto alle altre due — stessa tredici opzioni, la sua impostazione, default No Overlay. Nascosto a meno che l'org possa effettivamente raggiungere quella schermata: l'app Meetings acceso E KamoMeets scelto come fornitore. Un org su Zoom o team non rende mai uno schermo pre-incontro KamoMeets, e un org senza l'applicazione non ne apre mai uno, quindi il campo sarebbe un controllo collegato a nulla. Un immagazzinato il valore sopravvive mentre è nascosto, in modo da voltare Riunioni su ripristina il scelta invece di cancellarla silenziosamente. Il fornitore è preso una volta sul monte. Fino a che non risponde al campo rimane nascosto, quindi appare piuttosto che svanire; una ricerca fallita si risolve a KAMO MEET, che è quello che fa il backend per un org senza fornitore fila — meglio mostrare un'impostazione innocua che nascondere una reale perché una richiesta fallita. A differenza dei suoi due fratelli questo token non raggiunge mai la superficie che governa. KamoMeet è una forchetta Meet senza accesso a OrgContext, quindi SecurityService risolve l'ombra e cuoce il colore finito nel tema dell'org config.json. Solo le impostazioni UI qui legge il token.
· InitializerService
Acquisti i report e le righe del cruscotto, e smettere di vedere VIEW DASHBOARD
VIEW DASHBOARD (0), VIEW REPORTS (1) e EXPORT REPORTI (2) sono stati eliminati da RoleRightType oggi, insieme alle due pagine che hanno chiamato. Questo rimuove ciò che essi a sinistra, attraverso entrambe le codifiche. Non e' vero. VIEW DASHBOARD tra i diritti concesso ad ogni nuova organizzazione, quindi esce anche. Questo era l'unico riferimento fuori di un sito di definizione, e il compilatore è ciò che l'ha trovato — un promemoria che grepping per un nome giusto e la lettura dell'enum non sono la stessa ricerca. VIEW TASKS è deliberatamente assente dal purge: app/tasks sembra identico al pagine cancellate nella fonte ma è prevista per essere completata. Id 0 è un vero id — il predicato lo elenca esplicitamente, e qualsiasi cosa in questo percorso che appoggiato sulla veridicità sarebbe silenziosamente saltare le file di VIEW DASHBOARD.

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta