<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jayesh Shende</title>
    <description>The latest articles on DEV Community by Jayesh Shende (@sjayesh).</description>
    <link>https://dev.to/sjayesh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4144764%2Fac57781c-b8e1-434a-ac08-8063d2642a67.png</url>
      <title>DEV Community: Jayesh Shende</title>
      <link>https://dev.to/sjayesh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sjayesh"/>
    <language>en</language>
    <item>
      <title>Run Luxir on a Mac or Windows laptop (no Linux, no C++)</title>
      <dc:creator>Jayesh Shende</dc:creator>
      <pubDate>Sat, 26 Sep 2026 20:08:52 +0000</pubDate>
      <link>https://dev.to/sjayesh/run-luxir-on-a-mac-or-windows-laptop-no-linux-no-c-k6l</link>
      <guid>https://dev.to/sjayesh/run-luxir-on-a-mac-or-windows-laptop-no-linux-no-c-k6l</guid>
      <description>&lt;p&gt;Luxir ships a Linux x86-64 binary. This post is how I run that build in Docker on a laptop that is not Linux, including ARM machines that have to emulate &lt;code&gt;linux/amd64&lt;/code&gt;. Four files, &lt;code&gt;docker compose up&lt;/code&gt;, then a small index and search. Good enough to try the API. Not how you measure production speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Luxir?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Luxir is a new open-source hybrid search engine.&lt;/strong&gt; You put documents in. You ask for the ones that match words, numbers, maps, or vectors. It talks HTTP and JSON on port 9400, so &lt;code&gt;curl&lt;/code&gt; is enough. There is also gRPC on 9401 for programs. Official site: &lt;a href="https://luxir.org/" rel="noopener noreferrer"&gt;luxir.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Yonik Seeley created it. He is the original author of Apache Solr and a longtime Lucene/Solr committer. Luxir is &lt;strong&gt;not&lt;/strong&gt; Solr, Lucene, Elasticsearch, or OpenSearch. It is a separate C++ engine, Apache License 2.0, first public release &lt;strong&gt;0.1.0&lt;/strong&gt; (September 2026). It is pre-1.0: APIs and on-disk format can still change.&lt;/p&gt;

