<script data-pm-proxy="intercept"></script><?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[DefconQ Newsletter]]></title><description><![CDATA[DefconQ is a blog focused on helping developers enhance their KDB/Q skills. From beginner tutorials to advanced insights, it covers key topics in KDB/Q technology. Explore valuable resources and boost your knowledge by following the newsletter]]></description><link>https://defconq.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!EwIv!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60327a05-982e-4b91-9d8d-f067d5795035_1080x1080.png</url><title>DefconQ Newsletter</title><link>https://defconq.substack.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 03 Sep 2026 14:15:50 GMT</lastBuildDate><atom:link href="/__u/defconq.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[DefconQ]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[defconq@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[defconq@substack.com]]></itunes:email><itunes:name><![CDATA[DefconQ]]></itunes:name></itunes:owner><itunes:author><![CDATA[DefconQ]]></itunes:author><googleplay:owner><![CDATA[defconq@substack.com]]></googleplay:owner><googleplay:email><![CDATA[defconq@substack.com]]></googleplay:email><googleplay:author><![CDATA[DefconQ]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[DefconQ Happy Hour Is Back!]]></title><description><![CDATA[The wait is over: DefconQ Happy Hour is returning to London!]]></description><link>https://defconq.substack.com/p/defconq-happy-hour-is-back</link><guid isPermaLink="false">https://defconq.substack.com/p/defconq-happy-hour-is-back</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Mon, 10 Aug 2026 10:34:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WLs9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The wait is over: <strong>DefconQ Happy Hour</strong> is returning to London!</p><p>After another fantastic turnout at our previous events, we&#8217;re bringing the KDB/Q community together once again for an evening of great conversations, new connections, and plenty of laughs. Whether you&#8217;re a seasoned developer, just starting your journey with KDB/Q, or simply curious about the ecosystem, this is the perfect opportunity to meet like-minded people in a relaxed, informal setting.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>This time, we&#8217;re delighted to be hosted by <a href="https://firstderivative.com/">First Derivative (FD)</a> of <a href="https://www.epam.com/">EPAM Financial Services</a>, who have kindly opened the doors of their London office for the community. A huge thank you to the EPAM team for supporting the event and helping us continue to grow the KDB/Q community.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!WLs9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!WLs9!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!WLs9!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!WLs9!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WLs9!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!WLs9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png" width="1254" height="1254" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1254,&quot;width&quot;:1254,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2506667,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/210582267?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!WLs9!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!WLs9!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!WLs9!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WLs9!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e5bedf3-8ee4-4fc2-92c1-652d111f7962_1254x1254.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Event Details</strong></p><p>&#128197; <strong>Date</strong>: Thursday, 17th September 2026<br>&#128341; <strong>Time</strong>: 18:00 onwards<br>&#128205; <strong>Venue</strong>: <a href="https://maps.app.goo.gl/9HSiBCUk9sehN8hDA">EPAM London Office, 9 Devonshire Square, London</a><br>&#9999;&#65039; <strong>Sign up</strong>: <a href="https://www.eventbrite.com/e/defconq-x-first-derivative-happy-hour-tickets-1996997754040?aff=oddtdtcreator">DefconQ x First Derivative Happy Hour Eventbride</a></p><p><strong>Please note that registration is mandatory for security reasons. Unfortunately, entry cannot be granted without prior registration.</strong></p><h2>More Than Just a Meetup</h2><p><strong>DefconQ Happy Hour</strong> isn&#8217;t about presentations or slide decks.</p><p>It&#8217;s about conversations.</p><p>It&#8217;s about finally putting faces to the names you&#8217;ve seen on LinkedIn or Discord. It&#8217;s about sharing ideas, discussing architecture, debating language features, swapping war stories from production systems, and maybe even discovering your next career opportunity.</p><p>Whether you&#8217;re looking for technical discussions, career advice, collaborators for your next project, or simply a good chat over a drink, you&#8217;ll find all of that&#8212;and more.</p><h2>Come for the Community, Stay for the Conversations</h2><p>The KDB/Q ecosystem has always thrived because of its people. Every Happy Hour brings together developers, quants, architects, hiring managers, students, and industry veterans under one roof.</p><p>So if you&#8217;ve been meaning to get more involved in the community, this is your chance.</p><p>Spaces are limited, so make sure to register early.</p><p>I can&#8217;t wait to see familiar faces, meet plenty of new ones, and raise a glass to another fantastic evening with the community.</p><p><strong>See you on 17th September!</strong></p><h2>About First Derivative &amp; EPAM: Strategic Synergy</h2><p>First Derivative, established in 1996 in Newry, Co. Down, Ireland, is a global provider of technology products and consulting services to leading institutions in finance, technology and energy. With deep expertise in trading technology, risk management, data analytics and regulatory compliance for capital markets, First Derivative delivers capital markets intelligence to clients worldwide. Today, the company employs over 1,300 professionals across 15 offices globally.</p><p>As part of EPAM Systems, First Derivative benefits from the scale and innovation of a leading global provider of digital platform engineering and software development services. Founded in 1993 in Princeton, New Jersey, EPAM specializes in bespoke software development, digital transformation, cloud solutions, data engineering, and experience design across industries including finance, healthcare, retail, and more. EPAM&#8217;s global presence includes over 60,000 professionals in more than 50 countries across Europe, Asia, North America and beyond.</p><p>Together, First Derivative and EPAM combine capital markets expertise with world-class digital engineering, offering clients strategic solutions and transformative technology to meet the demands of today&#8217;s dynamic markets.</p><h3>Open Roles at First Derivative</h3><p><a href="https://careers.epam.com/en/vacancy/kdb-developer-bltr2oe962ttko44k6z_en">KDB Developer - HYBRID IN THE UNITED KINGDOM: LONDON</a></p><p><a href="https://careers.epam.com/en/vacancy/kdb-developer-blt54kjhtipi14pigbe_en">KDB Developer - HYBRID IN THE UNITED KINGDOM: NEWRY, THE UNITED KINGDOM: BELFAST</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Another Peach Falls Into the Basket - PeachQ]]></title><description><![CDATA[Open Source, Open Opportunities: Exploring Ryan Hamilton's Vision for the Future of q]]></description><link>https://defconq.substack.com/p/another-peach-falls-into-the-basket</link><guid isPermaLink="false">https://defconq.substack.com/p/another-peach-falls-into-the-basket</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Mon, 03 Aug 2026 10:55:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9IxP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Summer of New Beginnings</h2><p>It seems the weather isn&#8217;t the only thing refusing to cool down this summer. Only a few days ago, I wrote about <a href="https://www.defconq.tech/blog/L%20Has%20Landed%20-%20A%20New%20Runtime%20for%20k%20and%20q%20Enters%20the%20Scene">L</a>, <a href="https://www.linkedin.com/in/jacobloveless/">Jacob Loveless&#8217;</a> new runtime for k and q, and why I believe it&#8217;s one of the projects worth watching in the evolving k ecosystem.</p><p>Well... here&#8217;s another one.</p><p>This time, it&#8217;s <strong><a href="https://peachq.org/">PeachQ</a></strong>, an <strong>open-source implementation</strong> of the q language spearheaded by none other than <strong><a href="https://www.linkedin.com/in/justryanhamilton/">Ryan Hamilton</a></strong>.</p><p>If you&#8217;re sensing a pattern, you&#8217;re right. Innovation is happening. And, perhaps more importantly, it&#8217;s happening in the open.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!9IxP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!9IxP!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png 424w, /__u/substackcdn.com/image/fetch/$s_!9IxP!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png 848w, /__u/substackcdn.com/image/fetch/$s_!9IxP!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9IxP!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!9IxP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png" width="1456" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:608,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:441017,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/209609393?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!9IxP!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png 424w, /__u/substackcdn.com/image/fetch/$s_!9IxP!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png 848w, /__u/substackcdn.com/image/fetch/$s_!9IxP!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9IxP!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb746f503-f976-4bcd-a776-20fde5f6553a_2492x1040.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/defconq.substack.com/subscribe"><span>Subscribe now</span></a></p><h2>Meet Ryan Hamilton</h2><p>Ryan Hamilton is hardly a new face in the community.</p><p>If you&#8217;ve spent any amount of time working with KDB/Q over the last decade, chances are you&#8217;ve used one of his tools, read one of his articles, or benefitted from one of his countless contributions.</p><p>As the founder of <strong><a href="https://www.timestored.com/">TimeStored</a></strong>, Ryan has quietly become one of the ecosystem&#8217;s most prolific builders.</p><p>In many ways, you could say he&#8217;s the <em><strong>Pulse</strong></em> of the community.</p><p>Yes, that&#8217;s a deliberate pun.</p><p>Not only because one of his flagship products is called <strong><a href="https://www.timestored.com/pulse/">Pulse</a></strong>, but because Ryan has consistently kept the community moving forward through new ideas, thoughtful discussions, and practical tooling. Over the years he has built:</p><ul><li><p><strong><a href="https://www.timestored.com/qstudio/">QStudio</a></strong>: one of the best-known IDEs for KDB/Q development.</p></li><li><p><strong><a href="https://www.timestored.com/pulse/">Pulse</a></strong>: powerful platform for building real-time data applications.</p></li><li><p>Numerous open-source tools, integrations and community resources spanning far beyond traditional KDB/Q development.</p></li></ul><p>I&#8217;ve had the pleasure of working with Ryan on several feature implementations for Pulse, and one thing quickly becomes apparent: if there&#8217;s a useful feature to build, Ryan usually finds a way to ship it.</p><h2>A Long-Time Advocate for Improving q</h2><p>One thing I&#8217;ve always appreciated about Ryan is that he doesn&#8217;t simply point out problems: he proposes solutions.</p><p>Over the years, his blog has become a collection of thoughtful ideas about where the ecosystem could evolve. He&#8217;s written about making q more approachable, improving interoperability with modern data tooling, embracing open-source technologies, expanding SQL support, introducing richer language features such as type hints, simplifying deployment, broadening compatibility, and generally making the language easier to adopt beyond its traditional financial audience.</p><p>Some of these articles were deliberately speculative. Others explored &#8220;what if?&#8221; scenarios.</p><p>With <strong>PeachQ</strong>, many of those ideas are no longer just blog posts.</p><p>Ryan now has the opportunity to implement them himself.</p><p>That might be one of the most exciting aspects of the project.</p><h2>So, What Is PeachQ?!?</h2><p>At its core, <strong><a href="https://peachq.org/">PeachQ</a></strong> is an <strong>MIT-licensed, open-source implementation of the q language.</strong> It aims to preserve the expressive array programming model and familiar qSQL semantics while providing a modern, community-driven implementation that anyone can use, inspect, extend, and improve. Today it runs on the Rayforce in-memory engine, with future plans including DuckDB-backed storage and broader interoperability with modern data ecosystems.</p><p>That last point is particularly important.</p><p>Unlike proprietary runtimes, PeachQ is being developed in <strong>public.</strong></p><p>The project openly tracks compatibility, encourages contributions, and invites developers to help shape everything from language support and tooling to libraries, drivers, IDE integration, and package ecosystems. For a language that has traditionally lived behind commercial licensing, that&#8217;s a significant shift.</p><h2>Compatibility Is Already Moving Fast</h2><p>At the time of writing, PeachQ reports approximately <strong>66% language compatibility with q.</strong></p><p>Now, depending on how you look at it, that number can either sound encouraging or daunting.</p><p>Personally?</p><p>I think it&#8217;s incredibly impressive.</p><p>Building a language is hard.</p><p>Building a language with decades of existing behaviour, subtle semantics, and production expectations is even harder.</p><p>Having worked with Ryan before, I&#8217;m probably a little less surprised than others. He&#8217;s someone who iterates quickly, listens carefully to feedback, and ships improvements at an impressive pace. If history is anything to go by, I wouldn&#8217;t expect that compatibility percentage to stand still for very long.</p><h2>More Than Just Another Runtime</h2><p>It&#8217;s tempting to view PeachQ purely as another implementation of q.</p><p>I think that would be underselling it.</p><p>Open implementations change ecosystems.</p><p>They lower barriers to entry.</p><p>They encourage experimentation.</p><p>They enable universities, startups, independent developers and hobbyists to learn, prototype and build without worrying about licensing constraints.</p><p>Perhaps most importantly, they encourage tooling.</p><p>Open languages tend to attract IDEs, language servers, testing frameworks, package managers, notebooks, AI integrations, linters, debuggers and countless community projects that become difficult to justify in closed ecosystems.</p><p>That&#8217;s how ecosystems grow.</p><h2>Why This Matters</h2><p>If you&#8217;ve been following <strong>DefconQ</strong> recently, you&#8217;ll notice a recurring theme.</p><p><strong>First L.</strong></p><p><strong>Now PeachQ.</strong></p><p>And trust me&#8212;they&#8217;re not the only projects currently being worked on.</p><p>For many years, innovation around q largely revolved around applications built on top of the language.</p><p>Now we&#8217;re beginning to see innovation happening within the language ecosystem itself.</p><p>That&#8217;s healthy.</p><p>Competition drives innovation.</p><p>Different implementations explore different ideas.</p><p>Developers gain more choice.</p><p>And the entire community benefits.</p><p>Whether you ultimately choose commercial q, L, PeachQ, or something else entirely almost becomes secondary.</p><p>The important part is that people are building.</p><p>People are experimenting.</p><p>People are investing their time into making the ecosystem stronger.</p><h2>Looking Ahead</h2><p>PeachQ is still in its early days, but it&#8217;s already one of the most interesting open-source projects in the k and q world.</p><p>Knowing Ryan, I expect it to evolve rapidly. I also wouldn&#8217;t be surprised to see many of the ideas he&#8217;s championed over the years gradually finding their way into the language itself.</p><p>One thing is certain: I&#8217;ll be following the project closely.</p><p>And if this summer has taught us anything, it&#8217;s that the k and q ecosystem is entering one of its most exciting periods in years.</p><p>I&#8217;ll be here covering every step of that journey.</p><p><strong>Good Luck Ryan!</strong></p><p>Stay tuned.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[L Has Landed - A New Runtime for k and q Enters the Scene]]></title><description><![CDATA[Not Only the Weather Is Heating Up&#8230;]]></description><link>https://defconq.substack.com/p/l-has-landed-a-new-runtime-for-k</link><guid isPermaLink="false">https://defconq.substack.com/p/l-has-landed-a-new-runtime-for-k</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Tue, 21 Jul 2026 10:31:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!EwIv!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60327a05-982e-4b91-9d8d-f067d5795035_1080x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Not Only the Weather Is Heating Up&#8230;</h2><p>Not only have the temperatures been rising this summer, but so has the market for exciting new projects in the k and q ecosystem. While I&#8217;m aware of several groups quietly working on some very interesting ideas behind the scenes, L-Labs a new entity founded by K/Q veteran and former HFT engineer <strong><a href="https://www.linkedin.com/in/jacobloveless/">Jacob Loveless</a></strong>, is the first to bring something new to market.</p><p>Meet <strong><a href="https://lv1.sh/">L</a></strong>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>A brand-new runtime for k and q that has just become publicly available, with the ambitious goal of rethinking how k and q applications are executed.</p><p>As someone who spends a large amount of time looking at everything happening around the KDB/Q ecosystem, it&#8217;s always exciting to see innovation emerge, especially when it comes from someone who has been working with the language for years.</p><h2>Why Build Another Runtime?</h2><p>It&#8217;s a fair question.</p><p>After all, q has been around for decades, has powered some of the world&#8217;s largest financial institutions, and remains one of the fastest technologies available for time-series analytics. So why build another runtime? Jacob&#8217;s motivation is refreshingly straightforward.</p><p>As he explains in his <strong><a href="https://lv1.sh/blog/why-l/">Why L? article</a></strong>, the goal wasn&#8217;t to replace existing tools for the sake of replacing them. It was to build a modern runtime that explores different implementation choices, removes historical constraints where possible, and provides a fresh foundation for future development. Rather than simply recreating the past, L is an experiment in how a modern k and q runtime could look today.</p><p>Projects like this are healthy for an ecosystem.</p><p>They challenge assumptions.</p><p>They encourage experimentation.</p><p>And they often introduce ideas that eventually influence everyone.</p><h2>Performance Looks&#8230; Interesting</h2><p>One of the first things that caught my eye was the benchmark section. L has been benchmarked across a variety of workloads and, at least in the published results, performs extremely well, often outperforming many other language runtimes in those tests. It&#8217;s an impressive showing and certainly suggests there&#8217;s some serious engineering under the hood.</p><p>Of course, benchmarks always deserve a healthy dose of context.</p><p>Different benchmarks measure different things, and synthetic workloads don&#8217;t necessarily translate directly into production systems. The workloads you care about might look very different from those used in published comparisons. For those of us working with production KDB/Q systems, the natural question is how L behaves on the kinds of real-world problems we care about: large in-memory databases, tickerplants, gateways, IPC-heavy applications, historical queries, and high-throughput market data processing.</p><p>That&#8217;s still something the community will have to explore over time. But regardless of where those comparisons ultimately land, it&#8217;s encouraging to see a new runtime pushing performance and introducing fresh implementation ideas.</p><h2>More Choice Is Good for Everyone</h2><p>Perhaps the most exciting aspect of L isn&#8217;t a benchmark chart.</p><p>It&#8217;s the fact that somebody decided to build something new.</p><p>For a long time, the k and q ecosystem has been relatively quiet when it comes to alternative runtimes and implementations. Seeing fresh ideas emerge lowers the barrier for experimentation and opens up entirely new opportunities for developers, researchers, and companies interested in the language. Competition drives innovation.</p><p>New implementations often lead to new tooling. Different implementation strategies expose different strengths. Three decades have seen several implementations of k, none as fast as k4. L has supported commercial systems for a decade. And it claims to be significantly faster than k4. And even if they never become the dominant runtime, they frequently inspire improvements across the wider ecosystem. That&#8217;s good news for everyone who enjoys working with vector programming languages.</p><h2>What Else Is Brewing?</h2><p>L certainly isn&#8217;t the only exciting project currently in the works. Behind the scenes, several teams are quietly building new languages, tools, runtimes, libraries, and ideas that have the potential to shape the future of the k and q ecosystem. Some are still under wraps, others are getting closer to seeing the light of day. As always, <strong>DefconQ</strong> aims to stay at the forefront of everything happening in the community. I&#8217;ll be following these developments closely and sharing them here as soon as they&#8217;re ready to go public. So if you&#8217;d like to stay ahead of the curve, make sure to follow DefconQ. The easiest way is to subscribe to the <strong><a href="/__u/defconq.substack.com/">free newsletter</a></strong> and have every new article delivered straight to your inbox, or follow me on <strong><a href="https://www.linkedin.com/in/alexanderunterrainer/">LinkedIn</a></strong> where I regularly share the latest news, tutorials, and developments from across the ecosystem.</p><p>Because if this summer has shown us anything, it&#8217;s that the k and q world is far from standing still.</p><h2>I&#8217;ll Be Keeping a Close Eye on This One</h2><p>It&#8217;s still very early days, and only time will tell how L evolves and where it ultimately fits within the ecosystem. But one thing is certain: it&#8217;s one of the most interesting developments in the k and q world this year. I&#8217;ll definitely be keeping a close eye on the project, experimenting with it, and following its progress as it matures. If you&#8217;re curious yourself, I&#8217;d encourage you to take a look, play around with it, and form your own opinion. As always, I&#8217;ll keep you posted as I learn more.</p><p>Stay tuned.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[When Markets Never Sleep]]></title><description><![CDATA[Extended Hours, Odd Lots, and the Infrastructure Implications of Always-On Markets]]></description><link>https://defconq.substack.com/p/when-markets-never-sleep</link><guid isPermaLink="false">https://defconq.substack.com/p/when-markets-never-sleep</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Mon, 22 Jun 2026 10:56:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!EwIv!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60327a05-982e-4b91-9d8d-f067d5795035_1080x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few months ago, I wrote a blog post about <a href="https://www.defconq.tech/blog/Nasdaq%20Extends%20Trading%20Hours%20-%20What%20It%20Really%20Means%20for%20Market%20Data%20Systems">Nasdaq&#8217;s plans to extend trading hours</a> and what that might mean for market data infrastructure. At the time, the discussion was largely theoretical. It was easy to dismiss it as yet another market structure change that would slowly work its way through committees, working groups, and technology roadmaps.</p><p>The more I thought about it, however, the more I realised that extended trading hours are not really about trading hours at all.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>They are about a much bigger shift taking place across financial markets.</p><p>Markets are becoming more continuous. More fragmented. More data-intensive. More demanding.</p><p>And most importantly, they are beginning to expose assumptions that have been baked into market data systems for decades.</p><p>That&#8217;s exactly why I&#8217;m excited to be joining <a href="https://kx.com/">KX</a> for an upcoming webinar discussing the infrastructure implications of always-on markets. Together we&#8217;ll explore what extended trading hours, odd lots, sub-penny pricing, AI-driven workflows, and increasingly continuous markets mean for firms operating in today&#8217;s landscape.</p><h2>The End of &#8220;Business Hours&#8221;</h2><p>For most of modern market history, technology teams have enjoyed a luxury they rarely appreciated: downtime. Markets opened. Markets closed. Systems had time to breathe. The overnight window was often used to recover from failures, perform maintenance, replay data, rebuild databases, execute batch processes, and generally prepare for the next day. If something went wrong at 6 p.m., there was usually time to fix it before the opening bell the next morning.</p><p>Those assumptions are rapidly disappearing.</p><p>Whether it&#8217;s extended trading sessions, overnight equity markets, crypto&#8217;s 24/7 trading model, or increasing globalisation of liquidity, markets are steadily moving toward continuous operation. For market participants, this creates new opportunities. For infrastructure teams, it creates new headaches. Because an always-on market eventually requires always-on infrastructure.</p><p>And that changes everything.</p><h2>More Than Just More Data</h2><p>When people hear &#8220;extended trading hours,&#8221; the first reaction is often: <em>&#8220;So we&#8217;ll have more data?&#8221;</em></p><p>Yes. But that&#8217;s probably the least interesting part of the story. The real challenge comes from the combination of trends happening simultaneously.</p><p>Odd lots are becoming increasingly important. Sub-penny pricing continues to evolve. Market fragmentation continues to increase. AI-driven workflows are creating entirely new categories of data consumers. Real-time analytics are expected everywhere. Historical data is no longer simply stored; it&#8217;s continuously queried, replayed, modelled, and fed into machine learning systems. Each of these developments adds pressure individually. Together, they fundamentally change how firms need to think about infrastructure.</p><p>What used to be a relatively clean separation between real-time systems, historical databases, research environments, and analytics platforms is becoming increasingly blurred.</p><p>And that&#8217;s where things start getting interesting for KDB/Q developers.</p><h2>The Recovery Window Is Disappearing</h2><p>One of the topics I&#8217;m particularly looking forward to discussing during the webinar is the disappearing recovery window. Historically, many systems relied on periods of reduced activity to catch up. Data could be reconciled. Processes could be restarted. Infrastructure could be upgraded. Large batch jobs could run. Many firms still have critical workflows that quietly assume these windows will always exist.</p><p>But what happens when they don&#8217;t?</p><p>What happens when there is no convenient downtime?</p><p>What happens when trading activity never truly stops?</p><p>The challenge is no longer simply building systems that are fast. The challenge becomes building systems that remain continuously available, continuously observable, and continuously resilient. That is a very different engineering problem.</p><h2>When Architectures Start to Crack</h2><p>Most firms didn&#8217;t intentionally design fragmented architectures. In fact, many of the decisions that created today&#8217;s technology stacks were entirely reasonable at the time. One system handled real-time data. Another stored historical information. A separate platform supported research. Analytics ran somewhere else. AI workloads are added nowadays.</p><p>Over time, however, every additional component introduces another handoff. Another integration, another potential point of failure, another place where latency, inconsistency, operational risk, and complexity can accumulate.</p><p>When markets operate within defined sessions, those compromises can often be managed. When markets become continuous however, the cracks become much harder to hide. The cost of moving data between systems increases.The operational burden increases. The complexity increases.</p><p>And eventually firms start asking a difficult question: <em>&#8220;Would we build it this way if we were starting today?&#8221;</em></p><h2>Building for the Next Decade</h2><p>This naturally leads to the final topic we&#8217;ll discuss during the webinar: what principles should guide the next generation of market infrastructure? If markets are becoming more continuous, more granular, and more data-intensive, then infrastructure needs to evolve alongside them.</p><p>Firms increasingly need platforms that can handle real-time analytics, historical data, research workloads, and AI-driven applications without requiring a maze of disconnected systems. They need interoperability. They need resilience. They need simplicity. And they need technology capable of operating continuously rather than merely surviving until the next maintenance window.</p><p>This is where KDB-X enters the conversation.</p><p>One of the reasons KDB/Q has remained so dominant in capital markets is its ability to unify problems that traditionally required multiple technologies. KDB-X takes that philosophy further, providing a platform designed for modern workloads where real-time, historical, analytics, and AI increasingly coexist.</p><p>We&#8217;ll explore exactly what that means during the discussion.</p><h2>Join Us</h2><p>Whether you&#8217;re a KDB/Q developer, quant engineer, market data architect, researcher, or simply someone interested in where market infrastructure is heading, this webinar should be a fascinating discussion. Because the real question isn&#8217;t whether markets will continue to evolve.</p><p>They will.</p><p>The real question is whether our infrastructure is evolving with them.</p><p>I hope you&#8217;ll join us as we explore what happens when markets never sleep.</p><p><a href="https://kx.com/resources/webinars/when-markets-never-sleep-extended-hours-odd-lots-and-the-infrastructure-implications-of-always-on-markets/">SIGNUP HERE</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[DefconQ x Databento Meetup - The Market Data Provider You Wish Always Existed]]></title><description><![CDATA[There Is No KDB Without Market Data]]></description><link>https://defconq.substack.com/p/defconq-x-databento-meetup-the-market</link><guid isPermaLink="false">https://defconq.substack.com/p/defconq-x-databento-meetup-the-market</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Mon, 08 Jun 2026 07:35:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FBb6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s be honest: there is <strong>no KDB/Q</strong> without market data.</p><p>You can build the cleanest tickerplant in the world, design elegant schemas, optimise queries until they scream, and architect the perfect stack, but without data flowing into it, it&#8217;s all just a very expensive and slightly nerdy sculpture.</p><p>Market data is the <em>lifeblood</em> of every serious KDB/Q system. It&#8217;s where the story begins. And yet, for something so fundamental, getting access to market data as an individual developer has historically been ... painful.</p><p>That&#8217;s exactly why I&#8217;m excited to announce that <strong>DefconQ</strong> and <strong><a href="https://databento.com/">Databento</a></strong> are teaming up for an upcoming <strong>Meetup in London</strong>, a community event for quants, financial engineers, developers, and anyone working with market data who wants to see what happens when market data stops being a headache and starts becoming something you can actually work with.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!FBb6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!FBb6!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png 424w, /__u/substackcdn.com/image/fetch/$s_!FBb6!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png 848w, /__u/substackcdn.com/image/fetch/$s_!FBb6!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png 1272w, /__u/substackcdn.com/image/fetch/$s_!FBb6!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!FBb6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png" width="1402" height="1122" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1122,&quot;width&quot;:1402,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2839158,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/201109797?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!FBb6!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png 424w, /__u/substackcdn.com/image/fetch/$s_!FBb6!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png 848w, /__u/substackcdn.com/image/fetch/$s_!FBb6!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png 1272w, /__u/substackcdn.com/image/fetch/$s_!FBb6!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4132a5d-f433-4314-9cdb-ec844bb1d265_1402x1122.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Who Is Databento?</h2><p>If you haven&#8217;t come across Databento yet, chances are you will. Databento recently celebrated its third anniversary, and in a remarkably short time has established itself as one of the most exciting and fastest-growing players in the market data space. The company was built around one core idea: creating modern market data infrastructure capable of serving some of the world&#8217;s leading trading firms while still remaining accessible to individual developers, researchers, startups, and smaller teams.</p><p>And clearly, that vision resonated.</p><p>Today, Databento serves more than 40,000 users and powers firms representing hundreds of billions in AUM, alongside products spanning fintech, AI, quantitative research, and trading infrastructure. What makes Databento particularly refreshing is that it genuinely feels like it was built by engineers who have personally suffered through the pain of traditional market data providers before.</p><p>Because they have.</p><p>Historically, market data has often felt like it was built for procurement teams, lawyers, and infrastructure departments first ... and developers somewhere near the bottom of the priority list. Complicated onboarding. Opaque pricing. Questionable APIs. Documentation that feels like it was written during the Cold War. Strange licensing restrictions. Integration projects that somehow become multi-week engineering exercises.</p><p>Databento flipped that script.</p><p>Their platform makes it possible to access historical and real-time market data through a clean, well-documented API, without the usual layers of friction many developers have simply accepted as &#8220;part of the process.&#8221; Fast access. Transparent pricing. Modern tooling. Excellent documentation.</p><p>It sounds simple, but anyone who has integrated market data providers before knows this is absolutely not a given.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>The Founders Behind It</h2><p>Databento was founded by people who clearly understand both the technical and commercial realities of market data because they lived through them themselves while working inside the industry.</p><p>At the top is <a href="https://www.linkedin.com/in/christinaqi/">Christina Qi</a>, alongside <a href="https://www.linkedin.com/in/linl/">Luca Lin</a> and <a href="https://www.linkedin.com/in/renan-gemignani/">Renan Gemignani</a>. Together with the broader core team, they bring experience from prestigious hedge funds, quantitative trading firms, and high-performance financial infrastructure environments where market data is not just important, it is mission critical.</p><p>And honestly, I think that experience is exactly why the product feels different.</p><p>This wasn&#8217;t built by people theorising about market data problems from the outside. It was built by engineers and quants who were tired of dealing with bad market data vendors themselves. The frustrations that many of us have simply learned to tolerate, painful integrations, poor tooling, strange workflows, slow onboarding, became the motivation for building something better.</p><p>And perhaps that&#8217;s what stood out to me most when I met Christina and the Databento team in London: they genuinely understand the problems developers and engineers face because they&#8217;ve been on the receiving end of them.</p><p>That combination of technical depth, practical thinking, and building from real-world frustration tends to produce very good products.</p><h2>How We Got Here</h2><p>This meetup actually started with a DefconQ tutorial. A while ago, I wrote my real-time stock market tutorial, walking readers through how to stream live data into a KDB/Q stack. Initially, I used Yahoo Finance to pull market data because, well ... it was free and it worked. Until it didn&#8217;t.</p><p>Anyone who has ever used Yahoo Finance for anything even remotely serious knows what happens next: you request a little too much data and suddenly the door gets slammed shut. That was a problem. I wanted to create something realistic for DefconQ readers, something that actually resembled how a production-style system works. But I also wasn&#8217;t exactly sitting on a Bloomberg budget to pay for a full real-time market data feed just to support a tutorial.</p><p>That&#8217;s when I came across Databento. The free credits they provide were exactly what I needed to make the tutorial happen.</p><p>Now, I&#8217;ll be honest: my expectations were cautiously optimistic.</p><p>Because integrating market data providers can be painful. Documentation gaps, weird APIs, unexpected licensing complexity, strange authentication workflows, if you&#8217;ve done it before, you know.</p><p>So I mentally blocked off some time for &#8220;integration pain.&#8221; And then something strange happened: There wasn&#8217;t any.</p><p>Thanks to the excellent documentation and a genuinely easy-to-use API, I managed to integrate Databento into the tutorial in a single evening, while my wife was at a Beyonc&#233; concert.</p><p>That might sound like a silly benchmark, but trust me: in market data integration time, that&#8217;s lightning fast.</p><h2>From Tutorial to Meetup</h2><p>The tutorial went on to become one of DefconQ&#8217;s more popular hands-on walkthroughs, and to my surprise, Christina herself featured it. That eventually led to me meeting Christina and the Databento team at a London meetup, and if you&#8217;ve ever wondered whether technical people can also be genuinely fun people, the answer is yes.</p><p>Now they&#8217;re back in town.</p><p>And this time, we&#8217;re hosting something together.</p><h2>Why You Should Attend</h2><p>This meetup is not just another fintech networking event where everyone pretends to enjoy warm white wine and vague conversations about &#8220;innovation.&#8221; This is a real community event for people who actually work with data.</p><p>If you are a:</p><ul><li><p>Quant</p></li><li><p>Financial Engineer</p></li><li><p>Market Data Engineer</p></li><li><p>KDB/Q Developer</p></li><li><p>or anyone building systems that depend on fast, reliable market data ...</p></li></ul><p>... this is genuinely worth attending.</p><p>You&#8217;ll get the opportunity to learn directly from the Databento team, understand how their platform works, ask technical questions, and see why accessing market data has become dramatically easier than it used to be.</p><p>And perhaps just as importantly, you&#8217;ll meet others in the DefconQ community who care about the same problems you do, architecture, infrastructure, data engineering, market data, production systems, and all the weird little things that only people in this niche get excited about.</p><p>There will be conversations, technical discussions, networking, and plenty of opportunities to ask the questions you don&#8217;t usually get to ask.</p><p>Because at the end of the day, market data is where many of our systems begin.</p><p>And if someone makes that easier for developers, it&#8217;s worth paying attention.</p><p>See you there.</p><p><strong>The Details</strong>:</p><p><strong>When</strong>: Wednesday, July 1st 2026 <br><strong>Where</strong>: Hedosophia, 2 Soho Place, London W1D 3BG <br><strong>Sign Up Link</strong>: <a href="https://luma.com/p22b7ff3">here</a></p><p><strong>IMPORTANT</strong>: This event is expected to reach capacity, so sign up as soon as possible. If you can no longer attend, please cancel your registration to free up your spot for someone else.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ma9u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ma9u!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!ma9u!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!ma9u!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ma9u!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ma9u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2735238,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/201109797?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ma9u!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!ma9u!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!ma9u!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ma9u!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49fe3a33-7b20-4349-b0bc-fc49df5ea241_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/defconq.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[The Weekly Q Rumble - Sharpen Your KDB/Q Skills, One Challenge at a Time]]></title><description><![CDATA[A Little Bit of Fun Never Hurt a Q Developer]]></description><link>https://defconq.substack.com/p/the-weekly-q-rumble-sharpen-your</link><guid isPermaLink="false">https://defconq.substack.com/p/the-weekly-q-rumble-sharpen-your</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Wed, 27 May 2026 07:01:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!EwIv!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60327a05-982e-4b91-9d8d-f067d5795035_1080x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s be honest: <strong>learning KDB/Q</strong> can sometimes feel like going to the gym. You know it&#8217;s <em>good for you</em>. You know you <em>should keep practicing.</em> But after a long day of <strong>debugging</strong> code, fighting with <code>type</code> errors, and wondering why your function suddenly returned a rank error, the last thing you want is to sit down and read another page of documentation.</p><p>That&#8217;s exactly why we&#8217;re launching the <strong>DefconQ Weekly KDB/Q Challenge.</strong></p><p>The idea is <strong>simple</strong>: have a bit of fun, keep your Q brain sharp, and <strong>improve your KDB/Q skills</strong> on the side, without it feeling like homework. Every week, a new KDB/Q challenge will be posted on the <strong><a href="https://discord.gg/98BbB9HdV">DefconQ Community Discord Server</a></strong>, and everyone is invited to participate.</p><h2>What Is the Weekly KDB/Q Challenge?</h2><p>Think of it as your weekly <code>Q workout</code>. Each week, we will post a brand-new challenge designed to test your KDB/Q skills, your vector thinking, your creativity, and occasionally your patience.</p><p>Some challenges will be quick and fun. Others might make you stare at your screen for an hour questioning your life choices. That&#8217;s part of the experience. The difficulty will vary from week to week, meaning there will be something for everyone, from complete <strong>Qbies</strong> taking their first steps in <code>Q</code>, to seasoned <strong>KDB/Q developers</strong> looking for a challenge worthy of their ego.</p><p>And the best part?</p><p>There&#8217;s usually more than one way to solve a problem in Q.</p><p>That means the real fun often starts <em><strong>after</strong></em> the challenge, when the community begins comparing solutions, debating elegance versus performance, and collectively admiring (or questioning) the weird genius of some of the answers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Why Are We Doing This</h2><p><strong>DefconQ</strong> has always been about making KDB/Q easier to learn and more enjoyable to work with. But the truth is, reading tutorials and watching walkthroughs will only take you so far. At some point, you need to get your hands dirty. You need to write code. Break things. Try ideas. Compare solutions. Learn from others. That&#8217;s where the <strong>Weekly Challenge</strong> comes in. It creates a fun, low-pressure way to keep practicing regularly while exposing yourself to different types of problems and different styles of thinking.</p><p>Because one of the best ways to improve in Q is to see how someone else solved the same problem in a completely different, and often much more elegant, way. And let&#8217;s be honest: Q developers are a competitive bunch. So why not turn learning into a bit of a friendly battle?</p><h2>Hosted on the DefconQ Community Discord Server</h2><p>All challenges will be hosted on the <strong>DefconQ Community Discord Server</strong>, where participants can submit solutions, discuss approaches, compare ideas, and occasionally argue over whether one-liners are elegant or just deeply irresponsible. However, this isn&#8217;t about <em>winning</em> in the traditinal sense. It&#8217;s about</p><ul><li><p>Improving your skills, while</p></li><li><p>learning from others, while</p></li><li><p>seing new techniques</p></li><li><p>and having some fun with the community along the way.</p></li></ul><p>Of course, a little bragging rights never hurt either.</p><h2>Ready To Rumble?</h2><p>Whether you are a beginner trying to build confidence, an intermediate developer looking to sharpen your skills, or an experienced Q wizard who thinks nobody can out-vector you, the <strong>DefconQ Weekly KDB/Q Challenge</strong> is for you.</p><p>A new challenge. Every week. Different levels of difficulty. Community discussion. Multiple solutions. Plenty of learning. And perhaps the occasional reminder that Q can still humble all of us.</p><p>Come join the <strong>DefconQ Community Discord Server</strong>, take on the challenge, and let&#8217;s see what you&#8217;ve got.</p><p><strong>DefconQ Community Discord Server</strong> invite link <a href="https://discord.gg/98BbB9HdV">here</a></p><p>Happy coding.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/defconq.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[DefconQ Community Discord Server]]></title><description><![CDATA[Where KDB/Q Minds Meet, Build, and Level Up Together]]></description><link>https://defconq.substack.com/p/defconq-community-discord-server</link><guid isPermaLink="false">https://defconq.substack.com/p/defconq-community-discord-server</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Wed, 20 May 2026 07:45:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ew6s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The <strong>DefconQ Community Server</strong> is officially live. Over the last few years, DefconQ has grown from a simple technical blog into something much bigger: a growing <strong>community</strong> of KDB/Q developers, engineers, quants, and vector programming enthusiasts who genuinely care about learning, building, and pushing the ecosystem forward. Launching a dedicated community server felt like the natural next step.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ew6s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ew6s!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!ew6s!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!ew6s!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!ew6s!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ew6s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:435537,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/198472779?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ew6s!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!ew6s!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!ew6s!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!ew6s!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7efab00f-8e44-4137-9ac1-8384f154df96_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The goal is simple. We want to create a place where people can:</p><ul><li><p>exchange ideas</p></li><li><p>share best practices</p></li><li><p>ask questions without feeling intimidated</p></li><li><p>discuss architecture and production systems</p></li><li><p>collaborate on projects</p></li><li><p>and ultimately learn from each other</p></li></ul><p>And importantly: this is <strong>not</strong> intended to become just another forum about KDB/Q.</p><p>The DefconQ server is designed to be a genuine community space: <strong>independent, objective, and driven by the people participating in it</strong>. No consultancy agenda. No hidden sales pitch. No &#8220;our framework solves everything&#8221; marketing. Just developers helping developers and people passionate about vector programming sharing knowledge.</p><p>Whether you are:</p><ul><li><p>completely new to q</p></li><li><p>building your first tickerplant</p></li><li><p>debugging IPC at 2AM</p></li><li><p>designing distributed architectures</p></li><li><p>or debating whether everything should really be a list</p></li></ul><p>...there will be a place for you.</p><p>The server will include dedicated channels for:</p><ul><li><p>KDB/Q help</p></li><li><p>architecture discussions</p></li><li><p>performance tuning</p></li><li><p>KDB-X modules</p></li><li><p>code reviews</p></li><li><p>learning resources</p></li><li><p>and community projects</p></li></ul><p>Over time, the goal is to grow this into one of the strongest independent KDB/Q communities out there, a place where knowledge is shared openly and where people can genuinely level up together. So if that sounds like your kind of place, come join us.</p><p>Join the DefconQ Community Discord Server <a href="https://discord.gg/wKVdH6xrW">here</a></p><p>Happy chatting and Happy coding.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/defconq.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[DefconQ at Iverson College]]></title><description><![CDATA[The Return to Milden Hall]]></description><link>https://defconq.substack.com/p/defconq-at-iverson-college</link><guid isPermaLink="false">https://defconq.substack.com/p/defconq-at-iverson-college</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Mon, 11 May 2026 10:26:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xTHo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve been around the KDB/Q ecosystem for a while, chances are you&#8217;ve come across the legendary Iverson College. Founded by former KX Librarian Stephen Taylor in honour of Kenneth E. Iverson, the inventor of APL, the college has been running since 2011. After a brief hiatus between 2018 and 2023, it made a strong return in 2024. This year DefconQ joins forces with Stephen to reconvene the College at one of its favourite venues: Milden Hall.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!xTHo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!xTHo!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!xTHo!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!xTHo!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!xTHo!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!xTHo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:544499,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/197197007?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!xTHo!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!xTHo!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!xTHo!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!xTHo!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cae8461-83aa-4676-8bfd-2ccee256d3ad_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>While previous meetings spanned a range of Iversonian programming languages, this year&#8217;s meeting will be entirely on KDB/Q. That said, the principles and concepts explored remain broadly applicable across the wider family of vector languages, with future meetings set to expand again.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Iverson College is half conference, half house party. There&#8217;s no rigid agenda, no back-to-back slide decks, and no passive audience. The participants <em>are</em> the programme. It&#8217;s a collaborative, immersive environment where ideas are shared, challenged, and built upon in real time. Inspired by the ethos outlined in the college&#8217;s foundations, the focus is on deep learning through interaction, not presentation. Even though there will be no pre-set agenda, there will be a handful of presentations, knowledge-sharing sessions, and story times from some of the most experienced voices in the industry. We shall bring together some of the smartest, most experienced kdb developers.</p><p>With the recent release of KDB-X and the introduction of modules, this year&#8217;s meeting of the College will centre around building the modules the community actually needs. And we won&#8217;t just talk about them, we&#8217;ll start implementing them. The goal is to lay the groundwork for a shared, community-driven codebase that can be reused and extended in real production environments.</p><p>The setting for all of this is Milden Hall, a Tudor barn in Suffolk that has hosted some of the college&#8217;s most memorable meetings. It&#8217;s a unique workspace that fosters the kind of close collaboration and focused work the event is known for. The ticket price of &#163;1300 includes meals (we bring our own chefs) and hostel-level accommodation, ensuring everyone can fully immerse themselves in the experience without distraction. Places are strictly limited to just 20 attendees, keeping the environment intimate, focused, and highly interactive.</p><p><strong>When</strong>: 6 - 10 September, 2026 <br><strong>Where</strong>: <a href="https://www.thehall-milden.co.uk/">Milden Hall, Suffolk</a><br><strong>Price</strong>: 1300&#163; <br><strong>Signup here</strong>: You can secure your ticket by sending an email to <a href="mailto:dean@iversoncollege.com">dean@iversoncollege.com</a> and we will send you the payment instructions</p><p>Some impressions of the 2024 edition of the Iverson College in Cambridge, captured by <a href="https://www.mikiy.com/">Miki Yamanouchi</a>, a London based photographer and film maker.</p><div id="youtube2-w-MyzJLHfmc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;w-MyzJLHfmc&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/w-MyzJLHfmc?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>You can learn more about Iverson College and explore previous editions <a href="https://iversoncollege.com/">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[KDB-X Modules: The Building Blocks to KDB/Q Excellence]]></title><description><![CDATA[Stack It. Scale It. Master It.]]></description><link>https://defconq.substack.com/p/kdb-x-modules-the-building-blocks</link><guid isPermaLink="false">https://defconq.substack.com/p/kdb-x-modules-the-building-blocks</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Thu, 02 Apr 2026 10:55:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Nq_5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve spent any time building KDB/Q systems, or if you&#8217;re just starting out, chances are the codebase you&#8217;re working on didn&#8217;t start as a &#8220;system.&#8221; It started as a script. Then another script. Then a helper function. Then a quick fix. And before you know it, you&#8217;re sitting on a tangled web of logic where everything works, but no one is entirely sure why.</p><p><strong>KDB-X modules</strong> are designed to change that.</p><h2>What are KDB-X modules</h2><p>At a high level, modules introduce a structured way of packaging logic into <strong>self-contained, reusable components</strong>. Instead of throwing functions into a shared global namespace and hoping nothing collides, each module lives in its own isolated space. It decides what to expose, what to keep private, and how it should be consumed. This might sound like a small shift, but in practice, it&#8217;s a fundamental upgrade in how you design and reason about your systems.</p><p>What makes this particularly powerful is the consistency the module framework brings. There is now a standardised way to define, load, and interact with components. You no longer have to guess where something is defined or how it should be used, the structure enforces clarity. Over time, this reduces cognitive load, improves maintainability, and makes collaboration far less painful.</p><p>The real value, however, shows up when your codebase starts to grow.</p><h2>Why you should be using KDB-X modules</h2><p>Modularity is not just a <strong>&#8220;nice to have&#8221;</strong>, it&#8217;s what separates scripts from systems. When code is modular, it becomes easier to isolate functionality, reason about behaviour, and make changes without unintended side effects. You&#8217;re no longer editing a monolithic block of logic; you&#8217;re working with well-defined building blocks that can evolve independently.</p><p>This naturally leads to reusability. Instead of rewriting the same utilities across projects, <em>logging, data ingestion, query handling, connectivity</em>, you encapsulate them once as modules and reuse them wherever needed. The same component can be loaded into multiple processes, shared across teams, or even reused across entirely different systems. Over time, this compounds into a significant productivity gain. You spend less time rewriting and more time building.</p><p>And then comes scalability, not just in terms of performance, but in terms of architecture.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/defconq.substack.com/subscribe"><span>Subscribe now</span></a></p><p>As systems grow, complexity doesn&#8217;t increase linearly. It explodes. Without structure, even small changes can have unpredictable consequences. Modules provide a way to contain that complexity. New functionality can be introduced as new modules, existing ones can be extended or replaced, and the overall system remains stable because the interfaces between components are clearly defined. You&#8217;re effectively building a system that is designed to evolve.</p><p>A useful way to think about this is through a slightly nostalgic analogy.</p><p>Remember building Lego sets as a kid. At first, you followed the instructions. Step by step, piece by piece, until you had exactly what was on the box. It was satisfying, but also a bit limiting. The real fun began when you stopped following the instructions. When you took pieces from different sets, combined them, and started building something entirely your own.</p><p><strong>KDB-X modules</strong> are those Lego pieces.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Nq_5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Nq_5!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Nq_5!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Nq_5!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Nq_5!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Nq_5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic" width="1121" height="1402" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1402,&quot;width&quot;:1121,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:303850,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/192944823?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Nq_5!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Nq_5!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Nq_5!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Nq_5!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a338a4-306f-4007-ba98-26a39293c5e5_1121x1402.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Each module represents a building block, a piece of functionality that does one thing well. On their own, they&#8217;re useful. But the real power comes from how you combine them. You can stack them, extend them, swap them out, or integrate them into larger systems. You&#8217;re no longer constrained by a predefined structure; you&#8217;re designing your own.</p><p>And that&#8217;s the key shift.</p><p>You move from asking, <em><strong>&#8220;How do I write this function?&#8221;</strong></em> to <em><strong>&#8220;How do I design this component?&#8221;</strong></em> From <em><strong>&#8220;Where do I put this code?&#8221;</strong></em> to <em><strong>&#8220;How does this fit into the system?&#8221;</strong></em>. It&#8217;s a transition from writing code that works today to building architecture that will still make sense tomorrow.</p><p>KDB-X modules don&#8217;t just give you a cleaner way to organise your code. They push you toward better engineering practices. They encourage you to think in terms of boundaries, interfaces, and responsibilities. They make reuse the default rather than an afterthought. And most importantly, they give you the tools to scale, not just your systems, but the way you build them.</p><p>Because in the end, the difference between a fragile codebase and a robust system isn&#8217;t how clever the code is. It&#8217;s how well it&#8217;s put together.</p><h2>How to create a module</h2><p>Now that we&#8217;ve covered the <em>what</em> and the <em>why</em>, let&#8217;s look at something more practical, the <em>how</em>. <strong>How do you actually create a KDB-X module?</strong> The requirements are refreshingly simple. To define a module, all you need is a variable called <code>export</code>. This variable contains a dictionary that represents the public interface of your module, in other words, the functions (or values) you explicitly want to expose to the outside world.</p><p>Let&#8217;s pause for a moment and walk through a concrete example.</p><pre><code><code>// /Users/alexanderunterrainer/.kx/mod/foo/init.q
export:([f:{x+1};g:{x*2}])</code></code></pre><p>This defines a module with two functions, <code>f</code> and <code>g</code>. That&#8217;s it. No boilerplate, no ceremony, just a clean declaration of what your module provides.</p><p>To make this module usable, you place it on the search path (more details on how to use an appropriate file structure can be found on the official documentation <a href="https://code.kx.com/kdb-x/modules/module-framework/quickstart.html#search-path">here</a>). Once it&#8217;s in place, you can load it using the <code>use</code> function:</p><pre><code><code>alexanderunterrainer@Mac:~/.kx/mod/foo|&#8658;  pwd
/Users/alexanderunterrainer/.kx/mod/foo
alexanderunterrainer@Mac:~/.kx/mod/foo|&#8658;  ls
init.q
alexanderunterrainer@Mac:~/.kx/mod/foo|&#8658;  q
KDB-X 5.0 2026.01.22 Copyright (C) 1993-2026 Kx Systems
q)foo:use`foo
q)foo
f| {x+1}
g| {x*2}
q)foo.f
{x+1}
q)foo.g
{x*2}
q)foo.f 3
4
q)foo.g 5
10</code></code></pre><p>When you call use, it loads the module and returns its <code>export</code> dictionary. This allows you to assign the module to a variable, in this case <code>foo</code>, and access its functions in a structured and predictable way.</p><p>Simple as it looks, this pattern is incredibly powerful. You&#8217;ve just defined a reusable, self-contained component with a clear interface, a building block that can now be plugged into larger systems, shared across projects, or extended over time.</p><h3>The <code>export</code> variable</h3><p>As we have already seen, the <code>export</code> variable is essentially a dictionary that defines the public interface of a module, the functions and values you explicitly expose to the user:</p><pre><code><code>export:([f:{x+1};g:{x*2}])</code></code></pre><p>You can keep variables and functions private, meaning they are only accessible within the module itself, simply by <strong>not</strong> including them in the <code>export</code> dictionary. Let&#8217;s see how this works in practice.</p><pre><code><code>// /Users/alexanderunterrainer/.kx/mod/foo/init.q
privateVar:100;
publicVar:`HelloWorld
privateFunc:{show publicVar}
publicFunc:{show privateVar}

