1<!DOCTYPE html><html lang="en"><head> 2 <meta charset="UTF-8"> 3 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 4 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 5 6 <!-- Primary Meta Tags --> 7 <title>Blog | EFFOMA - Research, Product & Engineering Insights</title> 8 <meta name="title" content="EFFOMA - Creative Technology Solutions | AI & XR"> 9 <meta name="description" content="Explore articles on AI agents, extended reality, engineering deep-dives, product updates, and company news from the EFFOMA team."> 10 <meta name="keywords" content="EFFOMA blog, AI research, XR technology, engineering blog, startup blog"> 11 <meta name="author" content="EFFOMA"> 12 13 <meta name="language" content="English"> 14 <meta name="revisit-after" content="7 days"> 15 16 <!-- Canonical URL --> 17 <link rel="canonical" href="https://effoma.com/blog"> 18 19 <!-- Favicon --> 20 <link rel="icon" href="/favicon.ico" type="image/x-icon"> 21 <link rel="apple-touch-icon" href="/favicon.ico"> 22 23 <!-- Open Graph / Facebook --> 24 <meta property="og:type" content="website"> 25 <meta property="og:url" content="https://effoma.com/blog"> 26 <meta property="og:title" content="Blog | EFFOMA - Research, Product & Engineering Insights"> 27 <meta property="og:description" content="Explore articles on AI agents, extended reality, engineering deep-dives, product updates, and company news from the EFFOMA team."> 28 <meta property="og:image" content="https://effoma.com/effoma-logo.png"> 29 <meta property="og:image:width" content="1200"> 30 <meta property="og:image:height" content="630"> 31 32 <meta property="og:site_name" content="EFFOMA"> 33 <meta property="og:locale" content="en_US"> 34 35 <!-- Twitter --> 36 <meta name="twitter:card" content="summary_large_image"> 37 <meta name="twitter:url" content="https://effoma.com"> 38 <meta name="twitter:title" content="Blog | EFFOMA - Research, Product & Engineering Insights"> 39 <meta name="twitter:description" content="Explore articles on AI agents, extended reality, engineering deep-dives, product updates, and company news from the EFFOMA team."> 40 <meta name="twitter:image" content="https://effoma.com/effoma-logo.png"> 41 42 43 <!-- Preconnect to external domains for performance --> 44 <link rel="preconnect" href="https://fonts.googleapis.com"> 45 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""> 46 <link rel="preconnect" href="https://us.i.posthog.com" crossorigin=""> 47 <link rel="dns-prefetch" href="https://us.i.posthog.com"> 48 49 <!-- Google Fonts - loaded async to avoid render-blocking --> 50 <link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:wght@300;400;500;600;700;900&display=swap"> 51 <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:wght@300;400;500;600;700;900&display=swap"> 52 <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:wght@300;400;500;600;700;900&display=swap" /></noscript> 53 54 <!-- RSS Feed --> 55 <link rel="alternate" type="application/rss+xml" title="EFFOMA Blog" href="/feed.xml"> 56 57 <!-- Theme Color --> 58 <meta name="theme-color" content="#000000"> 59 60 <!-- Structured Data (JSON-LD) --> 61 62 63 64
64<script type="module" crossorigin="" src="/assets/index-Ct6GWPHc.js"></script>
64 65 <link rel="modulepreload" crossorigin="" href="/assets/rolldown-runtime-B0Z9INg1.js"> 66 <link rel="modulepreload" crossorigin="" href="/assets/vendor-markdown-DDdifeuo.js"> 67 <link rel="modulepreload" crossorigin="" href="/assets/vendor-react-y5u0SBxH.js"> 68 <link rel="modulepreload" crossorigin="" href="/assets/dist-BYUN2m_u.js"> 69 <link rel="modulepreload" crossorigin="" href="/assets/dist-F3VF8YtG.js"> 70 <link rel="modulepreload" crossorigin="" href="/assets/utils-FrSbbIHp.js"> 71 <link rel="modulepreload" crossorigin="" href="/assets/createLucideIcon-BxyMmt7N.js"> 72 <link rel="modulepreload" crossorigin="" href="/assets/globe-DnRlyJEp.js"> 73 <link rel="modulepreload" crossorigin="" href="/assets/vendor-mermaid-C6hBMDce.js"> 74 <link rel="stylesheet" crossorigin="" href="/assets/index-BaPb9Wwg.css"> 75<style type="text/css">:where(html[dir="ltr"]),:where([data-sonner-toaster][dir="ltr"]){--toast-icon-margin-start: -3px;--toast-icon-margin-end: 4px;--toast-svg-margin-start: -1px;--toast-svg-margin-end: 0px;--toast-button-margin-start: auto;--toast-button-margin-end: 0;--toast-close-button-start: 0;--toast-close-button-end: unset;--toast-close-button-transform: translate(-35%, -35%)}:where(html[dir="rtl"]),:where([data-sonner-toaster][dir="rtl"]){--toast-icon-margin-start: 4px;--toast-icon-margin-end: -3px;--toast-svg-margin-start: 0px;--toast-svg-margin-end: -1px;--toast-button-margin-start: 0;--toast-button-margin-end: auto;--toast-close-button-start: unset;--toast-close-button-end: 0;--toast-close-button-transform: translate(35%, -35%)}:where([data-sonner-toaster]){position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1: hsl(0, 0%, 99%);--gray2: hsl(0, 0%, 97.3%);--gray3: hsl(0, 0%, 95.1%);--gray4: hsl(0, 0%, 93%);--gray5: hsl(0, 0%, 90.9%);--gray6: hsl(0, 0%, 88.7%);--gray7: hsl(0, 0%, 85.8%);--gray8: hsl(0, 0%, 78%);--gray9: hsl(0, 0%, 56.1%);--gray10: hsl(0, 0%, 52.3%);--gray11: hsl(0, 0%, 43.5%);--gray12: hsl(0, 0%, 9%);--border-radius: 8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:none;z-index:999999999;transition:transform .4s ease}:where([data-sonner-toaster][data-lifted="true"]){transform:translateY(-10px)}@media (hover: none) and (pointer: coarse){:where([data-sonner-toaster][data-lifted="true"]){transform:none}}:where([data-sonner-toaster][data-x-position="right"]){right:var(--offset-right)}:where([data-sonner-toaster][data-x-position="left"]){left:var(--offset-left)}:where([data-sonner-toaster][data-x-position="center"]){left:50%;transform:translate(-50%)}:where([data-sonner-toaster][data-y-position="top"]){top:var(--offset-top)}:where([data-sonner-toaster][data-y-position="bottom"]){bottom:var(--offset-bottom)}:where([data-sonner-toast]){--y: translateY(100%);--lift-amount: calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);filter:blur(0);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:none;overflow-wrap:anywhere}:where([data-sonner-toast][data-styled="true"]){padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px #0000001a;width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}:where([data-sonner-toast]:focus-visible){box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast][data-y-position="top"]){top:0;--y: translateY(-100%);--lift: 1;--lift-amount: calc(1 * var(--gap))}:where([data-sonner-toast][data-y-position="bottom"]){bottom:0;--y: translateY(100%);--lift: -1;--lift-amount: calc(var(--lift) * var(--gap))}:where([data-sonner-toast]) :where([data-description]){font-weight:400;line-height:1.4;color:inherit}:where([data-sonner-toast]) :where([data-title]){font-weight:500;line-height:1.5;color:inherit}:where([data-sonner-toast]) :where([data-icon]){display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}:where([data-sonner-toast][data-promise="true"]) :where([data-icon])>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}:where([data-sonner-toast]) :where([data-icon])>*{flex-shrink:0}:where([data-sonner-toast]) :where([data-icon]) svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}:where([data-sonner-toast]) :where([data-content]){display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;cursor:pointer;outline:none;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}:where([data-sonner-toast]) :where([data-button]):focus-visible{box-shadow:0 0 0 2px #0006}:where([data-sonner-toast]) :where([data-button]):first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}:where([data-sonner-toast]) :where([data-cancel]){color:var(--normal-text);background:rgba(0,0,0,.08)}:where([data-sonner-toast][data-theme="dark"]) :where([data-cancel]){background:rgba(255,255,255,.3)}:where([data-sonner-toast]) :where([data-close-button]){position:absolute;
75left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast] [data-close-button]{background:var(--gray1)}:where([data-sonner-toast]) :where([data-close-button]):focus-visible{box-shadow:0 4px 12px #0000001a,0 0 0 2px #0003}:where([data-sonner-toast]) :where([data-disabled="true"]){cursor:not-allowed}:where([data-sonner-toast]):hover :where([data-close-button]):hover{background:var(--gray2);border-color:var(--gray5)}:where([data-sonner-toast][data-swiping="true"]):before{content:"";position:absolute;left:-50%;right:-50%;height:100%;z-index:-1}:where([data-sonner-toast][data-y-position="top"][data-swiping="true"]):before{bottom:50%;transform:scaleY(3) translateY(50%)}:where([data-sonner-toast][data-y-position="bottom"][data-swiping="true"]):before{top:50%;transform:scaleY(3) translateY(-50%)}:where([data-sonner-toast][data-swiping="false"][data-removed="true"]):before{content:"";position:absolute;inset:0;transform:scaleY(2)}:where([data-sonner-toast]):after{content:"";position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}:where([data-sonner-toast][data-mounted="true"]){--y: translateY(0);opacity:1}:where([data-sonner-toast][data-expanded="false"][data-front="false"]){--scale: var(--toasts-before) * .05 + 1;--y: translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}:where([data-sonner-toast])>*{transition:opacity .4s}:where([data-sonner-toast][data-expanded="false"][data-front="false"][data-styled="true"])>*{opacity:0}
75:where([data-sonner-toast][data-visible="false"]){opacity:0;pointer-events:none}:where([data-sonner-toast][data-mounted="true"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}:where([data-sonner-toast][data-removed="true"][data-front="true"][data-swipe-out="false"]){--y: translateY(calc(var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="true"]){--y: translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}:where([data-sonner-toast][data-removed="true"][data-front="false"][data-swipe-out="false"][data-expanded="false"]){--y: translateY(40%);opacity:0;transition:transform .5s,opacity .2s}:where([data-sonner-toast][data-removed="true"][data-front="false"]):before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y, 0px)) translate(var(--swipe-amount-x, 0px));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{0%{transform:var(--y) translate(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translate(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{0%{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width: 600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-theme=light]{--normal-bg: #fff;--normal-border: var(--gray4);--normal-text: var(--gray12);--success-bg: hsl(143, 85%, 96%);--success-border: hsl(145, 92%, 91%);--success-text: hsl(140, 100%, 27%);--info-bg: hsl(208, 100%, 97%);--info-border: hsl(221, 91%, 91%);--info-text: hsl(210, 92%, 45%);--warning-bg: hsl(49, 100%, 97%);--warning-border: hsl(49, 91%, 91%);--warning-text: hsl(31, 92%, 45%);--error-bg: hsl(359, 100%, 97%);--error-border: hsl(359, 100%, 94%);--error-text: hsl(360, 100%, 45%)}[data-sonner-toaster][data-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg: #000;--normal-border: hsl(0, 0%, 20%);--normal-text: var(--gray1)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg: #fff;--normal-border: var(--gray3);--normal-text: var(--gray12)}[data-sonner-toaster][data-theme=dark]{--normal-bg: #000;--normal-bg-hover: hsl(0, 0%, 12%);--normal-border: hsl(0, 0%, 20%);--normal-border-hover: hsl(0, 0%, 25%);--normal-text: var(--gray1);--success-bg: hsl(150, 100%, 6%);--success-border: hsl(147, 100%, 12%);--success-text: hsl(150, 86%, 65%);--info-bg: hsl(215, 100%, 6%);--info-border: hsl(223, 100%, 12%);--info-text: hsl(216, 87%, 65%);--warning-bg: hsl(64, 100%, 6%);--warning-border: hsl(60, 100%, 12%);--warning-text: hsl(46, 87%, 65%);--error-bg: hsl(358, 76%, 10%);--error-border: hsl(357, 89%, 16%);
75--error-text: hsl(358, 100%, 81%)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success],[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info],[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning],[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error],[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size: 16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:nth-child(1){animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}to{opacity:.15}}@media (prefers-reduced-motion){[data-sonner-toast],[data-sonner-toast]>*,.sonner-loading-bar{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)} 76</style><link rel="alternate" hreflang="en" href="https://effoma.com/blog"><link rel="alternate" hreflang="vi" href="https://effoma.com/vn/blog"><link rel="alternate" hreflang="x-default" href="https://effoma.com/blog">
76<script type="application/ld+json">{"@context":"https://schema.org","@type":"Blog","name":"EFFOMA Blog","description":"Explore articles on AI agents, extended reality, engineering deep-dives, product updates, and company news from the EFFOMA team.","url":"https://effoma.com/blog","publisher":{"@type":"Organization","name":"EFFOMA","url":"https://effoma.com","logo":{"@type":"ImageObject","url":"https://effoma.com/effoma-logo.png"}},"blogPost":[{"@type":"BlogPosting","headline":"Jev and Laya bring structured decisions to AI applications","description":"Jev and Laya answer bounded questions with choices, scores and probabilities. Their practical value depends on the workload, the evidence behind their confidence estimates and the software that decides when to escalate.","datePublished":"2026-10-03","author":{"@type":"Person","name":"Kody Anh Nguyen"},"url":"https://effoma.com/blog/jev-laya-structured-decisions"},{"@type":"BlogPosting","headline":"Generating tool-use training data from executable workflows","description":"ToolGrad constructs executable tool-call sequences before generating the requests used to train language models. The study examines how this ordering affects data generation, performance on unfamiliar tools, and the limits of scaling synthetic examples.","datePublished":"2026-09-26","author":{"@type":"Person","name":"Kody Anh Nguyen"},"url":"https://effoma.com/blog/generating-tool-use-training-data-from-executable-workflows"},{"@type":"BlogPosting","headline":"Synthetic neuron shapes improve automated brain mapping","description":"MoGen uses generated 3D neuron fragments to improve the reconstruction of real brain tissue. The research connects advances in generative modeling to one of connectomics' central challenges: reducing errors that still require human correction.","datePublished":"2026-09-13","author":{"@type":"Person","name":"Kody Anh Nguyen"},"url":"https://effoma.com/blog/synthetic-neuron-shapes-improve-brain-mapping"},{"@type":"BlogPosting","headline":"Every Vector Database Ranking Is an Artifact of Its Workload","description":"Three peer-reviewed and preprint benchmarks each report a vector database ranking that inverts under a different one of pgvector, Milvus, and Qdrant when a single measurement condition changes, which means none of the rankings, including our own from June, describe a system rather than a workload.","datePublished":"2026-09-11","author":{"@type":"Person","name":"Kody Anh Nguyá»
n"},"url":"https://effoma.com/blog/vector-database-benchmark-inversion-2026"},{"@type":"BlogPosting","headline":"Vector Databases in 2026: A Systematic Performance Analysis of Indexing Architectures, Quantization Methods, and Production-Scale Retrieval","description":"A comprehensive empirical and theoretical survey of vector database systems as of June 2026. We analyze indexing architectures (HNSW, IVF, DiskANN, CAGRA), quantization strategies (scalar, product, binary, RaBitQ), and filtered search performance across Qdrant, Milvus, Pinecone, Weaviate, pgvector, LanceDB, and Turbopuffer â with production benchmarks at 1M, 10M, 100M, and 1B+ vector scales.","datePublished":"2026-06-16","author":{"@type":"Person","name":"Kody Anh Nguyen"},"url":"https://effoma.com/blog/vector-database-performance-benchmark-comparison-2026"},{"@type":"BlogPosting","headline":"Thinking From the Beginning and Other Ways of Working Things Out","description":"Some questions you should work out from the beginning, and most you should not. A plain guide to the ways people work things out, what each one costs, and how each one fails.","datePublished":"2026-08-30","author":{"@type":"Person","name":"Kody Anh Nguyen"},"url":"https://effoma.com/blog/thinking-from-the-beginning"},{"@type":"BlogPosting","headline":"A Survey of Open Weights Image Generation Models Running Locally in 2026","description":"Every open-weights model that competes with Midjourney, GPT Image, Nano Banana, and Grok Imagine, organized the way a team actually has to evaluate one: base model lineage, the fine-tune ecosystem that grew on top of it, editing capability, hardware requirements, and the license governing the weights. The best open model by preference score is non-commercial. The most-downloaded fine-tune base is not the newest architecture. Renting a GPU beats buying one for almost every workload measured here.","datePublished":"2026-08-25","author":{"@type":"Person","name":"Kody Anh Nguyen"},"url":"https://effoma.com/blog/open-weights-image-generation-licenses-2026"},{"@type":"BlogPosting","headline":"Running an AI Assistant on Company Data Without the Data Leaving Vietnam","description":"Vietnam's Decree 356/2025 counts cloud processing as a cross-border data transfer, which turns an architecture preference into a legal question. This is the cost model for all three routes, the break-even volume for self-hosting, and the arithmetic showing a hundred-person company sits 155 times below it.","datePublished":"2026-08-18","author":{"@type":"Person","name":"Kody Anh Nguyen"},"url":"https://effoma.com/blog/ai-assistant-company-data-vietnam-residency"},{"@type":"BlogPosting","headline":"How Letters Became Software","description":"A history of type from cast metal to variable fonts, told as six changes in what a letter is: an object, a photograph, a grid of pixels, an outline, a program, a parameter space. Each stage froze an assumption the next one had to break, and the bill for the frozen assumptions was usually paid by the world's non-Latin scripts.","datePublished":"2026-08-18","author":{"@type":"Person","name":"Kody Anh Nguyen"},"url":"https://effoma.com/blog/how-letters-became-software"},{"@type":"BlogPosting","headline":"Choosing Between WebGL and WebGPU for a Browser 3D Application","description":"WebGPU reaches 85.56% of browsers and Firefox still ships it disabled. Three.js supports both APIs from one renderer class, so the decision is no longer about which one works. It is about browser reach, bundle size, which shader language your team is locked into, and whether the application needs GPU compute at all.","datePublished":"2026-08-11","author":{"@type":"Person","name":"Kody Anh Nguyen"},"url":"https://effoma.com/blog/choosing-between-webgl-and-webgpu"}]}</script>
76</head> 77 78<body> 79 <div id="root"><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events: none;"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section><nav class="effoma-navigation fixed bottom-0 left-0 right-0 z-50 md:hidden bg-background/95 backdrop-blur-md border-t border-border flex"><a class="flex-1 flex flex-col items-center justify-center gap-1 py-2 text-[10px] font-medium transition-colors text-foreground/50 hover:text-foreground/80" href="/" data-discover="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-house w-5 h-5 stroke-[1.5]"><path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"></path><path d="M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path></svg>Home</a><a class="flex-1 flex flex-col items-center justify-center gap-1 py-2 text-[10px] font-medium transition-colors text-foreground/50 hover:text-foreground/80" href="/about" data-discover="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info w-5 h-5 stroke-[1.5]"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg>About</a><a class="flex-1 flex flex-col items-center justify-center gap-1 py-2 text-[10px] font-medium transition-colors text-foreground/50 hover:text-foreground/80" href="/tech" data-discover="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-cpu w-5 h-5 stroke-[1.5]"><rect width="16" height="16" x="4" y="4" rx="2"></rect><rect width="6" height="6" x="9" y="9" rx="1"></rect><path d="M15 2v2"></path><path d="M15 20v2"></path><path d="M2 15h2"></path><path d="M2 9h2"></path><path d="M20 15h2"></path><path d="M20 9h2"></path><path d="M9 2v2"></path><path d="M9 20v2"></path></svg>Tech</a><a class="flex-1 flex flex-col items-center justify-center gap-1 py-2 text-[10px] font-medium transition-colors text-foreground/50 hover:text-foreground/80" href="/blog" data-discover="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-book-open w-5 h-5 stroke-[1.5]"><path d="M12 7v14"></path><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"></path></svg>Blog</a></nav><div class="min-h-screen bg-background"><header class="effoma-navigation fixed top-0 left-0 right-0 z-50 transition-shadow duration-300 bg-background/55 backdrop-blur-md "><div class="container mx-auto px-6 lg:px-12"><div class="flex items-center justify-between h-16 md:h-[72px]"><a class="flex items-center" href="/" data-discover="true"><span class="inline-flex items-center h-10 w-auto md:h-12"><img src="/assets/effoma-logo-DO4VBbgB.png" alt="EFFOMA" loading="eager" class="h-full w-auto"></span></a><nav class="hidden md:flex items-center gap-8"><a class="nav-link text-sm font-medium transition-colors text-foreground/80 hover:text-foreground" href="/" data-discover="true">Home</a><a class="nav-link text-sm font-medium transition-colors text-foreground/80 hover:text-foreground" href="/about" data-discover="true">About us</a><a class="nav-link text-sm font-medium transition-colors text-foreground/80 hover:text-foreground" href="/tech" data-discover="true">Tech</a><a class="nav-link text-sm font-medium transition-colors text-foreground
79/80 hover:text-foreground" href="/blog" data-discover="true">Blog</a><a class="nav-link text-sm font-medium transition-colors text-foreground/80 hover:text-foreground" href="/moving" data-discover="true">Moving</a></nav><div class="flex items-center gap-3"><a class="hidden sm:flex items-center gap-1 px-2.5 py-1.5 rounded-full text-xs font-semibold border border-border hover:bg-secondary transition-colors" aria-label="Chuyá»n sang tiếng Viá»t" href="/vn/blog/" data-discover="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-globe w-3.5 h-3.5"><circle cx="12" cy="12" r="10"></circle><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"></path><path d="M2 12h20"></path></svg>VN</a><button class="p-2 rounded-full hover:bg-secondary transition-colors" aria-label="Toggle theme"><div style="opacity: 0; transform: rotate(8.12572deg);"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon w-5 h-5"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path></svg></div></button><button class="md:hidden p-2 rounded-full hover:bg-secondary transition-colors" aria-label="Toggle menu"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu w-5 h-5"><line x1="4" x2="20" y1="12" y2="12"></line><line x1="4" x2="20" y1="6" y2="6"></line><line x1="4" x2="20" y1="18" y2="18"></line></svg></button></div></div></div></header><main class="container mx-auto px-6 lg:px-12 pt-24 pb-16"><div class="mb-10"><h1 class="text-4xl md:text-5xl font-bold tracking-tight mb-3">Blog</h1><p class="text-lg text-muted-foreground max-w-2xl">Research, product launches, engineering deep-dives, and company news.</p></div><div class="flex flex-col sm:flex-row sm:items-center gap-4 mb-8"><div dir="ltr" data-orientation="horizontal"><div role="tablist" aria-orientation="horizontal" class="inline-flex items-center justify-center rounded-md text-muted-foreground h-auto flex-wrap gap-1 bg-transparent p-0" tabindex="0" data-orientation="horizontal" style="outline: none;"><button type="button" role="tab" aria-selected="true" aria-controls="radix-:r1:-content-all" data-state="active" id="radix-:r1:-trigger-all" class="inline-flex items-center justify-center whitespace-nowrap font-medium ring-offset-background transition-all data-[state=active]:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground rounded-full px-4 py-1.5 text-sm" tabindex="-1" data-orientation="horizontal" data-radix-collection-item="">All</button><button type="button" role="tab" aria-selected="false" aria-controls="radix-:r1:-content-Research" data-state="inactive" id="radix-:r1:-trigger-Research" class="inline-flex items-center justify-center whitespace-nowrap font-medium ring-offset-background transition-all data-[state=active]:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground rounded-full px-4 py-1.5 text-sm" tabindex="-1" data-orientation="horizontal" data-radix-collection-item="">Research</button><button type="button" role="tab" aria-selected="false" aria-controls="radix-:r1:-content-Product" data-state="inactive" id="radix-:r1:-trigger-Product" class="inline-flex items-center justify-center whitespace-nowrap font-medium ring-offset-background transition-all data-[state=active]:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground rounded-full px-4 py-1.5 text-sm" tabindex="-1" data-orientation="horizontal" data-radix-collection-item="">Product</button><button type="button" role="tab" aria-selected="false" aria-controls="radix-:r1:-content-News" data-state="inactive" id="radix-:r1:-trigger-News" class="inline-flex items-center justify-center whitespace-nowrap font-medium ring-offset-background transition-all data-[state=active]:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground rounded-full px-4 py-1.5 text-sm" tabindex="-1" data-orientation="horizontal" data-radix-collection-item="">News</button><button type="button" role="tab" aria-selected="false" aria-controls="radix-:r1:-content-Engineering" data-state="inactive" id="radix-:r1:-trigger-Engineering" class="inline-flex items-center justify-center whitespace-nowrap font-medium ring-offset-background transition-all data-[state=active]:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground rounded-full px-4 py-1.5 text-sm" tabindex="-1" data-orientation="horizontal" data-radix-collection-item="">Engineering</button><button type="button" role="tab" aria-selected="false" aria-controls="radix-:r1:-content-Company" data-state="inactive" id="radix-:r1:-trigger-Company" class="inline-flex items-center justify-center whitespace-nowrap font-medium ring-offset-background transition-all data-[state=active]:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-primary data-[state=active]:text-primary-foreground rounded-full px-4 py-1.5 text-sm" tabindex="-1" data-orientation="horizontal" data-radix-collection-item="">Company</button></div></div><div class="sm:ml-auto"><div class="relative w-full max-w-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg><input type="search" class="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm pl-9" placeholder="Search articles..." value=""></div></div></div><div class="grid sm:grid-cols-2 lg:grid-cols-3 gap-6"><a href="/blog/jev-laya-structured-decisions" data-discover="true"><div class="rounded-lg border bg-card text-card-foreground shadow-sm group overflow-hidden border-border/50 hover:border-effoma-cyan/50 transition-all duration-300 h-full"><div class="aspect-[16/9] overflow-hidden bg-muted flex items-center justify-center"><img src="/blog/q7n4v9kc.svg" alt="A text record passes into a decision model and branches into a category, an ordered score and a yes probability" loading="lazy" class="w-full h-full object-contain transition-transform duration-500 group-hover:scale-105"></div><div class="p-5"><div class="flex items-center gap-2 mb-3"><div class="inline-flex items-center rounded-full border px-2.5 py-0.5 font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80 text-[10px] uppercase tracking-wider">Engineering</div></div><h3 class="font-semibold text-lg leading-tight mb-2 group-hover:text-effoma-cyan transition-colors line-clamp-2">Jev and Laya bring structured decisions to AI applications</h3><p class="text-sm text-muted-foreground line-clamp-2 mb-4">Jev and Laya answer bounded questions with choices, scores and probabilities. Their practical value depends on the workload, the evidence behind their confidence estimates and the softw
79are that decides when to escalate.</p><div class="flex items-center gap-4 text-xs text-muted-foreground"><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar w-3 h-3"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg>October 3, 2026</span><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock w-3 h-3"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>10 min read</span></div></div></div></a><a href="/blog/generating-tool-use-training-data-from-executable-workflows" data-discover="true"><div class="rounded-lg border bg-card text-card-foreground shadow-sm group overflow-hidden border-border/50 hover:border-effoma-cyan/50 transition-all duration-300 h-full"><div class="aspect-[16/9] overflow-hidden bg-muted flex items-center justify-center"><img src="/blog/q7m4v9cx.svg" alt="Schematic showing executed tool calls supplying evidence for a synthetic training request" loading="lazy" class="w-full h-full object-contain transition-transform duration-500 group-hover:scale-105"></div><div class="p-5"><div class="flex items-center gap-2 mb-3"><div class="inline-flex items-center rounded-full border px-2.5 py-0.5 font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80 text-[10px] uppercase tracking-wider">Research</div></div><h3 class="font-semibold text-lg leading-tight mb-2 group-hover:text-effoma-cyan transition-colors line-clamp-2">Generating tool-use training data from executable workflows</h3><p class="text-sm text-muted-foreground line-clamp-2 mb-4">ToolGrad constructs executable tool-call sequences before generating the requests used to train language models. The study examines how this ordering affects data generation, performance on unfamiliar tools, and the limits of scaling synthetic examples.</p><div class="flex items-center gap-4 text-xs text-muted-foreground"><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar w-3 h-3"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg>September 26, 2026</span><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock w-3 h-3"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>8 min read</span></div></div></div></a><a href="/blog/synthetic-neuron-shapes-improve-brain-mapping" data-discover="true"><div class="rounded-lg border bg-card text-card-foreground shadow-sm group overflow-hidden border-border/50 hover:border-effoma-cyan/50 transition-all duration-300 h-full"><div class="aspect-[16/9] overflow-hidden bg-muted flex items-center justify-center"><img src="/blog/n4r8k2vp.svg" alt="Schematic of a branching neuronal surface represented as points, alongside a continuous traced branch" loading="lazy" class="w-full h-full object-contain transition-transform duration-500 group-hover:scale-105"></div><div class="p-5"><div class="flex items-center gap-2 mb-3"><div class="inline-flex items-center rounded-full border px-2.5 py-0.5 font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80 text-[10px] uppercase tracking-wider">Research</div></div><h3 class="font-semibold text-lg leading-tight mb-2 group-hover:text-effoma-cyan transition-colors line-clamp-2">Synthetic neuron shapes improve automated brain mapping</h3><p class="text-sm text-muted-foreground line-clamp-2 mb-4">MoGen uses generated 3D neuron fragments to improve the reconstruction of real brain tissue. The research connects advances in generative modeling to one of connectomics' central challenges: reducing errors that still require human correction.</p><div class="flex items-center gap-4 text-xs text-muted-foreground"><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar w-3 h-3"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg>September 13, 2026</span><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock w-3 h-3"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>8 min read</span></div></div></div></a><a href="/blog/vector-database-benchmark-inversion-2026" data-discover="true"><div class="rounded-lg border bg-card text-card-foreground shadow-sm group overflow-hidden border-border/50 hover:border-effoma-cyan/50 transition-all duration-300 h-full"><div class="aspect-[16/9] overflow-hidden bg-muted flex items-center justify-center"><img src="/blog/vectordb-inversion-cover.svg" alt="EFFOMA technical report cover titled Every Vector Database Ranking Is an Artifact of Its Workload" loading="lazy" class="w-full h-full object-contain transition-transform duration-500 group-hover:scale-105"></div><div class="p-5"><div class="flex items-center gap-2 mb-3"><div class="inline-flex items-center rounded-full border px-2.5 py-0.5 font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80 text-[10px] uppercase tracking-wider">Research</div></div><h3 class="font-semibold text-lg leading-tight mb-2 group-hover:text-effoma-cyan transition-colors line-clamp-2">Every Vector Database Ranking Is an Artifact of Its Workload</h3><p class="text-sm text-muted-foreground line-clamp-2 mb-4">Three peer-reviewed and preprint benchmarks each report a vector database ranking that inverts under a different one of pgvector, Milvus, and Qdrant when a single measurement condition changes, which means none of the rankings, including our own from June, describe a system rather than a workload.</p><div class="flex items-center gap-4 text-xs text-muted-foreground"><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar w-3 h-3"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg>September 11, 2026</span><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock w-3 h-3"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>23 min read</span></div></div></div></a><a href="/blog/vector-database-performance-benchmark-comparison-2026" data-discover="true"><div class="rounded-lg border bg-card text-card-foreground shadow-sm group overflow-hidden border-border/50 hover:border-effoma-cyan/50 transition-all duration-300 h-full"><div class="aspect-[16/9] overflow-hidden bg-muted flex items-center justify-center"><img src="/blog/vector-database-benchmark-2026.svg" alt="Vector Databases in 2026: A Systematic Performance Analysis of Indexing Architectures, Quantization Methods, and Production-Scale Retrieval" loading="lazy" class="w-full h-full object-contain transition-transform duration-500 group-hover:scale-105"></div><div class="p-5"><div class="flex items-center gap-2 mb-3"><div class="inline-flex items-center rounded-full border px-2.5 py-0.5 font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80 text-[10px] uppercase tracking-wider">Research</div></div><h3 class="font-semibold text-lg leading-tight mb-2 group-hover:text-effoma-cyan transition-colors line-clamp-2">Vector Databases in 2026: A Systematic Performance Analysis of Indexing Architectures, Quantization Methods, and Production-Scale Retrieval</h3><p class="text-sm text-muted-foreground line-clamp-2 mb-4">A comprehensive empirical and theoretical survey of vector database systems as of June 2026. We analyze indexing architectures (HNSW, IVF, DiskANN, CAGRA), quantization strategies (scalar, product, binary, RaBitQ), and filtered search performance across Qdrant, Milvus, Pinecone, Weaviate, pgvector, LanceDB, and Turbopuffer â with production benchmarks at 1M, 10M, 100M, and 1B+ vector scales.</p><div class="flex items-center gap-4 text-xs text-muted-foreground"><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar w-3 h-3"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg>June 16, 2026</span><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock w-3 h-3"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>28 min read</span></div></div></div></a><a href="/blog/thinking-from-the-beginning" data-discover="true"><div class="rounded-lg border bg-card text-card-foreground shadow-sm group overflow-hidden border-border/50 hover:border-effoma-cyan/50 transition-all duration-300 h-full"><div class="aspect-[16/9] overflow-hidden bg-muted flex items-center justify-center"><img src="/blog/thinking-from-the-beginning-cover.svg" alt="On ivory paper, a stack of bars narrowing downward to a single caramel mark, beside a mirrored stack widening upward to a caramel bar" loading="lazy" class="w-full h-full object-contain transition-transform duration-500 group-hover:scale-105"></div><div class="p-5"><div class="flex items-center gap-2 mb-3"><div class="inline-flex items-center rounded-full border px-2.5 py-0.5 font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80 text-[10px] uppercase tracking-wider">Research</div></div><h3 class="font-semibold text-lg leading-tight mb-2 group-hover:text-effoma-cyan transition-colors line-clamp-2">Thinking From the Beginning and Other Ways of Working Things Out</h3><p class="text-sm text-muted-foreground line-clamp-2 mb-4">Some questions you should work out from the beginning, and most you should not. A plain guide to the ways people work things out, what each one costs, and how each one fails.</p><div class="flex items-center gap-4 text-xs text-muted-foreground"><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar w-3 h-3"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg>August 30, 2026</span><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock w-3 h-3"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>23 min read</span></div></div></div></a><a href="/blog/open-weights-image-generation-licenses-2026" data-discover="true"><div class="rounded-lg border bg-card text-card-foreground shadow-sm group overflow-hidden border-border/50 hover:border-effoma-cyan/50 transition-all duration-300 h-full"><div class="aspect-[16/9] overflow-hidden bg-muted flex items-center justify-center"><img src="/blog/open-weights-image-gen-licenses-cover.svg" alt="A sandstone-toned cover showing a checkpoint file icon with a padlock, five license tag chips in warm stone colors reading Apache 2.0, Non-Commercial, Community, Territory, and Share-Alike, above the title text" loading="lazy" class="w-full h-full object-contain transition-transform duration-500 group-hover:scale-105"></div><div class="p-5"><div class="flex items-center gap-2 mb-3"><div class="inline-flex items-center rounded-full border px-2.5 py-0.5 font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80 text-[10px] uppercase tracking-wider">Research</div></div><h3 class="font-semibold text-lg leading-tight mb-2 group-hover:text-effoma-cyan transition-colors line-clamp-2">A Survey of Open Weights Image Generation Models Running Locally in 2026</h3><p class="text-sm text-muted-foreground line-clamp-2 mb-4">Every open-weights model that competes with Midjourney, GPT Image, Nano Banana, and Grok Imagine, organized the way a team actually has to evaluate one: base model lineage, the fine-tune ecosystem that grew on top of it, editing capability, hardware requirements, and the license governing the weights. The best open model by preference score is non-commercial. The most-downloaded fine-tune base is not the newest architecture. Renting a GPU beats buying one for almost every workload measured here.</p><div class="flex items-center gap-4 text-xs text-muted-foreground"><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar w-3 h-3"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg>August 25, 2026</span><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock w-3 h-3"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>35 min read</span></div></div></div></a><a href="/blog/ai-assistant-company-data-vietnam-residency" data-discover="true"><div class="rounded-lg border bg-card text-card-foreground shadow-sm group overflow-hidden border-border/50 hover:border-effoma-cyan/50 transition-all duration-300 h-full"><div class="aspect-[16/9] overflow-hidden bg-muted flex items-center justify-center"><img src="/blog/vn-residency-cover-v2.svg" alt="Chocolate-palette diagram of a Vietnam data border with three routes for company documents: open weights on a rented GPU inside the border, managed cloud straddling it, and a vendor API call offshore" loading="lazy" class="w-full h-full object-contain transition-transform duration-500 group-hover:scale-105"></div><div class="p-5"><div class="flex items-center gap-2 mb-3"><div class="inline-flex items-center rounded-full border px-2.5 py-0.5 fo
79nt-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80 text-[10px] uppercase tracking-wider">Engineering</div></div><h3 class="font-semibold text-lg leading-tight mb-2 group-hover:text-effoma-cyan transition-colors line-clamp-2">Running an AI Assistant on Company Data Without the Data Leaving Vietnam</h3><p class="text-sm text-muted-foreground line-clamp-2 mb-4">Vietnam's Decree 356/2025 counts cloud processing as a cross-border data transfer, which turns an architecture preference into a legal question. This is the cost model for all three routes, the break-even volume for self-hosting, and the arithmetic showing a hundred-person company sits 155 times below it.</p><div class="flex items-center gap-4 text-xs text-muted-foreground"><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar w-3 h-3"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg>August 18, 2026</span><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock w-3 h-3"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>30 min read</span></div></div></div></a><a href="/blog/how-letters-became-software" data-discover="true"><div class="rounded-lg border bg-card text-card-foreground shadow-sm group overflow-hidden border-border/50 hover:border-effoma-cyan/50 transition-all duration-300 h-full"><div class="aspect-[16/9] overflow-hidden bg-muted flex items-center justify-center"><img src="/blog/letters-software-cover-v2.svg" alt="Dark gothic-palette cover showing the same letter a three ways: cast on a lead sort, caught in a pixel grid, and traced by Bezier control points" loading="lazy" class="w-full h-full object-contain transition-transform duration-500 group-hover:scale-105"></div><div class="p-5"><div class="flex items-center gap-2 mb-3"><div class="inline-flex items-center rounded-full border px-2.5 py-0.5 font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80 text-[10px] uppercase tracking-wider">Research</div></div><h3 class="font-semibold text-lg leading-tight mb-2 group-hover:text-effoma-cyan transition-colors line-clamp-2">How Letters Became Software</h3><p class="text-sm text-muted-foreground line-clamp-2 mb-4">A history of type from cast metal to variable fonts, told as six changes in what a letter is: an object, a photograph, a grid of pixels, an outline, a program, a parameter space. Each stage froze an assumption the next one had to break, and the bill for the frozen assumptions was usually paid by the world's non-Latin scripts.</p><div class="flex items-center gap-4 text-xs text-muted-foreground"><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar w-3 h-3"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg>August 18, 2026</span><span class="flex items-center gap-1"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-clock w-3 h-3"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>34 min read</span></div></div></div></a></div><nav role="navigation" aria-label="pagination" class="mx-auto flex w-full justify-center mt-10"><ul class="flex flex-row items-center gap-1">
79<li class=""><a aria-current="page" class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 w-10 cursor-pointer">1</a></li><li class=""><a class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-accent hover:text-accent-foreground h-10 w-10 cursor-pointer">2</a></li><li class=""><a class="inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-accent hover:text-accent-foreground h-10 w-10 cursor-pointer">5</a></li><li class=""><a class="inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2 gap-1 pr-2.5 cursor-pointer" aria-label="Go to next page"><span>Next</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right h-4 w-4"><path d="m9 18 6-6-6-6"></path></svg></a></li></ul></nav></main><footer id="contact" class="relative z-10 py-16 md:py-24 bg-primary/90 text-primary-foreground"><div class="container mx-auto px-6 lg:px-12"><div class="grid md:grid-cols-3 gap-12 lg:gap-16"><div style="opacity: 0; transform: translateY(20px);"><h3 class="font-bold text-lg mb-4">Vietnam</h3><address class="not-italic text-primary-foreground/70 text-sm leading-relaxed">255A Tran Xuan Soan Street, Tân Hưng Ward, Há» Chà Minh City<br>(Tân Thuáºn Tây, Quáºn 7, Thà nh phá» Há» Chà Minh)</address></div><div style="opacity: 0; transform: translateY(20px);"><h3 class="font-bold text-lg mb-4">Australia</h3><address class="not-italic text-primary-foreground/70 text-sm leading-relaxed mb-4">1 Gaza Rd, West Ryde NSW 2114,<br>Sydney</address><div><p class="text-sm text-primary-foreground/70 mb-1">Contact us at</p><a href="/cdn-cgi/l/email-protection#82e1edecf6e3e1f6c2e7e4e4edefe3ace1edef" class="text-sm text-primary-foreground hover:text-accent transition-colors underline"><span class="__cf_email__" data-cfemail="c4a7abaab0a5a7b084a1a2a2aba9a5eaa7aba9">[email protected]</span></a></div></div><div class="flex flex-col gap-4" style="opacity: 0; transform: translateY(20px);"><div class="bg-white rounded-md p-3 w-48 md:w-56 flex items-center justify-center"><img src="/assets/partner-nvidia-Cwz7xZgK.webp" alt="NVIDIA Inception Program" class="w-full h-auto object-contain"></div><div class="bg-white rounded-md p-3 w-48 md:w-56 flex items-center justify-center"><img src="/assets/partner-microsoft-C-chrBl_.webp" alt="Microsoft for Startups Founders Hub" class="w-full h-auto object-contain"></div></div></div><div class="mt-16 pt-8 border-t border-primary-foreground/20 flex flex-col md:flex-row items-center justify-between gap-4" style="opacity: 0;"><span class="inline-flex items-center h-8 w-auto md:h-10"><img src="/assets/effoma-logo-DO4VBbgB.png" alt="EFFOMA" loading="eager" class="h-full w-auto invert"></span>
79<p class="text-xs text-primary-foreground/60">© 2026 EFFOMA. All rights reserved.</p></div></div></footer></div></div>
vendor: 111 bytes, lines 79-82
79 80 81 82<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
82<script type="text/javascript" crossorigin="anonymous" src="https://us-assets.i.posthog.com/static/exception-autocapture.js?v=1.435.6"></script>
82<script type="text/javascript" crossorigin="anonymous" src="https://us-assets.i.posthog.com/array/phc_P07yjZfP2iCWOwmmB5TibF7jIJaK6WVHgAeLEZVBa15/config.js"></script>
82<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"38cb808ae03c4d33a98be4c9c62019cf","r":1,"spa":2}' crossorigin="anonymous"></script>
82 83</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.