1"use strict";(globalThis.webpackChunkdocutest=globalThis.webpackChunkdocutest||[]).push([[758],{44584(e,a,t){t.r(a),t.d(a,{assets:()=>u,contentTitle:()=>l,default:()=>f,frontMatter:()=>c,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"kb/scanastudio-sdk/install","title":"Installation","description":"Two things are needed to use the SDK: a client library in your preferred language, and a server","source":"@site/docs/kb/scanastudio-sdk/001install.md","sourceDirName":"kb/scanastudio-sdk","slug":"/kb/scanastudio-sdk/install","permalink":"/kb/scanastudio-sdk/install","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"id":"install","title":"Installation","sidebar_position":2},"sidebar":"docs_scanastudio_sdk","previous":{"title":"Introduction","permalink":"/kb/scanastudio-sdk/scanastudio_sdk_home"},"next":{"title":"Your first capture","permalink":"/kb/scanastudio-sdk/quickstart"}}');var i=t(74848),s=t(28453),o=t(4865),d=t(19365),r=t(51020);const c={id:"install",title:"Installation",sidebar_position:2},l="Installation",u={},h=[{value:"The client library",id:"the-client-library",level:2},{value:"The server",id:"the-server",level:2},{value:"Linux: device permissions",id:"linux-device-permissions",level:2},{value:"Checking it works",id:"checking-it-works",level:2}];function p(e){const a={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.header,{children:(0,i.jsx)(a.h1,{id:"installation",children:"Installation"})}),"\n",(0,i.jsxs)(a.p,{children:["Two things are needed to use the SDK: a ",(0,i.jsx)(a.strong,{children:"client library"})," in your preferred language, and a ",(0,i.jsx)(a.strong,{children:"server"}),"\nto talk to."]}),"\n",(0,i.jsx)(a.h2,{id:"the-client-library",children:"The client library"}),"\n","\n",(0,i.jsxs)(o.A,{groupId:"ss-lang",children:[(0,i.jsxs)(d.A,{value:"py",label:"Python",children:[(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"pip install ikalogic-scanastudio\n"})}),(0,i.jsxs)(a.p,{children:["Python 3.10 or newer. The package is fully typed and ships ",(0,i.jsx)(a.code,{children:"py.typed"}),", so mypy\nand your editor see the whole API."]}),(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-python",children:"from ikalogic_scanastudio import ScanaStudio, Trigger\n"})}),(0,i.jsxs)(a.p,{children:["The client is ",(0,i.jsx)(a.strong,{children:"synchronous"}),": no ",(0,i.jsx)(a.code,{children:"async"})," in the public API, and no event loop\nto set up."]})]}),(0,i.jsxs)(d.A,{value:"js",label:"NodeJS",children:[(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"npm install @ikalogic/scanastudio\n"})}),(0,i.jsx)(a.p,{children:"Node 20 or newer."}),(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-javascript",children:"import { ScanaStudio, Trigger } from '@ikalogic/scanastudio';\n"})}),(0,i.jsxs)(a.p,{children:["The package ships both ESM and CommonJS builds with full TypeScript types, so\n",(0,i.jsx)(a.code,{children:"import"})," and ",(0,i.jsx)(a.code,{children:"require"})," both work."]}),(0,i.jsxs)(a.admonition,{title:"Node 20 needs one more package",type:"caution",children:[(0,i.jsxs)(a.p,{children:["Node 22 and later have a global ",(0,i.jsx)(a.code,{children:"WebSocket"})," and need nothing else. ",(0,i.jsxs)(a.strong,{children:["On Node 20,\nalso install ",(0,i.jsx)(a.code,{children:"ws"}),":"]})]}),(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"npm install ws\n"})}),(0,i.jsxs)(a.p,{children:["Without it, ",(0,i.jsx)(a.code,{children:"connect()"})," throws because it can find no WebSocket implementation."]})]}),(0,i.jsx)(a.admonition,{title:"There is a browser build too",type:"tip",children:(0,i.jsxs)(a.p,{children:["The package exposes a browser entry point that uses the platform ",(0,i.jsx)(a.code,{children:"WebSocket"}),",\nso a web page can drive a ScanaStudio server directly. Mind\n",(0,i.jsx)(a.a,{href:"/kb/scanastudio-sdk/concepts#the-server-has-no-authentication",children:"the missing authentication"}),"\nbefore you expose one."]})})]}),(0,i.jsxs)(d.A,{value:"rust",label:"Rust",children:[(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"cargo add scanastudio-client\n"})}),(0,i.jsxs)(a.p,{children:["Or in ",(0,i.jsx)(a.code,{children:"Cargo.toml"}),":"]}),(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-toml",children:'[depen
1dencies]\nscanastudio-client = "0.2"\ntokio = { version = "1", features = ["rt-multi-thread", "macros"] }\n'})}),(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-rust",children:"use scanastudio_client::{ScanaStudio, Trigger, DEFAULT_URL};\n"})}),(0,i.jsxs)(a.p,{children:["The Rust client is ",(0,i.jsx)(a.strong,{children:"async"}),", on tokio. Request and response types are available\nunder ",(0,i.jsx)(a.code,{children:"scanastudio_client::proto"}),"."]})]}),(0,i.jsxs)(d.A,{value:"c",label:"C",children:[(0,i.jsx)(a.p,{children:"The C library is distributed as one archive:"}),(0,i.jsx)(r.A,{}),(0,i.jsx)(a.p,{children:"Inside it:"}),(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"include/scanastudio.h the header, always matching the libraries below\nexamples/capture.c capture on a demo device, decode, read the packets\nexamples/inspect.c open a .scana, describe it, seek its edges, measure\nwindows-x86_64/ scanastudio.dll, scanastudio.dll.lib, scanastudio.lib\nlinux-x86_64/ libscanastudio.so, libscanastudio.a\nmacos-universal/ libscanastudio.dylib, libscanastudio.a\n"})}),(0,i.jsx)(a.p,{children:"Put the header and the library for your platform wherever your build expects\nthem; the paths below are only an example."}),(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"cc -I/opt/scanastudio-sdk/include prog.c \\\n -L/opt/scanastudio-sdk/lib -lscanastudio -o prog\n./prog\n"})}),(0,i.jsx)(a.p,{children:"If the shared library is not on the loader's search path, point to it at run\ntime:"}),(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"LD_LIBRARY_PATH=/opt/scanastudio-sdk/lib ./prog\n"})}),(0,i.jsxs)(a.p,{children:["The header carries ",(0,i.jsx)(a.code,{children:'extern "C"'})," guards, so C++ can include it unchanged."]})]})]}),"\n",(0,i.jsx)(a.h2,{id:"the-server",children:"The server"}),"\n",(0,i.jsx)(a.p,{children:"Every client needs a server to connect to. There are two ways to have one."}),"\n",(0,i.jsxs)(a.p,{children:[(0,i.jsx)(a.strong,{children:"Run ScanaStudio."})," The application starts its own server and your script can\nconnect to it. This is the easiest way to start, and you can watch what your\nscript does in the window."]}),"\n",(0,i.jsxs)(a.p,{children:[(0,i.jsx)(a.strong,{children:"Run the server on its own."})," The server binary is installed alongside the\napplication and runs headless, with no window or display, which suits a lab\nmachine or a CI runner:"]}),"\n",(0,i.jsxs)(a.table,{children:[(0,i.jsx)(a.thead,{children:(0,i.jsxs)(a.tr,{children:[(0,i.jsx)(a.th,{children:"Platform"}),(0,i.jsx)(a.th,{children:"Where the installer puts it"})]})}),(0,i.jsxs)(a.tbody,{children:[(0,i.jsxs)(a.tr,{children:[(0,i.jsx)(a.td,{children:"Windows"}),(0,i.jsx)(a.td,{children:(0,i.jsx)(a.code,{children:"%LOCALAPPDATA%\\Programs\\ScanaStudio\\scanastudio-server.exe"})})]}),(0,i.jsxs)(a.tr,{children:[(0,i.jsx)(a.td,{children:"Linux"}),(0,i.jsxs)(a.td,{children:[(0,i.jsx)(a.code,{children:"<prefix>/bin/scanastudio-server"})," \u2014 ",(0,i.jsx)(a.code,{children:"/usr/bin"})," from the ",(0,i.jsx)(a.code,{children:".deb"})," or ",(0,i.jsx)(a.code,{children:".rpm"})]})]}),(0,i.jsxs)(a.tr,{children:[(0,i.jsx)(a.td,{children:"macOS"}),(0,i.jsx)(a.td,{children:(0,i.jsx)(a.code,{children:"/Applications/ScanaStudio.app/Contents/MacOS/scanastudio-server"})})]})]})]}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"scanastudio-server\n"})}),"\n",(0,i.jsxs)(a.p,{children:["It listens on ",(0,i.jsx)(a.code,{children:"ws://127.0.0.1:4911"}),". Move it with ",(0,i.jsx)(a.code,{children:"--listen"})," or the\n",(0,i.jsx)(a.code,{children:"SCANASTUDIO_LISTEN"})," environment variable:"]}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"scanastudio-server --listen 127.0.0.1:5000 # another port, still local only\nscanastudio-server --listen 192.168.1.20:4911 # one network interface only\nscanastudio-server --listen 0.0.0.0:4911 # every interface\n"})}),"\n",(0,i.jsx)(a.admonition,{title:"No authentication",type:"danger",children:(0,i.jsxs)(a.p,{children:["The protocol has no authentication. A server listening beyond loopback gives\nanyone who can reach the port full control of your instruments, and lets them\nwrite files on that machine. Read\n",(0,i.jsx)(a.a,{href:"/kb/scanastudio-sdk/guides/remote",children:"Remote and shared instruments"})," before you\nopen it up."]})}),"\n",(0,i.jsx)(a.h2,{id:"linux-device-permissions",children:"Linux: device permissions"}),"\n",(0,i.jsxs)(a.p,{children:["On Linux, a device is visible but not open
1able until the udev rules are\ninstalled. The ",(0,i.jsx)(a.code,{children:".deb"}),", the ",(0,i.jsx)(a.code,{children:".rpm"})," and the tarball's ",(0,i.jsx)(a.code,{children:"install.sh"})," all place\n",(0,i.jsx)(a.code,{children:"60-ikalogic.rules"})," in ",(0,i.jsx)(a.code,{children:"/etc/udev/rules.d"})," for you."]}),"\n",(0,i.jsxs)(a.p,{children:["If a device appears in ",(0,i.jsx)(a.code,{children:"devices()"})," but refuses to open, the rules are usually\nmissing (",(0,i.jsx)(a.code,{children:"install.sh --no-udev"}),", or an install without root). Re-run the\ninstaller, or copy the rules file by hand and reload:"]}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-bash",children:"sudo udevadm control --reload-rules && sudo udevadm trigger\n"})}),"\n",(0,i.jsx)(a.h2,{id:"checking-it-works",children:"Checking it works"}),"\n",(0,i.jsx)(a.p,{children:"You do not need hardware. Every server offers demo devices:"}),"\n",(0,i.jsxs)(o.A,{groupId:"ss-lang",children:[(0,i.jsx)(d.A,{value:"py",label:"Python",children:(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-python",children:'from ikalogic_scanastudio import ScanaStudio\n\nwith ScanaStudio.connect() as server:\n print(server.info)\n for device in server.devices():\n print(" ", device)\n'})})}),(0,i.jsx)(d.A,{value:"js",label:"NodeJS",children:(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-javascript",children:"import { ScanaStudio } from '@ikalogic/scanastudio';\n\nconst server = await ScanaStudio.connect();\nconsole.log(server.info);\nfor (const device of await server.devices()) console.log(' ', device.key);\nserver.close();\n"})})}),(0,i.jsx)(d.A,{value:"rust",label:"Rust",children:(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-rust",children:'use scanastudio_client::{ScanaStudio, DEFAULT_URL};\n\n#[tokio::main]\nasync fn main() -> scanastudio_client::Result<()> {\n let server = ScanaStudio::connect(DEFAULT_URL).await?;\n println!("{:?}", server.info());\n for device in server.devices().await? {\n println!(" {}", device.key);\n }\n Ok(())\n}\n'})})}),(0,i.jsx)(d.A,{value:"c",label:"C",children:(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{className:"language-c",children:'#include <stdio.h>\n#include "scanastudio.h"\n\nint main(void) {\n ss_server *server = ss_server_connect(NULL);\n if (!server) { fprintf(stderr, "%s\\n", ss_last_error()); return 1; }\n\n char *info = ss_server_info(server);\n printf("%s\\n", info);\n ss_string_free(info);\n\n char *devices = ss_server_devices(server);\n printf("%s\\n", devices);\n ss_string_free(devices);\n\n ss_server_disconnect(server);\n return 0;\n}\n'})})})]}),"\n",(0,i.jsxs)(a.p,{children:["You should see the server's version and at least one demo device. ",(0,i.jsx)(a.code,{children:"se254"})," is\nthe one used throughout this documentation."]}),"\n",(0,i.jsx)(a.admonition,{title:"Version mismatch on connect",type:"caution",children:(0,i.jsxs)(a.p,{children:["If ",(0,i.jsx)(a.code,{children:"connect"})," fails with a protocol version mismatch, the SDK and the server are\nout of step. Update whichever is older."]})}),"\n",(0,i.jsxs)(a.p,{children:["Next: ",(0,i.jsx)(a.a,{href:"/kb/scanastudio-sdk/quickstart",children:"your first capture"}),"."]})]})}function f(e={}){const{wrapper:a}={...(0,s.R)(),...e.components};return a?(0,i.jsx)(a,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},19365(e,a,t){t.d(a,{A:()=>r});t(96540);var n=t(34164),i=t(47751);const s="tabItem_Ymn6";var o=t(74848);function d({children:e,className:a,hidden:t}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,n.A)(s,a),hidden:t,children:e})}function r({children:e,className:a,value:t}){const{selectedValue:n,lazy:s}=(0,i.uc)(),r=t===n;return!r&&s?null:(0,o.jsx)(d,{className:a,hidden:!r,children:e})}},4865(e,a,t){t.d(a,{A:()=>f});t(96540);var n=t(34164),i=t(17559),s=t(47751),o=t(23104),d=t(92303);const r="tabList__CuJ",c="tabItem_LNqP";var l=t(74848);function u({className:e}){const{selectedValue:a,selectValue:t,tabValues:i,block:d}=(0,s.uc)(),r=[],{blockElementScrollPositionUntilNextRender:u}
1=(0,o.a_)(),h=e=>{const n=e.currentTarget,s=r.indexOf(n),o=i[s].value;o!==a&&(u(n),t(o))},p=e=>{let a=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{const t=r.indexOf(e.currentTarget)+1;a=r[t]??r[0];break}case"ArrowLeft":{const t=r.indexOf(e.currentTarget)-1;a=r[t]??r[r.length-1];break}}a?.focus()};return(0,l.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,n.A)("tabs",{"tabs--block":d},e),children:i.map(({value:e,label:t,attributes:i})=>(0,l.jsx)("li",{role:"tab",tabIndex:a===e?0:-1,"aria-selected":a===e,ref:e=>{r.push(e)},onKeyDown:p,onClick:h,...i,className:(0,n.A)("tabs__item",c,i?.className,{"tabs__item--active":a===e}),children:t??e},e))})}function h({children:e}){return(0,l.jsx)("div",{className:"margin-top--md",children:e})}function p({className:e,children:a}){return(0,l.jsxs)("div",{className:(0,n.A)(i.G.tabs.container,"tabs-container",r),children:[(0,l.jsx)(u,{className:e}),(0,l.jsx)(h,{children:a})]})}function f(e){const a=(0,d.A)(),t=(0,s.OC)(e);return(0,l.jsx)(s.O_,{value:t,children:(0,l.jsx)(p,{className:e.className,children:(0,s.vT)(e.children)})},String(a))}},47751(e,a,t){t.d(a,{OC:()=>f,O_:()=>x,uc:()=>g,vT:()=>l});var n=t(96540),i=t(56347),s=t(205),o=t(57485),d=t(70679),r=t(31682),c=t(74848);function l(e){return n.Children.toArray(e).filter(e=>"\n"!==e)}function u(e){const{values:a,children:t}=e;return(0,n.useMemo)(()=>{const e=a??function(e){return n.Children.toArray(e).flatMap(e=>{if(!e)return[];if((0,n.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return[e];const a="string"==typeof e.type?e.type:e.type.name;throw new Error(`Docusaurus error: Bad <Tabs> child <${a}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.\nIf you do not want to pass on a "value" prop to the direct children of <Tabs>, you can also pass an explicit <Tabs values={...}> prop.`)}).map(({props:{value:e,label:a,attributes:t,default:n}})=>({value:e,label:a,attributes:t,default:n}))}(t);return function(e){const a=(0,r.XI)(e,(e,a)=>e.value===a.value);if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map(e=>`'${e.value}'`).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[a,t])}function h({value:e,tabValues:a}){return a.some(a=>a.value===e)}function p({queryString:e=!1,groupId:a}){const t=(0,i.W6)(),s=function({queryString:e=!1,groupId:a}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!a)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:e,groupId:a});return[(0,o.aZ)(s),(0,n.useCallback)(e=>{if(!s)return;const a=new URLSearchParams(t.location.search);a.set(s,e),t.replace({...t.location,search:a.toString()})},[s,t])]}function f(e){const{defaultValue:a,queryString:t=!1,groupId:i}=e,o=u(e),[r,c]=(0,n.useState)(()=>function({defaultValue:e,tabValues:a}){if(0===a.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!h({value:e,tabValues:a}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${a.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=a.find(e=>e.default)??a[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:a,tabValues:o})),[l,f]=p({queryString:t,groupId:i}),[m,g]=function({groupId:e}){const a=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,i]=(0,d.Dv)(a);return[t,(0,n.useCallback)(e=>{a&&i.set(e)},[a,i])]}({groupId:i}),x=(()=>{const e=l??m;return h({value:e,tabValues:o})?e:null})();(0,s.A)(()=>{x&&c(x)},[x]);return{selectedValue:r,selectValue:(0,n.useCallback)(e=>{if(!h({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);c(e),f(e),g(e)},[f,g,o]),tabValues:o,lazy:e.lazy??!1,block:e.block??!1}}const m=(0,n.createContext)(null);function g(){const e=n.useContext(m);if(!e)throw new Error("useTabsContext() must be used within a Tabs component");return e}function x(e){return(0,c.jsx)(m.Provider,{value:e.value,children:e.children})}},51020(e,a,t){t.d(a,{A:()=>d});t(96540);var n=t(22862),i=t(86405),s=t(74848);const{QE:o}=n;function d(){return o?(0,s.jsxs)("div",{className:"card shadow--nice padding--md margin-vert--md",children:[(0,s.jsx)("h4",{className:"margin-bottom--xs",children:"ScanaStudio C API"}),(0,s.jsxs)("p",{style:{marginBottom:"0.75rem"},children:["One cross-platform archive: ",(0,s.jsx)("code",{children:"include/scanastudio.h"}),", an example, and the prebuilt libraries for Windows (x86_64), Linux (x86_64) and macOS (universal). There is no per-platform download to choose from."]}),(0,s.jsxs)("a",{href:o.alias_url??o.url,className:"button button--outline button--primary",children:["Download ",o.filename??"the C API"]}),(0,s.jsxs)("div",{style:{marginTop:"0.75rem",fontSize:"0.8rem",color:"#888"},children:["v",o.version," \u2014 ",o.date,o.sha256&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("br",{}),(0,s.jsx)(i.A,{value:o.sha256})]})]}),(0,s.jsx)("p",{style:{marginTop:"0.75rem",marginBottom:0,fontSize:"0.85rem"},children:"The C library carries its own version number and is released independently of the ScanaStudio application."})]}):null}},86405(e,a,t){t.d(a,{A:()=>d});var n=t(96540),i=t(95924),s=t(66188),o=t(74848);function d({value:e,truncate:a}
1){const[t,d]=(0,n.useState)(!1),r=a?`${e.slice(0,a)}\u2026`:e;return(0,o.jsxs)("span",{style:{whiteSpace:"nowrap"},children:["sha256 ",(0,o.jsx)("code",{style:{fontSize:"0.75rem"},children:r})," ",(0,o.jsx)("button",{type:"button",title:t?"Copied":`Copy the full digest\n${e}`,"aria-label":t?"Digest copied":"Copy the full sha256 digest",onClick:async()=>{await async function(e){try{return await navigator.clipboard.writeText(e),!0}catch{try{const a=document.createElement("textarea");a.value=e,a.style.position="fixed",a.style.opacity="0",document.body.appendChild(a),a.select();const t=document.execCommand("copy");return document.body.removeChild(a),t}catch{return!1}}}(e)&&(d(!0),setTimeout(()=>d(!1),1500))},style:{background:"none",border:"none",padding:"0 0.2rem",cursor:"pointer",color:t?"var(--ifm-color-success)":"inherit",font:"inherit"},children:(0,o.jsx)(i.gc,{icon:t?s.e68:s.jPR})})]})}},22862(e){e.exports=JSON.parse('{"IW":{"version":"6.0.18","date":"2026-09-28","commit":"f8e0df9","notes":"- feature: the ScanaQuad family (SQ25, SQ50, SQ100, SQ200), with its pattern generator, capture and I/O configuration\\n- feature: an inputs / outputs window with a wiring schematic of each channel\'s termination\\n- feature: in Generation or Mixed mode every output channel gets its own row holding what the next generation replays, filled from the capture, at a constant level, drawn by hand or by a script\\n- feature: signal builder scripts (on_build_signals) run with their configuration form, as in ScanaStudio 3\\n- feature: measurements on generation rows, and a mixed run shows the replayed region in a loop\\n- improvement: a new trigger step starts from the levels the previous step leaves instead of don\'t care\\n- improvement: the miniview\'s grips resize the visible zone\\n- improvement: the SP259 reports its clock and each memory bank in the device information\\n- fix: a multistep trigger combining a held level, an edge and a time window never fired\\n- fix: an external trigger on a device with no TRIG IN fired at once; it is now refused\\n- fix: the cursor readout inverted duty cycle and pulse level on every channel\\n- fix: a marker can no longer be placed or moved before the first sample\\n- fix: the memory depth list offered one step past the device\'s memory","changes":[{"tag":"feature","text":"the ScanaQuad family (SQ25, SQ50, SQ100, SQ200), with its pattern generator, capture and I/O configuration"},{"tag":"feature","text":"an inputs / outputs window with a wiring schematic of each channel\'s termination"},{"tag":"feature","text":"in Generation or Mixed mode every output channel gets its own row holding what the next generation replays, filled from the capture, at a constant level, drawn by hand or by a script"},{"tag":"feature","text":"signal builder scripts (on_build_signals) run with their configuration form, as in ScanaStudio 3"},{"tag":"feature","text":"measurements on generation rows, and a mixed run shows the replayed region in a loop"},{"tag":"improvement","text":"a new trigger step starts from the levels the previous step leaves instead of don\'t care"},{"tag":"improvement","text":"the miniview\'s grips resize the visible zone"},{"tag":"improvement","text":"the SP259 reports its clock and each memory bank in the device information"},{"tag":"fix","text":"a multistep trigger combining a held level, an edge and a time window never fired"},{"tag":"fix","text":"an external trigger on a device with no TRIG IN fired at once; it is now refused"},{"tag":"fix","text":"the cursor readout inverted duty cycle and pulse level on every channel"},{"tag":"fix","text":"a marker can no longer be placed or moved before the first sample"},{"tag":"fix","text":"the memory depth list offered one step past the device\'s memory"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.18_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.18_x64-setup.exe","sha256":"f573271e1ed30c6d5c50d526f673579cb63c1338a04935830ce13644ed2ff12b","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"windows_portable":{"filename":"ScanaStudio-6.0.18-windows-x86_64-portable.zip","url":"https://cdn.ikalogic.
1com/dist/scanastudio-6/ScanaStudio-6.0.18-windows-x86_64-portable.zip","sha256":"9fda086bc4d550fb9a53fef077c72cd55b6cb1201a5a239c74087972b9f7a9e5","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-windows-x86_64-portable.zip"},"linux_tarball":{"filename":"ScanaStudio-6.0.18-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.18-linux-x86_64.tar.gz","sha256":"7b61ef22ecb915012c016bd6dfb0495c7c75735a2fdae0dcc10e3d4ddf7a0342","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.18_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.18_universal.dmg","sha256":"6017112459cdb119efe37a403c1feb8b47a963a07c9c9c48aae4d1c016e9bddf","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},"D8":[{"version":"6.0.0","date":"2026-08-27","commit":"7afe526","notes":"- First public v6 build: Rust daemon plus Tauri interface, replacing the Qt v3\\n application.\\n- Windows setup, Linux `.deb`/`.rpm`/AppImage and a standalone installer script,\\n macOS disk image.\\n- Supported instruments: SP209, SP259/SP259i, SP1000G, SE254.","downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.0_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.0_x64-setup.exe","sha256":"ba6c4a6c73744cfeaa955a87c2e7637f118012dd0a2c581bb39580edd4bcfe00","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_deb":{"filename":"ScanaStudio_6.0.0_amd64.deb","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.0_amd64.deb","sha256":"2f2d100fa51225b02f0b2182d0b3f5946587ed2d092029701a81feeb6035224a","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.deb"},"linux_rpm":{"filename":"ScanaStudio-6.0.0-1.x86_64.rpm","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.0-1.x86_64.rpm","sha256":"bbcbfa749c2b74dfd04ba79e33932f7bf827c38115ddbbcf88391fd35f751b33","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.rpm"},"linux_appimage":{"filename":"ScanaStudio_6.0.0_amd64.AppImage","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.0_amd64.AppImage","sha256":"0fc9e88be3e9c07ad950023b941d1bd7fab1bef18463ce8f7af4ca10c52cca00","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.AppImage"},"linux_tarball":{"filename":"ScanaStudio-6.0.0-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.0-linux-x86_64.tar.gz","sha256":"b184acf9e56f60dbc5f350d1d3dca8b415f183264bcbd1c37df864163152f75e","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.0_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.0_universal.dmg","sha256":"0ba8d9ae495b3e929cfd686c4ad2bf7c5cbff0dceebedd1965fb7730987e976b","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.1","date":"2026-08-27","commit":"8c78855","notes":"- improvement: Linux installer package minor adjustments","changes":[{"tag":"improvement","text":"Linux installer package minor adjustments"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.1_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.1_x64-setup.exe","sha256":"f0048f5fc39a0235d0d666ff383d2ae3e259de10c0d591314b213b46a1db7d57","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_deb":{"filename":"ScanaStudio_6.0.1_amd64.deb","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.1_amd64.deb","sha256":"8893b23d5b95cbbe330208aa08cbdcbc116ce0d5d39eecc2432a72f4f8f8de90","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.deb"},"linux_rpm":{"filename":"ScanaStudio-6.0.1-1.x86_64.rpm","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.1-1.x86_64.rpm","sha256":"8cbea235d532bc735bbabada90d579ed3917af8e0f42a81fc910cfca79b3f089","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.rpm"},"linux_appimage":{"filename":"ScanaStudio_6.0.1_amd64.AppImage","url":"https://cdn.ikalogic.
1com/dist/scanastudio-6/ScanaStudio_6.0.1_amd64.AppImage","sha256":"79a5afef5665ec2b1a883c2dcdecaea1081e8fec1ac9e6cd4b9e888bd9d3a932","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.AppImage"},"linux_tarball":{"filename":"ScanaStudio-6.0.1-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.1-linux-x86_64.tar.gz","sha256":"66a20bf7e83b26ccc72ffe89edf7efbc26e345e93f70a1dd8a5fc8c305bcad13","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.1_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.1_universal.dmg","sha256":"033e00f08b899031e8506f9fcb0c0fc0433759b7adc52c8701a796781fdde157","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.2","date":"2026-08-27","commit":"a62318b","notes":"- fix: Auto-update not triggering","changes":[{"tag":"fix","text":"Auto-update not triggering"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.2_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.2_x64-setup.exe","sha256":"df57a691049f5cd016c6a33b7bf72bbb3a3dbf34edb796d42551ab68375a9ebf","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_deb":{"filename":"ScanaStudio_6.0.2_amd64.deb","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.2_amd64.deb","sha256":"4cf9c92e8b98d063b56fbc356b01f6e5875859cfb54de8b84d75a60dd4cf6593","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.deb"},"linux_rpm":{"filename":"ScanaStudio-6.0.2-1.x86_64.rpm","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.2-1.x86_64.rpm","sha256":"869f39d039b86dc056d05ddd7c23d324f3aad3a3fbef34b1418a1719404c1ecd","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.rpm"},"linux_appimage":{"filename":"ScanaStudio_6.0.2_amd64.AppImage","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.2_amd64.AppImage","sha256":"7a8bf2cbff4149aeeb67ed7ef62bbd880e1fc99bd158e7ba7ffe44c7e3dd0b06","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.AppImage"},"linux_tarball":{"filename":"ScanaStudio-6.0.2-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.2-linux-x86_64.tar.gz","sha256":"5205a4c7eef538cdf6047ba304583ec264b75e36c5417a63118423629b5bf10f","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.2_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.2_universal.dmg","sha256":"6b8ac1a59859ecc105e3ac8cf6d31afa3859d9e6fe650bba4b356a9a677c3180","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.3","date":"2026-08-27","commit":"d296219","notes":"- fix: the installer rewrote every other desktop entry in the target directory to launch ScanaStudio","changes":[{"tag":"fix","text":"the installer rewrote every other desktop entry in the target directory to launch ScanaStudio"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.3_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.3_x64-setup.exe","sha256":"ff6ee0c5bc533855341db108eea8848c749fdc625eaaa2d9216a1237b8e33bd3","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_deb":{"filename":"ScanaStudio_6.0.3_amd64.deb","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.3_amd64.deb","sha256":"46cc14807d57618a7311d46a33b1d7045acea1f8440a5f4ca9cd30a9779b04c4","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.deb"},"linux_rpm":{"filename":"ScanaStudio-6.0.3-1.x86_64.rpm","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.3-1.x86_64.rpm","sha256":"40a457e6763c5f7e20290041734e33fd8d779ca5be7714dc44aec4a8364224f9","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.rpm"},"linux_appimage":{"filename":"ScanaStudio_6.0.3_amd64.AppImage","url":"https://cdn.ikalogic.
1com/dist/scanastudio-6/ScanaStudio_6.0.3_amd64.AppImage","sha256":"822b479ae18e0a589126832aae009ddcdb18b4cf7a8f71ed2a72effea29e58f2","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.AppImage"},"linux_tarball":{"filename":"ScanaStudio-6.0.3-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.3-linux-x86_64.tar.gz","sha256":"064c80ea13f62ddb377dbd86e7157a5959c593045c9b60cf823ed5343f0e4f27","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.3_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.3_universal.dmg","sha256":"738d728921d710eaa849a5744799fbc7b1448eda2f85ad1887abdd0cd3e4f66a","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.4","date":"2026-08-27","commit":"8f274e2","notes":"- fix: uninstalling no longer deletes a launcher entry that the install had replaced","changes":[{"tag":"fix","text":"uninstalling no longer deletes a launcher entry that the install had replaced"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.4_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.4_x64-setup.exe","sha256":"36833ff5f487c2a6986bc956dfc6693cc444e4f961152c411b33436ea27c8114","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_deb":{"filename":"ScanaStudio_6.0.4_amd64.deb","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.4_amd64.deb","sha256":"ce8e486a958d97f8c08db1f455232d0838f9bc48ab084c17a9608834cd0363b5","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.deb"},"linux_rpm":{"filename":"ScanaStudio-6.0.4-1.x86_64.rpm","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.4-1.x86_64.rpm","sha256":"5df7596d872288511a4ca583b38ea757952faf28894c3e4fc1ca64e5efb3b8f6","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.rpm"},"linux_appimage":{"filename":"ScanaStudio_6.0.4_amd64.AppImage","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.4_amd64.AppImage","sha256":"c64c5c5d58d7d6634aff5bb2b30439d9be378e1c027a6d08bc3bb4a7b9659b54","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.AppImage"},"linux_tarball":{"filename":"ScanaStudio-6.0.4-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.4-linux-x86_64.tar.gz","sha256":"4e5e73c1418d03ddbcb55f3706b47025285bb363e227a24cf881b9e8b7395459","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.4_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.4_universal.dmg","sha256":"1375f5b6c4a054fecc15aa387f7070e5f64e5c00a280f7e08ef5a702a8390bb0","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.5","date":"2026-08-27","commit":"b186f2b","notes":"- feature: an update installs itself: the banner opens a dialog with the release notes, and a script install replaces itself and restarts\\n- breaking: Linux ships the installer tarball only; the deb, rpm and AppImage are no longer published","changes":[{"tag":"feature","text":"an update installs itself: the banner opens a dialog with the release notes, and a script install replaces itself and restarts"},{"tag":"breaking","text":"Linux ships the installer tarball only; the deb, rpm and AppImage are no longer published"}],"downloads":{"linux_tarball":{"filename":"ScanaStudio-6.0.5-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.5-linux-x86_64.tar.gz","sha256":"cdb36b332bbe0a248113761a5ba8ad3e77ab96f43148b156775e3938b46a8ca3","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"}}},{"version":"6.0.6","date":"2026-08-27","commit":"0641f24","notes":"- improvement: a test release, to prove an update installs itself","changes":[{"tag":"improvement","text":"a test release, to prove an update installs itself"}],"downloads":{"linux_tarball":{"filename":"ScanaStudio-6.0.6-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.
1com/dist/scanastudio-6/ScanaStudio-6.0.6-linux-x86_64.tar.gz","sha256":"3e8ce263fc33f74fbda530f684119103926862b0c40be604d6268e559c6aa2c3","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"}}},{"version":"6.0.7","date":"2026-08-27","commit":"154b165","notes":"- fix: closing and reopening no longer reports a crash that did not happen","changes":[{"tag":"fix","text":"closing and reopening no longer reports a crash that did not happen"}],"downloads":{"linux_tarball":{"filename":"ScanaStudio-6.0.7-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.7-linux-x86_64.tar.gz","sha256":"7773679382bda6b2c41202a5677b451c911b9b6da4b3a99a5e20cea78b84c799","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"}}},{"version":"6.0.8","date":"2026-08-27","commit":"b9cfd68","notes":"- fix: an update that fails now says why, and the installer runs under the shell it asks for","changes":[{"tag":"fix","text":"an update that fails now says why, and the installer runs under the shell it asks for"}],"downloads":{"linux_tarball":{"filename":"ScanaStudio-6.0.8-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.8-linux-x86_64.tar.gz","sha256":"b464ab66e91e5aebf6b42d9dc448ca50efdc28abbc4d311c3ab6523075037711","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"}}},{"version":"6.0.9","date":"2026-08-27","commit":"7b492e7","notes":"- fix: turning down the crash report now answers it, instead of asking again at every start-up","changes":[{"tag":"fix","text":"turning down the crash report now answers it, instead of asking again at every start-up"}],"downloads":{"linux_tarball":{"filename":"ScanaStudio-6.0.9-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.9-linux-x86_64.tar.gz","sha256":"5243dce250d63702dc83b5a944b435934c3dd90f6e27d65306bc47dd3e2196b5","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"}}},{"version":"6.0.10","date":"2026-08-27","commit":"28a4eb2","notes":"- fix: The Windows update now closes ScanaStudio and hands over to the setup wizard, which installs the new version and starts it.\\n- improvement: The macOS update replaces the application and reopens it, rather than leaving the disk image for you to drag.","changes":[{"tag":"fix","text":"The Windows update now closes ScanaStudio and hands over to the setup wizard, which installs the new version and starts it."},{"tag":"improvement","text":"The macOS update replaces the application and reopens it, rather than leaving the disk image for you to drag."}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.10_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.10_x64-setup.exe","sha256":"941e381cefd33464d4dab62519d3fd70362b7e5fe41e71f318ebb51e3e6ee282","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_tarball":{"filename":"ScanaStudio-6.0.10-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.10-linux-x86_64.tar.gz","sha256":"de12079e096f6728469d92ff950ee74d4bd0c59b835d120ff616a20438bfc1cd","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.10_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.10_universal.dmg","sha256":"4f4fd304c7d6a621f3c7282f5c09b5606e2a66be9c3e36a4ec4ba17862de616b","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.11","date":"2026-09-01","commit":"4f61e41","notes":"- feature: draw over a capture with the signal overlay, then keep it or throw it away\\n- feature: the waveform can be driven from the keyboard\\n- feature: a crash now produces a report you read before deciding to send it\\n- feature: the interface can talk to a daemon on another machine\\n- improvement: settings are found by name instead of by tab, and each one says what it does\\n- improvement: the home screen is a wall of devices\\n- fix: maximizing a detached view no longer docks it\\n- fix: item views keep up with a drag of the scrollbar\\n- fix: a canvas that changes size is repainted before it is shown","changes":[{"tag":"feature","text":"draw over a capture with the signal overlay, then keep it or throw it away"},{"tag":"feature","text":"the waveform can be driven from the keyboard"},{"tag":"feature","text":"a crash now produces a report you read before deciding to send it"},{"tag":"feature","text":"the interface can talk to a daemon on another machine"},{"tag":"improvement","text":"settings are found by name instead of by tab, and each one says what it does"},{"tag":"improvement","text":"the home screen is a wall of devices"},{"tag":"fix","text":"maximizing a detached view no longer docks it"},{"tag":"fix","text":"item views keep up with a drag of the scrollbar"},{"tag":"fix","text":"a canvas that changes size is repainted before it is shown"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.11_x64-setup.exe","url":"https://cdn.ikalogic.
1com/dist/scanastudio-6/ScanaStudio_6.0.11_x64-setup.exe","sha256":"2ae05ae0c761105d3455ba621abf74f50fa2ae7b6b861a4dd721022364931574","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_tarball":{"filename":"ScanaStudio-6.0.11-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.11-linux-x86_64.tar.gz","sha256":"782585ae1e23132d4cfbe4d0531499021c22f9ef25d81156b1d0030cb9140260","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.11_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.11_universal.dmg","sha256":"d3978d0e86f47cd1b6a3de24e55a83bd22816eb13a5678c52428b0f6ad80b0f2","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.13","date":"2026-09-02","commit":"86c14e0","notes":"- fix: Update internal deploy system\\n- feature: Add preliminary support for SDK (Python,JS, C, Rust)","changes":[{"tag":"fix","text":"Update internal deploy system"},{"tag":"feature","text":"Add preliminary support for SDK (Python,JS, C, Rust)"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.13_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.13_x64-setup.exe","sha256":"59c9b1d72711525af9921163af24e6f0b1ffb8d08b2dc97c487f23b73c9decdb","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_tarball":{"filename":"ScanaStudio-6.0.13-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.13-linux-x86_64.tar.gz","sha256":"672e75a40cfeb913c2bfc0322c4a5861c2ad80134fd9f0daa01c49ab031b27bc","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.13_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.13_universal.dmg","sha256":"2508921f06e300959fd3cb9f623bc4c09504bd7f0e45804c97ee6078d0b20e63","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.14","date":"2026-09-11","commit":"59a4973","notes":"- feature: state mode (sampling on an external clock) on the SP209, SP259 and SP1000G, with positions shown in states rather than seconds\\n- feature: the SP209 has a native driver, Linux included; the SP209i and SP259i industrial receivers reach the device\\n- feature: log view \u2014 a decoder\'s console output, with filters and clearing\\n- feature: fifteen themes, and a waveform that follows them\\n- feature: scripts can read and write files (the file_system_* API), granted per script and off by default\\n- feature: open a ScanaStudio 3/5 workspace\\n- feature: a reopened workspace offers the settings it was captured with, and opens at its device\'
1s sample rate\\n- feature: the cursor readout says what you ask it to\\n- improvement: home screen \u2014 one strip of device cards, and a device landing no longer moves the screen\\n- improvement: a capture says \\"preparing\\" while the device opens, and a booting device is reported as such\\n- improvement: a running acquisition freezes what it cannot change, and the pattern generator says whether it is armed\\n- improvement: the SP1000G shows its USB recovery instead of looking frozen\\n- improvement: SP1000G core 0x18 (captures more than once per FPGA load), SP259 firmware v8, SE254 firmware v3\\n- fix: the SP259 flexitrig counter runs at 125 MHz, not 250\\n- fix: SP209 threshold groups were sent in the wrong order\\n- fix: text is no longer selectable on macOS and Linux\\n- fix: a device with no cached capabilities no longer kills the dock\\n- fix: a workspace file that cannot be read says so in one sentence\\n- fix: the script manager\'s New sheet swallowed the file name and the author URL\\n- fix: pulse width constraints are sent instead of dropped","changes":[{"tag":"feature","text":"state mode (sampling on an external clock) on the SP209, SP259 and SP1000G, with positions shown in states rather than seconds"},{"tag":"feature","text":"the SP209 has a native driver, Linux included; the SP209i and SP259i industrial receivers reach the device"},{"tag":"feature","text":"log view \u2014 a decoder\'s console output, with filters and clearing"},{"tag":"feature","text":"fifteen themes, and a waveform that follows them"},{"tag":"feature","text":"scripts can read and write files (the file_system_* API), granted per script and off by default"},{"tag":"feature","text":"open a ScanaStudio 3/5 workspace"},{"tag":"feature","text":"a reopened workspace offers the settings it was captured with, and opens at its device\'
1s sample rate"},{"tag":"feature","text":"the cursor readout says what you ask it to"},{"tag":"improvement","text":"home screen \u2014 one strip of device cards, and a device landing no longer moves the screen"},{"tag":"improvement","text":"a capture says \\"preparing\\" while the device opens, and a booting device is reported as such"},{"tag":"improvement","text":"a running acquisition freezes what it cannot change, and the pattern generator says whether it is armed"},{"tag":"improvement","text":"the SP1000G shows its USB recovery instead of looking frozen"},{"tag":"improvement","text":"SP1000G core 0x18 (captures more than once per FPGA load), SP259 firmware v8, SE254 firmware v3"},{"tag":"fix","text":"the SP259 flexitrig counter runs at 125 MHz, not 250"},{"tag":"fix","text":"SP209 threshold groups were sent in the wrong order"},{"tag":"fix","text":"text is no longer selectable on macOS and Linux"},{"tag":"fix","text":"a device with no cached capabilities no longer kills the dock"},{"tag":"fix","text":"a workspace file that cannot be read says so in one sentence"},{"tag":"fix","text":"the script manager\'s New sheet swallowed the file name and the author URL"},{"tag":"fix","text":"pulse width constraints are sent instead of dropped"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.14_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.14_x64-setup.exe","sha256":"fb703abe7f5a31c5a77c81467695df95b091c94064ff4627eb9f8596137bab8a","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_tarball":{"filename":"ScanaStudio-6.0.14-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.14-linux-x86_64.tar.gz","sha256":"4476082452ea02205d0a5d75cd51ff72503b049aee6e1dce9a7e598b3ee2dd28","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.14_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.14_universal.dmg","sha256":"90af59f02d9c36d6b787b674110f722a7fd27fc7eb52f657ef06e29cff9453bd","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.15","date":"2026-09-12","commit":"5b7b109","notes":"- fix: the crash report can be sent \u2014 Send now reaches Ikalogic instead of answering that the build has no address\\n- fix: the script library is the same folder as ScanaStudio v3, so both versions share one set of scripts\\n- fix: the \\"Ikalogic drivers\\" link on the home screen opens the download page instead of starting the download\\n- improvement: v3 scripts run the way v3 ran them \u2014 multi-page config GUIs are drawn page by page, a decoder keeps its globals between passes, and a finished capture gets one last pass\\n- improvement: the SP1000G pattern generator reports where it stepped, so a script can line a pattern up with the signals it produced\\n- improvement: a generator script that also decodes offers to attach that side too, with the options already filled in\\n- fix: a decoder pass no longer hangs until the end of the capture on a channel left idle\\n- fix: a script\'s direct file access takes effect as soon as it is granted\\n- fix: a capture that fails says why","changes":[{"tag":"fix","text":"the crash report can be sent \u2014 Send now reaches Ikalogic instead of answering that the build has no address"},{"tag":"fix","text":"the script library is the same folder as ScanaStudio v3, so both versions share one set of scripts"},{"tag":"fix","text":"the \\"Ikalogic drivers\\" link on the home screen opens the download page instead of starting the download"},{"tag":"improvement","text":"v3 scripts run the way v3 ran them \u2014 multi-page config GUIs are drawn page by page, a decoder keeps its globals between passes, and a finished capture gets one last pass"},{"tag":"improvement","text":"the SP1000G pattern generator reports where it stepped, so a script can line a pattern up with the signals it produced"},{"tag":"improvement","text":"a generator script that also decodes offers to attach that side too, with the options already filled in"},{"tag":"fix","text":"a decoder pass no longer hangs until the end of the capture on a channel left idle"},{"tag":"fix","text":"a script\'s direct file access takes effect as soon as it is granted"},{"tag":"fix","text":"a capture that fails says why"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.15_x64-setup.exe","url":"https://cdn.ikalogic.
1com/dist/scanastudio-6/ScanaStudio_6.0.15_x64-setup.exe","sha256":"92531359dcd816368f1c23af7fe9147c2a416757a495f9e4a4dfc1ff14252151","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_tarball":{"filename":"ScanaStudio-6.0.15-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.15-linux-x86_64.tar.gz","sha256":"132947338046c81e4dea3d5ba90486534c37f192d61d1f68652f59eb5f650e5c","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.15_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.15_universal.dmg","sha256":"b3dc72b66a66f8d03a457fdd0966178f4ff59a9b18b23ce84d1bcae87e779ab2","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.16","date":"2026-09-12","commit":"8ed2bcd","notes":"- fix: a measurement no longer stays on \\"Calculating\\" after its result is in","changes":[{"tag":"fix","text":"a measurement no longer stays on \\"Calculating\\" after its result is in"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.16_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.16_x64-setup.exe","sha256":"a67afacbdf202fb4bb38a06b8d13a4555a8fdc3ca7ce9313fda7c8075aa1d205","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"linux_tarball":{"filename":"ScanaStudio-6.0.16-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.16-linux-x86_64.tar.gz","sha256":"471b1cd4bfcda9789ea19a56093d55c3706a41156bef77c1fa2c2c06e007ca2a","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.16_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.16_universal.dmg","sha256":"adb029829cdf2c19881963b9cfaef17f69d1be4b3cba2090839338685f22f6f8","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.17","date":"2026-09-23","commit":"c597252","notes":"- feature: a portable edition for Windows \u2014 a .zip that runs where it is unpacked, keeps its logs, autosaves and script library in a data folder beside it, and updates itself in place\\n- feature: rows can be selected (click, Ctrl, Shift), dragged as a group, and pinned to the top of the plot while the rest scrolls behind them\\n- feature: a channel follows the pointer while it is dragged, and a drag held at the edge scrolls the view\\n- feature: a probe port\'s configuration can be copied and pasted onto another port, in the same workspace or another one\\n- feature: a trigger engine\'s configuration can be copied and pasted onto the other engine or another workspace, adapted to the target device\\n- feature: every workspace ScanaStudio 5 opens can now be imported, including files from ScanaStudio 2 to 4.1, with hidden channels and row order kept\\n- feature: the script library folder can be changed in Settings\\n- feature: the third-party licence notices ship with the application and open from the About window\\n- improvement: the About window shows the script API and SDK versions, and where the server runs\\n- improvement: the P992 window keeps a threshold per channel, saved with the workspace\\n- improvement: SP1000G controller firmware 0.12.252\\n- improvement: a capture that is refused offers \\"Show the trigger\\" only when the trigger is the reason\\n- fix: a click beside a dialog no longer closes it and throws away what was typed\\n- fix: Cancel in Settings undoes every change, and OK is the only thing that applies one\\n- fix: a server port taken by another program no longer makes the application restart its server again and again; a free port is offered instead\\n- fix: on Windows, a second server can no longer start on a port that is already in use\\n- fix: buttons that would open a folder on a remote server\'s machine are disabled instead of opening the wrong local folder\\n- fix: decoder items drawn under a curve placed above a channel land on the right row\\n- fix: layered decoders using sync_decode produce their items again\\n- fix: a pattern generator\'s settings form reads the sample rate correctly\\n- fix: a capture imported from a ScanaStudio 5 demo device opens on the matching demo device","changes":[{"tag":"feature","text":"a portable edition for Windows \u2014 a .zip that runs where it is unpacked, keeps its logs, autosaves and script library in a data folder beside it, and updates itself in place"}
1,{"tag":"feature","text":"rows can be selected (click, Ctrl, Shift), dragged as a group, and pinned to the top of the plot while the rest scrolls behind them"},{"tag":"feature","text":"a channel follows the pointer while it is dragged, and a drag held at the edge scrolls the view"},{"tag":"feature","text":"a probe port\'s configuration can be copied and pasted onto another port, in the same workspace or another one"},{"tag":"feature","text":"a trigger engine\'s configuration can be copied and pasted onto the other engine or another workspace, adapted to the target device"},{"tag":"feature","text":"every workspace ScanaStudio 5 opens can now be imported, including files from ScanaStudio 2 to 4.1, with hidden channels and row order kept"},{"tag":"feature","text":"the script library folder can be changed in Settings"},{"tag":"feature","text":"the third-party licence notices ship with the application and open from the About window"},{"tag":"improvement","text":"the About window shows the script API and SDK versions, and where the server runs"},{"tag":"improvement","text":"the P992 window keeps a threshold per channel, saved with the workspace"},{"tag":"improvement","text":"SP1000G controller firmware 0.12.252"},{"tag":"improvement","text":"a capture that is refused offers \\"Show the trigger\\" only when the trigger is the reason"},{"tag":"fix","text":"a click beside a dialog no longer closes it and throws away what was typed"},{"tag":"fix","text":"Cancel in Settings undoes every change, and OK is the only thing that applies one"},{"tag":"fix","text":"a server port taken by another program no longer makes the application restart its server again and again; a free port is offered instead"},{"tag":"fix","text":"on Windows, a second server can no longer start on a port that is already in use"},{"tag":"fix","text":"buttons that would open a folder on a remote server\'s machine are disabled instead of opening the wrong local folder"},{"tag":"fix","text":"decoder items drawn under a curve placed above a channel land on the right row"},{"tag":"fix","text":"layered decoders using sync_decode produce their items again"},{"tag":"fix","text":"a pattern generator\'s settings form reads the sample rate correctly"},{"tag":"fix","text":"a capture imported from a ScanaStudio 5 demo device opens on the matching demo device"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.17_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.17_x64-setup.exe","sha256":"ad48a3698f11cca860f97ac8217609e2a91fe97f0d3c2c0df12f26679283d839","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"windows_portable":{"filename":"ScanaStudio-6.0.17-windows-x86_64-portable.zip","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.17-windows-x86_64-portable.zip","sha256":"3239db0a77a6ac8fdaab8b358ba45df30434a24e7c311d428c267e556f341153","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-windows-x86_64-portable.zip"},"linux_tarball":{"filename":"ScanaStudio-6.0.17-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.17-linux-x86_64.tar.gz","sha256":"2733e0ffc9b57a8d3554f137337c9aa6b9d38431b695c97cdd0b15aef56d9102","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.17_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.17_universal.dmg","sha256":"1068ab38a4c2e0d701b0d3b8d0e1ae4b10a6a7dda505d982182d80c29f957b92","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}},{"version":"6.0.18","date":"2026-09-28","commit":"f8e0df9","notes":"- feature: the ScanaQuad family (SQ25, SQ50, SQ100, SQ200), with its pattern generator, capture and I/O configuration\\n- feature: an inputs / outputs window with a wiring schematic of each channel\'s termination\\n- feature: in Generation or Mixed mode every output channel gets its own row holding what the next generation replays, filled from the capture, at a constant level, drawn by hand or by a script\\n- feature: signal builder scripts (on_build_signals) run with their configuration form, as in ScanaStudio 3\\n- feature: measurements on generation rows, and a mixed run shows the replayed region in a loop\\n- improvement: a new trigger step starts from the levels the previous step leaves instead of don\'t care\\n- improvement: the miniview\'s grips resize the visible zone\\n- improvement: the SP259 reports its clock and each memory bank in the device information\\n- fix: a multistep trigger combining a held level, an edge and a time window never fired\\n- fix: an external trigger on a device with no TRIG IN fired at once; it is now refused\\n- fix: the cursor readout inverted duty cycle and pulse level on every channel\\n- fix: a marker can no longer be placed or moved before the first sample\\n- fix: the memory depth list offered one step past the device\'
1s memory","changes":[{"tag":"feature","text":"the ScanaQuad family (SQ25, SQ50, SQ100, SQ200), with its pattern generator, capture and I/O configuration"},{"tag":"feature","text":"an inputs / outputs window with a wiring schematic of each channel\'s termination"},{"tag":"feature","text":"in Generation or Mixed mode every output channel gets its own row holding what the next generation replays, filled from the capture, at a constant level, drawn by hand or by a script"},{"tag":"feature","text":"signal builder scripts (on_build_signals) run with their configuration form, as in ScanaStudio 3"},{"tag":"feature","text":"measurements on generation rows, and a mixed run shows the replayed region in a loop"},{"tag":"improvement","text":"a new trigger step starts from the levels the previous step leaves instead of don\'t care"},{"tag":"improvement","text":"the miniview\'s grips resize the visible zone"},{"tag":"improvement","text":"the SP259 reports its clock and each memory bank in the device information"},{"tag":"fix","text":"a multistep trigger combining a held level, an edge and a time window never fired"},{"tag":"fix","text":"an external trigger on a device with no TRIG IN fired at once; it is now refused"},{"tag":"fix","text":"the cursor readout inverted duty cycle and pulse level on every channel"},{"tag":"fix","text":"a marker can no longer be placed or moved before the first sample"},{"tag":"fix","text":"the memory depth list offered one step past the device\'s memory"}],"downloads":{"windows_setup":{"filename":"ScanaStudio_6.0.18_x64-setup.exe","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.18_x64-setup.exe","sha256":"f573271e1ed30c6d5c50d526f673579cb63c1338a04935830ce13644ed2ff12b","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-Setup.exe"},"windows_portable":{"filename":"ScanaStudio-6.0.18-windows-x86_64-portable.zip","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.18-windows-x86_64-portable.zip","sha256":"9fda086bc4d550fb9a53fef077c72cd55b6cb1201a5a239c74087972b9f7a9e5","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-windows-x86_64-portable.zip"},"linux_tarball":{"filename":"ScanaStudio-6.0.18-linux-x86_64.tar.gz","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-6.0.18-linux-x86_64.tar.gz","sha256":"7b61ef22ecb915012c016bd6dfb0495c7c75735a2fdae0dcc10e3d4ddf7a0342","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-linux-x86_64.tar.gz"},"macos_dmg":{"filename":"ScanaStudio_6.0.18_universal.dmg","url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio_6.0.18_universal.dmg","sha256":"6017112459cdb119efe37a403c1feb8b47a963a07c9c9c48aae4d1c016e9bddf","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio.dmg"}}}],"QE":{"version":"0.2.8","date":"2026-09-28","commit":"f8e0df9","filename":"scanastudio-c-0.2.8.zip","url":"https://cdn.ikalogic.com/dist/scanastudio-6/scanastudio-c-0.2.8.zip","sha256":"da6d3bac2099795e3f00bf84fed1687e72b950e1d8b5341cff81d6af238746d6","alias_url":"https://cdn.ikalogic.com/dist/scanastudio-6/ScanaStudio-C-API.zip"}}')}}]);
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.