export:([f:{x+1};g:{x*2};publicVar;publicFunc])</code></code></pre><p>When loading the module, we can observe the following:</p><pre><code><code>q)myNameSpace:use`foo
q)myNameSpace
f         | {x+1}
g         | {x*2}
publicVar | `HelloWorld
publicFunc| {show privateVar}
q)myNameSpace.publicFunc
{show privateVar}
q)myNameSpace.publicFunc[]
100</code></code></pre><p>However, there is an important nuance when it comes to variables. While you can include variables in the <code>export</code> dictionary, they are exposed as <strong>copies</strong>, not references. This means any modification on the user side won&#8217;t affect the internal state of the module. To properly expose and control access to internal variables, the recommended approach is to provide <strong>getter and setter functions</strong>.</p><p>This becomes evident when you try to modify the private variable <code>privateVar</code> by overwriting it.</p><pre><code><code>q)myNameSpace.privateVar:1000000
q)myNameSpace
f         | {x+1}
g         | {x*2}
publicVar | `HelloWorld
publicFunc| {show privateVar}
privateVar| 1000000
q)myNameSpace.publicFunc[]
100</code></code></pre><p>As shown, this doesn&#8217;t actually change the original variable inside the module, instead, it creates a new variable in the user&#8217;s namespace. Meanwhile, the original value defined within the module remains intact and continues to be used by the public function <code>publicFunc</code>.</p><p>To properly update the value of <code>privateVar</code>, we need to expose controlled access. Let&#8217;s add a public setter function that allows us to modify the internal state of the module.</p><pre><code><code>// /Users/alexanderunterrainer/.kx/mod/foo/init.q
privateVar:100;
publicVar:`HelloWorld
privateFunc:{show publicVar}
publicFunc:{show privateVar}
setPrivateVar:{privateVar:x}
export:([f:{x+1};g:{x*2};publicVar;publicFunc;setPrivateVar])</code></code></pre><p>We can now restart our KDB/Q process and reload the module.</p><pre><code><code>q)myNameSpace:use`foo
q)myNameSpace
f            | {x+1}
g            | {x*2}
publicVar    | `HelloWorld
publicFunc   | {show privateVar}
setPrivateVar| {privateVar:x}
q)myNameSpace.setPrivateVar[1000]
1000
q)myNameSpace.publicFunc
{show privateVar}
q)myNameSpace.publicFunc[]
100</code></code></pre><p>Somewhat unexpectedly, the private variable wasn&#8217;t updated by our setter function when using the assign operator <code>:</code>. Let&#8217;s try again, this time using the <code>set</code> operator and referencing the variable name directly.</p><pre><code><code>// /Users/alexanderunterrainer/.kx/mod/foo/init.q
privateVar:100;
publicVar:`HelloWorld
privateFunc:{show publicVar}
publicFunc:{show privateVar}
setPrivateVar:{`privateVar set x}
export:([f:{x+1};g:{x*2};publicVar;publicFunc;setPrivateVar])</code></code></pre><p>Once again we restart our KDB/Q process and load the module</p><pre><code><code>q)myNameSpace:use`foo
q)myNameSpace
f            | {x+1}
g            | {x*2}
publicVar    | `HelloWorld
publicFunc   | {show privateVar}
setPrivateVar| {`privateVar set x}
q)myNameSpace.setPrivateVar[1000]
`privateVar
q)myNameSpace.publicFunc[]
100
q)privateVar
1000</code></code></pre><p>To our surprise, the result still isn&#8217;t what we expected. Rather than updating the private variable inside the module, the <code>set</code> operator ends up creating a new global variable, definitely not the outcome we were aiming for. To understand why, we need to take a closer look at the official <a href="https://code.kx.com/kdb-x/modules/module-framework/quickstart.html">KDB-X module documentation</a>. There, we find an important detail: when assigning to globals from within functions, the standard assignment operator <code>:</code> must be replaced with the double-colon <code>::</code> operator to ensure the variable is treated as global rather than local.</p><p>Once we make that change, the behaviour aligns with our expectations, the private variable inside the module is correctly updated.</p><pre><code><code>// /Users/alexanderunterrainer/.kx/mod/foo/init.q
privateVar:100;
publicVar:`HelloWorld
privateFunc:{show publicVar}
publicFunc:{show privateVar}
setPrivateVar:{privateVar::x}
export:([f:{x+1};g:{x*2};publicVar;publicFunc;setPrivateVar])</code></code></pre><p>After restarting our KDB/Q session and loading the module one final time</p><pre><code><code>q)myNameSpace:use`foo
q)myNameSpace
f            | {x+1}
g            | {x*2}
publicVar    | `HelloWorld
publicFunc   | {show privateVar}
setPrivateVar| {privateVar::x}
q)myNameSpace.publicFunc[]
100
q)myNameSpace.setPrivateVar[1000]
q)myNameSpace.publicFunc[]
1000</code></code></pre><p>That&#8217;s it, we made it. You should now have a solid foundation in KDB-X modules and be ready to build and assemble your own KDB/Q Lego pieces... and maybe even your battleship.</p><h2>Tips and Tricks</h2><p>As you&#8217;ve probably noticed, we had to restart and reload our KDB/Q process quite frequently while building the final module, not exactly the most enjoyable workflow. Fortunately, <a href="https://kx.com/">KX</a> anticipated this and introduced a <code>reuse</code> function that allows you to reload a module without restarting the entire process.</p><p>While this functionality isn&#8217;t officially documented yet, you can find it in the <code>.Q.m</code> namespace, the dedicated namespace for everything module-related.</p><pre><code><code>q).Q.m
     | ::
M    | (+`p`s!(("";"/Users/alexanderunterrainer/.kx/mod/foo");``))!+(,`m)!,``.m.foo
dp   | k){"/"\:x}
pd   | k){"/"/:x}
pe   | k){y,/:x}[(".k";".q";".k_";".q_";".ma64.so")]
p1   | k){x@*&amp;0&lt;#:'!:'`$":",'x}
pl   | k){,/{pd'(,y),/:,/((-1_x),/:,:'pe[:/x];x,/:,:'pe["init"])}[$y]'x}
ld   | k){S:(,`)!,(::);g:{.[`/:x,y;();:;z]}d:."\\d";$[|/x like/:-1 0_\:"*.?_";[."\\l ",x;$[99h=@e:$[`export in !d;d`export;'"no export: ",x];$[@. e;g[`export]e:S,e;e];g[`export]S,e y]]
 [x:`$|(1+x?".")_x:|x;g[`export]S,r:(@[x 2:;(`kexport;..
ef   | k){e0:."\\e";r:@[{."\\e 1";(0b;x y)}x;y;{(1b;x)}];@[{."\\e ",$x};e0;::];r}
ch   | k){[m;p;s;z;a];d0:."\\d";m0:-200!0;p0:-201!0;-200!m1:`$1_$m;-201!p;."\\d .",$m1;M[(p;s)]:([m:`:]);r:ef[z;a];M::([],p;,s)_ M;."\\d ",$d0;-200!m0;-201!p0;r}
dl   | k){$[(:/d:dp x)like"init.*";pd (-1_d);x]}
up   | k){[m;x;a]([p;s:`]):M?([m]);if[~^u:M[(p;x)]`m;$[u~`:;'`cycle;:u]];r:ch[m;p;x;m[`provide] .;(x;a)];:[r;(0b;r);[M[(p;x)]:([m:r]);r];(1b;r);'r]}
mn   | k){a:1_(),x;x:x0:*x;if[1&lt;#b:":"\:$x;:up[mn`$*b;(`$":"/:1_b);a]];n:$[j:+/&amp;\^x:`\:x;[x:j_x;{`/:`,$[0&lt;l:1+x-(#y:`\:y);`m,`$($l);(-x)_y]}[j-1;-200!0]];`.m]
 if[~#l:p1 ll:pl[$[j;,{$[~#x;,".";x]}pd {y:((,".")~*y)_y;$[0&lt;l:x-#y;l#,"..";(-x)..
mp   | k){([p]):M?([m:mn x]);p}
reuse| k){r:ch[m:mn x;p;`;ld[p1 $[(:/dp p:mp x)like"*.*";,p;p,/:pe["/init"]]];1_(),x];:[r;(0b;r);[M[(p;`)]:([m]);m];(1b;r);'r];use x}
fp   | k){$[$[99h=@y;11h=@!y;0];(`/:'x,/:!y).z.s'y;(100h=t)|((103h&lt;t)&amp;(t&lt;112h))|$[112h=t:@y;"code"~$y;0b];x . ();y]}
use  | k){. `/:mn[x],`export}
SP   | ,"/Users/alexanderunterrainer/.kx/mod"</code></code></pre><h2>Final Thoughts</h2><p>KDB-X modules are more than just a new feature, they&#8217;re a powerful shift in how you build, structure, and scale kdb+/q systems. By embracing modularity, you move from writing scattered scripts to designing clean, reusable building blocks that grow with your architecture. The real value comes when you start creating your own modules, combining them, and shaping systems that are truly yours. So don&#8217;t just read about it, start building, experiment, and turn your ideas into components you can stack, scale, and evolve.</p><p>Happy Coding!</p><h2>Resources</h2><p><a href="https://code.kx.com/kdb-x/modules/module-index.html">Offical KX Modules Overview</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[DefconQ x Squarepoint - Networking Event]]></title><description><![CDATA[The DefconQ Events are back, and this time, we&#8217;re taking over The Globe. Well...the Globe at Moorgate.]]></description><link>https://defconq.substack.com/p/defconq-x-squarepoint-networking</link><guid isPermaLink="false">https://defconq.substack.com/p/defconq-x-squarepoint-networking</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Mon, 02 Mar 2026 16:50:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Lrk8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The <strong>DefconQ Events</strong> are back, and this time, we&#8217;re taking over <strong>The Globe</strong>. Well...the Globe at Moorgate.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Lrk8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Lrk8!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Lrk8!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Lrk8!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Lrk8!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Lrk8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:457444,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/189670779?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Lrk8!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Lrk8!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Lrk8!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Lrk8!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891e7091-8504-40a3-a25e-82095761bf29_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I am excited to share that <strong>DefconQ x <a href="https://www.squarepoint-capital.com/">Squarepoint</a></strong> are joining forces to invite all KDB/Q developers, engineers, and enthusiasts to a community get together and networking event in the heart of London.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>And this one is going to be special, for two big reasons:</p><p><strong>First</strong>: With the backing of Squarepoint, one of the largest KDB/Q users on the street and a firm operating at the forefront of quantitative trading and large-scale data engineering, you will get the chance to connect with some of the strongest KDB/Q minds in the industry.</p><p><strong>Second (and even better):</strong> Squarepoint&#8217;s recruiters will be there in person, ready to chat about open roles across engineering, quantitative research, and infrastructure. If you&#8217;ve ever wondered what it really takes to build, scale, and operate KDB/Q systems in a top-tier quant environment, this is your chance to ask the people doing it.</p><p>Opportunities like this don&#8217;t come around every day, we hope you won&#8217;t miss it. Light refreshments will be provided.</p><h2>What to Expect</h2><ul><li><p>Welcoming talk by Squarepoint</p></li><li><p>Informal networking with the DefconQ community</p></li><li><p>Deep technical conversations about KDB/Q in production</p></li><li><p>Insight into how leading hedge funds leverage time-series architecture</p></li><li><p>Direct access to recruiters hiring for real, impactful roles</p></li></ul><p>See you at the Globe.</p><p><strong>When</strong>: Wednesday, 18th March, from 18:00 <br><strong>Where</strong>: <a href="https://maps.app.goo.gl/cqPCsmKix7q6L3Ci6">The Globe, Moorgate</a><br><strong>Signup here</strong>: <a href="https://www.eventbrite.com/e/defconq-x-squarepoint-networking-event-tickets-1984052730125?aff=oddtdtcreator">Event Signup</a></p><h2>About Squarepoint</h2><p>Squarepoint is a privately held firm led by its four founding partners across seventeen cities around the world. The business dates back to 2000 and has evolved through Lehman Brothers and Barclays before becoming independent in December 2014.</p><p>We are committed to developing a world-class quantitative investment platform through our systematic, diversified approach. At Squarepoint, collaboration occurs across all teams, sharing investment ideas and promoting a culture of ownership and accountability. We pride ourselves on our deep expertise across Quantitative Investment Management, Technology and Trading Operations.</p><p>You can read more about Squarepoint <a href="https://squarepoint-capital.com/about">here...</a></p><h2>Open Roles at Squarepoint</h2><p>Squarepoint&#8217;s success comes down to its people. <a href="https://squarepoint-capital.com/careers">Open Roles at Squarepoint</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Building the Bouncer: A Hands-On Guide to Implementing a KDB/Q Gateway from Scratch]]></title><description><![CDATA[From Zero to Gatekeeper: Designing, Coding, and Wiring a Production-Ready KDB/Q Gateway]]></description><link>https://defconq.substack.com/p/building-the-bouncer-a-hands-on-guide</link><guid isPermaLink="false">https://defconq.substack.com/p/building-the-bouncer-a-hands-on-guide</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Mon, 16 Feb 2026 11:55:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pKzT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This tutorial picks up right where the <strong>Gateway Architecture Design</strong> post left off, taking the next step: turning theory into working code. In the previous post, we looked at the gateway as the <a href="https://www.defconq.tech/docs/architecture/gateway">The Bouncer at the Front Door of Your KDB/Q Stack</a>, deciding who gets in, where queries go, and how the system behaves under load. In other terms: handling routing, access control, load balancing, aggregation, and shielding backend services from unnecessary complexity. In this hands-on tutorial, we will take those concepts and turn them into something concrete by building a gateway <strong>step by step, from scratch</strong>. If any of the architectural concepts are still a little hazy, take a quick detour back to the architecture post <a href="https://www.defconq.tech/docs/architecture/gateway">here</a>, this walkthrough assumes you know <em><strong>why</strong></em> the gateway exists and focuses on <em><strong>how</strong></em> to make it real.</p><h2>From Blank Slate to Gateway: What We&#8217;re About to Build</h2><p>In the following sections we will build the core pieces of a <strong>scalable query routing framework</strong> inspired by the <strong><a href="https://code.kx.com/q/wp/query-routing/">Query Routing</a></strong> from <a href="https://kx.com/">KX</a> white paper, written by <a href="https://www.linkedin.com/in/kevin-holsgrove-2b191158/">Kevin Holsgrove</a>. The goal is to illustrate a practical, production-ready pattern where multiple processes coordinate to handle user queries efficiently in a distributed KDB/Q system.</p><p>But before we dive into the technical implementation of the framework, let&#8217;s take a brief step back and look at the system from a higher-level perspective, focusing on the processes we&#8217;re about to build and how they fit together. At the center of our design are three key players:</p><ul><li><p><strong>Gateway</strong>: This process sits at the edge of your system, accepts client requests, annotates them with a unique sequence identifier, and hands them off for routing. Each incoming query is captured in an internal table, tagged with a unique sequence number, and linked back to the client&#8217;s process handle. The gateway then asks the load balancer for an available service and forwards the query to whatever worker gets allocated. When the result comes back, the gateway uses the sequence number to match it to the original request and sends the response straight back to the right user.</p></li><li><p><strong>Load Balancer / Connection Manager</strong>: Think of this as the brains of query distribution. It knows what services are available (e.g., multiple HDBs, RDBs, or custom compute services), which ones are busy, and which are free to take work. Rather than simple round-robin, this component tags incoming queries and only allocates them to idle backends, minimizing queueing and improving latency.</p></li><li><p><strong>Service Instances</strong>: These are the actual workers: database processes, analytics engines, or custom report builders that evaluate user queries. Each one registers itself with the load balancer so it can be included in allocation decisions. Once a service finishes a request, it reports back to the load balancer so it can be assigned another job. By running multiple instances of the same service, for example, HDBs backed by identical data sets or RDBs subscribing to the same tickerplant, we create a shared pool of resources that can be spread across different servers. This opens the door to a hot-hot setup, where the framework can not only distribute load efficiently across available instances, but also seamlessly reroute user queries if a service or host goes down, without clients needing to be aware of the failure.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!pKzT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!pKzT!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic 424w, /__u/substackcdn.com/image/fetch/$s_!pKzT!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic 848w, /__u/substackcdn.com/image/fetch/$s_!pKzT!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!pKzT!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!pKzT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:405625,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/188127550?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!pKzT!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic 424w, /__u/substackcdn.com/image/fetch/$s_!pKzT!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic 848w, /__u/substackcdn.com/image/fetch/$s_!pKzT!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!pKzT!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F954b78d5-3d0b-43d1-9614-9cedbdcd7bd4_1024x1536.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>The Life of a Query</h2><p>From a user&#8217;s perspective, interaction is straightforward. Queries are sent to the gateway handle via a single entry point, the <code>userQuery</code> function, which takes a two-element list: the target service and the query to execute. Communication with the gateway uses deferred synchronous messaging, giving users a familiar request&#8211;response model while allowing the system to remain non-blocking under the hood.</p><p>Services backing the different database types can be distributed across multiple servers, with the number of instances driven by available hardware and user demand, and configured independently per service type. To keep the focus where it matters, we intentionally keep the gateway&#8217;s routing logic simple here and put the spotlight on the load balancer&#8217;s role in the system. The flow itself is equally clean. Once a query enters the system, the gateway coordinates with the load balancer to allocate an appropriate service, forwards the request, and waits for the result. Responses are then routed back to the user through the gateway. If something goes wrong, an invalid service request or an error during query evaluation, the gateway propagates a clear error back to the client, keeping failure handling centralized and predictable.</p><p>The load balancer, instead of relying on a simple round-robin strategy, takes a more deliberate approach. It actively tracks which service instances are free and only allocates queries to resources that are actually available. Once a service finishes executing a query, it explicitly notifies the load balancer that it&#8217;s ready to take on more work, allowing the system to maintain an accurate view of capacity at all times. The only exception to this flow occurs when a service has been allocated but the user disconnects before the query completes. In that case, the gateway steps in and informs the load balancer that the service is no longer needed, ensuring resources are released promptly and not left unnecessarily occupied.</p><p>The diagram below shows the full lifecycle of a query as it moves through the system.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!n1bx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!n1bx!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic 424w, /__u/substackcdn.com/image/fetch/$s_!n1bx!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic 848w, /__u/substackcdn.com/image/fetch/$s_!n1bx!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!n1bx!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!n1bx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic" width="1000" height="886" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:886,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:123657,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/188127550?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!n1bx!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic 424w, /__u/substackcdn.com/image/fetch/$s_!n1bx!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic 848w, /__u/substackcdn.com/image/fetch/$s_!n1bx!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!n1bx!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51be26e0-4363-4865-9f4e-ed6f8ffeffca_1000x886.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Where the Rubber Meets the Road: The Technical Walkthrough</h2><p>In this section, we&#8217;ll roll up our sleeves and walk through the technical implementation of each moving part in the system: the gateway, the load balancer, the backend services, and a client process sending queries through the gateway. We will first outline the key responsibilities and core functionality of each process, so it&#8217;s clear what role they play and how they fit together. Once the concepts are in place, we&#8217;ll look at how they&#8217;re implemented in practice. The full codebase for this walkthrough is available in the DefconQ <a href="https://github.com/DefconQ/defconQ/tree/master/projects">GitHub repository</a>, for anyone who wants to explore, run, or extend it themselves.</p><h3>Gateway</h3><p>At its core, the gateway maintains two tables, one for tracking available backend services and another for tracking incoming user queries, along with a small set of functions that coordinate communication between the client, the gateway, and the load balancer. In the following sections, we will break these pieces down and explain how they work together.</p><h4>The <code>services</code> Table</h4><p>The <code>services</code> table keeps track of all backend services currently available to the gateway. It is implemented as a keyed table, with the backend service address as the key. For each entry, the table stores the service name as well as the corresponding connection handle. Note that this handle represents the IPC connection established from the gateway to the backend service, not the client connection.</p><pre><code><code>services:([address:()] serviceName:();sh:());</code></code></pre><h4>The <code>userQueries</code> Table</h4><p>The <code>userQueries</code> table records every query that enters the gateway. This is also a keyed table, using a unique sequence number as the key. The sequence number is a simple counter that increments with each new incoming query. Alongside it, the table captures the user handle that submitted the query, the timestamp when the query was recorded, the timestamp when it was forwarded to a backend service, the timestamp when the result was returned, the user name, the service handle and service name associated with the execution, and finally the query itself. Together, this table provides full visibility into the lifecycle of each request as it flows through the gateway.</p><pre><code><code>userQueries:([sq:`int$()] uh:`int$(); rec:`timestamp$(); snt:`timestamp$(); ret:`timestamp$(); user:`$(); sh:`int$(); serv:`$(); query:());</code></code></pre><h4>The <code>connectToLoadbalancer</code> Function</h4><p>The <code>connectToLoadbalancer</code> function is responsible for establishing the IPC connection from the gateway to the load balancer. It opens the connection and stores both the original handle, a positive handle used for synchronous communication, and its negative counterpart for asynchronous messaging, which is how most interactions will be handled. If the connection attempt fails, the function simply reports an error.</p><pre><code><code>connectToLoadbalancer:{@[{NLB::neg LB::hopen x};`:localhost:1234;{show x}]};</code></code></pre><h4>The <code>registerGatewayWithLoadbalancer</code> Function</h4><p>The <code>registerGatewayWithLoadbalancer</code> function then performs the initial handshake with the load balancer. It sends a synchronous message invoking the <code>registerGW</code> function on the load balancer. While we will explain the inner workings of the load balancer later, at a high level this call registers the gateway and returns the full set of backend services currently known to the load balancer. The gateway uses this response to populate its internal services table via the <code>addService</code> function. This exchange is deliberately synchronous: just like a real-time subscriber registering with a tickerplant, the gateway must wait for this response before continuing its startup sequence.</p><p>If you&#8217;d like to go deeper into IPC in KDB/Q or the mechanics of the tickerplant, check out the dedicated posts linked in the resources section at the end of this article.</p><pre><code><code>registerGatewayWithLoadbalancer:{addService LB(`registerGW;`)};</code></code></pre><h4>The <code>addService</code> Function</h4><p>The <code>addService</code> function updates the gateway&#8217;s internal service table with the details of all available backend services. As part of this process, it establishes a direct IPC connection from the gateway to each backend service and then upserts the corresponding entries into the services table with the relevant connection and service metadata.</p><pre><code><code>addService:{ `services upsert `address xkey update sh:{hopen first x}each address from x };</code></code></pre><h4>The <code>getData</code> Function</h4><p>The <code>getData</code> function is the main entry point into our KDB/Q system, the front door to the data warehouse, the <em><strong>&#8220;open sesame&#8221;</strong></em> to whatever insights are hiding behind your data points. It&#8217;s also the first place where the gateway logic starts to get a little more interesting, so it&#8217;s worth walking through it line by line.</p><p>We begin with a simple conditional check that splits execution into two paths. First, we verify whether the service the user is trying to query actually exists. If it does, the gateway logs the query along with all its metadata, increments the global sequence number, and then asks the load balancer to allocate the next available backend service capable of handling the request. From there, the query continues its journey through the system. In the (hopefully rare) case where the requested service does <em><strong>not</strong></em> exist, the gateway immediately returns a clear error message to the client, and that&#8217;s where this particular query&#8217;s very short life comes to an end.</p><p>Remember, the <code>getData</code> function expects a tuple, a two-element list, where the first element specifies the name of the service to query, and the second element contains the actual query the user wants to execute.</p><pre><code><code>getData:{
  $[(serv:x 0) in exec distinct serviceName from services;
    [userQueries,:(SEQ+:1;.z.w;.z.p;0Np;0Np;.z.u;0N;serv;x 1);
      NLB(`requestService;SEQ;serv)];
    (neg .z.w)(`$"Service Unavailable")] };</code></code></pre><h4>The <code>serviceAlloc</code> Function</h4><p>The next function we look at is <code>serviceAlloc</code>. This function is called by the load balancer once it has identified an available backend service and is returning its address to the gateway. At this point, the gateway once again uses a conditional check to determine whether the user who originally submitted the query is still around and waiting for a response, after all, client processes can disappear for any number of reasons.</p><p>To make this determination, the gateway looks up the query in the <code>userQueries</code> table, which tracks all active requests. This works because the sequence number assigned to the query was passed to the load balancer when the gateway initially requested a free service, and is now returned alongside the allocation. That sequence number lets the gateway reliably match the allocation back to the correct query.</p><p>If the user is no longer waiting, there&#8217;s nothing left to do. The gateway simply releases the backend service by calling <code>releaseService</code> on the load balancer, freeing it up for other work. If the user <em><strong>is</strong></em> still waiting, the gateway sends an asynchronous message to the allocated backend service, invoking the <code>queryService</code> function to kick off execution. Finally, the gateway updates the query&#8217;s metadata in the <code>userQueries</code> table and continues with the normal execution flow.</p><pre><code><code>serviceAlloc:{[sq;addr]
  $[null userQueries[sq;`uh];
    NLB(`releaseService;sq);
    [(neg sh:services[addr;`sh]) (`queryService;(sq;userQueries[sq;`query]));
    userQueries[sq;`snt`sh]:(.z.p;sh)]]};</code></code></pre><h4>The <code>returnRes</code> Function</h4><p>Next up is the function that closes the loop and delivers the result back to the client. The <code>returnRes</code> function is called by the backend service once it has finished executing the user&#8217;s query. It receives a tuple, a two element list, where the first element is the sequence number of the query and the second element is the actual result containing the requested data.</p><p>Using the sequence number, the gateway looks up the corresponding entry in the <code>userQueries</code> table and retrieves the handle of the waiting client. If the client is still connected, the gateway sends the result back to the user. As a final step, it updates the timestamp marking when the response was returned. With that, the lifecycle of this query comes to a close, and the gateway is ready to handle the next request.</p><pre><code><code>returnRes:{[res]
  uh:first exec uh from userQueries where sq=(res 0);
  if[not null uh;(neg uh)(res 1)];
  userQueries[(res 0);`ret]:.z.p };</code></code></pre><h4>The <code>.z.pc</code> Function</h4><p>One important edge case to cover is what happens when a connection to the gateway is dropped. We handle this by overriding the default behaviour of the internal system function <code>.z.pc</code> with gateway-specific logic. This allows us to clean up properly and ensure no KDB/Q process is left hanging indefinitely.</p><p>The cleanup happens in stages. First, we null out the user handle for all entries in the <code>userQueries</code> table where the handle matches the disconnected client. Next, we remove any backend services whose service handle corresponds to the dropped connection. Rather than branching with conditional checks, we simply delete matching rows, if there&#8217;s no match, nothing happens.</p><p>If the disconnected handle belongs to a backend service, we then identify all affected, still-waiting users and return an appropriate <strong>&#8220;Service Disconnected&#8221;</strong> error message. Finally, we check whether the dropped connection was the load balancer itself. If so, the gateway broadcasts an error to all clients with outstanding queries, closes all backend service connections (since no further allocations are possible), clears the services table, and updates the sent and return timestamps for all in-flight queries.</p><p>As a last step, the gateway resets its load balancer state and arms a timer with a 10-second interval, attempting to re-establish the connection to the load balancer every ten seconds until it&#8217;s back online.</p><pre><code><code>.z.pc:{[handle]
  update uh:0N from `userQueries where uh=handle;
  delete from `services where sh=handle;
  if[count sq:exec distinct sq from userQueries where sh=handle,null ret;
    returnRes'[sq cross `$"Service Disconnect"]];
  if[handle~LB;
    (neg exec uh from userQueries where not null uh,null snt)@\:`$"Service Unavailable";
    hclose each (0!services)`sh;
    delete from `services;
    update snt:.z.p,ret:.z.p from `userQueries where not null uh,null snt;
    LB::0; NLB::0; value"\\t 10000"] };</code></code></pre><h4>The <code>.z.ts</code> Function</h4><p>Last but definitely not least, we wire up the function that should fire whenever the internal timer ticks by assigning it to the system hook <code>.z.ts</code>. On each trigger, the gateway attempts to open a connection to the load balancer and, if successful, proceeds to register itself by calling <code>registerGatewayWithLoadbalancer</code>.</p><p>To keep things robust, the whole sequence is wrapped in a trap, f anything goes wrong, we catch it and return a meaningful error instead of letting the gateway stumble forward in an undefined state. Better safe than sorry. Once the connection is established and the gateway is successfully registered, we shut the timer back down by resetting the interval to zero. At that point, the gateway, the load balancer, and the backend services are all in sync and fully operational.</p><pre><code><code>z.ts:{
  connectToLoadbalancer[];
  if[0&lt;LB;@[registerGatewayWithLoadbalancer;`;{show x}];value"\\t 0"] };</code></code></pre><h3>Loadbalancer</h3><p>Now that the gateway has done its job of funnelling user queries, it&#8217;s time to meet the load balancer, the quiet workhorse that decides who actually does the heavy lifting. Think of it as mission control: it keeps a live view of available backend services, queues incoming requests from the gateway, and tracks every gateway currently plugged into the system. Backed by a small set of purpose-built tables and a handful of core functions, the load balancer is responsible for making sure work is assigned efficiently, safely, and at the right time. In the sections that follow, we&#8217;ll break down these building blocks and walk through the logic that keeps everything moving.</p><h4>The <code>services</code> Table</h4><p>This table tracks all available service instances and the gateways currently consuming them. It is keyed by the backend service handle and records the service address, service name, the gateway handle currently assigned to the service, the sequence number of the query being processed, and the corresponding timestamp.</p><pre><code><code>services:([handle:`int$()] address:`$(); serviceName:`$(); gwHandle:`int$(); sq:`int$(); udt:`timestamp$());</code></code></pre><h4>The <code>serviceQueue</code> Table</h4><p>The serviceQueue table keeps track of all requests waiting for an available resource. It is keyed by the gateway handle the request originated from and the corresponding service request sequence number. In addition, it records the target service name and the timestamp marking when the request reached the load balancer.</p><pre><code><code>serviceQueue:([gwHandle:`int$();sq:`int$()] serviceName:`$(); time:`timestamp$());</code></code></pre><h4>The <code>gateways</code> List</h4><p>The load balancer also keeps a lightweight list of gateway handles, aptly named gateways, which tracks all gateways currently connected to it.</p><pre><code><code>gateways:()</code></code></pre><h4>The <code>registerGW</code> Function</h4><p>To track which gateways are connected to the load balancer, we maintain a simple list of gateway handles. New entries are added via the <code>registerGW</code> unction. When a gateway connects, this function records its handle and immediately responds with the full set of currently available backend services. Armed with this information, the gateway can populate and synchronise its internal service table with the service names and addresses known to the load balancer.</p><pre><code><code>registerGW:{gateways,:.z.w ; select serviceName, address from services};</code></code></pre><h4>The <code>registerService</code> Function</h4><p>Gateways matter, but without backend services there&#8217;s nothing to route to. To onboard a newly connected backend, we define the <code>registerService</code> function. It takes the service name and address and upserts the entry into the load balancer&#8217;s services table. Since this service is now part of the ecosystem, its details must be broadcast to all connected gateways. We do this using the each-left iterator, invoking <code>addService</code> on every registered gateway handle with the relevant metadata. Once that propagation is complete, the service is marked as available and ready to take work.</p><pre><code><code>registerService:{[name;addr]
  `services upsert (.z.w;addr;name;0N;0N;.z.p);
  (neg gateways)@\:(`addService;enlist`serviceName`address!(name;addr));
  serviceAvailable[.z.w;name] };</code></code></pre><h4>The <code>sendService</code> Function</h4><p>When a gateway asks the load balancer for an available backend, we need a clean way to hand that information back. That&#8217;s the job of the <code>sendService</code> function. It selects a free backend service, returns its handle and address to the gateway, and immediately invokes the gateway&#8217;s <code>serviceAlloc</code> function so the user query can be forwarded to its final destination.</p><p>If you look closely at the implementation, you&#8217;ll notice the use of <code>raze</code> when constructing the message sent back to the gateway. At first glance this might seem a little odd, but it&#8217;s entirely intentional. Indexing into the services table by handle yields the sequence number and address, which we then combine with the symbolic name of <code>serviceAlloc</code>.</p><pre><code><code>q)services
handle| address   serviceName       gwHandle sq udt
------| ---------------------------------------------------------------------
7     | :mac:2222 EQUITY_MARKET_RDB             2026.02.10D22:13:43.941150000
q)services[7;`sq`address]
0Ni
`:mac:2222
q)(`serviceAlloc;services[7;`sq`address])
`serviceAlloc
(0Ni;`:mac:2222)
q)0N!(`serviceAlloc;services[7;`sq`address])
(`serviceAlloc;(0Ni;`:mac:2222))
`serviceAlloc
(0Ni;`:mac:2222)</code></code></pre><p>Without <code>raze</code>, this produces a two-element list: the function name and a tuple containing the arguments. That would cause <code>serviceAlloc</code> to be called with a single list argument, which is not what we want. Since <code>serviceAlloc</code> expects two atomic parameters, we flatten the structure with <code>raze</code>, ensuring the function is invoked with the correct argument shape.</p><pre><code><code>q)raze (`serviceAlloc;services[7;`sq`address])
`serviceAlloc
0Ni
`:mac:2222
q)0N!raze (`serviceAlloc;services[7;`sq`address])
(`serviceAlloc;0Ni;`:mac:2222)
`serviceAlloc
0Ni
`:mac:2222</code></code></pre><p><strong>Full implementation</strong>:</p><pre><code><code>sendService:{[gw;h]neg[gw]raze(`serviceAlloc;services[h;`sq`address])};</code></code></pre><h4>The <code>requestService</code> Function</h4><p>Before we can dispatch a free backend to a gateway, we first need to receive and process the request. That responsibility sits with the <code>requestService</code> function. It takes two parameters: the sequence number assigned by the gateway and the symbolic name of the backend service that should handle the user&#8217;s query.</p><p>The first step inside <code>requestService</code> is resource discovery. We query the <code>services</code> table for a row where the service name matches the requested service <em><strong>and</strong></em> the gateway handle column is null. In other words, a service instance that is currently idle and not allocated to another gateway. Availability is not assumed; it is explicitly verified.</p><p>If a suitable service is found, we immediately log the request in the <code>serviceQueue</code> table via <code>addQueryToQueue</code>. This gives us traceability and ordering. We then update the <code>services</code> table itself, assigning the backend instance to the requesting gateway, recording the query&#8217;s sequence number, and stamping the allocation time. At this point, the resource is officially reserved.</p><p>With the bookkeeping done, we send the handle of the allocated backend service to the gateway. From there, the gateway takes over and forwards the client&#8217;s query to its final destination, the backend service that will actually execute it.Clean allocation. Clear state.</p><pre><code><code>requestService:{[seq;serv]
  res:exec first handle from services where serviceName=serv,null gwHandle;
  $[null res;
    addQueryToQueue[seq;serv;.z.w];
    [services[res;`gwHandle`sq`udt]:(.z.w;seq;.z.p);
      sendService[.z.w;res]]] };</code></code></pre><h4>The <code>addQueryToQueue</code> Function</h4><p>If an incoming request cannot be processed immediately, it needs to be parked in the <code>serviceQueue</code> table. That&#8217;s precisely the role of the <code>addQueryToQueue</code> function. It takes the query&#8217;s sequence number, the target service name, and the gateway handle from which the request originated, and inserts this information into the queue table. As part of the process, it also stamps the entry with the current timestamp, ensuring we retain a clear record of when the request entered the load balancer.</p><pre><code><code>addQueryToQueue:{[seq;serv;gw]`serviceQueue upsert (gw;seq;serv;.z.p)};</code></code></pre><h4>The <code>releaseService</code> Function</h4><p>Once a backend service has either completed a client request or the client has disconnected and no longer requires a response, the service instance must be freed and marked as available again. That responsibility falls to the <code>releaseService</code> function.</p><p>If <code>releaseService</code> is triggered by a backend service, meaning the query was successfully processed, we simply call <code>serviceAvailable</code> with the relevant service details, marking the instance as idle and ready for new work. If, on the other hand, <code>releaseService</code> is invoked by a gateway, this signals that the client disconnected before the result was returned. In that case, we identify the backend service that was allocated to that query using the gateway handle and the query&#8217;s service name, and then call <code>serviceAvailable</code> with those details. Either way, the outcome is the same: the resource is returned to the pool and can be reassigned.</p><pre><code><code>releaseService:{
  serviceAvailable . $[.z.w in (0!services)`handle;
    (.z.w;x);
    value first select handle,serviceName from services
      where gwHandle=.z.w,sq=x ] };</code></code></pre><h4>The <code>serviceAvailable</code> Function</h4><p>The <code>releaseService</code> function delegates some of the workload to the <code>serviceAvailable</code> function. This function determines whether the freed resource should simply be marked as idle or immediately reassigned to the next waiting request. In doing so, it updates both the <code>services</code> and <code>serviceQueue</code> tables to reflect the new state.</p><p>The first step is to retrieve all gateway handle and sequence number combinations from the <code>serviceQueue</code> where the service name matches the backend service being released. Thanks to KDB/Q&#8217;s left-of-right evaluation efficiency, we can directly extract the first gateway/sequence pair from that result set, effectively identifying the next request in line.</p><p>We then remove that entry from the <code>serviceQueue</code> and update the <code>services</code> table with the allocation details. If a queued request exists, the backend service is immediately reassigned, and its handle is sent to the corresponding gateway so processing can continue without delay. If no matching requests remain, the execution flow stops there. This means the service is simply marked as available and waits for the next allocation.</p><pre><code><code>serviceAvailable:{[zw;serv]
  nxt:first n:select gwHandle,sq from serviceQueue where serviceName=serv;
  serviceQueue::(1#n)_ serviceQueue;
  services[zw;`gwHandle`sq`udt]:(nxt`gwHandle;nxt`sq;.z.p);
  if[count n; sendService[nxt`gwHandle;zw]] };</code></code></pre><h4>The <code>.z.pc</code> Function</h4><p>The final piece on the load balancer side mirrors the gateway&#8217;s approach: we override the system function <code>.z.pc</code> to handle disconnections cleanly and deterministically.</p><p>When a process disconnects, the first step is to remove its handle from the <code>services</code> table. If the disconnected handle does not belong to a backend service, the table remains unchanged, no branching logic required. We then apply the same logic to the list of registered gateways, removing the handle if it belongs to a gateway; otherwise, the list stays as is.</p><p>Next, we clean up the <code>serviceQueue</code> by deleting any outstanding requests submitted by the disconnected gateway. If the originating gateway is no longer alive, there is no client to receive the result, making those queued queries obsolete. Finally, we check whether any backend service is currently allocated to the gateway that just dropped. If so, we release that resource by resetting the occupying gateway handle to null. A disconnected gateway cannot hold onto a backend service, and the system must reflect that immediately.</p><p>And with that, the load balancer is fully implemented, its responsibilities defined, its edge cases handled. The routing layer is now operational, and we can shift our focus to building a simple backend service to complete the architecture.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/defconq.substack.com/subscribe"><span>Subscribe now</span></a></p><h3>Backend Service</h3><p>In the next section, we&#8217;ll walk through the implementation of a simple backend service. For the purpose of this tutorial, we&#8217;ll assume the backend represents an equity real-time database (RDB) exposing two dummy tables: <code>trade</code> and <code>quote</code>. Alongside the data itself, we&#8217;ll store the service name and the connection details required to register with the load balancer.</p><p>At the core of the backend sits the <code>execQuery</code> function, responsible for executing incoming client queries. However, to prevent a malformed or poorly written query from destabilising the service, we don&#8217;t expose <code>execQuery</code> directly. Instead, it is wrapped inside <code>queryService</code>, where we use a trap to safely execute the request and contain potential errors.</p><p>Let&#8217;s break down each of these components in detail.</p><h4>The <code>connectToLoadbalancer</code> Function</h4><p>The first function we&#8217;ll examine is <code>connectToLoadbalancer</code>. Its purpose is straightforward: establish a connection between the backend service and the load balancer. The load balancer&#8217;s host and port are hardcoded within the function and used to initiate the connection.</p><p>Once connected, the backend stores both the positive handle (for synchronous communication) and the negative handle (for asynchronous calls). To ensure robustness, the entire connection attempt is wrapped in a trap, so any failure results in a controlled error rather than an unhandled exception.</p><pre><code><code>connectToLoadbalancer:{@[{NLB::neg LB::hopen x}; `:localhost:1234; {show "Can't connect to Load Balancer-&gt; ",x}]};</code></code></pre><h4>The <code>serviceDetails</code> List</h4><p>The <code>serviceDetails</code> list acts as a parse tree that is sent to the load balancer immediately after a connection has been established. Its first element is the symbolic name of the <code>registerService</code> function, followed by the service name and the backend service&#8217;s address as arguments. When transmitted, this structure invokes <code>registerService</code> on the load balancer side, effectively registering the backend service and making it known to the system.</p><pre><code><code>serviceDetails:(`registerService; serviceName; `$":" sv string (();.z.h;system"p"));</code></code></pre><h4>The <code>execQuery</code> Function</h4><p>The function that ultimately executes the client request on the backend is <code>execQuery</code>. It takes two parameters. The first is the (negative) handle of the gateway that submitted the query, this handle is used to send the result back once processing is complete. The second parameter is a tuple, a two-element list: the sequence number of the query and the actual client query to be executed. The sequence number allows the gateway to correctly reconcile the response with the original request when it is returned.</p><p>The client query itself is executed inside an error trap on the backend, ensuring that any runtime issues are safely contained. Once execution finishes, whether successfully or with an error, the result is sent back to the gateway by invoking <code>returnRes</code>, which will then forward the response to the client.</p><pre><code><code>execQuery:{[nh;rq] nh(`returnRes;(rq 0;@[value;rq 1;{x}]));nh[]};</code></code></pre><h4>The <code>queryService</code> Function</h4><p>Before reaching its final destination in <code>execQuery</code>, he request is first routed through <code>queryService</code>. This is the function invoked by the gateway, and it receives a tuple containing the query&#8217;s sequence number and the actual client query.</p><p>Rather than calling <code>execQuery</code> directly, we first construct a projection that wraps the execution logic with proper error handling. This ensures that any exception raised during execution is safely captured and controlled. We then invoke<code>execQuery</code> and allow the query lifecycle to continue.</p><p>Regardless of whether the query completes successfully or fails with an error, the final step inside <code>queryService</code> is to release the backend service. Once execution finishes, the service is no longer blocked and can be returned to the pool for the next request.</p><pre><code><code>queryService:{
  errProj:{[nh;sq;er]nh(sq;`$er);nh[]};
  @[execQuery[neg .z.w];x;errProj[neg .z.w;x 0]];
  NLB(`releaseService;serviceName) };</code></code></pre><h4>Backend Bootstrapping and Bureaucracy: Wiring the Service to the Grid</h4><p>With the core logic in place, all that remains is a bit of framework housekeeping.</p><p>We start by defining the <code>.z.ts</code> function: the routine executed on each timer tick. Inside it, the backend attempts to establish a connection to the load balancer via <code>connectToLoadBalancer</code>. If the connection succeeds, the service registers itself by sending the <code>serviceDetails</code> parse tree to the load balancer. Once registration is complete and the backend is officially online, we reset the timer to zero, no further reconnection attempts are needed.</p><p>For resilience, we also override <code>.z.pc</code>, the handler triggered whenever a process disconnects from the backend. If the disconnected process happens to be the load balancer, we react by resetting the timer to a ten-second interval and repeatedly attempt to reconnect. This ensures the backend can recover automatically from infrastructure hiccups.</p><p>Finally, we initialise some dummy <code>trade</code> and <code>quote</code> data to simulate our equity RDB and invoke <code>.z.ts</code> to kick everything off. With that, the backend service is live, registered, and ready to handle incoming client queries.</p><pre><code><code>.z.ts:{connectToLoadbalancer[];if[0&lt;LB;@[NLB;serviceDetails;{show x}];value"\\t 0"]};

z.pc:{[handle]if[handle~LB;LB::0;value"\\t 10000"]};

quote:([] date:10#.z.D-1; sym:10#`APPL; time:09:30t+00:30t*til 10; bid:100.+0.01*til 10; ask:101.+0.01*til 10)
trade:([] date:10#.z.D-1; sym:10#`AAPL; time:09:30t+00:30t*til 10; price:100.+0.01*til 10; size:10#100)

.z.ts[]</code></code></pre><h3>Client Onboarding: Injecting Queries into the Machine</h3><p>With the gateway, load balancer, and backend service all up and running, it&#8217;s time to simulate a client and push some queries through the framework.</p><p>We spin up a fresh KDB/Q process and define a helper function that allows us to submit queries to the gateway. More specifically, we create a projection that accepts two inputs: the target service name and the query to be executed. The projection establishes a connection to the gateway using the supplied connection details, then constructs a lambda that invokes the <code>getData</code> function asynchronously. After sending the request, it flushes the output queue to ensure the message is dispatched immediately.</p><p>This implements a deferred synchronous pattern: the client blocks while waiting for the result, but the gateway does not. That distinction is critical. The gateway must remain free to handle other incoming requests, because a gateway that blocks on the first client query isn&#8217;t much of a gateway at all.</p><pre><code><code>q)gw:{h:hopen x;{(neg x)(`getData;y);x[]}[h]}[`:localhost:5555]
q)gw(`EQUITY_MARKET_RDB;"select from trade")
date       sym  time         price  size
----------------------------------------
2026.02.14 AAPL 09:30:00.000 100    100
2026.02.14 AAPL 10:00:00.000 100.01 100
2026.02.14 AAPL 10:30:00.000 100.02 100
2026.02.14 AAPL 11:00:00.000 100.03 100
2026.02.14 AAPL 11:30:00.000 100.04 100
2026.02.14 AAPL 12:00:00.000 100.05 100
2026.02.14 AAPL 12:30:00.000 100.06 100
2026.02.14 AAPL 13:00:00.000 100.07 100
2026.02.14 AAPL 13:30:00.000 100.08 100
2026.02.14 AAPL 14:00:00.000 100.09 100</code></code></pre><h2>Lights On: Watching the Framework Come Alive</h2><p>With the line-by-line walkthrough behind us, it&#8217;s time to see the architecture in motion. Let&#8217;s run a short demonstration of the system we&#8217;ve just built and watch the components interact in real time. The illustration below highlights the full setup and how the pieces fit together. If you&#8217;d like to recreate the framework yourself, you can find the complete codebase on DefconQ&#8217;s GitHub repository.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!8pqA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!8pqA!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic 424w, /__u/substackcdn.com/image/fetch/$s_!8pqA!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic 848w, /__u/substackcdn.com/image/fetch/$s_!8pqA!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!8pqA!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!8pqA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic" width="1456" height="914" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:914,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:277627,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/188127550?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!8pqA!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic 424w, /__u/substackcdn.com/image/fetch/$s_!8pqA!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic 848w, /__u/substackcdn.com/image/fetch/$s_!8pqA!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!8pqA!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a069d74-a49a-4023-b9fd-147e3f37e3a3_3412x2142.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Where Do We Go From Here? Scaling the Blueprint</h2><p>This tutorial walked through a lightweight gateway-load balancer framework, breaking down the functionality and code step by step. By now, you should have a solid set of foundational building blocks, enough to evolve this simple architecture into something far more powerful.</p><p>A natural next step would be to replace the deferred synchronous pattern with the deferred response pattern introduced in KDB/Q v3.6. From there, you could expand the ecosystem: add additional backend services, refine the load balancer&#8217;s routing logic, introduce user-level permissions, or deploy multiple gateways segmented by region or asset class. The framework is intentionally minimal, the ceiling is defined only by your imagination.</p><p>As always, happy coding.</p><h2>Resources</h2><ul><li><p><a href="https://www.defconq.tech/docs/architecture/gateway">Gateways: The Bouncer at the Front Door of Your KDB/Q Stack</a></p></li><li><p><a href="https://www.defconq.tech/docs/architecture/advanced">Advanced KDB/Q Architecture</a></p></li><li><p><a href="https://www.defconq.tech/docs/concepts/ipc">Fundamentals of Interprocess Communication (IPC)</a></p></li><li><p><a href="https://www.defconq.tech/docs/concepts/ipcNextLevel">Beyond the Fundamentals: Next Level Interprocess Communications</a></p></li><li><p><a href="https://www.defconq.tech/docs/tutorials/tick">KDB Tick Explained: A Walkthrough</a></p></li><li><p><a href="https://code.kx.com/q/wp/query-routing/">KX Whitepaper: Query Routing: A kdb+ framework for a scalable, load balanced system by Kevin Holsgrove</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Gateways: The Bouncer at the Front Door of Your KDB/Q Stack]]></title><description><![CDATA[Why They Matter, How They Work, and How to Build One That Actually Scales]]></description><link>https://defconq.substack.com/p/gateways-the-bouncer-at-the-front</link><guid isPermaLink="false">https://defconq.substack.com/p/gateways-the-bouncer-at-the-front</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Wed, 21 Jan 2026 11:55:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bdDN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In every KDB/Q stack you have ever built, somewhere behind the scenes there&#8217;s likely been <em>that</em> conversation:</p><blockquote><p>&#8220;Hey, where do I find the options data?&#8221;<br>&#8220;Why did my query lock up the HDB?&#8221;<br>&#8220;I swear I didn&#8217;t break anything...&#8221;</p></blockquote><p>If you have ever been on the receiving end of questions like these, or if your users have occasionally <em><strong>accidentally</strong></em> brought your system to its knees, you are living proof that <strong>a missing (or poorly implemented) gateway is a costly architectural gap.</strong></p><p>In this post, we will answer the big question:</p><blockquote><p><strong>What is a Gateway, and why is it such a critical component in modern KDB/Q architecture?</strong></p></blockquote><p>We will break down best practices, real design options, and even extend the classic ideas with modern approaches like async routing, caching, security, and observability.</p><h2>What Is a Gateway?</h2><p>The way I like to think about a gateway is as the <strong>single point of entry</strong> for all clients interacting with your KDB/Q system. But it&#8217;s not just an access point, it&#8217;s much more than that. A gateway acts as a protective layer for your stack: it shields your system from poorly formed or expensive queries, verifies who is allowed to query what, blocks requests when necessary, and routes valid queries to the correct endpoint.</p><p>Just as importantly, a gateway removes a whole set of responsibilities from your users. They no longer need to</p><ul><li><p>Know where the data lives (RDB vs HDB vs other services)</p></li><li><p>Understand how to combine results from multiple sources, or</p></li><li><p>Send several requests and stitch the responses together themselves.</p></li></ul><p>In other words, the gateway is your bouncer at the front door of the KDB/Q stack, checking IDs, enforcing the rules, and making sure only the right requests make it inside.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!bdDN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!bdDN!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!bdDN!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!bdDN!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!bdDN!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!bdDN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:251569,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/185286267?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!bdDN!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!bdDN!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!bdDN!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!bdDN!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc00855d9-823d-45af-b222-e4a99e09593d_1536x1024.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Clients make one call to the gateway, and <em><strong>magic</strong></em> happens behind the scenes:</p><ul><li><p>Data is retrieved from the correct services</p></li><li><p>Requests are load balanced if needed</p></li><li><p>Security and permissions are enforced</p></li><li><p>A clean, unified result is returned</p></li></ul><p>This separation is powerful. It decouples client logic from system internals, which means you can evolve your architecture without constantly breaking downstream users. You can move data, split databases, add replicas, or introduce new services, and the client never needs to know. From their perspective, the gateway <em><strong>is</strong></em> the system.</p><h2>Gateway Roles and Responsibilities</h2><p>Thinking of a gateway purely as an access point is selling it short. Yes, it <em><strong>is</strong></em> the single entry point for all clients interacting with your KDB/Q stack, but more importantly, it&#8217;s the place where <em>intent</em> is translated into <em>action</em>. Clients express what they want, not how or where to get it. The gateway takes responsibility for figuring out the rest.</p><h3>1. Access Interface</h3><p>The access interface defines <em>how</em> clients interact with your KDB/Q system, and predictability here is everything. A gateway should expose a small, well-defined set of entry points that clients can rely on, whether that&#8217;s through KDB/Q function calls, stored procedures, or endpoints for non-q consumers. By enforcing a consistent request structure, the gateway reduces ambiguity, simplifies client implementations, and prevents users from crafting ad-hoc queries that bypass system rules. A clear access interface also makes it easier to validate inputs, apply permissions, version APIs, and evolve the backend without breaking consumers. In short, the gateway turns an otherwise flexible and potentially dangerous system into something stable, consumable, and safe to use.</p><h3>2. Authentication, Authorization, and Entitlements</h3><p>Security in KDB/Q systems often starts, and ideally ends, at the gateway. Before talking to any service, it verifies:</p><ul><li><p><strong>User identity</strong></p></li><li><p><strong>What they are allowed to request</strong></p></li><li><p><strong>Whether the operation is permitted under current policy</strong></p></li></ul><p>This is often done with functions like <code>.z.pw</code>, <code>.z.pg</code>, or <code>.z.ps</code> to gate specific tables, symbols, or services without exposing internals. Rather than spreading entitlement logic across multiple processes, the gateway centralizes access control in one place. This includes verifying who the user is, what they are allowed to see, and which operations they are permitted to perform. From a design perspective, this dramatically simplifies the rest of the stack. Downstream services can assume that incoming requests are already authorized and well-formed. From an operational perspective, it gives you a single point to audit access, apply changes, and reason about who touched what data and when.</p><p>In larger systems, however, avoiding bottlenecks and single points of failure becomes critical. Following the <em>one process, one task</em>principle, it can make sense to introduce a dedicated, centralized entitlements service that gateways can query as needed. This keeps authorization logic decoupled, easier to maintain, and simpler to evolve over time. As with most architectural decisions, there&#8217;s no one-size-fits-all solution, the right approach depends on scale, complexity, and operational requirements.</p><h3>3. Routing Queries to the Right Endpoint</h3><p>In a non-trivial KDB/Q system, data rarely lives in just one place. Recent data may sit in an RDB, historical data in one or more HDBs, and derived analytics in separate services altogether. Expecting clients to understand this layout is both unrealistic and dangerous. The gateway abstracts this complexity away. Based on query parameters, such as date ranges, instruments or asset classes, it decides which backend service (or combination of services) should handle the request. The routing logic can be as simple or as sophisticated as your system requires, but the key point remains the same: <strong>clients should never need to care.</strong></p><h3>4. Load Balancing and Backpressure Management</h3><p>As usage grows, the gateway also becomes a strategic control point for managing load. Whether you&#8217;re serving more users, running heavier analytics, or supporting extended trading hours, a single process handling all requests will eventually become a bottleneck. Load balancing is how you scale horizontally without rewriting your entire system. In a KDB/Q context, load balancing typically means running multiple instances of the same service, most commonly HDBs, analytics services, or even gateways themselves, and distributing incoming queries across them. Because KDB/Q processes are lightweight and fast to start, spinning up additional instances is often far easier than vertically scaling a single, overworked process. A load balancer can track process health, query latency, or simple round-robin allocation to ensure work is spread evenly and no single process is overwhelmed.</p><p>A well-designed gateway architecture doesn&#8217;t just route queries; it distributes them intelligently. Load balancing ensures that requests are spread evenly across available resources, be that multiple RDBs, HDBs, or downstream analytic services, so no single process becomes a bottleneck. There are a few approaches you can take:</p><ul><li><p><strong>Round-robin</strong>: The simplest method, each request goes to the next available process in line. Great for evenly distributed workloads.</p></li><li><p><strong>Least-loaded</strong>: The gateway keeps an eye on real-time processes and routes queries to the node with the most capacity.</p></li><li><p><strong>Data-locality aware</strong>: Particularly in mult-database environments, the gateway can send queries to the node closest to the data, minimizing network latency and improving throughput.</p></li></ul><p>But load balancing isn&#8217;t just about performance, it&#8217;s also about <strong>resilience</strong>. If one node becomes unresponsive, the gateway can detect the failure, reroute queries, and keep the system alive without users even noticing. This combination of performance optimization and graceful degradation turns your gateway from a mere traffic cop into a full-fledged air traffic controller, keeping everything flowing safely and efficiently.</p><p>Much like entitlements, load balancing can be handled in two ways: either as a dedicated, standalone service, or by embedding the load-balancing logic directly within the gateway itself.</p><p><strong>And remember</strong>: a gateway without load balancing is like a London pub with only one bartender on a Friday night, it might technically work, but no one&#8217;s going to have a good time.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!xzJQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!xzJQ!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic 424w, /__u/substackcdn.com/image/fetch/$s_!xzJQ!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic 848w, /__u/substackcdn.com/image/fetch/$s_!xzJQ!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!xzJQ!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!xzJQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:350525,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/185286267?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!xzJQ!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic 424w, /__u/substackcdn.com/image/fetch/$s_!xzJQ!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic 848w, /__u/substackcdn.com/image/fetch/$s_!xzJQ!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!xzJQ!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01861f50-e5a4-4661-abc1-8786d654a12f_1024x1536.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>5. Data Aggregation</h3><p>Sometimes a single request needs data from more than one place, for example, combining historical data from the HDB with live updates from the RDB. In these cases, the gateway acts as the orchestrator: it fans out the request to the relevant backends, aggregates and reconciles the results, and composes a single, consistent response before returning it to the client. This keeps the client interface simple while hiding the underlying complexity of the data landscape.</p><h2>Gateway Design Options</h2><p>As usage increases, the gateway evolves beyond a simple entry point into your KDB/Q stack and starts acting as a coordinator, opening up a range of different architectural and design choices. It is worth keeping in mind that there&#8217;s no single &#8220;right&#8221; way to design a gateway. Different problems call for different solutions, so the shape of your gateway should always be driven by the actual needs of your system. Before settling on a design, it&#8217;s useful to step back and ask a few fundamental questions:</p><ul><li><p>What query volume does the gateway need to sustain?</p></li><li><p>How many clients connect, and are they humans, automated services, or a mix of both?</p></li><li><p>How many downstream processes does the gateway orchestrate (RDBs, HDBs, CEP engines, etc.)?</p></li><li><p>Are those processes distributed across multiple servers or even multiple regions?</p></li><li><p>Will there be a single central gateway, or several gateways working in parallel?</p></li><li><p>What are the requirements around resilience and business continuity?</p></li><li><p>How are queries expressed and executed?</p></li><li><p>How are results returned? Does the gateway need to merge or aggregate data before responding?</p></li></ul><p>Answering these upfront will naturally guide you toward a gateway design that fits your use case, rather than forcing your use case to fit the design. In the next section, we will look at two different approaches outlined in KX&#8217;s <a href="https://code.kx.com/q/wp/gateway-design/#load-balancing">&#8220;Common Design Principles for kdb+ Gateways</a>, and walk through the benefits and trade-offs of each.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!a8Rf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!a8Rf!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic 424w, /__u/substackcdn.com/image/fetch/$s_!a8Rf!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic 848w, /__u/substackcdn.com/image/fetch/$s_!a8Rf!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!a8Rf!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!a8Rf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic" width="1024" height="1536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1536,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:261176,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/185286267?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!a8Rf!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic 424w, /__u/substackcdn.com/image/fetch/$s_!a8Rf!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic 848w, /__u/substackcdn.com/image/fetch/$s_!a8Rf!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!a8Rf!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33c0a970-0799-4d37-b1d1-f188324c0cd3_1024x1536.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Pass-Through Gateway</h3><p>This is the simplest pattern. When the gateway gets a request it <em><strong>passes it straight</strong></em> to a dedicated load balancer. That balancer then picks the least busy backend service and returns the result, back through itself, to the gateway. Think of it like a traffic cop taking the request, deciding the best lane, and handing you back the response.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lIG7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lIG7!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic 424w, /__u/substackcdn.com/image/fetch/$s_!lIG7!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic 848w, /__u/substackcdn.com/image/fetch/$s_!lIG7!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!lIG7!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lIG7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic" width="1456" height="1406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1406,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:145068,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/185286267?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lIG7!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic 424w, /__u/substackcdn.com/image/fetch/$s_!lIG7!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic 848w, /__u/substackcdn.com/image/fetch/$s_!lIG7!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!lIG7!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8351a159-1dd5-4469-b04d-691e6e52a272_1522x1470.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>Pros</h4><ul><li><p>Simple logic.</p></li><li><p>Backend choice is based on load.</p></li></ul><h4>Cons</h4><ul><li><p>Extra hop adds overhead.</p></li><li><p>Every response flows back through the balancer (extra IPC).</p></li></ul><h4>When this works</h4><ul><li><p>Very simple systems</p></li><li><p>Use of External load balancers (L4/L7)</p></li><li><p>You don&#8217;t care about extra IPC hops</p></li></ul><h4>Why it often hurts</h4><ul><li><p>Extra latency (double IPC)</p></li><li><p>Load balancer becomes hot very quickly</p></li><li><p>Harder to introspect query lifecycle from the gateway</p></li></ul><p>In <strong>KDB/Q</strong> terms: it works, but it&#8217;s rarely elegant.</p><h3>Connection-Manager Load Balancer (Recommended)</h3><p>This approach splits responsibility a bit more smartly. The gateway asks the load balancer: <em><strong>&#8220;Give me the address of a service that can run this query.&#8221;</strong></em> The Loadbalancer responds with a <code>host:port</code>, and then the gateway talks directly to that service for both request and result. You can implement this two ways:</p><ul><li><p><strong>Round-Robin</strong>: simple rotation through services.</p></li><li><p><strong>Availability-Aware</strong>: only return a service if it&#8217;s currently free, otherwise queue the request until one becomes free.</p></li></ul><p>The latter is more work, but it&#8217;s <strong>way</strong> better at keeping services busy and minimizing unnecessary queueing. These more advanced gateways go one step further by actively maintaining a service registry and continuously tracking the state of the underlying services. Instead of blindly rotating requests, the gateway makes informed routing decisions based on factors such as service availability, current system load, and the expected complexity of the incoming query. A lightweight lookup determines which process is free, which one is already under pressure, and which is best suited to handle the work at hand. This moves the system well beyond simple round-robin scheduling and results in lower tail latencies, better overall throughput, and significantly improved resource utilisation across the entire KDB/Q stack.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!sbIR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!sbIR!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic 424w, /__u/substackcdn.com/image/fetch/$s_!sbIR!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic 848w, /__u/substackcdn.com/image/fetch/$s_!sbIR!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!sbIR!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!sbIR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic" width="1456" height="1406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1406,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:157646,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/185286267?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!sbIR!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic 424w, /__u/substackcdn.com/image/fetch/$s_!sbIR!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic 848w, /__u/substackcdn.com/image/fetch/$s_!sbIR!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!sbIR!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0e2d33-ba51-416f-adc4-71baebf4cde0_1522x1470.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Key Takeaways</h3><p>PatternIPC OverheadResource UtilizationComplexityPass-ThroughHighModerateLowConnection Manager (Smart)LowHighMedium-High</p><p>For smaller deployments or proof-of-concepts, simple round-robin might suffice. But at real scale &#8212; where queries run concurrently and durations vary, having the load balancer actually <em>track</em> service state and manage queues is worth the engineering investment.</p><h2>Beyond the Basics: Key Considerations for Advanced Gateway Design</h2><p>As your platform scales and the architecture becomes more sophisticated, the gateway naturally evolves with it. What started as a simple entry point now takes on more responsibility and nuance. In this section, we will look beyond the basics and explore a set of additional considerations that come into play when designing more advanced gateways, and how to approach them in practice.</p><h3>Synchronous vs. Asynchronous Communication in Gateway Design</h3><p>When you start building a gateway, one of the first architectural decisions you will run into is <em>how</em> processes talk to each other, and this isn&#8217;t just academic. The way components communicate directly shapes throughput, latency, and whether your gateway will become a scalable coordinator or a bottleneck.</p><h4>Synchronous Communication: Simple but Blocking</h4><p>In a <strong>synchronous</strong> world, every call waits for a reply. The gateway asks a service for data, and <em><strong>blocks</strong></em> until it gets a response. It&#8217;s straightforward: send a query, wait, get data, repeat. That simplicity has its charm, it makes reasoning about behavior easy, and for very small systems or simple tooling it &#8220;just works&#8221; without much code overhead.</p><p>But a gateway that blocks on every request doesn&#8217;t really make sense, or does it? Imagine hundreds of users firing off thousands of queries throughout the day. If the gateway had to wait for each request to fully complete before moving on to the next, everything would grind to a halt. Throughput would collapse, queues would explode, and response times would stretch into the absurd. In that kind of environment, a blocking gateway isn&#8217;t just inefficient, it&#8217;s simply not an option.</p><h4>Asynchronous Communication: Parallel by Defaut</h4><p>Enter <strong>asynchronous</strong> communication, the game-changer for gateways at scale. With async, the gateway sends a request to a downstream service and doesn&#8217;t wait around. Instead of blocking, it <em><strong>continues processing</strong></em>, accepting other client queries, sending more requests, and tracking outstanding work. When results come back, the gateway collects them and finalises the response. This pattern dramatically increases throughput: the gateway isn&#8217;t idle while waiting on I/O, and you can overlap slow operations with useful work. Want to query both RDB and HDB at the same time and then merge the results? With asynchronous messaging, that&#8217;s the norm rather than the exception.</p><h4>Deferred Responses: Best of Both Worlds</h4><p>DefconQ readers should note that many real deployments use a hybrid approach: clients make <strong>synchronous</strong> requests to the gateway (since they expect a result), but the gateway uses <strong>asynchronous</strong> calls internally to backends. This lets the gateway juggle work efficiently while preserving a request&#8211;response model at the API boundary, synchronous from the client&#8217;s perspective but asynchronous under the hood.</p><h4>The Bigger Picture</h4><p>Choosing between synchronous and asynchronous isn&#8217;t just about RPC (Remote Procedure Call) semantics, it&#8217;s about <strong>keeping the gateway alive and responsive under load</strong>. If your gateway is blocked waiting for every downstream service, you have a serialization point that kills parallelism; if you embrace deferred/asynchronous messaging internally, you unlock far more scalability with relatively modest added complexity.</p><p><strong>TIP: </strong>If you would like to read more about Interprocess Communication (IPC) in KDB/Q, I have written two dedicated blog posts that explore the topic in more detail.<br><a href="https://www.defconq.tech/docs/concepts/ipc">Fundamentals of Interprocess Communication (IPC)</a><br><a href="https://www.defconq.tech/docs/concepts/ipcNextLevel">Beyond the Fundamentals: Next Level Interprocess Communications</a></p><h3>Resilience and Fault Tolerance</h3><p>A production-grade gateway shouldn&#8217;t fall apart just because a single downstream component has a bad day. In real systems, processes crash, networks hiccup, and services get overloaded, and the gateway is often the first line of defence against all of that. Instead of blindly forwarding requests, a resilient gateway actively monitors the health of its dependencies and adapts its behaviour when things go wrong. If a primary HDB becomes unavailable, the gateway can transparently route requests to a redundant replica. If an RDB is under heavy load, it may choose to return a degraded but still useful response rather than letting queries pile up and time out. And when no viable option exists, the gateway should fail gracefully, returning clear, informative errors instead of leaving users guessing. This is why robust gateways are typically paired with health checks, heartbeats, and well-defined fallback strategies, not just to keep the system running, but to keep it predictable and user-friendly under failure conditions.</p><h3>Caching in Gateways</h3><p>One of the most underappreciated, and often overlooked, enhancements in gateway design is smart caching. A well-placed cache allows the gateway to access or store the results of frequently requested queries and serve them directly without hitting downstream services every single time. When combined with sensible invalidation strategies, such as time-to-live (TTL) expiries or event-driven invalidation on data updates, caching can dramatically reduce unnecessary load on RDBs and HDBs. This is especially powerful for predictable or repetitive queries, dashboards, and reference-style lookups where freshness requirements are well understood. Importantly, caching is not about replacing your databases or hiding bad query patterns, it&#8217;s about complementing them. Used correctly, gateway-level caching can transform overall system performance, smooth out traffic spikes, and deliver consistently fast response times to end users.</p><h3>Observability: Because You Can&#8217;t Improve What You Don&#8217;t Measure</h3><p>A gateway should never be a black box. As the central coordination point of your KDB/Q stack, it has a unique view of how the system is actually being used, and that insight is far too valuable to ignore. A well-designed gateway exposes clear, actionable metrics such as request volume, latency distributions, error rates, service-level timeouts, and cache hit or miss ratios. These signals allow you to understand not just whether the system is up, but how it behaves under real load. When fed into dashboards and alerting systems, this data becomes the foundation for capacity planning, performance tuning, and rapid incident response. Without observability, you&#8217;re flying blind; with it, the gateway becomes one of your most powerful tools for continuously improving reliability and performance.</p><h3>Aggregating and Normalizing Results</h3><p>Even when data is distributed across multiple backends, users almost always expect a single, coherent answer. The gateway is the natural place to bring those pieces together. Rather than pushing complexity onto clients, the gateway can aggregate partial responses from different services, normalize schemas, and present a consistent, well-defined output format. This keeps client code simple and decoupled from the underlying data topology. As systems evolve, this aggregation layer becomes increasingly important: new data sources can be introduced, storage formats can change, and legacy services can be retired without breaking consumers. By absorbing that change and enforcing a stable contract at the boundary, the gateway provides continuity over time, and that stability often becomes one of the most valuable and underappreciated features of a well-designed gateway.</p><h2>Final Thoughts: A Gateway Is More Than a Middleman</h2><p>A well-designed gateway is not just a thin layer sitting between clients and data, it is the backbone of a responsive, secure, scalable, and maintainable KDB/Q ecosystem. It brings together data access, service health, security, performance, observability, and high-concurrency handling into a single, cohesive control plane. Whether your system serves ten users or ten thousand, the gateway ensures that clients can express what they need in a clean, consistent way, while backend services focus on doing their job efficiently and safely. If you&#8217;re building or scaling a real production system, putting a thoughtfully designed gateway in front of it isn&#8217;t merely a best practice, it&#8217;s a prerequisite for long-term success.</p><p>In our next blog post, we will look into a practical, hands-on implementation of a gateway. Until then, stay tuned, and happy coding.</p><h2>BONUS: Resources</h2><ul><li><p><a href="https://code.kx.com/q/wp/gateway-design/#synchronous-vs-asynchronous">KX Whitepaper: Common design principles for kdb+ gateways by Michael McClintock</a></p></li><li><p><a href="https://www.youtube.com/watch?v=7hpvQ7q_Rus">Mastering kdb+ Architecture: A Panel Discussion</a></p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[DefconQ Pro: From Competent to Confident]]></title><description><![CDATA[No Slides. No Fluff. Just Real-World KDB/Q.]]></description><link>https://defconq.substack.com/p/defconq-pro-from-competent-to-confident</link><guid isPermaLink="false">https://defconq.substack.com/p/defconq-pro-from-competent-to-confident</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Mon, 05 Jan 2026 11:55:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sxpy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!sxpy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!sxpy!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!sxpy!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!sxpy!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!sxpy!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!sxpy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:170047,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/183534992?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!sxpy!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!sxpy!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!sxpy!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!sxpy!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b8098a1-4e95-43b5-b173-755f79306f1a_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>After more than two years of creating content to help developers get started, level up, deepen their understanding or grow their skills in KDB/Q, and after receiving positive feedback and requests for something beyond blog-based, more structured support, it feels like the right time to take <strong>DefconQ</strong> one step further. This next chapter will introduce a set of new offerings designed for those who want to go deeper, move faster, and build with confidence, including services for ...</p><h2>... Students</h2><p>I would like to support a small number of motivated students each year by mentoring them through a project, dissertation, or other academic coursework. This would be open globally to <strong>two selected students</strong> (free of charge) who are genuinely curious, hardworking, and eager to get a head start by learning KDB/Q before graduation.<br><br>The project would need to be part of your academic requirements and aligned with your university&#8217;s guidelines. Depending on the setup, a discussion with a supervising professor or academic staff member may be required to make sure everything fits within the formal framework, but those details can be explored together.</p><h2>... Universities</h2><p>I am very happy to collaborate with universities in a variety of ways. This could range from guest lectures and industry talks, to hands-on masterclasses or workshops in KDB/Q, and depending on location and scope, even a full course offering.<br><br>The audience can come from disciplines such as Computer Science, Finance, Engineering, Physics, Mathematics, or Quantitative Finance, though it&#8217;s by no means limited to these. If this sounds interesting, feel free to reach out for an initial, informal conversation.</p><h2>... Professionals</h2><p>For professionals, I&#8217;m offering two structured, <strong>paid mentorship programs</strong>, depending on where you are in your journey.</p><h3>Career Mentorship</h3><p>This program is focused purely on career progression. It includes <strong>our one-hour one-to-one sessions</strong> where we will talk through <strong>your goals, the role you&#8217;re aiming for, and how to position yourself to get there.</strong> This could involve an internal move, a transition from sell-side to buy-side, a shift toward a more business-facing role, or any other direction you&#8217;d like to explore. This track does not include technical coaching, it&#8217;s all about clarity, strategy, and next steps.</p><h3>Technical Mentorship</h3><p>This program is designed for anyone looking to <strong>deepen their KDB/Q skills or transition into a KDB/Q role.</strong> Over the past months, I&#8217;ve been piloting this format and have helped developers with no prior KDB/Q experience ramp up and successfully move into KDB/Q positions. The program includes:</p><ul><li><p>An onboarding call to understand your background and goals</p></li><li><p>A personalised weekly study plan</p></li><li><p>Ten one-hour one-to-one sessions with me (one hour per week)</p></li></ul><p>Everything is tailored to your level and pace.</p><h2>... Conferences, Meetups, and Podcasts</h2><p>Over the past years, I have had the opportunity to speak at <strong>conferences, meetups, and podcasts</strong> such as <a href="https://www.alphaevents.com/events-futurealphaglobal">Quant Strats/Future Alpha</a>, <a href="https://kx.com/">KX events and livestreams</a>, <a href="https://www.fancyquantnation.com/">Fancy Quant podcast</a> with <a href="https://www.linkedin.com/in/dimitri-bianco/">Dimitri Bianco</a>, and <a href="https://www.engineering.cornell.edu/orie/2025/07/28/future-of-finance-and-ai-conference-on-roosevelt-island-september-19-2025/">Future of Finance &amp; AI Conference</a> hosted by <a href="https://www.linkedin.com/in/alexander-fleiss-70b49410/">Alexander Fleiss</a> of <a href="https://www.rebellionresearch.com/">Rebellion Research</a>. I am keen to continue these engagements throughout the year.<br><br>If you&#8217;re organising a conference, meetup, or podcast in fintech, finance, quantitative finance, or a related space, feel free to reach out and let&#8217;s see if there&#8217;s a good fit.</p><h2>... Sponsores</h2><p>I&#8217;m opening up a small number of sponsorship opportunities, including:</p><h3>DefconQ Happy Hours</h3><p>In 2025, I hosted DefconQ Happy Hours in <strong>London, Belfast, and New York</strong>, all of which turned out to be great community events. I am planning to continue these on a quarterly basis in 2026 and am looking for sponsors who&#8217;d like to support one of the events, typically by settling the tab.</p><h3>Sponsored Content</h3><p>DefconQ&#8217;s reach has grown beyond the core KDB/Q community and now spans a broader finance audience. If you&#8217;d like to promote your business in a subtle, thoughtful, and occasionally witty way, sponsoring a blog post could be a good option. There&#8217;s even a <strong>non-zero chance Adam Sandler might make a cameo</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!O7fC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!O7fC!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic 424w, /__u/substackcdn.com/image/fetch/$s_!O7fC!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic 848w, /__u/substackcdn.com/image/fetch/$s_!O7fC!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!O7fC!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!O7fC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1325749,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/183534992?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!O7fC!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic 424w, /__u/substackcdn.com/image/fetch/$s_!O7fC!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic 848w, /__u/substackcdn.com/image/fetch/$s_!O7fC!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!O7fC!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54a0fb4d-59df-4e21-924c-5a5abebfab86_2880x3840.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>... Everything Else</h2><p>If you&#8217;re interested in engaging with DefconQ but don&#8217;t see something that directly matches your situation above, don&#8217;t worry. Just drop me a message. I&#8217;m always happy to chat and explore ideas together, sometimes the best things come from conversations that weren&#8217;t planned in advance.</p><h2>Why Now</h2><p>Now is an especially good time to take advantage of the <strong>DefconQ Pro offerings</strong>. Over the past year, <strong>demand for KDB/Q developers</strong> has <strong>not only increased but reached its highest level in several years</strong>. As data volumes continue to grow, the <strong>need for engineers who can work efficiently with high-performance time-series</strong> systems grows with it. While opportunities exist across <strong>all experience levels</strong>, there has been a <strong>clear preference for mid-to-senior-level</strong> developers, those who can design, build, and reason about real systems.</p><p><strong>DefconQ Pro</strong> is designed to help you close that gap and position yourself exactly where the market demand is strongest.</p><h2>Why DefconQ</h2><p>Choosing <strong>DefconQ</strong> means learning KDB/Q from a <strong>practical, real-world perspective</strong>. Everything is grounded in <strong>hands-on experience</strong>, from building full tick stacks and analytics engines to designing scalable architectures used in production environments. The focus isn&#8217;t on isolated syntax or academic examples, but on understanding <em><strong>why</strong></em>systems are built the way they are and how to apply that knowledge with confidence. Based on years of experience not only building systems but also mentoring, upskilling, and teaching developers KDB/Q, DefconQ offers a level of guidance that&#8217;s hard to find elsewhere. Ultimately, the results speak for themselves.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!hjls!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!hjls!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic 424w, /__u/substackcdn.com/image/fetch/$s_!hjls!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic 848w, /__u/substackcdn.com/image/fetch/$s_!hjls!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!hjls!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!hjls!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic" width="862" height="994" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:994,&quot;width&quot;:862,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:105680,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/183534992?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!hjls!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic 424w, /__u/substackcdn.com/image/fetch/$s_!hjls!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic 848w, /__u/substackcdn.com/image/fetch/$s_!hjls!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!hjls!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef4a007-c4bb-4b08-9e74-6a09cb0b5fa9_862x994.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!xbP6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!xbP6!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic 424w, /__u/substackcdn.com/image/fetch/$s_!xbP6!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic 848w, /__u/substackcdn.com/image/fetch/$s_!xbP6!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!xbP6!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!xbP6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic" width="680" height="544" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:544,&quot;width&quot;:680,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68506,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/183534992?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!xbP6!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic 424w, /__u/substackcdn.com/image/fetch/$s_!xbP6!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic 848w, /__u/substackcdn.com/image/fetch/$s_!xbP6!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!xbP6!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc42fcc05-2232-4790-bfef-7a7107968d2b_680x544.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Who This is For</h2><p>DefconQ Pro is designed for highly motivated individuals who are serious about progressing their careers and deepening their KDB/Q expertise. It&#8217;s for developers who are willing to put in the work required to succeed in a competitive space and who want to leverage focused guidance to reach their goals faster and more efficiently. If you&#8217;re proactive, curious, and committed to improving, DefconQ Pro is built to support you on that journey.</p><h2>What DefconQ Pro Is Not</h2><p>DefconQ Pro is not a passive, &#8220;attend-only&#8221; or click-through program with guaranteed outcomes. There are no shortcuts, you have to do the work and take ownership of your progress. It&#8217;s also not a recruiting service or a guaranteed path to a KDB/Q role. While the program can significantly improve your skills, confidence, and interview readiness, success ultimately depends on you showing up, performing, and earning the role yourself.</p><h2>How To Apply</h2><p>If you&#8217;re ready to commit to this journey and are interested in any of the DefconQ Pro offerings, feel free to get in touch via email <a href="mailto:defconqpro@gmail.com">defconqpro@gmail.com</a> or LinkedIn message <a href="https://www.linkedin.com/in/alexanderunterrainer/">here</a>. As availability is limited, applications are carefully reviewed to ensure a strong fit on both sides. To keep the process efficient, please include your LinkedIn profile or CV when reaching out.</p>]]></content:encoded></item><item><title><![CDATA[Nasdaq Extends Trading Hours - What It Really Means for Market Data Systems]]></title><description><![CDATA[Always On, Never Quiet: Architecting Market Data Systems for Longer Trading Days]]></description><link>https://defconq.substack.com/p/nasdaq-extends-trading-hours-what</link><guid isPermaLink="false">https://defconq.substack.com/p/nasdaq-extends-trading-hours-what</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Wed, 17 Dec 2025 11:55:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eJEa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Yesterday (2025.12.16) <strong><a href="https://www.reuters.com/business/finance/nasdaq-seeks-extend-trading-hours-wall-street-gears-up-247-move-2025-12-15/">Nasdaq announced an extension of its trading hours</a></strong>, a move that once again reshapes how modern markets operate. While headlines focus on increased accessibility and global participation, the real impact is felt much deeper in the technology stacks that power trading, analytics, and risk systems. Extending trading hours is <em><strong>not</strong></em> just a business or regulatory change. It&#8217;s a <strong>data engineering problem.</strong> And a non-trivial one. In this post, I want to unpack what extended trading hours actually mean from a <strong>technical perspective</strong>, why many traditional data architectures will struggle, and why systems built with <strong>KDB/Q</strong> (or KDB-X) are particularly well suited to absorb this change without breaking a sweat.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!eJEa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!eJEa!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic 424w, /__u/substackcdn.com/image/fetch/$s_!eJEa!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic 848w, /__u/substackcdn.com/image/fetch/$s_!eJEa!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!eJEa!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!eJEa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic" width="720" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86324,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181876884?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!eJEa!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic 424w, /__u/substackcdn.com/image/fetch/$s_!eJEa!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic 848w, /__u/substackcdn.com/image/fetch/$s_!eJEa!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!eJEa!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbb3667-04a2-4955-ae3d-1ccbe6068566_720x480.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>What Changed: More Time, More Data, Same Expectations</h2><p>Historically, markets had well-defined trading sessions. Systems were designed around them:</p><ul><li><p>A clear <strong>start of day</strong></p></li><li><p>A clear <strong>end of day</strong></p></li><li><p>Overnight batch processes</p></li><li><p>Predictable data volumes</p></li><li><p>Fixed intraday windows for analytics</p></li></ul><p>Extended trading hours fundamentally challenge these assumptions. From a systems perspective, this means:</p><ul><li><p><strong>Longer continuous data streams</strong></p></li><li><p><strong>Higher total daily data volume</strong></p></li><li><p><strong>More intraday state to manage</strong></p></li><li><p><strong>Fewer clean reset points</strong></p></li><li><p><strong>Increased overlap across regions and venues</strong></p></li></ul><p>And crucially: <strong>Latency, throughput, and availability expectations do not relax just because the day is longer.</strong></p><h2>The Hidden Cost: Volume Isn&#8217;t Linear</h2><p>A common mistake is to assume that extending trading hours simply increases volume <em><strong>linearly</strong></em>. In practice, it often doesn&#8217;t. Extended hours introduce:</p><ul><li><p>Higher <strong>market fragmentation</strong></p></li><li><p>More <strong>algorithmic and automated participation</strong></p></li><li><p>Increased <strong>event-driven bursts</strong> (news, macro, cross-venue reactions)</p></li><li><p>Longer periods where <strong>real-time analytics</strong> must stay hot</p></li></ul><p>That means <strong>more ticks, more state, more joins, more aggregations, and more pressure on memory and compute</strong>.</p><p>Systems that were &#8220;just about fast enough&#8221; during regular hours may suddenly fall over.</p><h2>Why Many Databases Will Struggle</h2><p>Most modern data stacks weren&#8217;t designed for <em><strong>continuous, high-frequency, time-series workloads.</strong></em></p><h3>1. Row Based Storage</h3><p>Row-oriented systems are <strong>inefficient</strong> when queries scan time ranges <strong>across a small number of columns</strong>, which is exactly what market data workloads do.</p><h3>2. Disk-First Architectures</h3><p>Systems that rely heavily on disk I/O, even with caching, struggle when <strong>real-time queries and ingestion</strong> happen simultaneously over extended periods.</p><h3>3. Complex Streaming Pipelines</h3><p>Many stacks glue together:</p><ul><li><p>A streaming layer</p></li><li><p>A storage layer</p></li><li><p>A compute layer</p></li><li><p>A query layer</p></li></ul><p>Each boundary adds latency, failure modes, and operational complexity.</p><h3>4. Overnight Assumptions</h3><p>Batch jobs, rollovers, save-downs, and re-indexing jobs often assume a quiet overnight window. Extended trading hours shrink, or eliminate, that window entirely.</p><h2>Why KDB Handles This Naturally</h2><p>This is where <strong>KDB/Q stands apart</strong>, not because it&#8217;s <em><strong>&#8220;fast&#8221;</strong></em>, but because of how it&#8217;s designed.</p><h3>1. Built for Continuous Time-Series</h3><p>KDB/Q is not a database that supports time-series. It is a time-series system by design.</p><ul><li><p>Data is stored in vectors/arrays</p></li><li><p>Time is a first-class concept</p></li><li><p>Vector operations are second nature</p></li><li><p>Queries scale with time ranges, not table size</p></li></ul><p>Longer trading hours <em>simply mean more rows</em>. The access pattern doesn&#8217;t change.</p><h3>2. In-Memory First, Disk as an Optimization</h3><p>KDB/Q&#8217;s architecture cleanly separates:</p><ul><li><p>Real-time data (RDB), in memory</p></li><li><p>Historical data (HDB), memory-mapped on disk</p></li></ul><p>Extended trading hours don&#8217;t require redesigning the system. They just change <strong>how long the RDB stays hot and how often data is persisted.</strong></p><p>Memory-mapped storage ensures:</p><ul><li><p>No deserialization overhead</p></li><li><p>No ORM layers</p></li><li><p>No impedance mismatch between memory and disk</p></li></ul><h3>3. Streaming Is Native, Not Bolted On</h3><p>In KDB/Q, streaming isn&#8217;t an add-on, it&#8217;s the default.</p><ul><li><p>IPC is lightweight and event-driven</p></li><li><p>Subscribers process updates as they arrive</p></li><li><p>Backpressure patterns (e.g. chained tickerplants) are well understood</p></li></ul><p>Whether the market trades for 6 hours or 20 hours is largely irrelevant. The system is already designed to run (almost) continuously.</p><h3>4. Analytics Live Where the Data Lives</h3><p>This becomes even <em>more important</em> with longer trading days. Instead of:</p><blockquote><p>&#8220;Pull all the data out, then analyze it somewhere else&#8221;</p></blockquote><p>KDB/Q allows:</p><blockquote><p>&#8220;Run the analytics where the data already is&#8221;</p></blockquote><p>That means:</p><ul><li><p>Smaller result sets over the network</p></li><li><p>Lower bandwidth pressure</p></li><li><p>Faster response times</p></li><li><p>More predictable performance</p></li></ul><p>Extended trading hours amplify the cost of moving data. KDB avoids that cost entirely.</p><h2>Operational Reality: Fewer Moving Parts Win</h2><p>When markets run longer, <strong>operational simplicity matters more than ever.</strong> KDB/Q based systems typically replace:</p><ul><li><p>Streaming frameworks</p></li><li><p>Online Analytical Processing (OLAP) engines</p></li><li><p>Time-series databases</p></li><li><p>Analytics runtimes</p></li></ul><p>... with <strong>ONE COHERENT SYSTEM</strong></p><p>That matters when:</p><ul><li><p>Monitoring windows are longer</p></li><li><p>Failure recovery must be faster</p></li><li><p>Engineers are on-call for extended periods</p></li><li><p>Systems must degrade gracefully, not catastrophically</p></li></ul><h2>This Is a Trend, Not a One-Off</h2><p>Nasdaq extending trading hours isn&#8217;t an isolated event. Already towards the end of last year, we saw the New York Stock Exchange extend its trading hours (Read my blog post <a href="https://www.defconq.tech/blog/NYSE%20extends%20trading%20hours">here</a>). Most cryptocurrency exchanges already operate 24/7, and it&#8217;s clear that more traditional exchanges will follow this trend. We&#8217;re seeing:</p><ul><li><p>More global overlap</p></li><li><p>More electronic liquidity</p></li><li><p>More automation</p></li><li><p>More demand for always-on systems</p></li></ul><p>Markets are moving closer to continuous operation. Architectures that depend on:</p><ul><li><p>Quiet periods</p></li><li><p>Batch windows</p></li><li><p>Heavy ETL</p></li><li><p>Complex pipelines ... will increasingly struggle to keep up.</p></li></ul><h2>Final Thoughts</h2><p>Extended trading hours are a <strong>stress test</strong> for market data architectures. They expose:</p><ul><li><p>Hidden assumptions</p></li><li><p>Scalability limits</p></li><li><p>Operational fragility</p></li></ul><p>Systems built with <strong>KDB/Q</strong> (KDB-X) don&#8217;t need to be reinvented for this shift. They were already designed for it. If anything, changes like this highlight <em><strong>why</strong></em> KDB/Q has remained dominant in high-performance market data systems for decades, not because it&#8217;s fashionable, but because it solves the right problems at the right level of abstraction. And as markets keep pushing toward longer, faster, and more continuous trading, those design choices matter more than ever.</p><p>If you need help designing or architecting your KDB/Q system, feel free to reach out! Happy to chat. Until then, happy coding.</p><p><strong>Reference</strong>: <a href="https://www.reuters.com/business/finance/nasdaq-seeks-extend-trading-hours-wall-street-gears-up-247-move-2025-12-15/">Reuters: Nasdaq seeks to extend trading hours, as Wall Street gears up for 24/7 move</a></p>]]></content:encoded></item><item><title><![CDATA[Pulse Powered Alpha: Building your First Trading Strategy with KDB-X and Pulse]]></title><description><![CDATA[Analytics, Backtesting, and Dashboards: Supercharged by KDB-X and Pulse]]></description><link>https://defconq.substack.com/p/pulse-powered-alpha-building-your</link><guid isPermaLink="false">https://defconq.substack.com/p/pulse-powered-alpha-building-your</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Thu, 11 Dec 2025 12:00:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5SOK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the previous tutorials, we explored how to build a Tickerplant, pull real-time market data from providers like Yahoo and <a href="https://databento.com/">Databento</a>, and create a research-focused historical database. Now it&#8217;s time to bring all these pieces together. In this tutorial, we&#8217;ll build our first (simple) trading strategy, visualize it in a dashboard, and even demonstrate how to create a backtesting engine to evaluate its performance.</p><p>Here&#8217;s what the final dashboard will look like.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5SOK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5SOK!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic 424w, /__u/substackcdn.com/image/fetch/$s_!5SOK!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic 848w, /__u/substackcdn.com/image/fetch/$s_!5SOK!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!5SOK!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5SOK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic" width="1456" height="837" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:837,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:162801,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5SOK!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic 424w, /__u/substackcdn.com/image/fetch/$s_!5SOK!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic 848w, /__u/substackcdn.com/image/fetch/$s_!5SOK!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!5SOK!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbb4a16c-960f-4fae-98a9-0570543e833d_1917x1102.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Before We Dive In: Gearing Up for the Strategy Build</h2><p>Since we&#8217;ll be reusing parts of the code introduced in earlier tutorials, it&#8217;s helpful to familiarise yourself with those foundations, they&#8217;re explained in detail and will make this tutorial much easier to follow. Don&#8217;t worry, though: all new additions will be fully explained as we go. To visualise our trading strategy and build the dashboard, you&#8217;ll also need to install <strong>Pulse</strong>. Installation instructions are provided below.</p><p><strong>Prerequisites:</strong></p><ol><li><p>Review the previous tutorials to understand the core building blocks we&#8217;ll build on</p><ul><li><p><a href="https://www.defconq.tech/docs/tutorials/tick">KDB Tick Explained: A Walkthrough [PART 1]</a></p></li><li><p><a href="https://www.defconq.tech/docs/tutorials/tick2">KDB Tick Explained: A Walkthrough [PART 2]</a></p></li><li><p><a href="https://www.defconq.tech/docs/tutorials/researchHDB">Back to the Future: Building Your Research HDB for Stock Market Insights</a></p></li><li><p><a href="https://www.defconq.tech/docs/architecture/plain">The Plain Vanilla Tick Setup</a></p></li></ul></li><li><p>Install Pulse: Follow the instructions <a href="https://www.timestored.com/pulse/">here</a></p></li></ol><h2>Blueprints Before Code: Designing Your Trading Engine the Right Way</h2><p>Before we jump into writing any code, it&#8217;s worth pausing to look at the most critical part of building any solid application: <strong>the architecture</strong>. Even a small, <em>simple</em> system benefits enormously from a clean, extensible design. With that mindset, here&#8217;s how we&#8217;ll structure our trading engine:</p><ul><li><p><strong>Data Ingestion:</strong> A dedicated process responsible for feeding market data into our Tickerplant.</p></li><li><p><strong>Tickerplant:</strong> The heartbeat of every KDB-X application. It streams incoming data to all real-time subscribers and writes each update to a Tickerplant Log file, ensuring the system can recover seamlessly if needed.</p></li><li><p><strong>Complex Event Processing Engine (CEP):</strong> This component serves as our trading engine, executing the strategy logic and generating signals based on the incoming data.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Vem5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Vem5!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Vem5!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Vem5!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Vem5!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Vem5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic" width="651" height="461" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d829202e-951a-4f99-8718-e5625b01430b_651x461.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:461,&quot;width&quot;:651,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11156,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Vem5!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Vem5!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Vem5!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Vem5!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd829202e-951a-4f99-8718-e5625b01430b_651x461.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Feeding the Beast: Bringing Data Into Your Trading Engine</h2><p>For this tutorial, we&#8217;ll use end-of-day files from Yahoo Finance, the same dataset we worked with in an earlier tutorial. You can reuse those files or download fresh ones if you prefer. We&#8217;ll write a function that loads these files into memory and publishes the data to our Tickerplant. And since we also want to build a backtesting engine, we&#8217;ll stream the historical data on a timer to simulate a &#8220;time-lapse&#8221; playback of market history.</p><p>Let&#8217;s get started.</p><p>First, we define the table schema for the data we want to load and gather the filenames of all historical data files into a variable. When following along, remember to update the file path to match the location of your own data. Also make sure that the folder contains only data files, as the <code>key</code> operator will list everything inside that directory.</p><pre><code><code>// Define table schema for data we are going to load
data:([] time:`timestamp$(); sym:`symbol$(); feedHandlerTime: `timestamp$(); open: `float$(); high: `float$(); low: `float$(); close: `float$(); volume: `long$());

// List of files we want to load (Change this path to your file location. Note:folder should only contain your data as everything in the folder will be loaded)
fileList:key `$&#8221;:/Users/alexanderunterrainer/repos/defconQ/projects/tradingStrategy/stock_data&#8221;;

loadData:{[file]
    // Extract the name of the stock from the file name
    name:`$first &#8220;_&#8221; vs string file;
    // Load the data for the specific file, update the sym column with the stock name and a feedHandlerTime
    `data insert update sym:name,`timestamp$`date$time,feedHandlerTime:time from `time`open`high`low`close`volume xcol (&#8221;PFFFFJ&#8221;;enlist csv) 0:hsym file;
 };</code></code></pre><p>After defining our function, we can run it</p><pre><code><code>q)loadData each fileList;</code></code></pre><p>Before we can start streaming any data, we first need to bring up the Tickerplant. For this tutorial, we&#8217;re using an even more stripped-down version of the plain vanilla Tickerplant. If you&#8217;d like a detailed, line-by-line explanation of how it works, check out my walkthrough linked <a href="https://www.defconq.tech/docs/tutorials/tick">here</a>.</p><p>For now, let&#8217;s go ahead and start the Tickerplant.</p><pre><code><code>alexanderunterrainer@Mac:~/repos/defconQ/projects/tradingStrategy|master&#9889; &#8658;  qx tick.q sym . -p 5010
KDB-X 0.1.1 2025.09.29 Copyright (C) 1993-2025 Kx Systems
q)stocks
time sym feedHandlerTime open high low close volume
---------------------------------------------------
q)</code></code></pre><p>Once the Tickerplant is up and running, we can connect to it using <code>hopen</code>, which creates a connection handle between our feed handler and the Tickerplant. From there, we&#8217;re able to publish our data. Since we haven&#8217;t started any real-time subscribers yet, the Tickerplant will simply write the updates to its log file without broadcasting them to any subscribers.</p><pre><code><code>q)h:hopen 5010
q)h(`.u.upd;`stocks;data)</code></code></pre><p>Now that our data pipeline is in place, it&#8217;s time to build the Complex Event Processing Engine that will execute our trading strategy.</p><h2>Complex Event Processing Engine (CEP): Effortless Business Logic in Motion</h2><p>For our trading strategy, we&#8217;ll implement a straightforward moving average crossover model. It uses two averages: a short-term 50-day moving average and a long-term 200-day one. The signal rules are simple: when the short average crosses above the long average, we generate a buy signal; when it crosses below, we trigger a sell signal. This captures the classic idea that prices tend to revert toward their longer-term trend over time.</p><p>Calculating the moving averages couldn&#8217;t be easier, KDB-X gives us the <code>mavg</code> keyword out of the box. This is another perfect example of why it excels at analytical workloads. Using <code>mavg</code>, we can directly update our table with both moving averages. The only detail to watch out for is that our dataset contains multiple symbols, so we need to compute the averages for each symbol. That&#8217;s easily achieved using a <code>by</code> clause as you can see in the line below</p><pre><code><code>q)update sma50:mavg[50;close],sma200:mavg[200;close] by sym from `stocks
`stocks</code></code></pre><p>So far so good, we&#8217;ve made solid progress. But now it&#8217;s time to bring our data to life. Let&#8217;s start building our dashboard. As a reminder, this is what the final result will look like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!vBZV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!vBZV!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic 424w, /__u/substackcdn.com/image/fetch/$s_!vBZV!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic 848w, /__u/substackcdn.com/image/fetch/$s_!vBZV!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!vBZV!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!vBZV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic" width="1456" height="837" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:837,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:162801,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!vBZV!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic 424w, /__u/substackcdn.com/image/fetch/$s_!vBZV!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic 848w, /__u/substackcdn.com/image/fetch/$s_!vBZV!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!vBZV!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7736d69d-0d56-4246-a579-9b2540c9c424_1917x1102.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Pulse: The Catwalk for Your Data Model</h2><p>For those who know me, I&#8217;m much more of a backend person, I usually steer clear of UI and front-end work. But Pulse is so simple and intuitive that even I found myself <em><strong>almost</strong></em> enjoying the UI side of things. Once you&#8217;ve installed Pulse (installation guide linked <a href="https://www.timestored.com/pulse/">here</a>), you can launch it directly from your terminal. This opens a new tab in your browser where you can begin designing your dashboard. The first step is to set up a connection to the KDB-X process that holds our data.</p><pre><code><code>// Start Pulse from your terminal. This will launch Pulse and open the landing page
alexanderunterrainer@Mac:~|&#8658;  java -jar pulse.jar</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!LYB-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!LYB-!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic 424w, /__u/substackcdn.com/image/fetch/$s_!LYB-!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic 848w, /__u/substackcdn.com/image/fetch/$s_!LYB-!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!LYB-!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!LYB-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic" width="1456" height="702" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:702,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:135549,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!LYB-!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic 424w, /__u/substackcdn.com/image/fetch/$s_!LYB-!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic 848w, /__u/substackcdn.com/image/fetch/$s_!LYB-!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!LYB-!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2221ea57-b0b4-4605-9a29-4d2691dd6def_1917x924.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now let&#8217;s create a new connection by specifying the host and port. In our example, the process is running on <code>localhost</code> using port <code>5001</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Uj1x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Uj1x!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Uj1x!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Uj1x!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Uj1x!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Uj1x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic" width="1065" height="975" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:975,&quot;width&quot;:1065,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:67869,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Uj1x!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Uj1x!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Uj1x!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Uj1x!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a6c2f8-995e-4712-ac1c-7eb29cccb7a1_1065x975.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>With the connection configured, we can move on to creating our dashboard. Go ahead and add a new one to get started.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!erUs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!erUs!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic 424w, /__u/substackcdn.com/image/fetch/$s_!erUs!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic 848w, /__u/substackcdn.com/image/fetch/$s_!erUs!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!erUs!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!erUs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic" width="1217" height="318" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:318,&quot;width&quot;:1217,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:27396,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!erUs!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic 424w, /__u/substackcdn.com/image/fetch/$s_!erUs!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic 848w, /__u/substackcdn.com/image/fetch/$s_!erUs!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!erUs!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf7ac30-9c5f-4d08-9308-562aa7ec6512_1217x318.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A new dashboard will open in design mode, and we can start adding components right away. I&#8217;m a big believer in the &#8220;low-hanging fruit principle&#8221;, tackle the easiest wins first. So let&#8217;s begin by charting the volume. Before that, though, let&#8217;s quickly save and rename our dashboard.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!c6dK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!c6dK!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic 424w, /__u/substackcdn.com/image/fetch/$s_!c6dK!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic 848w, /__u/substackcdn.com/image/fetch/$s_!c6dK!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!c6dK!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!c6dK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic" width="500" height="372" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:372,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:15482,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!c6dK!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic 424w, /__u/substackcdn.com/image/fetch/$s_!c6dK!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic 848w, /__u/substackcdn.com/image/fetch/$s_!c6dK!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!c6dK!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc62352db-1145-4c1c-86bc-1d52e531560d_500x372.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Once that&#8217;s done, click the <strong>Time Series</strong> button in the top panel to add a new time-series chart.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!VQJd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!VQJd!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic 424w, /__u/substackcdn.com/image/fetch/$s_!VQJd!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic 848w, /__u/substackcdn.com/image/fetch/$s_!VQJd!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!VQJd!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!VQJd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic" width="1456" height="173" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:173,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20017,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!VQJd!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic 424w, /__u/substackcdn.com/image/fetch/$s_!VQJd!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic 848w, /__u/substackcdn.com/image/fetch/$s_!VQJd!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!VQJd!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa38f70dd-8291-4a70-aa35-5f9a7847c075_1522x181.heic 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Pulse will generate a placeholder chart with simulated data, which we can now replace by updating the query to display the volume we&#8217;re interested in.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!UkW8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!UkW8!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic 424w, /__u/substackcdn.com/image/fetch/$s_!UkW8!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic 848w, /__u/substackcdn.com/image/fetch/$s_!UkW8!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!UkW8!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!UkW8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic" width="1456" height="817" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:817,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:141963,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!UkW8!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic 424w, /__u/substackcdn.com/image/fetch/$s_!UkW8!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic 848w, /__u/substackcdn.com/image/fetch/$s_!UkW8!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!UkW8!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F183f00a2-c76c-4ff9-9403-66a4ceb30ec8_1920x1078.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><pre><code><code>// Query for volume</code>
<code>`time xasc select time,volume from stocks</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Aljh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Aljh!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Aljh!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Aljh!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Aljh!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Aljh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:123098,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Aljh!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Aljh!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Aljh!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Aljh!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4cb3802-b642-4ee8-9bff-f671e785fdda_1916x1070.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hold on, something looks off. There are far too many data points, and the volume fluctuations don&#8217;t make much sense. That&#8217;s because our <code>stocks</code> table contains data for multiple symbols, so when we chart the volume directly, we&#8217;re plotting everything at once. The fix is simple: we add a dropdown selector so we can choose the specific stock we want to display.</p><p>To do this, add a <strong>User Form</strong>. Click the <strong>User Form button</strong> in the top panel and place it above your volume chart. Then, in the Form Editor on the right, add a Dropdown component. We can populate the dropdown with our stock symbols by running a simple KDB-X query. Details below.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Fmfm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Fmfm!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Fmfm!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Fmfm!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Fmfm!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Fmfm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic" width="1456" height="838" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:838,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:101405,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Fmfm!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Fmfm!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Fmfm!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Fmfm!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5101c0e2-f8f2-427b-aaaf-140a46269399_1920x1105.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><pre><code><code>asc select distinct sym from stocks</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!GXKj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!GXKj!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic 424w, /__u/substackcdn.com/image/fetch/$s_!GXKj!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic 848w, /__u/substackcdn.com/image/fetch/$s_!GXKj!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!GXKj!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!GXKj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic" width="1287" height="569" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:569,&quot;width&quot;:1287,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32580,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!GXKj!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic 424w, /__u/substackcdn.com/image/fetch/$s_!GXKj!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic 848w, /__u/substackcdn.com/image/fetch/$s_!GXKj!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!GXKj!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb920f4f1-7148-4195-b520-1efb5a5b93d6_1287x569.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!03Et!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!03Et!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic 424w, /__u/substackcdn.com/image/fetch/$s_!03Et!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic 848w, /__u/substackcdn.com/image/fetch/$s_!03Et!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!03Et!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!03Et!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic" width="459" height="628" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:628,&quot;width&quot;:459,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16453,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!03Et!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic 424w, /__u/substackcdn.com/image/fetch/$s_!03Et!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic 848w, /__u/substackcdn.com/image/fetch/$s_!03Et!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!03Et!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51992191-a566-4442-86ba-e39d11b7e1ee_459x628.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>All that&#8217;s left is to connect the dropdown to our volume chart so that selecting a symbol updates the chart accordingly. We can do this by referencing the dropdown&#8217;s assigned key directly in the chart&#8217;s query. The updated query looks like this:</p><pre><code><code>`time xasc select time,volume from stocks where sym=`${{key1}}</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!u5sN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!u5sN!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic 424w, /__u/substackcdn.com/image/fetch/$s_!u5sN!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic 848w, /__u/substackcdn.com/image/fetch/$s_!u5sN!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!u5sN!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!u5sN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic" width="1456" height="839" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:839,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:115123,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!u5sN!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic 424w, /__u/substackcdn.com/image/fetch/$s_!u5sN!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic 848w, /__u/substackcdn.com/image/fetch/$s_!u5sN!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!u5sN!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F928e69b1-aece-429c-94f0-6d68fbd6b5c3_1914x1103.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Not too bad, right? Since our historical dataset spans several decades, it&#8217;s useful to control how much of it we display at once. Let&#8217;s add another dropdown to let us choose the time range. Later, when we switch to real-time backtesting, this dropdown won&#8217;t be needed anymore and can be removed.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>We start by adding another dropdown to choose the date range we want to display. This time, instead of populating the options with a Q-SQL query, we simply hard-code a list of day counts that correspond to 1, 2, 3, 5, 7, 10, and 15 years. We also include a large value to allow selecting the full time series.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!nIKP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!nIKP!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic 424w, /__u/substackcdn.com/image/fetch/$s_!nIKP!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic 848w, /__u/substackcdn.com/image/fetch/$s_!nIKP!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!nIKP!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!nIKP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic" width="702" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:702,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:22346,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!nIKP!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic 424w, /__u/substackcdn.com/image/fetch/$s_!nIKP!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic 848w, /__u/substackcdn.com/image/fetch/$s_!nIKP!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!nIKP!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2a5bc6e-2618-4783-a8c7-cc43e82983f0_702x485.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!MHqO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!MHqO!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic 424w, /__u/substackcdn.com/image/fetch/$s_!MHqO!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic 848w, /__u/substackcdn.com/image/fetch/$s_!MHqO!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!MHqO!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!MHqO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic" width="291" height="445" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:445,&quot;width&quot;:291,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10099,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!MHqO!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic 424w, /__u/substackcdn.com/image/fetch/$s_!MHqO!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic 848w, /__u/substackcdn.com/image/fetch/$s_!MHqO!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!MHqO!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fa50b8-5bc4-4aec-ba10-f2b89005eeba_291x445.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Next, we update the volume query to incorporate the dropdown&#8217;s key so the chart adjusts based on the selected range. For a small visual upgrade, we switch the chart from a <strong>line plot</strong> to a <strong>bar chart</strong>, and just like that, we have a clean, intuitive volume visualization for our stocks.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!J1z6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!J1z6!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic 424w, /__u/substackcdn.com/image/fetch/$s_!J1z6!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic 848w, /__u/substackcdn.com/image/fetch/$s_!J1z6!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!J1z6!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!J1z6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic" width="700" height="466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:466,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:15055,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!J1z6!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic 424w, /__u/substackcdn.com/image/fetch/$s_!J1z6!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic 848w, /__u/substackcdn.com/image/fetch/$s_!J1z6!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!J1z6!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8a10a5-4e16-42c6-b4c9-4ad9eefb31b9_700x466.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><pre><code><code>-{{key2}}#select time,volume from stocks where sym=`${{key1}}</code></code></pre><p>Alright, with the volume chart in place, it&#8217;s time to move on to the price chart and start implementing our trading strategy. As before, we&#8217;ll tackle the easy part first, plotting the price series along with the moving averages.</p><p>Just like we did for the volume chart, we&#8217;ll add a new time-series component and define a Q-SQL query that selects the <code>time</code>, <code>close</code>, <code>sma50</code> (50-day simple moving average), and <code>sma200</code> (200-day simple moving average). As before, we&#8217;ll use the values from our drop-downs to limit the chart to a specific stock and chosen time range.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!GO-n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!GO-n!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic 424w, /__u/substackcdn.com/image/fetch/$s_!GO-n!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic 848w, /__u/substackcdn.com/image/fetch/$s_!GO-n!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!GO-n!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!GO-n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic" width="1456" height="523" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:523,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91918,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!GO-n!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic 424w, /__u/substackcdn.com/image/fetch/$s_!GO-n!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic 848w, /__u/substackcdn.com/image/fetch/$s_!GO-n!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!GO-n!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e5af6c3-19fd-4ac4-a26e-7c6045c4571c_1919x689.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And just like that, we now have a clean visual of the price data alongside both moving averages. But how do we turn this into trading signals? Our rules are simple:</p><ul><li><p><strong>buy</strong> when the short-term moving average (<code>sma50</code>) crosses above the long-term average (<code>sma200</code>).</p></li><li><p><strong>sell</strong> when the short-term moving average (<code>sma50</code>) crosses below the long-term average (<code>sma200</code>).</p></li></ul><p>Instead of jumping straight into solving this on our full dataset, let&#8217;s first strip the problem down and build the logic step by step. We&#8217;ll start with two simple lists: one for the short moving average and one for the long moving average:</p><ul><li><p><code>s: 3 7 8 12 10 11 9 7</code> (short MA)</p></li><li><p><code>l: 5 9 10 11 8 7 12 13</code> (long MA)</p></li></ul><p>First, we subtract the long moving average <code>l</code> from the short moving average <code>s</code>. This tells us whether the short MA is above or below the long MA at each point.</p><p>Next, we apply the built-in <code>signum</code> function to that result. <code>signum</code> returns <code>-1</code> for <strong>negative</strong> values, <code>1</code> for <strong>positive</strong> values, and <code>0</code>when the input is <strong>zero</strong>. We then compare this list against <code>0</code> to get a boolean mask indicating where the short MA is below the long MA. This effectively captures when the relationship between the two averages flips from negative to positive (or the other way around).</p><p>Finally, we use <code>deltas</code> on this boolean sequence to generate our trading signals:</p><ul><li><p>A delta of <code>+1</code> &#8594; we buy</p></li><li><p>A delta of <code>-1</code> &#8594; we sell</p></li><li><p>A delta of <code>0</code> &#8594; we do nothing</p></li></ul><pre><code><code>q)s:3 7 8 12 10 11 9 7
q)l:5 9 10 11 8 7 12 13
q)s-l
-2 -2 -2 1 2 4 -3 -6
q)signum s-l
-1 -1 -1 1 1 1 -1 -1i
q)0&lt;signum s-l
00011100b
q)deltas 0&lt;signum s-l
0 0 0 1 0 0 -1 0i
q)1+deltas 0&lt;signum s-l
1 1 1 2 1 1 0 1
q)`sell`doNothing`buy 1+deltas 0&lt;signum s-l
`doNothing`doNothing`doNothing`buy`doNothing`doNothing`sell`doNothing</code></code></pre><p>The final step is to use the <code>deltas</code> output as an index into a list of symbols, allowing us to map the numeric values directly to their corresponding trading signals.</p><p>Now let&#8217;s integrate the signal-generation logic into our dashboard so we can produce a chart like the one shown below. It&#8217;s not particularly complicated, but it does require a few lines of code. We&#8217;ll also take advantage of some built-in Pulse features to display those nice visual marker, bubbles that highlight each buy or sell signal right on the chart.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!G6ZC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!G6ZC!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic 424w, /__u/substackcdn.com/image/fetch/$s_!G6ZC!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic 848w, /__u/substackcdn.com/image/fetch/$s_!G6ZC!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!G6ZC!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!G6ZC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic" width="1456" height="521" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:521,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:76708,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!G6ZC!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic 424w, /__u/substackcdn.com/image/fetch/$s_!G6ZC!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic 848w, /__u/substackcdn.com/image/fetch/$s_!G6ZC!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!G6ZC!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F823166b4-a09a-4c15-a079-3bf194b6ec3c_1916x685.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Pulse is extremely flexible and even lets you write logic directly inside the chart&#8217;s code editor. However, to keep things clean and maintainable, we&#8217;ll follow good coding practices and wrap our logic in a function that Pulse can call, with parameters controlled by the UI.</p><p>We&#8217;ll create a function called <code>priceChart</code> that takes two arguments: the stock symbol we want to plot and the time range (in days). We&#8217;ll build it step by step. First, we reuse the original query that returns the price and the two moving averages.</p><pre><code><code>select time,sym,sma50:mavg[50;close],sma200:mavg[200;close],price:close from stocks where sym=stock</code></code></pre><p>Then we extend that result with our signal-generation logic, keeping the numeric encoding for now: <code>-1</code> for <strong>sell</strong>, <code>1</code> for <strong>buy</strong>, and <code>0</code>for <strong>no action</strong>.</p><pre><code><code>update signal:deltas 0&lt;signum sma50-sma200 from
select time,sym,sma50:mavg[50;close],sma200:mavg[200;close],price:close from stocks where sym=stock</code></code></pre><p>Next, we derive a trade action and the corresponding buy/sell price, which for simplicity we set to the closing price at the signal time (ignoring bid/ask). After that, we create the visual &#8220;bubbles&#8221; that mark buys and sells using Pulse&#8217;s built-in conventions: if you add a column named <code>&lt;field&gt;_SD_CIRCLE</code> and define <code>&lt;field&gt;_SD_SIZE</code>, Pulse will draw a bubble of that size at the corresponding point. By adding four columns, <code>buy_SD_CIRCLE</code>, <code>buy_SD_SIZE</code>, <code>sell_SD_CIRCLE</code>, and <code>sell_SD_SIZE</code>, we get clear visual markers for our buy and sell signals.</p><pre><code><code>update buy_SD_CIRCLE:buy*signal,buy_SD_SIZE:10,sell_SD_CIRCLE:abs sell*signal,sell_SD_SIZE:10 from
update action:`sell`doNothing`buy 1+signal,buy:?[signal=1;price;0N],sell:?[-1=signal;price;0n] from
update signal:deltas 0&lt;signum sma50-sma200 from
select time,sym,sma50:mavg[50;close],sma200:mavg[200;close],price:close from stocks where sym=stock</code></code></pre><p>In the final step, we narrow things down to just the columns we care about and apply <code>sublist</code> to restrict the output to the selected date range. Here&#8217;s the full function in one piece.</p><pre><code><code>priceChart:{[stock;range]
        sublist[range;] select time,price,sma50,sma200,buy_SD_CIRCLE,buy_SD_SIZE,sell_SD_CIRCLE,sell_SD_SIZE from
        update buy_SD_CIRCLE:buy*signal,buy_SD_SIZE:10,sell_SD_CIRCLE:abs sell*signal,sell_SD_SIZE:10 from
        update action:`sell`doNothing`buy 1+signal,buy:?[signal=1;price;0N],sell:?[-1=signal;price;0n] from
        update signal:deltas 0&lt;signum sma50-sma200 from
        select time,sym,sma50:mavg[50;close],sma200:mavg[200;close],price:close from stocks where sym=stock}</code></code></pre><p>Following the same good coding practices, let&#8217;s also create a dedicated function for the volume chart.</p><pre><code><code>volumeChart:{[stock;range] select time, avgVolume:avg volume, volume from sublist[range;] select time,volume from stocks where sym=stock }</code></code></pre><p>As you&#8217;ve probably noticed, we also added the average volume to our volume chart. However, because KDB-X evaluates expressions from right to left, we can&#8217;t just compute the average volume first and then apply <code>sublist</code>, that would calculate the average over the <em><strong>entire</strong></em> dataset, giving us the wrong value for the selected time window.</p><p>To get the correct result, we must first extract the sublist for the chosen date range and <em><strong>then</strong></em> compute the average volume on that subset.</p><p>If you&#8217;re wondering why we use <code>sublist</code> instead of the <strong>take</strong> <code>#</code> operator, it comes down to their different behaviors. When you use <code>take #</code> on a list of <code>5</code> elements and request <code>7</code>, <code>take</code> will start cycling through the list again from the beginning to reach the desired length. In contrast, <code>sublist</code> returns only <code>min(n; count list)</code> elements.</p><p>This matters when a stock&#8217;s price history is shorter than the time range the user selects, <code>sublist</code> prevents accidental cycling and ensures we only return the data that actually exists.</p><pre><code><code>q)7#til 5
0 1 2 3 4 0 1
q)7 sublist til 5
0 1 2 3 4</code></code></pre><p>Now that our functions are in place, the final step is simply adding them into our Pulse dashboard. We just add the function calls to the TimeSeries code editor and pass in the selected stock and time-range values from our dropdown inputs. That&#8217;s all it takes, let&#8217;s hook everything up.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!dlJa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!dlJa!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic 424w, /__u/substackcdn.com/image/fetch/$s_!dlJa!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic 848w, /__u/substackcdn.com/image/fetch/$s_!dlJa!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!dlJa!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!dlJa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:138845,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!dlJa!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic 424w, /__u/substackcdn.com/image/fetch/$s_!dlJa!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic 848w, /__u/substackcdn.com/image/fetch/$s_!dlJa!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!dlJa!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1fd2722e-8c5f-4d29-90c4-b82b3db6bf56_1918x1080.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The last element to complete our dashboard is a summary table positioned at the top. This table presents key information at a glance, buy or sell price, the generated signal, volume, SMA50, SMA200, and the current price. It adds a numerical layer of context to complement the visual cues from our charts, rounding out the trading interface with clear, actionable insight.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!KQ0K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!KQ0K!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic 424w, /__u/substackcdn.com/image/fetch/$s_!KQ0K!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic 848w, /__u/substackcdn.com/image/fetch/$s_!KQ0K!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!KQ0K!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!KQ0K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic" width="1456" height="285" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92332520-d639-463c-98a1-f172fba81291_1920x376.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:285,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62899,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!KQ0K!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic 424w, /__u/substackcdn.com/image/fetch/$s_!KQ0K!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic 848w, /__u/substackcdn.com/image/fetch/$s_!KQ0K!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!KQ0K!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92332520-d639-463c-98a1-f172fba81291_1920x376.heic 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If we look closely at our <code>priceChart</code> function, we&#8217;ll notice that nearly all the data required for our summary table is already being produced. The only real difference is the set of columns we want to return. So instead of duplicating logic, we&#8217;ll refactor the function, rename it to <code>analytics</code>, and introduce a third parameter that specifies which column set we want, whether for the price chart or for the summary table.</p><p>By using a <code>functional select</code>, we can make the underlying query far more flexible and dynamic. It&#8217;s yet another great example of how expressive and powerful KDB-X can be. You&#8217;ll find the refactored version of the code below.</p><p><strong>NOTE:</strong> You can read everything about functional selects on my dedicated blog post <a href="https://www.defconq.tech/docs/concepts/functionalSelect">here</a></p><pre><code><code>analytics:{[stock;range;columns]
         chartColumns:`time`price`sma50`sma200`buy_SD_CIRCLE`buy_SD_SIZE`sell_SD_CIRCLE`sell_SD_SIZE;
         tableColumns:`time`sym`action`buy`sell`price`volume`sma50`sma200;
         c:();
         if[columns=`tab;c:tableColumns];
         if[columns=`chart;c:chartColumns];
         ?[;();0b;{x!x} c]
         sublist[range;] `time xasc update buy_SD_CIRCLE:buy*signal,buy_SD_SIZE:10,sell_SD_CIRCLE:abs sell*signal,sell_SD_SIZE:10 from
         update action:`sell`doNothing`buy 1+signal,buy:?[signal=1;price;0N],sell:?[-1=signal;price;0n] from
         update signal:deltas 0&lt;signum sma50-sma200 from
         select time,sym,sma50:mavg[50;close],sma200:mavg[200;close],price:close,volume from stocks where sym=stock}</code></code></pre><p>Now all that remains is a bit of clean-up to make the dashboard look polished and professional. Rename each component to something meaningful, add some spacing to the left and right of the charts, and tidy up the layout. And just like that, voil&#224;, you&#8217;ve got a sleek, production-ready dashboard that supports your traders&#8217; decision-making with clarity and style.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!-KcM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!-KcM!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic 424w, /__u/substackcdn.com/image/fetch/$s_!-KcM!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic 848w, /__u/substackcdn.com/image/fetch/$s_!-KcM!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!-KcM!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!-KcM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic" width="689" height="252" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:252,&quot;width&quot;:689,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:13836,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!-KcM!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic 424w, /__u/substackcdn.com/image/fetch/$s_!-KcM!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic 848w, /__u/substackcdn.com/image/fetch/$s_!-KcM!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!-KcM!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06e4e46b-d907-4026-ab2c-b0e8a8a4a246_689x252.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!pX67!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!pX67!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic 424w, /__u/substackcdn.com/image/fetch/$s_!pX67!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic 848w, /__u/substackcdn.com/image/fetch/$s_!pX67!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!pX67!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!pX67!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic" width="1456" height="833" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:833,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:156491,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!pX67!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic 424w, /__u/substackcdn.com/image/fetch/$s_!pX67!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic 848w, /__u/substackcdn.com/image/fetch/$s_!pX67!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!pX67!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0531ae29-9c61-497f-abca-ef88df9ecc46_1920x1099.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/defconq.substack.com/subscribe"><span>Subscribe now</span></a></p><h2>Backtesting for Alpha: Turning Strategy Into Performance</h2><p>At the start of this tutorial, I promised we would build a backtesting engine for our trading strategy, and I always deliver. In this final section, we&#8217;ll put everything together by creating a simple yet powerful backtester, powered by KDB-X&#8217;s built-in timer functionality: <code>.z.ts</code>.</p><p>Normally, <code>.z.ts</code> is undefined, but once you assign a function to it, that function is executed automatically every <code>n</code> milliseconds. You control this interval via a system command <code>\t</code>, either when starting your process with <code>-t n</code> or dyhnamically at runtime with <code>\t n</code>.</p><p>Let&#8217;s look at a small example to understand how it works. We define <code>.z.ts:{show x}</code>, which prints the argument <code>x</code> every time the timer fires. By default, <code>x</code> is the current timestamp. So, when we set the timer to fire every <code>1000 milliseconds</code> using <code>\t 1000</code>, we get the current time printed once per second. Simple, elegant, and exactly what we&#8217;ll use to &#8220;time-lapse&#8221; our historical data for backtesting. You can reseet the timer by setting it to zero <code>\t 0</code></p><pre><code><code>q).z.ts:{show x}