&lt;p&gt;What it does, in one list (from the project's own docs):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full-text&lt;/strong&gt; ranking (BM25), plus a small query language you can type by hand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector / kNN&lt;/strong&gt; search, with filters applied inside the vector search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid&lt;/strong&gt; ranking: lexical and vector in one request (rank fusion)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facets and analytics&lt;/strong&gt; on the same index view (counts, ranges, metrics)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geo&lt;/strong&gt; (box and radius), composed with the rest&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No JVM.&lt;/strong&gt; Native code. The pitch is more search per core, per gigabyte, and per dollar&lt;/li&gt;
&lt;li&gt;Collections appear on first write. You can start without declaring a schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you already know Solr or Elasticsearch: think "one process, curl-first, text plus vectors plus facets," not "a cluster you assemble from plugins."&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this guide exists
&lt;/h3&gt;

&lt;p&gt;Luxir is new enough that most people have never heard of it. The official ready-made program is a &lt;strong&gt;Linux x86-64&lt;/strong&gt; download. If you evaluate search engines on a Mac or Windows laptop, you hit that wall before you ever send a query.&lt;/p&gt;

&lt;p&gt;This page exists so you can &lt;strong&gt;try Luxir this afternoon&lt;/strong&gt; without installing Linux, without compiling C++, and without treating Docker emulation as production. The engine is Yonik Seeley and contributors (&lt;a href="https://luxir.org/" rel="noopener noreferrer"&gt;luxir.org&lt;/a&gt;). This walkthrough is a community how-to around the official Linux binary, not a project release. If anything here disagrees with the official docs, follow the docs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How-to facts&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Software&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://luxir.org/" rel="noopener noreferrer"&gt;Luxir&lt;/a&gt; 0.1.0 (Apache License 2.0), by Yonik Seeley and contributors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;This page&lt;/td&gt;
&lt;td&gt;Community Docker walkthrough (four files). Not an official image or download.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Written&lt;/td&gt;
&lt;td&gt;27 September 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host need&lt;/td&gt;
&lt;td&gt;Docker that can run &lt;code&gt;linux/amd64&lt;/code&gt; (native or simulated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ports&lt;/td&gt;
&lt;td&gt;HTTP &lt;strong&gt;9400&lt;/strong&gt;, gRPC &lt;strong&gt;9401&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time&lt;/td&gt;
&lt;td&gt;About 20-40 minutes the first time (image download)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Can you run Luxir without Linux or C++?
&lt;/h2&gt;

&lt;p&gt;Yes. The official 0.1.0 program is a &lt;a href="https://github.com/luxir-search/luxir/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;Linux x86-64 v2 binary&lt;/a&gt;. You can run that same binary on a Mac or Windows PC if Docker can simulate &lt;code&gt;linux/amd64&lt;/code&gt; (Rosetta or QEMU on Apple Silicon and other ARM machines). You do not dual-boot Linux. You do not compile C++. You are not running a rewrite.&lt;/p&gt;

&lt;p&gt;This is a laptop demo, not a production or benchmark setup. Official docs: &lt;a href="https://luxir.org/" rel="noopener noreferrer"&gt;luxir.org&lt;/a&gt;, &lt;a href="https://luxir.org/docs/latest/guide/http-api/" rel="noopener noreferrer"&gt;HTTP API&lt;/a&gt;, &lt;a href="https://luxir.org/docs/latest/guide/operations/" rel="noopener noreferrer"&gt;operations&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Luxir is a new C++ hybrid search engine (text, vectors, facets, geo) from Yonik Seeley. Site: &lt;a href="https://luxir.org/" rel="noopener noreferrer"&gt;luxir.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Official 0.1.0 binaries target Linux x86-64. Other chips use Docker platform simulation.&lt;/li&gt;
&lt;li&gt;Four files in &lt;code&gt;luxir-try&lt;/code&gt;: &lt;code&gt;Dockerfile&lt;/code&gt;, &lt;code&gt;docker-compose.yml&lt;/code&gt;, &lt;code&gt;books.ndjson&lt;/code&gt;, &lt;code&gt;search.json&lt;/code&gt;. Then &lt;code&gt;docker compose up --build -d&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Health: &lt;code&gt;http://127.0.0.1:9400/health&lt;/code&gt; -&amp;gt; &lt;code&gt;{"status":"ok"}&lt;/code&gt;. Index with &lt;code&gt;?commit=true&lt;/code&gt; or search can be empty.&lt;/li&gt;
&lt;li&gt;For production, use Linux x86-64 without emulation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This guide assumes you already have &lt;strong&gt;Docker Desktop&lt;/strong&gt; (or Docker Engine + Compose V2), a terminal, and &lt;code&gt;curl&lt;/code&gt;. The part most people miss is &lt;strong&gt;platform simulation&lt;/strong&gt;: Luxir's official binary is &lt;code&gt;linux/amd64&lt;/code&gt;, so ARM hosts must emulate that platform, and Docker Desktop often needs a setting turned on first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commands:&lt;/strong&gt; Unix-style &lt;code&gt;curl&lt;/code&gt; below. In Windows PowerShell, use &lt;code&gt;curl.exe&lt;/code&gt; (plain &lt;code&gt;curl&lt;/code&gt; is often &lt;code&gt;Invoke-WebRequest&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1 - Enable linux/amd64 simulation (then confirm Docker)
&lt;/h2&gt;

&lt;p&gt;Luxir 0.1.0 does not ship a native ARM build. The Compose file pins &lt;code&gt;platform: linux/amd64&lt;/code&gt;. On an Intel/AMD machine that pin is a no-op. On Apple Silicon or Windows ARM, Docker must &lt;strong&gt;translate&lt;/strong&gt; x86-64 (Rosetta on Mac, QEMU elsewhere). That is slower than native Linux. Fine for trying the API. Wrong for QPS numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apple Silicon (this is the setting people skip):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start Docker Desktop and wait until it is idle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settings -&amp;gt; General -&amp;gt; Use Rosetta for x86/amd64 emulation&lt;/strong&gt; -&amp;gt; on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply &amp;amp; Restart&lt;/strong&gt; if Docker asks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If that checkbox is missing, update Docker Desktop. Without it, &lt;code&gt;docker compose up&lt;/code&gt; often fails with &lt;code&gt;exec format error&lt;/code&gt;, a crash loop, or a container that never becomes healthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intel Mac or typical x86 Windows:&lt;/strong&gt; no extra checkbox. Keep the &lt;code&gt;linux/amd64&lt;/code&gt; pin in Compose anyway so the same files work on an ARM laptop later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows ARM:&lt;/strong&gt; use Docker Desktop's amd64 emulation (usually WSL 2). If the engine never starts, emulation is off or incomplete.&lt;/p&gt;

&lt;p&gt;Confirm the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker version
docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You want a running Engine and Compose V2. &lt;code&gt;Cannot connect to the Docker daemon&lt;/code&gt; means Desktop is still starting. &lt;code&gt;docker compose: command not found&lt;/code&gt; means an old install; update Desktop rather than adding a random &lt;code&gt;docker-compose&lt;/code&gt; binary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2 - Four files in &lt;code&gt;luxir-try&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/luxir-try &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/luxir-try
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="se"&gt;\l&lt;/span&gt;uxir-try&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="se"&gt;\l&lt;/span&gt;uxir-try
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save these four names exactly (&lt;code&gt;Dockerfile&lt;/code&gt; with no extension):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;books.ndjson&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;search.json&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  File 1 - &lt;code&gt;Dockerfile&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This file tells Docker: start from Ubuntu Linux, download the official Luxir 0.1.0 Linux x86-64 &lt;strong&gt;v2&lt;/strong&gt; program, and run it. &lt;code&gt;v2&lt;/code&gt; is the widest Intel/AMD tier. Use it under Mac emulation. Do not change it to &lt;code&gt;v3&lt;/code&gt; or &lt;code&gt;v4&lt;/code&gt; for a first try.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Runtime image: official Luxir Linux x86-64 v2 binary.&lt;/span&gt;
&lt;span class="c"&gt;# Always build and run as linux/amd64 (Rosetta/QEMU on Apple Silicon).&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# Do not use this image for production performance numbers on ARM hosts.&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; --platform=linux/amd64 ubuntu:22.04&lt;/span&gt;

&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; LUXIR_VERSION=0.1.0&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; LUXIR_CPU_TIER=v2&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; DEBIAN_FRONTEND=noninteractive&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--no-install-recommends&lt;/span&gt; ca-certificates curl tzdata &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# v2 is the widest x86-64 tier and the one to use under Apple Silicon emulation.&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;curl &lt;span class="nt"&gt;-fL&lt;/span&gt; &lt;span class="nt"&gt;--retry&lt;/span&gt; 3 &lt;span class="se"&gt;\
&lt;/span&gt;      &lt;span class="s2"&gt;"https://github.com/luxir-search/luxir/releases/download/v&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LUXIR_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/luxir-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LUXIR_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-linux-x86_64-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LUXIR_CPU_TIER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;      &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/local/bin/luxir &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/local/bin/luxir

&lt;span class="k"&gt;RUN &lt;/span&gt;groupadd &lt;span class="nt"&gt;--system&lt;/span&gt; luxir &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; useradd &lt;span class="nt"&gt;--system&lt;/span&gt; &lt;span class="nt"&gt;--gid&lt;/span&gt; luxir &lt;span class="nt"&gt;--home-dir&lt;/span&gt; /var/lib/luxir &lt;span class="nt"&gt;--create-home&lt;/span&gt; luxir

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; luxir&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /var/lib/luxir&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 9400 9401&lt;/span&gt;
&lt;span class="k"&gt;VOLUME&lt;/span&gt;&lt;span class="s"&gt; ["/var/lib/luxir"]&lt;/span&gt;

&lt;span class="k"&gt;HEALTHCHECK&lt;/span&gt;&lt;span class="s"&gt; --interval=15s --timeout=3s --start-period=10s --retries=3 \&lt;/span&gt;
    CMD curl -sf http://127.0.0.1:9400/health || exit 1

&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["luxir"]&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["--store.backend=fs", "--store.data-dir=/var/lib/luxir"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  File 2 - &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This file tells Docker: build that Dockerfile as a &lt;strong&gt;linux/amd64&lt;/strong&gt; image, publish ports 9400 and 9401 on your laptop, and keep the search index in a named volume so data survives a restart.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Luxir try-out. Forces linux/amd64 so Apple Silicon uses the official&lt;/span&gt;
&lt;span class="c1"&gt;# x86-64 binary (Rosetta/QEMU). Not for production capacity planning.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# From this folder:&lt;/span&gt;
&lt;span class="c1"&gt;#   docker compose up --build -d&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;luxir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;luxir:try&lt;/span&gt;
    &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;linux/amd64&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
      &lt;span class="na"&gt;platforms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;linux/amd64&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9400:9400"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9401:9401"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;luxir-data:/var/lib/luxir&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;luxir-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  File 3 - &lt;code&gt;books.ndjson&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Two documents. Each line is one JSON object. That format is called NDJSON (newline-delimited JSON). Luxir creates the &lt;code&gt;books&lt;/code&gt; collection on the first write.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"title_t"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Dune"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"author_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Frank Herbert"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"year_i"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1965&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"title_t"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Dune Messiah"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"author_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Frank Herbert"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"year_i"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1969&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;title_t&lt;/code&gt; is full text. &lt;code&gt;year_i&lt;/code&gt; is an integer. &lt;code&gt;author_name&lt;/code&gt; is a name field. You do not need to understand the schema yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  File 4 - &lt;code&gt;search.json&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"author_name:herbert AND year_i:&amp;lt;1970"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"fields"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"title_t"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"year_i"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm: &lt;code&gt;ls Dockerfile docker-compose.yml books.ndjson search.json&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3 - Ports 9400 and 9401
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; http://127.0.0.1:9400/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;000&lt;/code&gt; or a connection error means the port is free. &lt;code&gt;200&lt;/code&gt; means something (often an old Compose stack) is already bound; from this folder run &lt;code&gt;docker compose down&lt;/code&gt;, or stop the other process.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4 - Build and start
&lt;/h2&gt;

&lt;p&gt;First run pulls Ubuntu plus about 80 MB for the Luxir binary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;
docker compose ps
docker compose logs &lt;span class="nt"&gt;--tail&lt;/span&gt; 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You should see:&lt;/strong&gt; &lt;code&gt;Built&lt;/code&gt; / &lt;code&gt;Started&lt;/code&gt;, service &lt;code&gt;luxir&lt;/code&gt;, image &lt;code&gt;luxir:try&lt;/code&gt;, ports 9400-9401. Health may say &lt;code&gt;starting&lt;/code&gt; for 10-20 seconds. Logs should show a Luxir banner, not a crash loop.&lt;/p&gt;

&lt;p&gt;On Apple Silicon, &lt;code&gt;docker compose ps&lt;/code&gt; should list &lt;code&gt;linux/amd64&lt;/code&gt;. If the platform is &lt;code&gt;arm64&lt;/code&gt;, the pin did not apply; do not continue until it does.&lt;/p&gt;

&lt;p&gt;Pull or certificate errors: check the network and rerun the same &lt;code&gt;up --build&lt;/code&gt;. Docker reuses layers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 5 - Health
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; http://127.0.0.1:9400/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the connect fails, &lt;code&gt;docker compose ps&lt;/code&gt; and &lt;code&gt;docker compose logs&lt;/code&gt;. If the container exits or restarts on ARM, go back to Part 1 (Rosetta / emulation).&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 6 - Index two documents
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;commit=true&lt;/code&gt; publishes the write. Without it, search can return no hits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://127.0.0.1:9400/collections/books/_update?commit=true"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/x-ndjson"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; @books.ndjson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You should see:&lt;/strong&gt; &lt;code&gt;"status":"ok"&lt;/code&gt; and an &lt;code&gt;update_version&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 7 - Search
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"http://127.0.0.1:9400/collections/books/_search?pretty"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; @search.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You should see:&lt;/strong&gt; two hits, &lt;code&gt;Dune&lt;/code&gt; (1965) and &lt;code&gt;Dune Messiah&lt;/code&gt; (1969).&lt;/p&gt;

&lt;p&gt;More queries: &lt;a href="https://luxir.org/docs/latest/guide/quickstart/" rel="noopener noreferrer"&gt;Luxir's quickstart&lt;/a&gt; against &lt;code&gt;http://127.0.0.1:9400&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 8 - Stop, start again, or wipe the data
&lt;/h2&gt;

&lt;p&gt;Stay in &lt;code&gt;luxir-try&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop Luxir&lt;/strong&gt; (the program stops; your indexed books stay on disk):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Start again&lt;/strong&gt; (no rebuild if the image already exists):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After it is healthy, the &lt;code&gt;books&lt;/code&gt; collection is still there. You can jump to Part 7.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wipe the index&lt;/strong&gt; (only if you want a clean slate). This deletes the Docker volume &lt;code&gt;luxir-data&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  If something went wrong
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Cannot connect to the Docker daemon&lt;/code&gt; - Desktop is not running yet.&lt;br&gt;
&lt;code&gt;docker compose: command not found&lt;/code&gt; - update Docker Desktop.&lt;br&gt;
&lt;code&gt;stat Dockerfile&lt;/code&gt; &lt;strong&gt;/ no such file&lt;/strong&gt; - wrong directory, or the file is &lt;code&gt;Dockerfile.txt&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;GitHub release&lt;/strong&gt; &lt;code&gt;curl&lt;/code&gt; &lt;strong&gt;hangs&lt;/strong&gt; - network; open &lt;a href="https://github.com/luxir-search/luxir/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;v0.1.0&lt;/a&gt; in a browser, retry &lt;code&gt;up --build&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;port is already allocated&lt;/code&gt; - &lt;code&gt;docker compose down&lt;/code&gt; or stop whatever owns 9400/9401.&lt;br&gt;
&lt;code&gt;exec format error&lt;/code&gt;&lt;strong&gt;, crash loop, or health never&lt;/strong&gt; &lt;code&gt;ok&lt;/code&gt; &lt;strong&gt;on ARM&lt;/strong&gt; - Rosetta / amd64 emulation is off (Part 1). &lt;code&gt;docker compose ps&lt;/code&gt; must show &lt;code&gt;linux/amd64&lt;/code&gt;, not &lt;code&gt;arm64&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;Empty&lt;/strong&gt; &lt;code&gt;docs&lt;/code&gt; - missing &lt;code&gt;commit=true&lt;/code&gt;, or you are hitting a different process on 9400.&lt;br&gt;
&lt;strong&gt;PowerShell&lt;/strong&gt; &lt;code&gt;curl&lt;/code&gt; &lt;strong&gt;looks like HTML&lt;/strong&gt; - use &lt;code&gt;curl.exe&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why &lt;code&gt;platform: linux/amd64&lt;/code&gt; is required
&lt;/h2&gt;

&lt;p&gt;Docker can store several CPU variants under one image name and pick one on &lt;code&gt;pull&lt;/code&gt;. Luxir 0.1.0 only publishes a Linux x86-64 binary, so this Compose file &lt;strong&gt;forces&lt;/strong&gt; &lt;code&gt;linux/amd64&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On Apple Silicon or Windows ARM, that means simulation: Rosetta (Mac) or QEMU (typical Linux/Windows ARM). You run the real official binary. You do not get native ARM speed. Use the &lt;strong&gt;v2&lt;/strong&gt; CPU tier in the Dockerfile; v3/v4 need newer x86 instruction sets and are a poor first try under emulation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Do not use this setup for production
&lt;/h2&gt;

&lt;p&gt;For anything you would call production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Linux x86-64 on a real machine or a same-architecture VM. No emulation.&lt;/li&gt;
&lt;li&gt;Download the matching official binary from &lt;a href="https://luxir.org/download/" rel="noopener noreferrer"&gt;luxir.org/download&lt;/a&gt;, or follow Luxir's own &lt;a href="https://luxir.org/docs/latest/dev/container-build/" rel="noopener noreferrer"&gt;container build&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Give the machine enough RAM to hold the index.&lt;/li&gt;
&lt;li&gt;Add your own TLS and login. Luxir 0.1.0 has none. Do not put port 9400 on the public internet.&lt;/li&gt;
&lt;li&gt;Treat the API and on-disk format as pre-1.0. They can change. Read the &lt;a href="https://luxir.org/docs/latest/guide/operations/" rel="noopener noreferrer"&gt;operations guide&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is Luxir, and who created it?
&lt;/h3&gt;

&lt;p&gt;Luxir is an open-source hybrid search engine in C++ (full text, vectors, facets, geo). HTTP JSON on port 9400, gRPC on 9401. Yonik Seeley (original author of Apache Solr) and contributors. Apache License 2.0, version 0.1.0. &lt;a href="https://luxir.org/" rel="noopener noreferrer"&gt;luxir.org&lt;/a&gt;, &lt;a href="https://github.com/luxir-search/luxir" rel="noopener noreferrer"&gt;github.com/luxir-search/luxir&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is this an official Luxir Docker image?
&lt;/h3&gt;

&lt;p&gt;No. This page is a community how-to. It downloads the official &lt;strong&gt;linux-x86_64-v2&lt;/strong&gt; binary from the &lt;a href="https://github.com/luxir-search/luxir/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;v0.1.0 release&lt;/a&gt; and runs it in Ubuntu under Docker. It is not a project image and does not replace &lt;a href="https://luxir.org/download/" rel="noopener noreferrer"&gt;luxir.org/download&lt;/a&gt;. If this guide and the official docs disagree, follow &lt;a href="https://luxir.org/" rel="noopener noreferrer"&gt;luxir.org&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What do I turn on in Docker Desktop?
&lt;/h3&gt;

&lt;p&gt;On &lt;strong&gt;Apple Silicon:&lt;/strong&gt; Settings -&amp;gt; General -&amp;gt; &lt;strong&gt;Use Rosetta for x86/amd64 emulation&lt;/strong&gt;. Apply &amp;amp; Restart. Intel/AMD hosts do not need that box; they already are &lt;code&gt;amd64&lt;/code&gt;. Windows ARM needs Docker's amd64 emulation (usually WSL 2). After &lt;code&gt;up&lt;/code&gt;, &lt;code&gt;docker compose ps&lt;/code&gt; should show &lt;code&gt;linux/amd64&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I run Luxir on a Mac or Windows PC without installing Linux?
&lt;/h3&gt;

&lt;p&gt;Yes, if Docker can run &lt;code&gt;linux/amd64&lt;/code&gt; (natively or simulated). You still need Docker. You do not compile C++.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which CPU do I need?
&lt;/h3&gt;

&lt;p&gt;Native Intel/AMD, or ARM with platform simulation enabled. Use the &lt;strong&gt;v2&lt;/strong&gt; binary for a first try.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is my search empty after I index?
&lt;/h3&gt;

&lt;p&gt;Include &lt;code&gt;commit=true&lt;/code&gt; on the update (Part 6).&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use this for production or benchmarks?
&lt;/h3&gt;

&lt;p&gt;No. Use Linux x86-64 without emulation. See &lt;a href="https://luxir.org/download/" rel="noopener noreferrer"&gt;luxir.org/download&lt;/a&gt; and the &lt;a href="https://luxir.org/docs/latest/guide/operations/" rel="noopener noreferrer"&gt;operations guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and credit
&lt;/h2&gt;

&lt;p&gt;Luxir is Yonik Seeley and contributors, Apache License 2.0. Engine behavior is defined at &lt;a href="https://luxir.org/" rel="noopener noreferrer"&gt;luxir.org&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://luxir.org/download/" rel="noopener noreferrer"&gt;Download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://luxir.org/docs/latest/guide/quickstart/" rel="noopener noreferrer"&gt;Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://luxir.org/docs/latest/guide/http-api/" rel="noopener noreferrer"&gt;HTTP API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://luxir.org/docs/latest/guide/operations/" rel="noopener noreferrer"&gt;Operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/luxir-search/luxir/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;Release v0.1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/desktop/" rel="noopener noreferrer"&gt;Docker Desktop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About this guide
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.linkedin.com/in/mrjayeshshende/" rel="noopener noreferrer"&gt;Jayesh Shende&lt;/a&gt;&lt;/strong&gt; writes notes on search engines (Solr, OpenSearch, Luxir) while evaluating them. This walkthrough is a community how-to around the official binary, not a Luxir project publication. Corrections that match the official docs are welcome.&lt;/p&gt;

</description>
      <category>luxir</category>
      <category>oppority</category>
      <category>searchengine</category>
      <category>guide</category>
    </item>
  </channel>
</rss>