q)\t 1000
q)2025.12.07D15:23:23.316105000
2025.12.07D15:23:24.316105000
2025.12.07D15:23:25.316105000
2025.12.07D15:23:26.316105000
2025.12.07D15:23:27.316105000
2025.12.07D15:23:28.316105000
2025.12.07D15:23:29.316105000
2025.12.07D15:23:30.316105000
\t 0</code></code></pre><p>Remember, our original feed handler holds the <em><strong>entire</strong></em> price history for our stocks, about 75,000 records spanning from 1980 all the way to 2025. For the backtesting engine, we want to replay this history as a time-lapse, streaming one day&#8217;s worth of data every 100 milliseconds.</p><pre><code><code>q)count data
75863
q)exec `startDate`EndDate!(min;max)@\:time by sym from data
       | startDate                     EndDate
------ | -----------------------------------------------------------
7203.T | 1999.05.06D00:00:00.000000000 2025.05.26D00:00:00.000000000
9988.HK| 2019.11.26D00:00:00.000000000 2025.05.26D00:00:00.000000000
AAPL   | 1980.12.12D00:00:00.000000000 2025.05.23D00:00:00.000000000
AMZN   | 1997.05.15D00:00:00.000000000 2025.05.23D00:00:00.000000000
GOOG   | 2004.08.19D00:00:00.000000000 2025.05.23D00:00:00.000000000
META   | 2012.05.18D00:00:00.000000000 2025.05.23D00:00:00.000000000
MSFT   | 1986.03.13D00:00:00.000000000 2025.05.23D00:00:00.000000000
QQQ    | 1999.03.10D00:00:00.000000000 2025.05.23D00:00:00.000000000
SPY    | 1993.01.29D00:00:00.000000000 2025.05.23D00:00:00.000000000
TSLA   | 2010.06.29D00:00:00.000000000 2025.05.23D00:00:00.000000000
VOW3.DE| 1998.07.22D00:00:00.000000000 2025.05.26D00:00:00.000000000
VTI    | 2001.06.15D00:00:00.000000000 2025.05.23D00:00:00.000000000</code></code></pre><p>The logic is straightforward:</p><ol><li><p>Extract the list of all distinct trading dates from our dataset.</p></li><li><p>Initialize a counter to track our current position within that date list.</p></li><li><p>On each timer tick (every 100 ms), publish the data for the next date to the Tickerplant.</p></li><li><p>Increment the counter so the following tick streams the next day in sequence.</p></li></ol><p>Alright, time to bring it all together!</p><pre><code><code>q)dateList:exec distinct `date$time from data
q)dateList
1999.05.06 1999.05.07 1999.05.10 1999.05.11 1999.05.12 1999.05.13 1999.05.14 1999.05.17 1999.05.18 1999.05.19 1999.05.20 1999.05.21 1999.05.24 1999.05.25 1999.05.26 1999.05.27 1999.05.28 1999.05.31 1999.06.01 1999.06.02 1999.06.03 1999.06...
q)(min;max)@\:dateList
1980.12.12 2025.05.26
q)cntr:0
q)select from data where $[`date;time]=dateList 0
time                          sym     feedHandlerTime               open      high      low       close     volume
---------------------------------------------------------------------------------------------------------------------
1999.05.06D00:00:00.000000000 7203.T  1999.05.06D00:00:00.000000000 396.8346  410.4793  392.2863  410.4793  15575000
1999.05.06D00:00:00.000000000 AAPL    1999.05.06D00:00:00.000000000 0.3498498 0.3521977 0.3305959 0.3343524 433148800
1999.05.06D00:00:00.000000000 AMZN    1999.05.06D00:00:00.000000000 3.7       3.775     3.39375   3.434375  365688000
1999.05.06D00:00:00.000000000 MSFT    1999.05.06D00:00:00.000000000 24.73093  24.86503  23.75395  23.88805  74021000
1999.05.06D00:00:00.000000000 QQQ     1999.05.06D00:00:00.000000000 45.50791  45.90524  43.83911  44.26293  15173400
1999.05.06D00:00:00.000000000 SPY     1999.05.06D00:00:00.000000000 84.72099  85.15424  83.42122  84.43543  13507200
1999.05.06D00:00:00.000000000 VOW3.DE 1999.05.06D00:00:00.000000000 12.69323  12.72496  12.17915  12.50283  107812
q)stream:{-1&#8221;Streaming data for date:&#8221;,string dateList cntr;select from data where $[`date;time]=dateList cntr;cntr::cntr+1}
q)stream[]
Streaming data for date:1999.05.10
q)stream[]
Streaming data for date:1999.05.11
q)stream[]
// Add the actual publishing
stream:{-1&#8221;Streaming data for date:&#8221;,string dateList cntr;h(`.u.upd;`stocks;select from data where $[`date;time]=dateList cntr);cntr::cntr+1}</code></code></pre><p>Before we begin streaming, let&#8217;s reset the CEP by clearing out any previously stored data and create a copy of our Pulse dashboard to preserve the historical version. In the new <em><strong>Backtesting Dashboard</strong></em>, we&#8217;ll remove the date-range dropdown and adjust our functions accordingly. With these two changes in place, we&#8217;re ready to fire up the backtesting engine. It&#8217;s showtime!!!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!a7lz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!a7lz!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic 424w, /__u/substackcdn.com/image/fetch/$s_!a7lz!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic 848w, /__u/substackcdn.com/image/fetch/$s_!a7lz!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!a7lz!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!a7lz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic" width="1456" height="836" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:836,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165361,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!a7lz!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic 424w, /__u/substackcdn.com/image/fetch/$s_!a7lz!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic 848w, /__u/substackcdn.com/image/fetch/$s_!a7lz!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!a7lz!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa50575ab-6922-4632-b543-8726d4484f9c_1920x1102.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Jm2o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Jm2o!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Jm2o!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Jm2o!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Jm2o!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Jm2o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57182,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/181285830?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Jm2o!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Jm2o!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Jm2o!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Jm2o!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F676548de-c64b-414b-b4da-3b602a813cf1_1917x1070.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Video Tutorial</h2><div id="youtube2-Cya2BD1hJOY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Cya2BD1hJOY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/Cya2BD1hJOY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Code repo: <a href="https://github.com/DefconQ/defconQ/tree/master/projects/tradingStrategy">Pulse Powered Alpha: Building your First Trading Strategy with KDB-X and Pulse</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Euston, We Have an Error]]></title><description><![CDATA[Understanding KDB/Q Errors Before They Send You Into Orbit]]></description><link>https://defconq.substack.com/p/euston-we-have-an-error</link><guid isPermaLink="false">https://defconq.substack.com/p/euston-we-have-an-error</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Wed, 26 Nov 2025 12:10:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Mxxz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve just started learning KDB/Q and thought the <em><strong>language</strong></em> was the only terse thing, think again. The error codes are just as terse. At a first glance, KDB/Q errors can feel confusing, even a bit intimidating, but once you look closer and reflect on them, they actually make a lot of sense. Still, when you&#8217;re beginning your journey, it can definitely feel overwhelming.</p><p>In this blog post, I&#8217;ll break down the ten most common errors you&#8217;ll run into, explain what they mean, show examples of how they arise, and walk you through how to avoid them. I will also share some helpful tips and tricks for debugging your code so you can track down issues faster and with confidence.</p><p>Strap in, Euston, prepare for lift-off.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Mxxz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Mxxz!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Mxxz!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Mxxz!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Mxxz!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Mxxz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:368680,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/180015039?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Mxxz!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!Mxxz!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!Mxxz!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!Mxxz!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fa7718b-ddd7-416f-87e4-216cb1eff41a_1536x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>type</h2><p>Let&#8217;s start with one of the most intuitive errors you&#8217;ll encounter: the <strong>type error</strong>. As the name implies, this happens when the data type of one or more arguments isn&#8217;t what KDB/Q expects. A classic example is attempting to add a number to a symbol, an operation that simply doesn&#8217;t make sense.</p><p>Because KDB/Q is a <strong><a href="https://www.defconq.tech/docs/language/KDB#dynamic-by-design">dynamic array language</a></strong> where both variables and functions can change at runtime, mismatched types can appear more easily than you expect. When they do, KDB/Q politely (well&#8230; tersely) lets you know with a <code>type</code> error.</p><p>Some practical examples are:</p><pre><code><code>q)4+`a
&#8216;type
  [0]  4+`a
        ^
q)sum `hello`world
&#8216;type
  [0]  sum `hello`world
       ^</code></code></pre><p>As shown in the examples above, a <code>type</code> error is raised in situations where incompatible data types are used. In the first case, adding a number to a symbol triggers the error; in the second, attempting to sum two symbols results in the same issue, an operation that simply has no meaning in KDB/Q. Even when using other operators, such as amending a list of integers with a symbol via the <em><strong><a href="https://www.defconq.tech/docs/concepts/amend">amend&#8208;at</a></strong></em>, KDB/Q will rightfully complain with a <code>type</code> error.</p><pre><code><code>q)@[1 2 3;0 1;:;`hello]
&#8216;type
  [0]  @[1 2 3;0 1;:;`hello]
       ^</code></code></pre><p>However, there are cases where you might <em><strong>expect</strong></em> a <code>type</code> error, yet KDB/Q happily carries on without any complaints. A classic example is adding an integer to a float. Since this operation is mathematically valid, KDB/Q simply performs it, no error needed.</p><pre><code><code>q)3+4.0
7f</code></code></pre><p>More surprisingly, concatenating an integer or even a symbol to a string doesn&#8217;t trigger a <code>type</code> error either. While this might be unexpected at first, at a second glance it works because in KDB/Q, a string is simply a <em><strong>list of characters</strong></em>, and KDB/Q fully supports mixed lists. By appending a value of a different type to a string, KDB/Q implicitly creates a mixed list. You can easily verify this behaviour with the example below.</p><pre><code><code>q)&#8221;Hello World&#8221;,4
&#8220;H&#8221;
&#8220;e&#8221;
&#8220;l&#8221;
&#8220;l&#8221;
&#8220;o&#8221;
&#8220; &#8220;
&#8220;W&#8221;
&#8220;o&#8221;
&#8220;r&#8221;
&#8220;l&#8221;
&#8220;d&#8221;
4
q)&#8221;Hello World&#8221;, `Errors
&#8220;H&#8221;
&#8220;e&#8221;
&#8220;l&#8221;
&#8220;l&#8221;
&#8220;o&#8221;
&#8220; &#8220;
&#8220;W&#8221;
&#8220;o&#8221;
&#8220;r&#8221;
&#8220;l&#8221;
&#8220;d&#8221;
`Errors</code></code></pre><p>By applying the <code>type</code> operator to the results of these concatenations, we can clearly confirm that both outputs are treated as mixed lists (type 0h). In other words, KDB/Q doesn&#8217;t reject the operation, it simply adapts the data structure.</p><h2>length</h2><p>Next up is the <strong>length error</strong>, another fairly intuitive one. This error is raised whenever you attempt to perform an operation on two parameters that don&#8217;t share the same length. There is one important caveat, though: sometimes KDB/Q can perform an <strong>implicit atomic extension</strong> to make the operation valid. But before we get ahead of ourselves, let&#8217;s walk through a few examples.</p><pre><code><code>// Operation on parameters of same length, no error is thrown
q)1+2
3
q)1 2 3+4 5 6
5 7 9
// Operation on two parameters of different length, a length error is raised
q)1 2+3 4 5
&#8216;length
  [0]  1 2+3 4 5
          ^
q)</code></code></pre><p>So far so good, right? Now let&#8217;s talk about the <strong><a href="https://code.kx.com/q4m3/6_Functions/#66-atomic-functions">atomic extensions</a></strong> mentioned earlier. When an operation involves one list and one atom, KDB/Q doesn&#8217;t immediately complain. Instead, it will automatically <strong>extend</strong> the atom to match the length of the list and then apply the operation element-wise. This clever behaviour prevents a length error and makes working with arrays both powerful and concise.</p><pre><code><code>q)1 2 3+10
11 12 13</code></code></pre><p>But we&#8217;re not done yet, there&#8217;s another key detail worth highlighting. Let&#8217;s take a step back and remind ourselves what KDB/Q fundamentally is: an <strong>array programming language</strong>. (f you&#8217;d like to explore this in more detail, take a look <a href="https://www.defconq.tech/docs/language/KDB">here</a>). In KDB/Q, tables aren&#8217;t magic objects; they are simply <strong>flipped column dictionaries</strong> (Want to nerd out a bit more? You can read the full explanation <a href="https://www.defconq.tech/docs/concepts/dictionariesTables">here</a>), meaning each column is just a vector. And that leads to an important rule: <strong>whenever you operate on a table column, the result must produce vectors of the same length as the table itself.</strong> If it doesn&#8217;t, you&#8217;ll immediately run into a <code>length</code> error. The example below illustrates exactly what happens when this rule is broken.</p><pre><code><code>q)t:([] a:1 2 3;b:`One`Two`Three)
q)show t:([] a:1 2 3;b:`One`Two`Three)
a b
-------
1 One
2 Two
3 Three
q)update c:10 20 from t
&#8216;length
  [0]  update c:10 20 from t
       ^
q)update c:10 20 30 from t
a b     c
----------
1 One   10
2 Two   20
3 Three 30</code></code></pre><p>Hopefully this makes length errors a lot less mysterious and helps you spot them quickly whenever they show up.</p><h2>rank</h2><p>The <code>rank</code> error is somewhat like a cousin of the <code>length</code> error, at least that&#8217;s how I like to think about it. In KDB/Q the <em><strong>rank</strong></em> of a function refers to the number of arguments it expects. For example, the addition operator + takes exactly two arguments. If you try to pass more (or fewer), Q throws a rank error. In short, your &#8220;argument count&#8221; doesn&#8217;t match what the function requires. Luckily, this one is easy to fix: just adjust the number of parameters you&#8217;re passing.</p><pre><code><code>q)+[1;2;3]
&#8216;rank
  [0]  +[1;2;3]
       ^
q)f:{[one;two;three] one+two+three}
q)f[1;2;3]
6
q)f[1;2;3;4]
&#8216;rank
  [0]  f[1;2;3;4]
       ^</code></code></pre><h2>domain</h2><p>Before diving into the next error, it&#8217;s worth revisiting what a function actually is: <em><strong>&#8220;In mathematics, a function assigns each input value to exactly one output value. The set of valid inputs is called the domain, and the set from which outputs are taken is called the codomain.&#8221;</strong></em> (<a href="https://code.kx.com/q4m3/0_Overview/#022-functions">Q for Mortals, Overview</a>). If we provide a value that doesn&#8217;t belong to the domain, the function simply can&#8217;t operate on it, resulting in a <strong>domain error</strong>. A simple example is the <code>til</code> operator. Given a positive integer <code>x</code>, it generates all natural numbers from <code>0</code> to <code>x-1</code>. But its domain excludes negative integers, so passing one instantly triggers a domain error.</p><pre><code><code>// The argument is in the domain of the function
q)til 5
0 1 2 3 4
// The argument is outside of the domain of the function
q)til -1
&#8216;domain
  [0]  til -1
       ^</code></code></pre><h2>mismatch</h2><p>If you try to join two tables with a simple comma join but their schemas don&#8217;t match, KDB/Q will throw a <code>mismatch</code> error. And that&#8217;s exactly how I think of it: the schema between the two tables <strong>simply doesn&#8217;t match</strong>.</p><pre><code><code>q)([]a:til 4; b:`one`two`three`four),([]b:til 4;c:`one`two`three`four)
&#8216;mismatch
  [0]  ([]a:til 4; b:`one`two`three`four),([]b:til 4;c:`one`two`three`four)
                                         ^
q)([]a:til 4; b:`one`two`three`four),([]a:til 4;b:`one`two`three`four)
a b
-------
0 one
1 two
2 three
3 four
0 one
1 two
2 three
3 four</code></code></pre><h2>from</h2><p>Sticking with table-related issues for a moment: if you write a poorly structured Q-SQL query, you&#8217;ll run into a <code>from</code> error. This isn&#8217;t limited to forgetting the <code>from</code> keyword; it appears whenever the query itself is malformed.</p><pre><code><code>q)select t where a=1
&#8216;from
  [0]  select t where a=1
                        ^
q)selec from t where a=1
&#8216;from
  [0]  selec from t where a=1
             ^</code></code></pre><p>A simple way to avoid poorly structured Q-SQL queries is to brush up on the basics. You can start by reading my blog post on Q-SQL <a href="https://www.defconq.tech/docs/concepts/qsql">here</a>.</p><h2>upd</h2><p>The <code>upd</code> error is a classic one you&#8217;ll often encounter during Tickerplant (TP) log replays. Although it&#8217;s specific to the replay workflow, it highlights a much broader and more fundamental error pattern. So let&#8217;s make sure we really understand what&#8217;s going on. To understand why this error occurs, we first need to remind ourselves what&#8217;s inside a TP log file. As shown below, a TP log is essentially a list of lists.</p><pre><code><code>`upd `trade (0D14:56:01.113310000;`AUDUSD;&#8221;S&#8221;;1000;96.96)
`upd `trade (0D14:56:01.115310000;`SGDUSD;&#8221;S&#8221;;5000;95.45)
`upd `trade (0D14:56:01.119310000;`AUDUSD;&#8221;B&#8221;;1000;95.08)
`upd `trade (0D14:56:01.121310000;`AUDUSD;&#8221;B&#8221;;1000;95.65)
`upd `trade (0D14:56:01.122310000;`SGDUSD;&#8221;B&#8221;;5000;98.14)</code></code></pre><p>Each line contains the function to execute (<code>upd</code>), the target table name, and the data being written. Once you understand that structure, the reason behind the <code>upd</code> error becomes much clearer. The <code>upd</code> error isn&#8217;t random, it only occurs when the <code>upd</code>function has not been defined. We can confirm this with a simple example. First, we mimic a typical TP log entry by creating a list where the first element is a function and the remaining elements are its arguments. For simplicity, we&#8217;ll use the <code>+</code> operator with two integers. Evaluating this list with <code>value</code> correctly applies the function and returns the result.</p><pre><code><code>q)value (+;2;3)
5</code></code></pre><p>Next, we try the same idea using a TP-style entry. We define a small table with user names and ages, then attempt to insert a record by evaluating a list that calls <code>upd</code>.</p><pre><code><code>q)show t:([] name:`$(); age: `int$())
name age
--------
q)upd[`t;(`alex;38i)]
&#8216;upd
  [0]  upd[`t;(`alex;38i)]
       ^</code></code></pre><p>Since <code>upd</code> is not defined, evaluating the expression triggers the <code>upd</code> error.</p><p>This leads us to a more general rule: whenever KDB/Q references a function or variable that doesn&#8217;t exist in the current namespace, it throws an error using that missing name. In other words, the error message is simply the name of what&#8217;s undefined. Let&#8217;s see a practical example of this behaviour.</p><pre><code><code>q)thisFunctionDoesntExist[4;5]
&#8216;thisFunctionDoesntExist
  [0]  thisFunctionDoesntExist[4;5]
       ^
q)2+thisVariableDoesntExist
&#8216;thisVariableDoesntExist
  [0]  2+thisVariableDoesntExist
         ^</code></code></pre><p>Understanding this pattern makes it much easier to track down where an error comes from and resolve it quickly.Understanding this pattern makes it much easier to track down where an error comes from and resolve it quickly. The key takeaway: if you&#8217;re going to fail, fail fast!</p><h2>wsfull</h2><p>The next error is one you <strong>never</strong> want to see. It doesn&#8217;t just signal a (potential) flaw in your code, it means you&#8217;ve hit a <strong>hardware limit</strong>: you&#8217;ve <strong>run out of memory</strong>. At this point, the process will crash, you&#8217;ll stop intake of real-time data, and you may lose data entirely. The example below illustrates how this can happen, but <strong>do not run it unless you want to intentionally crash your machine</strong>, and <strong>never, ever in production.</strong></p><pre><code><code>q)999999999999#0</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!9aum!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!9aum!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic 424w, /__u/substackcdn.com/image/fetch/$s_!9aum!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic 848w, /__u/substackcdn.com/image/fetch/$s_!9aum!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!9aum!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!9aum!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic" width="612" height="408" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:408,&quot;width&quot;:612,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35169,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/180015039?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!9aum!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic 424w, /__u/substackcdn.com/image/fetch/$s_!9aum!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic 848w, /__u/substackcdn.com/image/fetch/$s_!9aum!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!9aum!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c5861d-56f9-4b74-b5d1-9b13ee1ee02b_612x408.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see below, once my MacBook began running out of memory, it slowly started suspending processes one by one.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!QMpC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!QMpC!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic 424w, /__u/substackcdn.com/image/fetch/$s_!QMpC!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic 848w, /__u/substackcdn.com/image/fetch/$s_!QMpC!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!QMpC!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!QMpC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic" width="834" height="744" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef4e587d-3907-44df-b685-009eec95890f_834x744.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:744,&quot;width&quot;:834,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48635,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/180015039?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!QMpC!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic 424w, /__u/substackcdn.com/image/fetch/$s_!QMpC!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic 848w, /__u/substackcdn.com/image/fetch/$s_!QMpC!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!QMpC!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4e587d-3907-44df-b685-009eec95890f_834x744.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It put up a brave fight, but eventually tapped out, shut down, and restarted. For me, it was just an unexpected coffee break before getting back to blogging. But in production? A crash won&#8217;t just wake you up like caffeine, it will shake you harder than an espresso shot to the system.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!_9mp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!_9mp!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic 424w, /__u/substackcdn.com/image/fetch/$s_!_9mp!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic 848w, /__u/substackcdn.com/image/fetch/$s_!_9mp!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!_9mp!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!_9mp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic" width="858" height="742" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:742,&quot;width&quot;:858,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:52533,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/180015039?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!_9mp!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic 424w, /__u/substackcdn.com/image/fetch/$s_!_9mp!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic 848w, /__u/substackcdn.com/image/fetch/$s_!_9mp!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!_9mp!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc33477cf-4a7c-4d5d-be8d-3cc6fa6ac7e5_858x742.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>-w abort</h2><p>Instead of letting your KDB/Q process eat up all available RAM like it&#8217;s at an all-you-can-eat buffet, you can put it on a strict diet. Setting a memory limit ensures that the <em><strong>process</strong></em> dies when it overeats, not your entire server. Once this limit is hit, the process terminates immediately, but at least the machine stays alive and the rest of your system keeps running. Use the <code>-w</code> argument to specify how many MB it&#8217;s allowed to consume. For example, <code>-w 10</code> restricts it to 10MB. If you leave <code>-w</code> at its default value of 0, the process gets unlimited access to your machine&#8217;s memory... and we all know how that story ends.</p><pre><code><code>alexanderunterrainer@Mac:~|&#8658;  qx -w 10
KDB-X 0.1.1 2025.09.29 Copyright (C) 1993-2025 Kx Systems
m64/ 8()core 24576MB alexanderunterrainer mac 192.168.1.177 EXPIRE 2025.12.31 COMMUNITY #5029523

q)999999999#0
&#8216;-w abort</code></code></pre><h2>u-fail</h2><p>The u-fail error is hands-down my favourite. Not because I bump into it often, in fact, I rarely do, but because of its name. It&#8217;s hard not to smile at an error that casually tells you: <strong>&#8220;you fail.&#8221;</strong> I like to think it&#8217;s KDB/Q&#8217;s subtle tribute to every <em>qbie</em> discovering the language and making their first glorious mistakes.</p><p>You&#8217;ll run into <code>u-fail</code> when trying to apply the <strong>unique attribute</strong> to a list that... well... isn&#8217;t <strong>unique</strong>. Likewise, you&#8217;ll trigger it by applying the <strong>parted attribute</strong> to a list that isn&#8217;t actually <strong>parted</strong>. It&#8217;s KDB/Q&#8217;s way of gently whispering, <em><strong>&#8220;nice try, but your attributes need some work.&#8221;</strong></em></p><p>A close cousin to this is the <code>s-fail</code> error, thrown when you attempt to mark a list as <strong>sorted</strong> when it&#8217;s not actually sorted in <strong>ascending order</strong>. If you&#8217;ve been blessed with both <code>u-fail</code> and <code>s-fail</code>, it may be time for a quick refresher on attributes.</p><p>Luckily, DefconQ comes to rescue. Check out my deep dive on attributes <a href="https://www.defconq.tech/docs/concepts/attributes">here</a>. Happy debugging!</p><pre><code><code>q)`u#2 2 3 4
&#8216;u-fail
  [0]  `u#2 2 3 4
         ^
q)`u#2 2 3 3 2 2 4 3 3 3
&#8216;u-fail
  [0]  `u#2 2 3 3 2 2 4 3 3 3
         ^
q)`u#2 3 4
`u#2 3 4
q)`p#2 2 2 3 3 3 4 2 2 3 3
&#8216;u-fail
  [0]  `p#2 2 2 3 3 3 4 2 2 3 3
         ^
q)`p#2 2 2 3 3 3 4
`p#2 2 2 3 3 3 4
q)`s#5 4 3 2 1
&#8216;s-fail
  [0]  `s#5 4 3 2 1
         ^
q)`s#1 2 3 4
`s#1 2 3 4</code></code></pre><h2><strong>BONUS</strong>: nyi</h2><p>The <code>nyi error</code> is another special one, it stands for <strong>&#8220;Not Yet Implemented.&#8221;</strong> You&#8217;ll come across it whenever you attempt an operation that could make sense logically, but simply hasn&#8217;t been built into the language (at least not yet). In other words, KDB/Q is telling you: <em>&#8220;Interesting idea... maybe one day, but not today.&#8221;</em> It&#8217;s a little reminder that the language continues to evolve, and some ideas still need time to mature.</p><h2>Catch Me If You Can: Error Traps that Secure Your KDB/Q Apps</h2><p>Up to this point, we&#8217;ve explored the most common KDB/Q errors, what triggers them, and how to prevent them. But no matter how careful you are, unexpected scenarios still happen, and when they do, you don&#8217;t want your entire application grinding to a halt.</p><p>To protect your system from crashing in the face of an error, you should wrap any risky or unpredictable code in an <strong>error trap</strong>, using the (heavily overloaded) <strong>trap</strong> <code>.</code> or <strong>trap at</strong> <code>@</code> operator. The table below shows the syntax and how to use it effectively:</p><p>Function nameFunction syntaxFunction semanticsTrap<code>.[g;gx;e]</code>Try <code>g . gx</code> ; catch with <code>e</code>Trap at<code>@[f;fx;e]</code>Try <code>f@fx</code> ; catch with <code>e</code></p><p>Examples:</p><pre><code><code>q)neg `a
&#8216;type
  [0]  neg `a
       ^
q)@[neg;`a;`error]
`error
q).[+;&#8221;ab&#8221;;`ouch]
`ouch</code></code></pre><p>For a deeper exploration of <strong>trap</strong>, you can read the full walkthrough <a href="https://www.defconq.tech/docs/concepts/amend#trap">here</a>. The <strong>extended trap at</strong> functionality is also covered <a href="https://code.kx.com/q/ref/dotq/#trp-extend-trap-at">here</a>and I&#8217;ll leave that one for you to experiment with. Enjoy the challenge!</p><p>To wrap things up, KDB/Q errors really aren&#8217;t as frightening as they first appear. Now that you understand what they mean and how to interpret them, there&#8217;s no need to panic the next time one pops up on your screen. Consider them helpful signposts rather than scary roadblocks.</p>]]></content:encoded></item><item><title><![CDATA[More Than a Database: The KDB/Q Mindset]]></title><description><![CDATA[Thinking in Vectors, Building at Velocity]]></description><link>https://defconq.substack.com/p/more-than-a-database-the-kdbq-mindset</link><guid isPermaLink="false">https://defconq.substack.com/p/more-than-a-database-the-kdbq-mindset</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Mon, 17 Nov 2025 08:30:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TQEA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two years into the <strong>DefconQ</strong> journey, I realised I&#8217;ve never actually taken the time to explain what KDB/Q really is. For those of us who work with it daily, it may seem obvious, but for newcomers, the name <em><strong>KDB</strong></em> often leads to a common misconception: that it&#8217;s <strong>&#8220;just&#8221;</strong> a database. In reality, that couldn&#8217;t be further from the truth. KDB/Q is so much more, it&#8217;s an <strong>array programming language</strong> with an in memory and on disk, column-based database functionality. KDB/Q lets you build entire frameworks, from real-time data streaming and in-memory or on-disk databases to powerful analytical and reporting engines, and just about anything else you can imagine. But beyond the technology itself, its real magic lies in how it transforms the way you think, it fundamentally reshapes your approach to solving problems. In this short blog post, I&#8217;ll explain what KDB/Q truly is, and why I find it such an elegant and powerful piece of technology.</p><h2>Q: Array Programming, Supercharged</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!TQEA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!TQEA!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic 424w, /__u/substackcdn.com/image/fetch/$s_!TQEA!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic 848w, /__u/substackcdn.com/image/fetch/$s_!TQEA!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!TQEA!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!TQEA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114287,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/179006619?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!TQEA!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic 424w, /__u/substackcdn.com/image/fetch/$s_!TQEA!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic 848w, /__u/substackcdn.com/image/fetch/$s_!TQEA!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!TQEA!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f829cee-039e-4bbe-83d5-b4d70a5b1c5b_1600x900.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>If you&#8217;re into sports cars like I am, think of Q as the American muscle car of programming, supercharged, powerful, and leaving everything else in the dust on the quarter mile. But before we get Too Fast and Too Furious, let&#8217;s hit the brakes and talk code. Q (or KDB/Q) isn&#8217;t just another database, it is first and foremost <em><strong>an array programming language</strong></em>. To put it precisely, as <a href="https://www.linkedin.com/in/nickpsaris/">Nick Psaris</a>, author of <em><strong><a href="https://amzn.to/4qVvXKx">Q Tips: Fast, Scalable, and Maintainable KDB</a></strong></em>, defines it:</p><blockquote><p>&#8220;Q is an interpreted, dynamic, event-driven, functional array programming language.&#8221;</p></blockquote><p>So what does that actually mean? Let&#8217;s take a closer look. We start with the most important point: <strong>Q</strong> is an <em><strong>array programming language.</strong></em> In simple terms, it&#8217;s designed to seamlessly extend operations on single values (scalars, or Atoms, how we call them in Q) to entire vectors, matrices, and higher-dimensional arrays. Other examples of array programming languages include APL, K, J, Fortran, MATLAB, Analytica, Octave, R, and of course, our all-time favorite <strong>Q</strong>.</p><pre><code><code>// Addition of Atoms
q)2+2
4
// Addition of two vectors
q)1 2 3+4 5 6
5 7 9
// Addition of two matrices
q)(1 2 3;4 5 6;7 8 9)+(10 20 30;40 50 60;70 80 90)
11 22 33
44 55 66
77 88 99
</code></code></pre><p>INFO</p><p>If you&#8217;re curious about how K, KDB, and Q differ, check out my blog post on the history of KDB/Q <a href="https://www.defconq.tech/docs/language/history">here</a></p><h2>When Functions Behave&#8230; Mostly</h2><p>The next defining feature of Q is that it&#8217;s a <em><strong>(semi-)functional</strong></em> programming language. In practice, this means functions are treated as first-class citizens, you can pass them as arguments, return them as results, assign them to variables, and even store them inside data structures.</p><pre><code><code>// Passing a function as a variable
q)f:{x+y}
q)g:{[f;x;y] f[x;y] }
q)g[f;5;6]
11
// storing functions in a dictionary
q)show dict:`add`sub`mult!({x+y};{x-y};{x*y})
add | {x+y}
sub | {x-y}
mult| {x*y}
q)dict[`add;3;4]
7
q)dict[`sub;10;4]
6
q)dict[`mult;10;4]
40
</code></code></pre><p>Q is considered <strong>semi-functional</strong> because its functions can produce side effects, they&#8217;re able to modify the state of the system. In contrast, pure functional programming languages do not allow any side effects, ensuring that functions are entirely self-contained and deterministic.</p><pre><code><code>q)changeTheWorld:{[param] `varA set param}
q)changeTheWorld &#8220;New World Order&#8221;
`varA
q)varA
&#8220;New World Order&#8221;
</code></code></pre><h2>Ain&#8217;t Nobody Got Time for Compilation</h2><p>Q is an <strong>interpreted language</strong>, which means there&#8217;s no separate compilation step, everything is compiled into bytecode at runtime. Function definitions are compiled when the process starts and resolved lazily. The only catch: they must be syntactically valid at startup, but their order doesn&#8217;t matter.</p><pre><code><code>alexanderunterrainer@Mac:~|&#8658;  cat def.q
g:{f[x;y]};
f:{x+y};

g[3;4]

alexanderunterrainer@Mac:~|&#8658;  qx def.q
KDB-X 0.1.1 2025.09.29 Copyright (C) 1993-2025 Kx Systems
m64/ 8()core 24576MB alexanderunterrainer mac 192.168.1.177 EXPIRE 2025.12.31 COMMUNITY #5029523
7
</code></code></pre><h2>Dynamic by Design</h2><p>Q is <strong>dynamic</strong> in every sense, both functions and variable types can change at runtime. This gives you tremendous flexibility, but it also means things can go sideways if those definitions shift unexpectedly. As Uncle Ben wisely put it: <em><strong>with great power comes great responsibility.</strong></em></p><pre><code><code>q)f:{x+y}
q)a:3
q)b:5
q)f[a;b]
8
q)f:{show x}
q)a:&#8221;With great power comes great responsibility&#8221;
q)f a
&#8220;With great power comes great responsibility&#8221;
</code></code></pre><h2>Turning Events into Action, the Q-Style</h2><p>The ease of interprocess communication in Q makes it an ideal fit for <strong>event-driven architectures</strong>, so much so that it&#8217;s often the default and recommended approach. With built-in support for both synchronous and asynchronous messaging, IPC in Q is refreshingly simple. That said, if you prefer timer-based designs, Q won&#8217;t stand in your way either.</p><h1>The Toolkit Behind the Fastest Systems You Know: What You Can Build with KDB/Q</h1><p>Now that we&#8217;ve covered what KDB/Q actually <em>is</em>, the next question is: what can you build with it? In short, almost anything. Well, anything on the backend, to be precise. Born on Wall Street, KDB/Q has long been the weapon of choice for financial systems, powering some of the largest and longest-running platforms since the late &#8217;80s.</p><p>But its strengths go far beyond finance. Any domain that generates massive volumes of data and requires rapid processing is a perfect match for KDB/Q. Think smart devices: your Fitbit, Apple Watch, Garmin, whatever you use is capturing millions of data points every single day. What better technology to stream, store, analyse, and make sense of that data than KDB/Q? So the next time you&#8217;re faced with a challenge involving mountains of data that need to be processed at lightning speed, give KDB/Q a serious try. And if you need a place to start learning, check out my study plan <a href="https://www.defconq.tech/docs/category/kdbq-study-roadmap">here</a>.</p><p>To wrap things up, I want to leave you with a quote from Alan Perlis. With that, happy coding.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!FIJK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!FIJK!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic 424w, /__u/substackcdn.com/image/fetch/$s_!FIJK!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic 848w, /__u/substackcdn.com/image/fetch/$s_!FIJK!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!FIJK!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!FIJK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic" width="800" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16179,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/179006619?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!FIJK!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic 424w, /__u/substackcdn.com/image/fetch/$s_!FIJK!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic 848w, /__u/substackcdn.com/image/fetch/$s_!FIJK!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!FIJK!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9516e8b0-b7e3-46f7-9c29-a0a93599237a_800x400.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[DefconQ Reddit Ask Me Anything (AMA)]]></title><description><![CDATA[Your Questions, My Answers: Everything KDB/Q, Careers & Beyond!]]></description><link>https://defconq.substack.com/p/defconq-reddit-ask-me-anything-ama</link><guid isPermaLink="false">https://defconq.substack.com/p/defconq-reddit-ask-me-anything-ama</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Tue, 04 Nov 2025 11:45:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AGkG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As promised, I&#8217;m hosting a <strong>Reddit AMA (Ask Me Anything)</strong> on <strong>November 13th, 2025</strong>, where I will be answering <em><strong>all</strong></em> your questions about <strong>KDB/Q</strong>, the world&#8217;s most powerful time-series database and array programming language.</p><p>Over the years, I&#8217;ve received countless messages about:</p><ul><li><p>&#128161; How to start learning KDB/Q</p></li><li><p>&#128640; Career paths and progression in the KDB/Q ecosystem</p></li><li><p>&#128218; Best learning resources and study plans</p></li><li><p>&#9881;&#65039; Real-world applications and architecture insights</p></li></ul><p>So instead of replying to everyone one by one, let&#8217;s bring it all together. The AMA will run for <strong>24 hours</strong>, and you will be able to ask your questions <strong>completely anonymously</strong>.</p><p>Looking forward to hearing from you all!</p><p>You can find the link here: <a href="https://www.reddit.com/r/apljk/comments/1odwsa9/join_defconq_kdbq_ama_on_reddit_november_13th_2025/">Reddit DefconQ AMA</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!AGkG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!AGkG!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic 424w, /__u/substackcdn.com/image/fetch/$s_!AGkG!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic 848w, /__u/substackcdn.com/image/fetch/$s_!AGkG!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!AGkG!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!AGkG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic" width="1456" height="1934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1934,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:812348,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/177974850?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!AGkG!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic 424w, /__u/substackcdn.com/image/fetch/$s_!AGkG!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic 848w, /__u/substackcdn.com/image/fetch/$s_!AGkG!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!AGkG!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84434b46-e31e-4f45-820e-0b01ab9b3dee_3072x4080.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Quant Strats Europe 2025 - Event Recap & Highlights]]></title><description><![CDATA[Where Quant Finance Meets Innovation: Insights, Highlights, and Takeaways from Europe&#8217;s Premier Quant Event]]></description><link>https://defconq.substack.com/p/quant-strats-europe-2025-event-recap</link><guid isPermaLink="false">https://defconq.substack.com/p/quant-strats-europe-2025-event-recap</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Mon, 20 Oct 2025 10:38:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RYfI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week marked one of my professional highlights of the year, the long-awaited <a href="https://www.alphaevents.com/events-quantstratsuk">Quant Strats</a>conference finally took place! Hosted on October 14&#8211;15 at Convene 22 Bishopsgate in London, the event delivered two action-packed days filled with cutting-edge insights, technical deep dives, and forward-thinking discussions at the intersection of quantitative finance, AI, and data infrastructure. Just like last year, this blog post will recap the event and share some of the key highlights. Among them was undoubtedly my KDB/Q Masterclass, a deep dive into <strong>Wall Street&#8217;s most powerful array programming language and real-time database</strong>. Keep reading to find out more.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!RYfI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!RYfI!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic 424w, /__u/substackcdn.com/image/fetch/$s_!RYfI!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic 848w, /__u/substackcdn.com/image/fetch/$s_!RYfI!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!RYfI!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!RYfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:341857,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/176629599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!RYfI!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic 424w, /__u/substackcdn.com/image/fetch/$s_!RYfI!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic 848w, /__u/substackcdn.com/image/fetch/$s_!RYfI!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!RYfI!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1b3e0b7-7459-4536-acda-495ada3b882d_2048x1536.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://www.alphaevents.com/events-quantstratsuk">Quant Strats</a> took place right in the heart of the City of London, the historical financial district, just a short walk from Bank Station. As you stroll down Threadneedle Street, passing the historic <strong><a href="https://en.wikipedia.org/wiki/Bank_of_England">Bank of England</a></strong> on your left and the <strong><a href="https://en.wikipedia.org/wiki/Royal_Exchange,_London">Royal Exchange</a></strong>, one of the world&#8217;s oldest trading hubs, first opened in 1571, you can almost feel the spirit of global finance in the air. <strong><a href="https://en.wikipedia.org/wiki/Voltaire">Voltaire</a></strong> captured this essence perfectly in <strong>Letters on the English (1733)</strong>, writing:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><blockquote><p>&#8220;Take a view of the Royal Exchange in London, a place more venerable than many courts of justice, where the representatives of all nations meet for the benefit of mankind. There the Jew, the Mahometan, and the Christian transact together, as though they all professed the same religion, and give the name of infidel to none but bankrupts.&#8221;</p></blockquote><p>A fitting reflection on the city that still serves as one of the world&#8217;s great crossroads of commerce and ideas.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!44cr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!44cr!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic 424w, /__u/substackcdn.com/image/fetch/$s_!44cr!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic 848w, /__u/substackcdn.com/image/fetch/$s_!44cr!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!44cr!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!44cr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1832957,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/176629599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!44cr!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic 424w, /__u/substackcdn.com/image/fetch/$s_!44cr!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic 848w, /__u/substackcdn.com/image/fetch/$s_!44cr!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!44cr!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a183177-e1d6-4ad3-a668-9de4fcdba5b3_3024x4032.heic 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But on this particular Tuesday morning, the usual buzz of the City of London was matched, no surpassed, by the energy inside the halls of <strong>Quant Strats Europe 2025</strong>. With over <strong>500 attendees </strong>representing some of the world&#8217;s leading buy- and sell-side institutions, the atmosphere was electric, a room full of some of the brightest minds in quantitative finance, all eager to connect, learn, and push the boundaries of the field.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!W1TG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!W1TG!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic 424w, /__u/substackcdn.com/image/fetch/$s_!W1TG!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic 848w, /__u/substackcdn.com/image/fetch/$s_!W1TG!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!W1TG!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!W1TG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic" width="1456" height="673" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:673,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:308499,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/176629599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!W1TG!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic 424w, /__u/substackcdn.com/image/fetch/$s_!W1TG!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic 848w, /__u/substackcdn.com/image/fetch/$s_!W1TG!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!W1TG!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa5c6044a-1cad-4db1-bb5a-f70f4cfe5dc9_2048x946.heic 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Setting the Stage &amp; Big Themes</h2><p>After the welcoming remarks of the host, the conference opened with a macroeconomic outlook from <a href="https://www.linkedin.com/in/mike-bell-cfa/">Mike Bell</a>, setting the tone for the conversations around risk, regime shifts, and policy tailwinds. From there, participants dived into panels and sessions on topics such as:</p><ul><li><p>Geopolitical shocks &amp; real-time market signalling</p></li><li><p>Alpha warfare and how AI is reshaping quant strategy</p></li><li><p>Machine learning interpretability in finance</p></li><li><p>Architecting where models live (cloud vs on-prem vs hybrid)</p></li><li><p>Extracting latent signals from unstructured data (LLMs, NLPs)</p></li><li><p>Portfolio construction innovations (multi-asset, private &amp; public)</p></li><li><p>Execution optimization, alternative data, and data pipelines</p></li></ul><p>The agenda was ambitious, bridging theory and practice, and bringing deep technical sessions alongside broader strategy talks.</p><p>A few standout features:</p><ul><li><p><strong>Quickfire &#8220;Insight Unlocked&#8221;</strong> sessions: five-minute lightning talks delivering tight, actionable ideas</p></li><li><p><strong>Masterclass / workshop tracks</strong> on specialized topics</p></li><li><p><strong>Expo demo drives and networking breaks</strong> built in to let practitioners explore tools and connect</p></li><li><p><strong>An app that truly elevates the conference experience</strong>: Guiding you seamlessly through the event with a host of powerful features. I already raved about the Quant Strats Event App last year (you can read my full review <a href="https://www.defconq.tech/blog/DefconQ%20goes%20QuantStrats%202024#organisation">here</a>), and it continues to impress.</p></li><li><p>A spotlight on data infrastructure, deployment architecture, and real-time systems rather than just pure model research</p></li></ul><p>Overall, the <em><strong>focus shifted from signal generation to signal execution, model robustness, deployment trade-offs, and system architecture</strong></em>, exactly where the rubber meets the road in quant finance.</p><h2>My Highlight: Masterclass Data to Deployment, End-to-End Coding for Quant Analysts</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!yAok!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!yAok!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic 424w, /__u/substackcdn.com/image/fetch/$s_!yAok!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic 848w, /__u/substackcdn.com/image/fetch/$s_!yAok!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!yAok!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!yAok!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic" width="1456" height="1934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1934,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1212386,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/176629599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!yAok!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic 424w, /__u/substackcdn.com/image/fetch/$s_!yAok!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic 848w, /__u/substackcdn.com/image/fetch/$s_!yAok!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!yAok!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92661cef-2f84-4f70-bd39-0c111f90be5d_3072x4080.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For me, the highlight of Quant Strats was leading the <strong>90-minute masterclass</strong> titled <em><strong>Data to Deployment: End-to-End Coding for Quant Analysts</strong></em>. In that session, I guided attendees through a full pipeline:</p><ol><li><p><strong>Introduction to KDB/Q</strong>: History, evolution and important concepts of Wall Street&#8217;s most powerful array programming language</p></li><li><p><strong>Ingest &amp; Stream Data</strong> - live integration from historical end-of-day (EOD) files as well as real time data from <strong><a href="https://databento.com/">Databento</a></strong>, a market data provider, giving you <strong>125$</strong> credit when signing up.</p></li><li><p><strong>Data Handling &amp; Cleaning</strong> - parsing, transformations, and schema logic</p></li><li><p><strong>Signal Generation &amp; Strategy Logic</strong> - crafting a simple rading signal, using simple moving averages (SMA), in KDB/Q</p></li><li><p><strong>Optimization, Deployment &amp; Execution</strong> - from prototype to a deployable system</p></li><li><p><strong>Leveraging existing libraries</strong> such as <strong><a href="https://exequtionanalytics.com/">ExeQution Analytics</a></strong>, to focus on what&#8217;s important: <strong>turning data into alpha</strong></p></li><li><p><strong>Visualization &amp; Dashboarding</strong> - showing results using <strong><a href="https://www.timestored.com/pulse/">Pulse</a></strong>, the framework that even makes me enjoy UI work</p></li></ol><p>What made the Masterclass special is the balance between hands-on coding and strategic architecture. Many participants told me afterward that seeing <em><strong>how everything connected:</strong></em> <strong>data &#10145;&#65039; model &#10145;&#65039; execution &#10145;&#65039; monitoring</strong>, helped solidify how to build a real quant system, not just isolated research code.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!dkqx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!dkqx!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic 424w, /__u/substackcdn.com/image/fetch/$s_!dkqx!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic 848w, /__u/substackcdn.com/image/fetch/$s_!dkqx!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!dkqx!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!dkqx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:110109,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/176629599?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!dkqx!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic 424w, /__u/substackcdn.com/image/fetch/$s_!dkqx!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic 848w, /__u/substackcdn.com/image/fetch/$s_!dkqx!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!dkqx!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a5a9bd6-fb01-47e7-a497-b51c49afbdc9_1600x1067.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One recurring theme during the masterclass (and across the event) was the significance of performance, interpretability, and model flexibility. Building for speed is important, but so is building for maintainability and resilience over time.</p><h2>Memorable Panels &amp; Moments</h2><p>Some highlights that stuck with me:</p><ul><li><p><strong>The Geopolitical Shock Panel</strong> asked: <em>How do you separate noise vs signal in global events? and What data sets help decode policy shocks in real time?</em> It&#8217;s a reminder that markets don&#8217;t operate in a vacuum and quant models must ingest events.</p></li><li><p><strong>Alpha Warfare: Winning the AI Arms Race</strong> explored where quant teams get edge when everyone has access to advanced models and compute. Not just model selection, but infrastructure, data, pipelines, and latency matter.</p></li><li><p><strong>Model interpretability &amp; explainable AI</strong> sessions tackled guardrails: how to deploy ML in finance when regulators or stakeholders demand transparency.</p></li><li><p>The discussion on <strong>where models should live</strong>, cloud vs on-prem, tackled real tradeoffs: latency, compliance, cost, and hybrid flexibility.</p></li><li><p>And the closing keynote <em><strong>From Pit Wall to Portfolio</strong></em>, by <a href="https://www.linkedin.com/in/neil-random-logic/">Neil Martin</a> (ex-Formula 1 strategist) drew powerful parallels between motorsport analytics and quant finance: split-second decisions, feedback loops, and optimizing under pressure.</p></li></ul><h2>Reflections &amp; Takeaways</h2><ul><li><p><strong>Systems matter as much as models</strong>: Many talks framed quant work not just as statistical or ML problems, but as engineering and software problems.</p></li><li><p><strong>Deployment &amp; infrastructure tradeoffs shine</strong>: It&#8217;s one thing to produce a signal in Jupyter or research code; it&#8217;s another to embed it into a production pipeline.</p></li><li><p><strong>Data quality, latency &amp; pipeline robustness are differentiators</strong>: Several speakers emphasized that alpha can be lost more in poor data ingestion or messy pipelines than in suboptimal modeling.</p></li><li><p><strong>Hybrid architectures are the future</strong>: The middle ground, balancing on-prem control with cloud scalability, is where many quant firms will land.</p></li><li><p><strong>AI &amp; LLMs are maturing but need guardrails</strong>: The promise is high, but interpretability, drift, and risk control cannot be ignored.</p></li></ul><h2>Conclusion</h2><p>From a personal perspective, seeing the breadth of talent in one room, researchers, engineers, portfolio experts, platform builders, reaffirms that the future of quant is multidisciplinary. Model authors must understand pipelines; engineers must think in signal space. And <strong>KDB/Q continues to prove why it&#8217;s the gold standard for quantitative finance</strong>. Its unmatched ability to process, analyse, and store massive volumes of real-time and historical data makes it the ultimate choice for building modern, scalable, and ultra-low-latency systems. Whether you&#8217;re streaming tick data, engineering features for machine learning, or running complex backtests, KDB/Q empowers quants to focus on insights rather than infrastructure. Simply put, when it comes to speed, scalability, and precision, nothing comes close.</p><p>I walked away energized, with new connections, fresh ideas, and a clearer view of where quant finance is heading.</p><p>If you&#8217;re working with KDB/Q, or planning to, and need expert guidance on architecture reviews, system design, or simply want to deepen your understanding of the language, don&#8217;t hesitate to reach out. I&#8217;m always happy to help fellow quants and developers get the most out of KDB/Q and bring their data infrastructure to the next level.</p><h2>Quant Strats Europe Photo Dump</h2><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17b49a24-9f58-4101-a0b6-84764931b1da_3072x4080.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/56482daf-de88-434b-9dd9-a06a76df5b71_3072x4080.jpeg&quot;},{&quot;type&quot;:&quot;image/jpeg&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/467f6ad4-de67-4d8f-b87f-f770b9593aaf_2880x3840.jpeg&quot;}],&quot;caption&quot;:&quot;&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2cccf4c5-c349-4912-a3c9-96eb78c65bf8_1456x474.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading DefconQ Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Two Years of DefconQ - From Baby Steps to Big Leaps]]></title><description><![CDATA[Marking milestones, growing community, and shaping the future of KDB/Q learning]]></description><link>https://defconq.substack.com/p/two-years-of-defconq-from-baby-steps</link><guid isPermaLink="false">https://defconq.substack.com/p/two-years-of-defconq-from-baby-steps</guid><dc:creator><![CDATA[DefconQ]]></dc:creator><pubDate>Thu, 04 Sep 2025 10:45:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!toY5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It&#8217;s hard to believe, but <strong>DefconQ</strong> just turned two!</p><p>What began as a small personal hobby, mainly to improve my own KDB/Q skills, has since evolved into a full-fledged side project and growing community. I never expected the blog to gain such traction, nor could I have imagined the incredible feedback and connections it would bring.</p><p>I&#8217;m truly grateful to everyone who has supported DefconQ along the way, whether you&#8217;ve subscribed to the newsletter, liked or reshared a LinkedIn post, attended a community meet-up, or simply read an article. Your encouragement and engagement mean the world to me.</p><p>As is now tradition, I&#8217;d love to share some of the highlights from the past year. Let&#8217;s take a look back and celebrate what we&#8217;ve built together. And if you&#8217;re wondering who won the <strong>FREE PREMIUM ticket</strong>to <strong><a href="https://www.alphaevents.com/events-quantstratsuk">Quant Strats Europe 2025</a></strong>, where I&#8217;ll be hosting a KDB/Q Masterclass, keep reading. The winner is revealed in this blog post!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!toY5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!toY5!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!toY5!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!toY5!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!toY5!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!toY5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:321640,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/172756939?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!toY5!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic 424w, /__u/substackcdn.com/image/fetch/$s_!toY5!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic 848w, /__u/substackcdn.com/image/fetch/$s_!toY5!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!toY5!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9cfc5fac-47d5-4781-8f6a-05a867fc7fb2_1024x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>DefconQ's Year in Review</h2><h3>TL;DR</h3><p>The summary below highlights all DefconQ activities from September 4th, 2024 through September 4th, 2025.</p><pre><code><code>q)show TLDR:(`$("Posts";"Reach";"Followers";"Meetups &amp; Conferences";"Livestreams &amp; Podcasts";"Collaborations";"Awards";"Newsletters";"Swag Store";"Bench Press PR";))!31 349686 655 1 3 0 1 2 1 120
Posts                 | 31
Reach                 | 349686
Followers             | 655
Meetups &amp; Conferences | 1
Livestreams &amp; Podcasts| 3
Collaborations        | 0
Awards                | 1
Newsletters&#9;      | 2
Swag Store&#9;      | 1
Bench Press PR&#9;      | 120&#9;</code></code></pre><h3>Blog Posts</h3><p>Just like last year, I want to start my recap with the metric that makes me proudest: the number of blog posts published. At its heart, DefconQ has always been about sharing knowledge and helping others learn KDB/Q. Over the past <strong>12 months</strong>, I published <strong>31 blog posts</strong>, a steady increase from the <strong>26 articles in year one</strong>. From deep dives into key KDB/Q concepts and hands-on tutorials, to curated resources, podcasts, community meet-ups, industry insights and news, the range of content has been both fun and rewarding to create. On average, this equates to one post every two weeks, a rhythm that shows consistency, but also reflects sustainable growth. Thank you to everyone who has read, shared, or joined along the way. Below are some highlights of the traffic and reach DefconQ achieved this year!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ox9a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ox9a!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic 424w, /__u/substackcdn.com/image/fetch/$s_!ox9a!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic 848w, /__u/substackcdn.com/image/fetch/$s_!ox9a!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!ox9a!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ox9a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic" width="1456" height="571" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:571,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:58900,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/172756939?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ox9a!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic 424w, /__u/substackcdn.com/image/fetch/$s_!ox9a!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic 848w, /__u/substackcdn.com/image/fetch/$s_!ox9a!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!ox9a!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f521a44-55d4-4a5a-aa6a-e69a7a6ef7af_1528x599.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>While DefconQ typically sees a steady flow of a few hundred visitors per day, the chart shows two significant spikes toward the end. Both are easy to trace back: the first coincides with my blog post on KDB-X, the newly launched KDB/Q community edition, while the second follows shortly after my third appearance on the ArrayCast as a guest panelist. The first spike from my blog post on KDB-X (link <a href="https://www.defconq.tech/blog/From%20Elite%20to%20Everyone%20-%20KX%20Community%20Edition%20Breaks%20Loose">here</a>), drew nearly <strong>2000 views</strong> on its own and pushed total daily traffic past <strong>3000</strong>. The ArrayCast recap (link <a href="https://www.defconq.tech/blog/ArrayCast%20Insights%20-%20Community%20Edition,%20Community%20Voices%20-%20Talking%20KDB-X%20on%20ArrayCast">here</a>) generated almost the same number of views, though overall traffic for that day leveled out just above 2000.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lAuo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lAuo!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic 424w, /__u/substackcdn.com/image/fetch/$s_!lAuo!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic 848w, /__u/substackcdn.com/image/fetch/$s_!lAuo!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!lAuo!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lAuo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic" width="721" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:721,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:39233,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/172756939?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lAuo!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic 424w, /__u/substackcdn.com/image/fetch/$s_!lAuo!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic 848w, /__u/substackcdn.com/image/fetch/$s_!lAuo!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!lAuo!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F539138f5-8fce-473e-9702-2b3de278f4eb_721x560.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://defconq.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/defconq.substack.com/subscribe"><span>Subscribe now</span></a></p><p>Even more impressive is the breakdown of <strong>user activity</strong>: over the past year, <strong>total visits</strong> grew from <strong>30k</strong> to <strong>69k</strong>, more than a <strong>100%</strong> increase. Active users also doubled, climbing from just over <strong>5k</strong> to more than <strong>10k</strong>. A clear sign that developers see real value in the content I&#8217;m sharing.</p><h3>Reach</h3><p>Another key metric I track is reach, because what&#8217;s the point of creating content if it doesn&#8217;t reach people, right? Since my mission is to share KDB/Q knowledge and make this powerful array programming language more accessible, it&#8217;s important to connect with as many readers as possible. As with last year, the statistics below reflect a combination of my blog readership, my personal LinkedIn presence, and, new this year, my Substack newsletter.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!NvoH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!NvoH!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic 424w, /__u/substackcdn.com/image/fetch/$s_!NvoH!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic 848w, /__u/substackcdn.com/image/fetch/$s_!NvoH!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!NvoH!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!NvoH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic" width="950" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/617978b7-8619-4691-8d85-603fafb8038e_950x406.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:950,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37946,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/172756939?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!NvoH!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic 424w, /__u/substackcdn.com/image/fetch/$s_!NvoH!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic 848w, /__u/substackcdn.com/image/fetch/$s_!NvoH!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!NvoH!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F617978b7-8619-4691-8d85-603fafb8038e_950x406.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One notable takeaway from the user-by-country breakdown is that the United States has now overtaken the United Kingdom, with the majority of users coming from the US. Another shift worth highlighting is Canada moving into fourth place, surpassing both Hong Kong and Ireland. While Ireland dropped out of the top ranks, Germany and Singapore made their way into the leaderboard.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!C6TF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!C6TF!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic 424w, /__u/substackcdn.com/image/fetch/$s_!C6TF!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic 848w, /__u/substackcdn.com/image/fetch/$s_!C6TF!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!C6TF!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!C6TF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic" width="556" height="409" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:409,&quot;width&quot;:556,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:13590,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/172756939?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!C6TF!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic 424w, /__u/substackcdn.com/image/fetch/$s_!C6TF!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic 848w, /__u/substackcdn.com/image/fetch/$s_!C6TF!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!C6TF!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b9eb60a-b5cf-4a25-bed6-6eac2f0e1ecd_556x409.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>On the bright side, London held onto its spot as the city with the most active users.</p><p>Much like last year, most of my blog post announcements went out via my personal LinkedIn profile, so it makes sense to look at those numbers too. And honestly, they blew me away. Impressions nearly doubled, climbing from just under <strong>200k to 350k</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!H4_i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!H4_i!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic 424w, /__u/substackcdn.com/image/fetch/$s_!H4_i!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic 848w, /__u/substackcdn.com/image/fetch/$s_!H4_i!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!H4_i!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!H4_i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic" width="814" height="576" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:576,&quot;width&quot;:814,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24598,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/172756939?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!H4_i!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic 424w, /__u/substackcdn.com/image/fetch/$s_!H4_i!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic 848w, /__u/substackcdn.com/image/fetch/$s_!H4_i!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!H4_i!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0174995-6b5a-48d2-b4af-8a5c383dbb39_814x576.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>My <strong>top-performing posts</strong> reached <strong>17.5k and 15k impressions</strong> each, and overall, more than 60k people engaged with my content. A milestone I&#8217;m truly proud of.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!eQcC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!eQcC!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic 424w, /__u/substackcdn.com/image/fetch/$s_!eQcC!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic 848w, /__u/substackcdn.com/image/fetch/$s_!eQcC!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!eQcC!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_webp, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!eQcC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic" width="819" height="470" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:470,&quot;width&quot;:819,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44032,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://defconq.substack.com/i/172756939?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!eQcC!, /__u/defconq.substack.com/w_424, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic 424w, /__u/substackcdn.com/image/fetch/$s_!eQcC!, /__u/defconq.substack.com/w_848, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic 848w, /__u/substackcdn.com/image/fetch/$s_!eQcC!, /__u/defconq.substack.com/w_1272, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic 1272w, /__u/substackcdn.com/image/fetch/$s_!eQcC!, /__u/defconq.substack.com/w_1456, /__u/defconq.substack.com/c_limit, /__u/defconq.substack.com/f_auto, /__u/defconq.substack.com/q_auto:good, /__u/defconq.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d96c2bc-74e8-4991-875d-fb032751c202_819x470.heic 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Followers</h3><p>Our <a href="https://www.linkedin.com/company/defconq/">DefconQ LinkedIn community</a> experienced a strong growth over the past year, reaching <strong>655 followers</strong>, a <strong>50% increase</strong> compared to the first year. This is a fantastic milestone considering most of the conversations still happen through my personal profile. On top of that, my <a href="/__u/defconq.substack.com/">DefconQ Substack newsletter</a>, which I only launched a year ago, already has <strong>173 subscribers</strong>! If you haven&#8217;t joined yet, head over and subscribe, it&#8217;s free, and it guarantees you&#8217;ll never miss a blog post (they&#8217;ll come straight to your inbox!).</p><h3>Meetup and Conferences</h3><p>While I didn&#8217;t speak at any major conferences this year, I had the pleasure of hosting something even more special: the very <strong>first KDB/Q Community Happy Hour</strong> in London! Nearly <strong>60 developers</strong> joined at Flight Club in Shoreditch for an agenda-free evening full of darts, laughter, networking with both new and familiar faces and brilliant conversations. We stayed until the pub finally kicked us out. The energy and turnout were so encouraging that for DefconQ&#8217;s second anniversary, we&#8217;ll be hosting not one but <strong>TWO</strong> Happy Hours, one in Belfast and another in New York. You can read more about them here.</p><p><a href="https://www.defconq.tech/blog/Brews%20and%20Qs%20Belfast%20Edition%20-%20KX%20and%20DefconQ%20Happy%20Hour!">September 10th, 2025: Brews and Qs Belfast Edition - KX and DefconQ Happy Hour!</a></p><p><a href="https://www.defconq.tech/blog/New%20York,%20New%20York%20-%20DefconQ%20Goes%20International">September 17th, 2025: New York, New York - DefconQ Goes International</a></p><p>Following the <strong>anniversary</strong>, I&#8217;ll be back on the conference stage. On September 19th, I&#8217;ll be in New York at the <strong><a href="https://www.rebellionresearch.com/cornell-financial-engineering-manhattan-2025-future-of-finance-ai-conference">Cornell Financial Engineering Manhattan 2025 Future of Finance &amp; Ai Conference</a></strong>, and in October, I&#8217;ll present a <strong>KDB/Q Masterclass</strong> at <strong><a href="https://www.alphaevents.com/events-quantstratsuk">Quant Strats Europe</a></strong> in London. Tickets for both conferences are still available and you can get a <strong>20% Discount</strong> for <strong>Quant Strats Europe</strong> if you book via my link below.</p><p><strong>Tickets</strong>:</p><p><strong><a href="https://www.rebellionresearch.com/cornell-financial-engineering-manhattan-2025-future-of-finance-ai-conference">Cornell Financial Engineering Manhattan 2025 Future of Finance &amp; Ai Conference</a></strong></p><p><strong><a href="https://www.alphaevents.com/events-quantstratsuk/srspricing-0?disc=AU-QS25&amp;salesmethod_c=Full%20Delegate%20Sales#/">Quant Strats Europe 2025</a></strong></p><h3>Livestreams and Podcasts</h3><p>2025 was a <strong>podcast-heavy</strong> year for me, I had the opportunity to appear on <strong>three podcast episodes</strong>in total: twice as a guest and once as a (guest) panelist!</p><h4>Top 10% Podcast</h4><p>Back in March, I had a great chat with <a href="https://www.linkedin.com/in/craig-whiting-b75a8ba/">Craig Whiting</a>, MD of RLS Search, on his <em><strong>Top 10% Podcast</strong></em>. We explored the world of Tech in Finance, covering everything from banking graduate schemes and nepotism in investment banks to salary progression, promotions, and more. If you&#8217;re considering a career move, navigating the job market, or just starting out, this episode is well worth a listen. Link <a href="https://www.defconq.tech/blog/The%20Truth%20About%20Tech%20Jobs%20in%20Finance%20-%20Nepotism,%20Hedge%20Funds%20&amp;%20Salary%20Secrets!">here</a></p><h4>The ArrayCast - Learning q with Alexander Unterrainer</h4><p>Next up was a real highlight and milestone for me, my first solo appearance on the ArrayCast, the must-listen podcast for array programming enthusiasts. While I had previously joined a group recording during Iverson College 2024, this was the first time I had a full episode to myself, which felt special. Given that The ArrayCast has featured some of the most respected names in the KDB/Q community, it was an honor to add my voice to that list. If you&#8217;re passionate about KDB/Q or array programming in general, this one's for you. Link <a href="https://www.defconq.tech/blog/The%20Array%20Cast%20-%20Where%20Code%20Meets%20Curiosity">here</a></p><h4>The ArrayCast - KDB-X</h4><p>My second appearance on The ArrayCast this year was as a (guest) panelist, stepping in for Stephen Taylor due to a scheduling clash in Stephen's diary. In episode 112, we welcomed Ashok Reddy, CEO of KX, who shared insights into the newly released KDB-X Community Edition. Together, we explored the motivations behind this release, its current state, and what&#8217;s next on the roadmap. Whether you&#8217;re a long-time KDB/Q practitioner or just getting started with this powerful array programming language, this episode is well worth a listen. Link <a href="https://www.defconq.tech/blog/ArrayCast%20Insights%20-%20Community%20Edition,%20Community%20Voices%20-%20Talking%20KDB-X%20on%20ArrayCast">here</a></p><h3>Collaborations</h3><p>Not every collaboration I explored this year materialised, but that&#8217;s part of the journey. What I did gain were incredible new connections, inspiring conversations, and friendships that I know will spark collaborations down the road. The seeds are planted, and I&#8217;m excited for what&#8217;s to come!</p><h3>Certificates and Awards</h3><h4>Quant Strats Advisory Board</h4><p>Technically, this isn&#8217;t an award or certificate, but to me, it feels like one. Earlier this year, I was honored to be nominated to the Advisory Board of <a href="https://www.alphaevents.com/events-quantstratsuk">Quant Strats</a>, the leading conference for quantitative professionals and finance practitioners. If you&#8217;re in finance, this is truly a must-attend event, and I can&#8217;t recommend it enough. Curious what to expect? I attended last year and shared a full recap <a href="https://www.defconq.tech/blog/DefconQ%20goes%20QuantStrats%202024">here</a>. Tickets for this year are still available, and with my link below, you can enjoy a <strong>20% discount</strong>.</p><p><strong><a href="https://www.alphaevents.com/events-quantstratsuk/srspricing-0?disc=AU-QS25&amp;salesmethod_c=Full%20Delegate%20Sales#/">Quant Strats Europe 2025</a></strong></p><h3>Reader's Feedback</h3><p>As I shared last year, the most rewarding achievement for me is the overwhelmingly positive feedback from my readers. There&#8217;s nothing more fulfilling than when someone I&#8217;ve never met reaches out to thank me, saying my blog posts have been helpful or inspiring. More than once, I&#8217;ve had fellow developers recognize me at meetups and strike up a conversation about KDB/Q, which I&#8217;m always delighted to do. So if you ever spot me at a meetup, or even just walking around London, don&#8217;t hesitate to come and say hi. That kind of feedback is priceless, and it remains one of my strongest motivations to keep writing and sharing.</p><h3>Failures</h3><p>Being my own toughest critic, I also acknowledge my failures. Last year, I promised an AMA (Ask Me Anything) session, but unfortunately, it didn&#8217;t happen. I&#8217;m making it up to you: I&#8217;ll be hosting the AMA this October, once all the meet-ups and conferences are wrapped up. During the session, I&#8217;ll do my best to answer your questions about KDB/Q, careers, or anything else you&#8217;d like to ask. It will take place on Reddit, and questions can be submitted completely anonymously. More details will be shared soon.</p><h3>Quant Strats Euoper 2025 Giveaway Winner</h3><p>Now, for the highlight of this wrap-up: it&#8217;s time to announce the winner of the DefconQ Giveaway for a free premium ticket to Quant Strats Europe 2025. And of course, how better to pick a winner than with KDB/Q, after all, we are KDB/Q developers! So, without further ado, here we go.</p><div id="youtube2-xtaFBVAQVPs" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;xtaFBVAQVPs&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/xtaFBVAQVPs?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3>What the Future holds</h3><p>After such a successful year, the future of DefconQ has never looked brighter. I already have a few projects and ideas in the works, along with some bigger plans I&#8217;ve been developing behind the scenes. Everything will be revealed in due time, so for now, stay tuned, subscribe to my newsletter, and keep up with everything happening at DefconQ.</p><p><strong>Until then, happy coding!</strong></p>]]></content:encoded></item></channel></rss>