<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>GitHub C Weekly Trending</title>
    <description>Weekly Trending of C in GitHub</description>
    <pubDate>Mon, 18 May 2026 01:47:38 GMT</pubDate>
    <link>http://mshibanami.github.io/GitHubTrendingRSS</link>
    
    <item>
      <title>Genymobile/scrcpy</title>
      <link>https://github.com/Genymobile/scrcpy</link>
      <description>&lt;p&gt;Display and control your Android device&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;This GitHub repo (&lt;a href=&quot;https://github.com/Genymobile/scrcpy&quot;&gt;https://github.com/Genymobile/scrcpy&lt;/a&gt;) is the only official source for the project. Do not download releases from random websites, even if their name contains &lt;code&gt;scrcpy&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt; 
&lt;h1&gt;scrcpy (v4.0)&lt;/h1&gt; 
&lt;img src=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/app/data/scrcpy.svg?sanitize=true&quot; width=&quot;128&quot; height=&quot;128&quot; alt=&quot;scrcpy&quot; align=&quot;right&quot; /&gt; 
&lt;p&gt;&lt;em&gt;pronounced &quot;&lt;strong&gt;scr&lt;/strong&gt;een &lt;strong&gt;c&lt;/strong&gt;o&lt;strong&gt;py&lt;/strong&gt;&quot;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;This application mirrors Android devices (video and audio) connected via USB or &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/connection.md#tcpip-wireless&quot;&gt;TCP/IP&lt;/a&gt; and allows control using the computer&#39;s keyboard and mouse. It does not require &lt;em&gt;root&lt;/em&gt; access or an app installed on the device. It works on &lt;em&gt;Linux&lt;/em&gt;, &lt;em&gt;Windows&lt;/em&gt;, and &lt;em&gt;macOS&lt;/em&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/linux.md&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Linux-download-orange?style=for-the-badge&amp;amp;logo=linux&quot; alt=&quot;Linux&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/windows.md&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Windows-download-blue?style=for-the-badge&amp;amp;logo=windows&quot; alt=&quot;Windows&quot; /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/macos.md&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/macOS-download-brightgreen?style=for-the-badge&amp;amp;logo=apple&quot; alt=&quot;macOS&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/assets/screenshot-debian-600.jpg&quot; alt=&quot;screenshot&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;It focuses on:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;lightness&lt;/strong&gt;: native, displays only the device screen&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;performance&lt;/strong&gt;: 30~120fps, depending on the device&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;quality&lt;/strong&gt;: 1920×1080 or above&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;low latency&lt;/strong&gt;: &lt;a href=&quot;https://github.com/Genymobile/scrcpy/pull/646&quot;&gt;35~70ms&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;low startup time&lt;/strong&gt;: ~1 second to display the first image&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;non-intrusiveness&lt;/strong&gt;: nothing is left installed on the Android device&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;user benefits&lt;/strong&gt;: no account, no ads, no internet required&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;freedom&lt;/strong&gt;: free and open source software&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Its features include:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/audio.md&quot;&gt;audio forwarding&lt;/a&gt; (Android 11+)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/recording.md&quot;&gt;recording&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/virtual-display.md&quot;&gt;virtual display&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;mirroring with &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/device.md#turn-screen-off&quot;&gt;Android device screen off&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/control.md#copy-paste&quot;&gt;copy-paste&lt;/a&gt; in both directions&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/video.md&quot;&gt;configurable quality&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/camera.md&quot;&gt;camera mirroring&lt;/a&gt; (Android 12+)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/v4l2.md&quot;&gt;mirroring as a webcam (V4L2)&lt;/a&gt; (Linux-only)&lt;/li&gt; 
 &lt;li&gt;physical &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/keyboard.md#physical-keyboard-simulation&quot;&gt;keyboard&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/mouse.md#physical-mouse-simulation&quot;&gt;mouse&lt;/a&gt; simulation (HID)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/gamepad.md&quot;&gt;gamepad&lt;/a&gt; support&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/otg.md&quot;&gt;OTG mode&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;and more…&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Prerequisites&lt;/h2&gt; 
&lt;p&gt;The Android device requires at least API 21 (Android 5.0).&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/audio.md&quot;&gt;Audio forwarding&lt;/a&gt; is supported for API &amp;gt;= 30 (Android 11+).&lt;/p&gt; 
&lt;p&gt;Make sure you &lt;a href=&quot;https://developer.android.com/studio/debug/dev-options#enable&quot;&gt;enabled USB debugging&lt;/a&gt; on your device(s).&lt;/p&gt; 
&lt;p&gt;On some devices (especially Xiaomi), you might get the following error:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Injecting input events requires the caller (or the source of the instrumentation, if any) to have the INJECT_EVENTS permission.
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;In that case, you need to enable &lt;a href=&quot;https://github.com/Genymobile/scrcpy/issues/70#issuecomment-373286323&quot;&gt;an additional option&lt;/a&gt; &lt;code&gt;USB debugging (Security Settings)&lt;/code&gt; (this is an item different from &lt;code&gt;USB debugging&lt;/code&gt;) to control it using a keyboard and mouse. Rebooting the device is necessary once this option is set.&lt;/p&gt; 
&lt;p&gt;Note that USB debugging is not required to run scrcpy in &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/otg.md&quot;&gt;OTG mode&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Get the app&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/linux.md&quot;&gt;Linux&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/windows.md&quot;&gt;Windows&lt;/a&gt; (read &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/windows.md#run&quot;&gt;how to run&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/macos.md&quot;&gt;macOS&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Must-know tips&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/video.md#size&quot;&gt;Reducing resolution&lt;/a&gt; may greatly improve performance (&lt;code&gt;scrcpy -m1024&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/mouse.md#mouse-bindings&quot;&gt;&lt;em&gt;Right-click&lt;/em&gt;&lt;/a&gt; triggers &lt;code&gt;BACK&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/mouse.md#mouse-bindings&quot;&gt;&lt;em&gt;Middle-click&lt;/em&gt;&lt;/a&gt; triggers &lt;code&gt;HOME&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;kbd&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;f&lt;/kbd&gt; toggles &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/window.md#fullscreen&quot;&gt;fullscreen&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;There are many other &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/shortcuts.md&quot;&gt;shortcuts&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Usage examples&lt;/h2&gt; 
&lt;p&gt;There are a lot of options, &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/#user-documentation&quot;&gt;documented&lt;/a&gt; in separate pages. Here are just some common examples.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;Capture the screen in H.265 (better quality), limit the size to 1920, limit the frame rate to 60fps, disable audio, and control the device by simulating a physical keyboard:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scrcpy --video-codec=h265 --max-size=1920 --max-fps=60 --no-audio --keyboard=uhid
scrcpy --video-codec=h265 -m1920 --max-fps=60 --no-audio -K  # short version
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Start VLC in a new virtual display (separate from the device display):&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Start VLC in a new &lt;em&gt;flex&lt;/em&gt; display using H.265 with a bitrate of 16 Mbps, while keeping the display active so it does not turn off:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scrcpy --new-display -x --keep-active --start-app=org.videolan.vlc --video-codec=h265 -b16M
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Record the device camera in H.265 at 1920x1080 (and microphone) to an MP4 file:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scrcpy --video-source=camera --video-codec=h265 --camera-size=1920x1080 --record=file.mp4
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Capture the device front camera and expose it as a webcam on the computer (on Linux):&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scrcpy --video-source=camera --camera-size=1920x1080 --camera-facing=front --v4l2-sink=/dev/video2 --no-playback
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Control the device without mirroring by simulating a physical keyboard and mouse (USB debugging not required):&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scrcpy --otg
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Control the device using gamepads plugged into the computer:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scrcpy --gamepad=uhid
scrcpy -G  # short version
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;User documentation&lt;/h2&gt; 
&lt;p&gt;The application provides a lot of features and configuration options. They are documented in the following pages:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/connection.md&quot;&gt;Connection&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/video.md&quot;&gt;Video&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/audio.md&quot;&gt;Audio&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/control.md&quot;&gt;Control&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/keyboard.md&quot;&gt;Keyboard&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/mouse.md&quot;&gt;Mouse&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/gamepad.md&quot;&gt;Gamepad&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/device.md&quot;&gt;Device&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/window.md&quot;&gt;Window&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/recording.md&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/virtual-display.md&quot;&gt;Virtual display&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/tunnels.md&quot;&gt;Tunnels&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/otg.md&quot;&gt;OTG&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/camera.md&quot;&gt;Camera&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/v4l2.md&quot;&gt;Video4Linux&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/shortcuts.md&quot;&gt;Shortcuts&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Resources&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/FAQ.md&quot;&gt;FAQ&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/Genymobile/scrcpy/wiki&quot;&gt;Translations&lt;/a&gt; (not necessarily up to date)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/build.md&quot;&gt;Build instructions&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/develop.md&quot;&gt;Developers&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/doc/verify-release.md&quot;&gt;Verify release signatures&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Articles&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://blog.rom1v.com/2018/03/introducing-scrcpy/&quot;&gt;Introducing scrcpy&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.genymotion.com/blog/open-source-project-scrcpy-now-works-wirelessly/&quot;&gt;Scrcpy now works wirelessly&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://blog.rom1v.com/2023/03/scrcpy-2-0-with-audio/&quot;&gt;Scrcpy 2.0, with audio&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Contact&lt;/h2&gt; 
&lt;p&gt;You can open an &lt;a href=&quot;https://github.com/Genymobile/scrcpy/issues&quot;&gt;issue&lt;/a&gt; for bug reports, feature requests or general questions.&lt;/p&gt; 
&lt;p&gt;For bug reports, please read the &lt;a href=&quot;https://raw.githubusercontent.com/Genymobile/scrcpy/master/FAQ.md&quot;&gt;FAQ&lt;/a&gt; first, you might find a solution to your problem immediately.&lt;/p&gt; 
&lt;p&gt;You can also use:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Reddit: &lt;a href=&quot;https://www.reddit.com/r/scrcpy&quot;&gt;&lt;code&gt;r/scrcpy&lt;/code&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;BlueSky: &lt;a href=&quot;https://bsky.app/profile/scrcpy.bsky.social&quot;&gt;&lt;code&gt;@scrcpy.bsky.social&lt;/code&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Twitter: &lt;a href=&quot;https://twitter.com/scrcpy_app&quot;&gt;&lt;code&gt;@scrcpy_app&lt;/code&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Donate&lt;/h2&gt; 
&lt;p&gt;I&#39;m &lt;a href=&quot;https://github.com/rom1v&quot;&gt;@rom1v&lt;/a&gt;, the author and maintainer of &lt;em&gt;scrcpy&lt;/em&gt;.&lt;/p&gt; 
&lt;p&gt;If you appreciate this application, you can &lt;a href=&quot;https://blog.rom1v.com/about/#support-my-open-source-work&quot;&gt;support my open source work&lt;/a&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/sponsors/rom1v&quot;&gt;GitHub Sponsors&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://liberapay.com/rom1v/&quot;&gt;Liberapay&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://paypal.me/rom2v&quot;&gt;PayPal&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;License&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;Copyright (C) 2018 Genymobile
Copyright (C) 2018-2026 Romain Vimont

Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
&lt;/code&gt;&lt;/pre&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/48242099a8c8865fc439e098d07ade70aa76169641ffe1dc05545302b5bf4d72/Genymobile/scrcpy" medium="image" />
      
    </item>
    
    <item>
      <title>cactus-compute/cactus</title>
      <link>https://github.com/cactus-compute/cactus</link>
      <description>&lt;p&gt;Low-latency AI engine for mobile devices &amp; wearables&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Cactus&lt;/h1&gt; 
&lt;img src=&quot;https://raw.githubusercontent.com/cactus-compute/cactus/main/assets/banner.jpg&quot; alt=&quot;Logo&quot; style=&quot;border-radius: 30px; width: 100%;&quot; /&gt; 
&lt;p&gt;&lt;a href=&quot;https://cactus-compute.github.io/cactus/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Docs-555?style=for-the-badge&amp;amp;logo=readthedocs&amp;amp;logoColor=white&quot; alt=&quot;Docs&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://cactuscompute.com/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Website-555?style=for-the-badge&amp;amp;logo=safari&amp;amp;logoColor=white&quot; alt=&quot;Website&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/cactus-compute/cactus&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/GitHub-555?style=for-the-badge&amp;amp;logo=github&amp;amp;logoColor=white&quot; alt=&quot;GitHub&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://huggingface.co/Cactus-Compute&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/HuggingFace-555?style=for-the-badge&amp;amp;logo=huggingface&amp;amp;logoColor=white&quot; alt=&quot;HuggingFace&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.reddit.com/r/cactuscompute/&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Reddit-555?style=for-the-badge&amp;amp;logo=reddit&amp;amp;logoColor=white&quot; alt=&quot;Reddit&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://cactuscompute.com/blog&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Blog-555?style=for-the-badge&amp;amp;logo=hashnode&amp;amp;logoColor=white&quot; alt=&quot;Blog&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;A low-latency AI engine for mobile devices &amp;amp; wearables. Main features:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Fast:&lt;/strong&gt; fastest inference on ARM CPU&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Low RAM:&lt;/strong&gt; zero-copy memory mapping ensures 10x lower RAM use than other engines&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Multimodal:&lt;/strong&gt; one SDK for speech, vision, and language models&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Cloud fallback:&lt;/strong&gt; automatically route requests to cloud models if needed&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Energy-efficient:&lt;/strong&gt; NPU-accelerated prefill&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code&gt;┌─────────────────┐
│  Cactus Engine  │ ←── OpenAI-compatible APIs for all major languages
└─────────────────┘     Chat, vision, STT, RAG, tool call, cloud handoff
         │
┌─────────────────┐
│  Cactus Graph   │ ←── Zero-copy computation graph (PyTorch for mobile)
└─────────────────┘     Custom models, optimised for RAM &amp;amp; quantisation
         │
┌─────────────────┐
│ Cactus Kernels  │ ←── ARM SIMD kernels (Apple, Snapdragon, Exynos, etc)
└─────────────────┘     Custom attention, KV-cache quant, chunked prefill
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Quick Demo (Mac)&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Step 1: &lt;code&gt;brew install cactus-compute/cactus/cactus&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Step 2: &lt;code&gt;cactus transcribe&lt;/code&gt; or &lt;code&gt;cactus run&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Cactus Engine&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;#include &quot;cactus.h&quot;

cactus_model_t model = cactus_init(
    &quot;path/to/weight/folder&quot;,
    &quot;path to txt or dir of txts for auto-rag&quot;,
    false
);

const char* messages = R&quot;([
    {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;You are a helpful assistant.&quot;},
    {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;My name is Henry Ndubuaku&quot;}
])&quot;;

const char* options = R&quot;({
    &quot;max_tokens&quot;: 50,
    &quot;stop_sequences&quot;: [&quot;&amp;lt;|im_end|&amp;gt;&quot;]
})&quot;;

char response[4096];
int result = cactus_complete(
    model,            // model handle
    messages,         // JSON chat messages
    response,         // response buffer
    sizeof(response), // buffer size
    options,          // generation options
    nullptr,          // tools JSON
    nullptr,          // streaming callback
    nullptr,          // user data
    nullptr,          // pcm audio buffer
    0                 // pcm buffer size
);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Example response from Gemma3-270m&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &quot;success&quot;: true,        // generation succeeded
    &quot;error&quot;: null,          // error details if failed
    &quot;cloud_handoff&quot;: false, // true if cloud model used
    &quot;response&quot;: &quot;Hi there!&quot;,
    &quot;function_calls&quot;: [],   // parsed tool calls
    &quot;confidence&quot;: 0.8193,   // model confidence
    &quot;time_to_first_token_ms&quot;: 45.23,
    &quot;total_time_ms&quot;: 163.67,
    &quot;prefill_tps&quot;: 1621.89,
    &quot;decode_tps&quot;: 168.42,
    &quot;ram_usage_mb&quot;: 245.67,
    &quot;prefill_tokens&quot;: 28,
    &quot;decode_tokens&quot;: 50,
    &quot;total_tokens&quot;: 78
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Cactus Graph&lt;/h2&gt; 
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;#include &quot;cactus.h&quot;

CactusGraph graph;
auto a = graph.input({2, 3}, Precision::FP16);
auto b = graph.input({3, 4}, Precision::INT8);

auto x1 = graph.matmul(a, b, false);
auto x2 = graph.transpose(x1);
auto result = graph.matmul(b, x2, true);

float a_data[6] = {1.1f, 2.3f, 3.4f, 4.2f, 5.7f, 6.8f};
float b_data[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

graph.set_input(a, a_data, Precision::FP16);
graph.set_input(b, b_data, Precision::INT8);

graph.execute();
void* output_data = graph.get_output(result);

graph.hard_reset(); 
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;API &amp;amp; SDK References&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Reference&lt;/th&gt; 
   &lt;th&gt;Language&lt;/th&gt; 
   &lt;th&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/cactus-compute/cactus/main/docs/cactus_engine.md&quot;&gt;Engine API&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;C&lt;/td&gt; 
   &lt;td&gt;Chat completion, streaming, tool calling, transcription, embeddings, RAG, vision, VAD, vector index, cloud handoff&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/cactus-compute/cactus/main/docs/cactus_graph.md&quot;&gt;Graph API&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;C++&lt;/td&gt; 
   &lt;td&gt;Tensor operations, matrix multiplication, attention, normalization, activation functions&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/cactus-compute/cactus/main/python/&quot;&gt;Python SDK&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Python&lt;/td&gt; 
   &lt;td&gt;Mac, Linux&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/cactus-compute/cactus/main/apple/&quot;&gt;Swift SDK&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Swift&lt;/td&gt; 
   &lt;td&gt;iOS, macOS, tvOS, watchOS, Android&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/cactus-compute/cactus/main/android/&quot;&gt;Kotlin SDK&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Kotlin&lt;/td&gt; 
   &lt;td&gt;Android, iOS (via KMP)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/cactus-compute/cactus/main/flutter/&quot;&gt;Flutter SDK&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Dart&lt;/td&gt; 
   &lt;td&gt;iOS, macOS, Android&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://raw.githubusercontent.com/cactus-compute/cactus/main/rust/&quot;&gt;Rust SDK&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Rust&lt;/td&gt; 
   &lt;td&gt;Mac, Linux&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href=&quot;https://github.com/cactus-compute/cactus-react-native&quot;&gt;React Native&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;JavaScript&lt;/td&gt; 
   &lt;td&gt;iOS, Android&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;&lt;strong&gt;Model weights:&lt;/strong&gt; Pre-converted weights for all supported models at &lt;a href=&quot;https://huggingface.co/Cactus-Compute&quot;&gt;huggingface.co/Cactus-Compute&lt;/a&gt;.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Benchmarks (CPU-only, no GPU)&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;All weights INT4 quantised&lt;/li&gt; 
 &lt;li&gt;LFM: 1k-prefill / 100-decode, values are prefill tps / decode tps&lt;/li&gt; 
 &lt;li&gt;LFM-VL: 256px input, values are latency / decode tps&lt;/li&gt; 
 &lt;li&gt;Parakeet: 20s audio input, values are latency / decode tps&lt;/li&gt; 
 &lt;li&gt;Missing latency = no NPU support yet&lt;/li&gt; 
&lt;/ul&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Device&lt;/th&gt; 
   &lt;th&gt;LFM 1.2B&lt;/th&gt; 
   &lt;th&gt;LFMVL 1.6B&lt;/th&gt; 
   &lt;th&gt;Parakeet 1.1B&lt;/th&gt; 
   &lt;th&gt;RAM&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Mac M4 Pro&lt;/td&gt; 
   &lt;td&gt;582/100&lt;/td&gt; 
   &lt;td&gt;0.2s/98&lt;/td&gt; 
   &lt;td&gt;0.1s/900k+&lt;/td&gt; 
   &lt;td&gt;76MB&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;iPad/Mac M3&lt;/td&gt; 
   &lt;td&gt;350/60&lt;/td&gt; 
   &lt;td&gt;0.3s/69&lt;/td&gt; 
   &lt;td&gt;0.3s/800k+&lt;/td&gt; 
   &lt;td&gt;70MB&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;iPhone 17 Pro&lt;/td&gt; 
   &lt;td&gt;327/48&lt;/td&gt; 
   &lt;td&gt;0.3s/48&lt;/td&gt; 
   &lt;td&gt;0.3s/300k+&lt;/td&gt; 
   &lt;td&gt;108MB&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;iPhone 13 Mini&lt;/td&gt; 
   &lt;td&gt;148/34&lt;/td&gt; 
   &lt;td&gt;0.3s/35&lt;/td&gt; 
   &lt;td&gt;0.7s/90k+&lt;/td&gt; 
   &lt;td&gt;1GB&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Galaxy S25 Ultra&lt;/td&gt; 
   &lt;td&gt;255/37&lt;/td&gt; 
   &lt;td&gt;-/34&lt;/td&gt; 
   &lt;td&gt;-/250k+&lt;/td&gt; 
   &lt;td&gt;1.5GB&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Pixel 6a&lt;/td&gt; 
   &lt;td&gt;70/15&lt;/td&gt; 
   &lt;td&gt;-/15&lt;/td&gt; 
   &lt;td&gt;-/17k+&lt;/td&gt; 
   &lt;td&gt;1GB&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Galaxy A17 5G&lt;/td&gt; 
   &lt;td&gt;32/10&lt;/td&gt; 
   &lt;td&gt;-/11&lt;/td&gt; 
   &lt;td&gt;-/40k+&lt;/td&gt; 
   &lt;td&gt;727MB&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;CMF Phone 2 Pro&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Raspberry Pi 5&lt;/td&gt; 
   &lt;td&gt;69/11&lt;/td&gt; 
   &lt;td&gt;13.3s/11&lt;/td&gt; 
   &lt;td&gt;4.5s/180k+&lt;/td&gt; 
   &lt;td&gt;869MB&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Supported Transcription Model&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;STT: 20s audio input on Macbook Air M3 chip&lt;/li&gt; 
 &lt;li&gt;Benchmark dataset: internal evals with production users&lt;/li&gt; 
&lt;/ul&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Model&lt;/th&gt; 
   &lt;th&gt;Params&lt;/th&gt; 
   &lt;th&gt;End2End ms&lt;/th&gt; 
   &lt;th&gt;Latency ms&lt;/th&gt; 
   &lt;th&gt;Decode toks/sec&lt;/th&gt; 
   &lt;th&gt;NPU&lt;/th&gt; 
   &lt;th&gt;RTF&lt;/th&gt; 
   &lt;th&gt;WER&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;UsefulSensors/moonshine-base&lt;/td&gt; 
   &lt;td&gt;61M&lt;/td&gt; 
   &lt;td&gt;361.35&lt;/td&gt; 
   &lt;td&gt;182&lt;/td&gt; 
   &lt;td&gt;262&lt;/td&gt; 
   &lt;td&gt;yes&lt;/td&gt; 
   &lt;td&gt;0.0180&lt;/td&gt; 
   &lt;td&gt;0.1395&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;openai/whisper-tiny&lt;/td&gt; 
   &lt;td&gt;39M&lt;/td&gt; 
   &lt;td&gt;232.03&lt;/td&gt; 
   &lt;td&gt;137.38&lt;/td&gt; 
   &lt;td&gt;581&lt;/td&gt; 
   &lt;td&gt;yes&lt;/td&gt; 
   &lt;td&gt;0.0116&lt;/td&gt; 
   &lt;td&gt;0.1860&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;openai/whisper-base&lt;/td&gt; 
   &lt;td&gt;74M&lt;/td&gt; 
   &lt;td&gt;329.37&lt;/td&gt; 
   &lt;td&gt;178.65&lt;/td&gt; 
   &lt;td&gt;358&lt;/td&gt; 
   &lt;td&gt;yes&lt;/td&gt; 
   &lt;td&gt;0.0164&lt;/td&gt; 
   &lt;td&gt;0.1628&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;openai/whisper-small&lt;/td&gt; 
   &lt;td&gt;244M&lt;/td&gt; 
   &lt;td&gt;856.79&lt;/td&gt; 
   &lt;td&gt;332.63&lt;/td&gt; 
   &lt;td&gt;108&lt;/td&gt; 
   &lt;td&gt;yes&lt;/td&gt; 
   &lt;td&gt;0.0428&lt;/td&gt; 
   &lt;td&gt;0.0930&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;openai/whisper-medium&lt;/td&gt; 
   &lt;td&gt;769M&lt;/td&gt; 
   &lt;td&gt;2085.87&lt;/td&gt; 
   &lt;td&gt;923.33&lt;/td&gt; 
   &lt;td&gt;49&lt;/td&gt; 
   &lt;td&gt;yes&lt;/td&gt; 
   &lt;td&gt;0.1041&lt;/td&gt; 
   &lt;td&gt;0.0930&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;openai/whisper-large-v3&lt;/td&gt; 
   &lt;td&gt;1.55B&lt;/td&gt; 
   &lt;td&gt;5994&lt;/td&gt; 
   &lt;td&gt;2050&lt;/td&gt; 
   &lt;td&gt;15.72&lt;/td&gt; 
   &lt;td&gt;no&lt;/td&gt; 
   &lt;td&gt;0.2992&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;nvidia/parakeet-ctc-0.6b&lt;/td&gt; 
   &lt;td&gt;600M&lt;/td&gt; 
   &lt;td&gt;201.77&lt;/td&gt; 
   &lt;td&gt;201.44&lt;/td&gt; 
   &lt;td&gt;5214285&lt;/td&gt; 
   &lt;td&gt;yes&lt;/td&gt; 
   &lt;td&gt;0.0101&lt;/td&gt; 
   &lt;td&gt;0.0930&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;nvidia/parakeet-tdt-0.6b-v3&lt;/td&gt; 
   &lt;td&gt;600M&lt;/td&gt; 
   &lt;td&gt;718.91&lt;/td&gt; 
   &lt;td&gt;718.82&lt;/td&gt; 
   &lt;td&gt;3583333&lt;/td&gt; 
   &lt;td&gt;yes&lt;/td&gt; 
   &lt;td&gt;0.0359&lt;/td&gt; 
   &lt;td&gt;0.0465&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;nvidia/parakeet-ctc-1.1b&lt;/td&gt; 
   &lt;td&gt;1.1B&lt;/td&gt; 
   &lt;td&gt;279.03&lt;/td&gt; 
   &lt;td&gt;278.92&lt;/td&gt; 
   &lt;td&gt;4562500&lt;/td&gt; 
   &lt;td&gt;yes&lt;/td&gt; 
   &lt;td&gt;0.0139&lt;/td&gt; 
   &lt;td&gt;0.1628&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;snakers4/silero-vad&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;pyannote/segmentation-3.0&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;pyannote/wespeaker-voxceleb-resnet34-LM&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
   &lt;td&gt;-&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Supported LLMs&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Gemma weights are often &lt;strong&gt;gated&lt;/strong&gt; on HuggingFace, needs tokens&lt;/li&gt; 
 &lt;li&gt;Run &lt;code&gt;huggingface-cli login&lt;/code&gt; and input your huggingface token&lt;/li&gt; 
&lt;/ul&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Model&lt;/th&gt; 
   &lt;th&gt;Features&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;google/gemma-3-270m-it&lt;/td&gt; 
   &lt;td&gt;completion&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;google/functiongemma-270m-it&lt;/td&gt; 
   &lt;td&gt;tools&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;google/gemma-3-1b-it&lt;/td&gt; 
   &lt;td&gt;completion, gated&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;google/gemma-4-E2B-it&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed, vision, speech&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;google/gemma-3n-E2B-it&lt;/td&gt; 
   &lt;td&gt;completion, tools&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;google/gemma-4-E4B-it&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed, vision, speech&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;google/gemma-3n-E4B-it&lt;/td&gt; 
   &lt;td&gt;completion, tools&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;google/gemma-4-E2B-it&lt;/td&gt; 
   &lt;td&gt;vision, audio, completion, tools, Apple NPU&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;google/gemma-4-E4B-it&lt;/td&gt; 
   &lt;td&gt;vision, audio, completion, tools, Apple NPU&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Qwen/Qwen3-0.6B&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Qwen/Qwen3-Embedding-0.6B&lt;/td&gt; 
   &lt;td&gt;embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Qwen/Qwen3.5-0.8B&lt;/td&gt; 
   &lt;td&gt;vision, completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Qwen/Qwen3-1.7B&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Qwen/Qwen3.5-2B&lt;/td&gt; 
   &lt;td&gt;vision, completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LiquidAI/LFM2.5-350M&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LiquidAI/LFM2-700M&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LiquidAI/LFM2-8B-A1B&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LiquidAI/LFM2.5-1.2B-Thinking&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LiquidAI/LFM2.5-1.2B-Instruct&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LiquidAI/LFM2-2.6B&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LiquidAI/LFM2-VL-450M&lt;/td&gt; 
   &lt;td&gt;vision, txt &amp;amp; img embed, Apple NPU&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LiquidAI/LFM2.5-VL-450M&lt;/td&gt; 
   &lt;td&gt;vision, txt &amp;amp; img embed, Apple NPU&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;LiquidAI/LFM2.5-VL-1.6B&lt;/td&gt; 
   &lt;td&gt;vision, txt &amp;amp; img embed, Apple NPU&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;tencent/Youtu-LLM-2B&lt;/td&gt; 
   &lt;td&gt;completion, tools, embed&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;nomic-ai/nomic-embed-text-v2-moe&lt;/td&gt; 
   &lt;td&gt;embed&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Roadmap&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Date&lt;/th&gt; 
   &lt;th&gt;Status&lt;/th&gt; 
   &lt;th&gt;Milestone&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Sep 2025&lt;/td&gt; 
   &lt;td&gt;Done&lt;/td&gt; 
   &lt;td&gt;Released v1&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Oct 2025&lt;/td&gt; 
   &lt;td&gt;Done&lt;/td&gt; 
   &lt;td&gt;Chunked prefill, KVCache Quant (2x prefill)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Nov 2025&lt;/td&gt; 
   &lt;td&gt;Done&lt;/td&gt; 
   &lt;td&gt;Cactus Attention (10 &amp;amp; 1k prefill = same decode)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Dec 2025&lt;/td&gt; 
   &lt;td&gt;Done&lt;/td&gt; 
   &lt;td&gt;Team grows to +6 Research Engineers&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Jan 2026&lt;/td&gt; 
   &lt;td&gt;Done&lt;/td&gt; 
   &lt;td&gt;Apple NPU/RAM, 5-11x faster iOS/Mac&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Feb 2026&lt;/td&gt; 
   &lt;td&gt;Done&lt;/td&gt; 
   &lt;td&gt;Hybrid inference, INT4, lossless Quant (1.5x)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Mar 2026&lt;/td&gt; 
   &lt;td&gt;Coming&lt;/td&gt; 
   &lt;td&gt;Qualcomm/Google NPUs, 5-11x faster Android&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Apr 2026&lt;/td&gt; 
   &lt;td&gt;Coming&lt;/td&gt; 
   &lt;td&gt;Mediatek/Exynos NPUs, Cactus@ICLR&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;May 2026&lt;/td&gt; 
   &lt;td&gt;Coming&lt;/td&gt; 
   &lt;td&gt;Kernel→C++, Graph/Engine→Rust, Mac GPU &amp;amp; VR&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Jun 2026&lt;/td&gt; 
   &lt;td&gt;Coming&lt;/td&gt; 
   &lt;td&gt;Torch/JAX model transpilers&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Jul 2026&lt;/td&gt; 
   &lt;td&gt;Coming&lt;/td&gt; 
   &lt;td&gt;Wearables optimisations, Cactus@ICML&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Aug 2026&lt;/td&gt; 
   &lt;td&gt;Coming&lt;/td&gt; 
   &lt;td&gt;Orchestration&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;Sep 2026&lt;/td&gt; 
   &lt;td&gt;Coming&lt;/td&gt; 
   &lt;td&gt;Full Cactus paper, chip manufacturer partners&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Using this repo&lt;/h2&gt; 
&lt;pre&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────────────────────┐
│                                                                              │
│ Step 0: if on Linux (Ubuntu/Debian)                                          │
│ sudo apt-get install python3 python3-venv python3-pip cmake                  │
│   build-essential libcurl4-openssl-dev                                       │
│                                                                              │
│ Step 1: clone and setup                                                      │
│ git clone https://github.com/cactus-compute/cactus &amp;amp;&amp;amp; cd cactus              │
│ source ./setup                                                               │
│                                                                              │
│ Step 2: use the commands                                                     │
│──────────────────────────────────────────────────────────────────────────────│
│                                                                              │
│  cactus auth                         manage Cloud API key                    │
│    --status                          show key status                         │
│    --clear                           remove saved key                        │
│                                                                              │
│  cactus run &amp;lt;model&amp;gt;                  opens playground (auto downloads)       │
│    --precision INT4|INT8|FP16        quantization (default: INT4)            │
│    --token &amp;lt;token&amp;gt;                   HF token (gated models)                 │
│    --reconvert                       force reconversion from source          │
│                                                                              │
│  cactus transcribe [model]           live mic transcription (parakeet-tdt-0.6b-v3) │
│    --file &amp;lt;audio.wav&amp;gt;                transcribe file instead of mic          │
│    --precision INT4|INT8|FP16        quantization (default: INT4)            │
│    --token &amp;lt;token&amp;gt;                   HF token (gated models)                 │
│    --reconvert                       force reconversion from source          │
│                                                                              │
│  cactus download &amp;lt;model&amp;gt;             downloads model to ./weights            │
│    --precision INT4|INT8|FP16        quantization (default: INT4)            │
│    --token &amp;lt;token&amp;gt;                   HuggingFace API token                   │
│    --reconvert                       force reconversion from source          │
│                                                                              │
│  cactus convert &amp;lt;model&amp;gt; [dir]        convert model, supports LoRA merge      │
│    --precision INT4|INT8|FP16        quantization (default: INT4)            │
│    --lora &amp;lt;path&amp;gt;                     LoRA adapter to merge                   │
│    --token &amp;lt;token&amp;gt;                   HuggingFace API token                   │
│                                                                              │
│  cactus build                        build for ARM → build/libcactus.a       │
│    --apple                           Apple (iOS/macOS)                       │
│    --android                         Android                                 │
│    --flutter                         Flutter (all platforms)                 │
│    --python                          shared lib for Python FFI               │
│                                                                              │
│  cactus test                         run unit tests and benchmarks           │
│    --model &amp;lt;model&amp;gt;                   default: LFM2-VL-450M                   │
│    --transcribe_model &amp;lt;model&amp;gt;        default: moonshine-base                 │
│    --benchmark                       use larger models                       │
│    --precision INT4|INT8|FP16        regenerate weights with precision       │
│    --reconvert                       force reconversion from source          │
│    --no-rebuild                      skip building library                   │
│    --llm / --stt / --performance     run specific test suite                 │
│    --ios                             run on connected iPhone                 │
│    --android                         run on connected Android                │
│                                                                              │
│  cactus clean                        remove all build artifacts              │
│  cactus --help                       show all commands and flags             │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Maintaining Organisations&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;a href=&quot;https://cactuscompute.com/&quot;&gt;Cactus Compute, Inc. (YC S25)&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://bruinai.org/&quot;&gt;UCLA&#39;s BruinAI&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://char.com/&quot;&gt;Char (YC S25)&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.yale-ai.org/team&quot;&gt;Yale&#39;s AI Society&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.nusaisociety.org/&quot;&gt;National University of Singapore&#39;s AI Society&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://aiclub.ics.uci.edu/&quot;&gt;UC Irvine&#39;s AI@UCI&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.imperialcollegeunion.org/csp/1391&quot;&gt;Imperial College&#39;s AI Society&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://ai-at-penn-main-105.vercel.app/&quot;&gt;University of Pennsylvania&#39;s AI@Penn&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://msail.github.io/&quot;&gt;University of Michigan Ann-Arbor MSAIL&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.cuaiclub.org/&quot;&gt;University of Colorado Boulder&#39;s AI Club&lt;/a&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Citation&lt;/h2&gt; 
&lt;p&gt;If you use Cactus in your research, please cite it as follows:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bibtex&quot;&gt;@software{cactus,
  title        = {Cactus: AI Inference Engine for Phones &amp;amp; Wearables},
  author       = {Ndubuaku, Henry and Cactus Team},
  url          = {https://github.com/cactus-compute/cactus},
  year         = {2025}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;strong&gt;N/B:&lt;/strong&gt; Scroll all the way up and click the shields link for resources!&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/300916f55d0cfc4f0bfe4f46ef6181c724e291d6dfb39b6c25424a799cfbfa92/cactus-compute/cactus" medium="image" />
      
    </item>
    
    <item>
      <title>mit-pdos/xv6-riscv</title>
      <link>https://github.com/mit-pdos/xv6-riscv</link>
      <description>&lt;p&gt;Xv6 for RISC-V&lt;/p&gt;&lt;hr&gt;&lt;p&gt;xv6 is a re-implementation of Dennis Ritchie&#39;s and Ken Thompson&#39;s Unix Version 6 (v6). xv6 loosely follows the structure and style of v6, but is implemented for a modern RISC-V multiprocessor using ANSI C.&lt;/p&gt; 
&lt;p&gt;ACKNOWLEDGMENTS&lt;/p&gt; 
&lt;p&gt;xv6 is inspired by John Lions&#39;s Commentary on UNIX 6th Edition (Peer to Peer Communications; ISBN: 1-57398-013-7; 1st edition (June 14, 2000)). See also &lt;a href=&quot;https://pdos.csail.mit.edu/6.1810/&quot;&gt;https://pdos.csail.mit.edu/6.1810/&lt;/a&gt;, which provides pointers to on-line resources for v6.&lt;/p&gt; 
&lt;p&gt;The following people have made contributions: Russ Cox (context switching, locking), Cliff Frey (MP), Xiao Yu (MP), Nickolai Zeldovich, and Austin Clements.&lt;/p&gt; 
&lt;p&gt;We are also grateful for the bug reports and patches contributed by Abhinavpatel00, Takahiro Aoyagi, Marcelo Arroyo, Hirbod Behnam, Silas Boyd-Wickizer, Anton Burtsev, carlclone, Ian Chen, clivezeng, Dan Cross, Cody Cutler, Mike CAT, Tej Chajed, Asami Doi,Wenyang Duan, echtwerner, eyalz800, Nelson Elhage, Saar Ettinger, Alice Ferrazzi, Nathaniel Filardo, flespark, Peter Froehlich, Yakir Goaron, Shivam Handa, Matt Harvey, Bryan Henry, jaichenhengjie, Jim Huang, Matúš Jókay, John Jolly, Alexander Kapshuk, Anders Kaseorg, kehao95, Wolfgang Keller, Jungwoo Kim, Jonathan Kimmitt, Eddie Kohler, Vadim Kolontsov, Austin Liew, l0stman, Pavan Maddamsetti, Imbar Marinescu, Yandong Mao, Matan Shabtay, Hitoshi Mitake, Carmi Merimovich, mes900903, Mark Morrissey, mtasm, Joel Nider, Hayato Ohhashi, OptimisticSide, papparapa, phosphagos, Harry Porter, Greg Price, Zheng qhuo, Quancheng, RayAndrew, Jude Rich, segfault, Ayan Shafqat, Eldar Sehayek, Yongming Shen, Fumiya Shigemitsu, snoire, Taojie, Cam Tenny, tyfkda, Warren Toomey, Stephen Tu, Alissa Tung, Rafael Ubal, unicornx, Amane Uehara, Pablo Ventura, Luc Videau, Xi Wang, WaheedHafez, Keiichi Watanabe, Lucas Wolf, Nicolas Wolovick, wxdao, Grant Wu, x653, Andy Zhang, Jindong Zhang, Icenowy Zheng, ZhUyU1997, and Zou Chang Wei.&lt;/p&gt; 
&lt;p&gt;ERROR REPORTS&lt;/p&gt; 
&lt;p&gt;Please send errors and suggestions to Frans Kaashoek and Robert Morris (&lt;a href=&quot;mailto:kaashoek,rtm@mit.edu&quot;&gt;kaashoek,rtm@mit.edu&lt;/a&gt;). The main purpose of xv6 is as a teaching operating system for MIT&#39;s 6.1810, so we are more interested in simplifications and clarifications than new features.&lt;/p&gt; 
&lt;p&gt;BUILDING AND RUNNING XV6&lt;/p&gt; 
&lt;p&gt;You will need a RISC-V &quot;newlib&quot; tool chain from &lt;a href=&quot;https://github.com/riscv/riscv-gnu-toolchain&quot;&gt;https://github.com/riscv/riscv-gnu-toolchain&lt;/a&gt;, and qemu compiled for riscv64-softmmu. Once they are installed, and in your shell search path, you can run &quot;make qemu&quot;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/4d96600b0c4e13c77d200a9fc773849289b4c78523d42f8ed56a1472c70ab72c/mit-pdos/xv6-riscv" medium="image" />
      
    </item>
    
    <item>
      <title>nginx/nginx</title>
      <link>https://github.com/nginx/nginx</link>
      <description>&lt;p&gt;The official NGINX Open Source repository.&lt;/p&gt;&lt;hr&gt;&lt;picture&gt; 
 &lt;source media=&quot;(prefers-color-scheme: dark)&quot; srcset=&quot;https://github.com/user-attachments/assets/9335b488-ffcc-4157-8364-2370a0b70ad0&quot; /&gt; 
 &lt;source media=&quot;(prefers-color-scheme: light)&quot; srcset=&quot;https://github.com/user-attachments/assets/3a7eeb08-1133-47f5-859c-fad4f5a6a013&quot; /&gt; 
 &lt;img alt=&quot;NGINX Banner&quot; /&gt; 
&lt;/picture&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.repostatus.org/#active&quot;&gt;&lt;img src=&quot;https://www.repostatus.org/badges/latest/active.svg?sanitize=true&quot; alt=&quot;Project Status: Active – The project has reached a stable, usable state and is being actively developed.&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://community.nginx.org&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/community-forum-009639?logo=discourse&amp;amp;link=https%3A%2F%2Fcommunity.nginx.org&quot; alt=&quot;Community Forum&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/LICENSE&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/License-BSD%202--Clause-blue.svg?sanitize=true&quot; alt=&quot;License&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/CODE_OF_CONDUCT.md&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg?sanitize=true&quot; alt=&quot;Code of Conduct&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;NGINX (pronounced &quot;engine x&quot; or &quot;en-jin-eks&quot;) is the world&#39;s most popular Web Server, high performance Load Balancer, Reverse Proxy, API Gateway and Content Cache.&lt;/p&gt; 
&lt;p&gt;NGINX is free and open source software, distributed under the terms of a simplified &lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/LICENSE&quot;&gt;2-clause BSD-like license&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Enterprise distributions, commercial support and training are available from &lt;a href=&quot;https://www.f5.com/products/nginx&quot;&gt;F5, Inc&lt;/a&gt;.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;The goal of this README is to provide a basic, structured introduction to NGINX for novice users. Please refer to the &lt;a href=&quot;https://nginx.org/en/docs/&quot;&gt;full NGINX documentation&lt;/a&gt; for detailed information on &lt;a href=&quot;https://nginx.org/en/docs/install.html&quot;&gt;installing&lt;/a&gt;, &lt;a href=&quot;https://nginx.org/en/docs/configure.html&quot;&gt;building&lt;/a&gt;, &lt;a href=&quot;https://nginx.org/en/docs/dirindex.html&quot;&gt;configuring&lt;/a&gt;, &lt;a href=&quot;https://nginx.org/en/docs/debugging_log.html&quot;&gt;debugging&lt;/a&gt;, and more. These documentation pages also contain a more detailed &lt;a href=&quot;https://nginx.org/en/docs/beginners_guide.html&quot;&gt;Beginners Guide&lt;/a&gt;, How-Tos, &lt;a href=&quot;https://nginx.org/en/docs/dev/development_guide.html&quot;&gt;Development guide&lt;/a&gt;, and a complete module and &lt;a href=&quot;https://nginx.org/en/docs/dirindex.html&quot;&gt;directive reference&lt;/a&gt;.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h1&gt;Table of contents&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#how-it-works&quot;&gt;How it works&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#modules&quot;&gt;Modules&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#configurations&quot;&gt;Configurations&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#runtime&quot;&gt;Runtime&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#downloading-and-installing&quot;&gt;Downloading and installing&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#stable-and-mainline-binaries&quot;&gt;Stable and Mainline binaries&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#linux-binary-installation-process&quot;&gt;Linux binary installation process&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#freebsd-installation-process&quot;&gt;FreeBSD installation process&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#windows-executables&quot;&gt;Windows executables&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#dynamic-modules&quot;&gt;Dynamic modules&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#getting-started-with-nginx&quot;&gt;Getting started with NGINX&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#installing-ssl-certificates-and-enabling-tls-encryption&quot;&gt;Installing SSL certificates and enabling TLS encryption&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#load-balancing&quot;&gt;Load Balancing&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#rate-limiting&quot;&gt;Rate limiting&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#content-caching&quot;&gt;Content caching&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#building-from-source&quot;&gt;Building from source&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#installing-dependencies&quot;&gt;Installing dependencies&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#cloning-the-nginx-github-repository&quot;&gt;Cloning the NGINX GitHub repository&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#configuring-the-build&quot;&gt;Configuring the build&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#compiling&quot;&gt;Compiling&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#location-of-binary-and-installation&quot;&gt;Location of binary and installation&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#running-and-testing-the-installed-binary&quot;&gt;Running and testing the installed binary&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#asking-questions-and-reporting-issues&quot;&gt;Asking questions and reporting issues&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#contributing-code&quot;&gt;Contributing code&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#additional-help-and-resources&quot;&gt;Additional help and resources&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#changelog&quot;&gt;Changelog&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#license&quot;&gt;License&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;How it works&lt;/h1&gt; 
&lt;p&gt;NGINX is installed software with binary packages available for all major operating systems and Linux distributions. See &lt;a href=&quot;https://nginx.org/en/#tested_os_and_platforms&quot;&gt;Tested OS and Platforms&lt;/a&gt; for a full list of compatible systems.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;While nearly all popular Linux-based operating systems are distributed with a community version of nginx, we highly advise installation and usage of official &lt;a href=&quot;https://nginx.org/en/linux_packages.html&quot;&gt;packages&lt;/a&gt; or sources from this repository. Doing so ensures that you&#39;re using the most recent release or source code, including the latest feature-set, fixes and security patches.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h2&gt;Modules&lt;/h2&gt; 
&lt;p&gt;NGINX is comprised of individual modules, each extending core functionality by providing additional, configurable features. See &quot;Modules reference&quot; at the bottom of &lt;a href=&quot;https://nginx.org/en/docs/&quot;&gt;nginx documentation&lt;/a&gt; for a complete list of official modules.&lt;/p&gt; 
&lt;p&gt;NGINX modules can be built and distributed as static or dynamic modules. Static modules are defined at build-time, compiled, and distributed in the resulting binaries. See &lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#dynamic-modules&quot;&gt;Dynamic Modules&lt;/a&gt; for more information on how they work, as well as, how to obtain, install, and configure them.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;You can issue the following command to see which static modules your NGINX binaries were built with:&lt;/p&gt; 
&lt;/div&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;nginx -V
&lt;/code&gt;&lt;/pre&gt; 
&lt;blockquote&gt; 
 &lt;p&gt;See &lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#configuring-the-build&quot;&gt;Configuring the build&lt;/a&gt; for information on how to include specific Static modules into your nginx build.&lt;/p&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Configurations&lt;/h2&gt; 
&lt;p&gt;NGINX is highly flexible and configurable. Provisioning the software is achieved via text-based config file(s) accepting parameters called &quot;&lt;a href=&quot;https://nginx.org/en/docs/dirindex.html&quot;&gt;Directives&lt;/a&gt;&quot;. See &lt;a href=&quot;https://nginx.org/en/docs/beginners_guide.html#conf_structure&quot;&gt;Configuration File&#39;s Structure&lt;/a&gt; for a comprehensive description of how NGINX configuration files work.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-info mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Note&lt;/p&gt;
 &lt;p&gt;The set of directives available to your distribution of NGINX is dependent on which &lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#modules&quot;&gt;modules&lt;/a&gt; have been made available to it.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h2&gt;Runtime&lt;/h2&gt; 
&lt;p&gt;Rather than running in a single, monolithic process, NGINX is architected to scale beyond Operating System process limitations by operating as a collection of processes. They include:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;A &quot;master&quot; process that maintains worker processes, as well as, reads and evaluates configuration files.&lt;/li&gt; 
 &lt;li&gt;One or more &quot;worker&quot; processes that process data (eg. HTTP requests).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The number of &lt;a href=&quot;https://nginx.org/en/docs/ngx_core_module.html#worker_processes&quot;&gt;worker processes&lt;/a&gt; is defined in the configuration file and may be fixed for a given configuration or automatically adjusted to the number of available CPU cores. In most cases, the latter option optimally balances load across available system resources, as NGINX is designed to efficiently distribute work across all worker processes.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;Processes synchronize data through shared memory. For this reason, many NGINX directives require the allocation of shared memory zones. As an example, when configuring &lt;a href=&quot;https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req&quot;&gt;rate limiting&lt;/a&gt;, connecting clients may need to be tracked in a &lt;a href=&quot;https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone&quot;&gt;common memory zone&lt;/a&gt; so all worker processes can know how many times a particular client has accessed the server in a span of time.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h1&gt;Downloading and installing&lt;/h1&gt; 
&lt;p&gt;Follow these steps to download and install precompiled NGINX binaries. You may also choose to &lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/#building-from-source&quot;&gt;build NGINX locally from source code&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Stable and Mainline binaries&lt;/h2&gt; 
&lt;p&gt;NGINX binaries are built and distributed in two versions: stable and mainline. Stable binaries are built from stable branches and only contain critical fixes backported from the mainline version. Mainline binaries are built from the &lt;a href=&quot;https://github.com/nginx/nginx/tree/master&quot;&gt;master branch&lt;/a&gt; and contain the latest features and bugfixes. You&#39;ll need to &lt;a href=&quot;https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/#choosing-between-a-stable-or-a-mainline-version&quot;&gt;decide which is appropriate for your purposes&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Linux binary installation process&lt;/h2&gt; 
&lt;p&gt;The NGINX binary installation process takes advantage of package managers native to specific Linux distributions. For this reason, first-time installations involve adding the official NGINX package repository to your system&#39;s package manager. Follow &lt;a href=&quot;https://nginx.org/en/linux_packages.html&quot;&gt;these steps&lt;/a&gt; to download, verify, and install NGINX binaries using the package manager appropriate for your Linux distribution.&lt;/p&gt; 
&lt;h3&gt;Upgrades&lt;/h3&gt; 
&lt;p&gt;Future upgrades to the latest version can be managed using the same package manager without the need to manually download and verify binaries.&lt;/p&gt; 
&lt;h2&gt;FreeBSD installation process&lt;/h2&gt; 
&lt;p&gt;For more information on installing NGINX on FreeBSD system, visit &lt;a href=&quot;https://nginx.org/en/docs/install.html&quot;&gt;https://nginx.org/en/docs/install.html&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Windows executables&lt;/h2&gt; 
&lt;p&gt;Windows executables for mainline and stable releases can be found on the main &lt;a href=&quot;https://nginx.org/en/download.html&quot;&gt;NGINX download page&lt;/a&gt;. Note that the current implementation of NGINX for Windows is at the Proof-of-Concept stage and should only be used for development and testing purposes. For additional information, please see &lt;a href=&quot;https://nginx.org/en/docs/windows.html&quot;&gt;nginx for Windows&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Dynamic modules&lt;/h2&gt; 
&lt;p&gt;NGINX version 1.9.11 added support for &lt;a href=&quot;https://nginx.org/en/docs/ngx_core_module.html#load_module&quot;&gt;Dynamic Modules&lt;/a&gt;. Unlike Static modules, dynamically built modules can be downloaded, installed, and configured after the core NGINX binaries have been built. &lt;a href=&quot;https://nginx.org/en/linux_packages.html#dynmodules&quot;&gt;Official dynamic module binaries&lt;/a&gt; are available from the same package repository as the core NGINX binaries described in previous steps.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;&lt;a href=&quot;https://github.com/nginx/njs&quot;&gt;NGINX JavaScript (njs)&lt;/a&gt;, is a popular NGINX dynamic module that enables the extension of core NGINX functionality using familiar JavaScript syntax.&lt;/p&gt; 
&lt;/div&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;If desired, dynamic modules can also be built statically into NGINX at compile time.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h1&gt;Getting started with NGINX&lt;/h1&gt; 
&lt;p&gt;For a gentle introduction to NGINX basics, please see our &lt;a href=&quot;https://nginx.org/en/docs/beginners_guide.html&quot;&gt;Beginner’s Guide&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Installing SSL certificates and enabling TLS encryption&lt;/h2&gt; 
&lt;p&gt;See &lt;a href=&quot;https://nginx.org/en/docs/http/configuring_https_servers.html&quot;&gt;Configuring HTTPS servers&lt;/a&gt; for a quick guide on how to enable secure traffic to your NGINX installation.&lt;/p&gt; 
&lt;h2&gt;Load Balancing&lt;/h2&gt; 
&lt;p&gt;For a quick start guide on configuring NGINX as a Load Balancer, please see &lt;a href=&quot;https://nginx.org/en/docs/http/load_balancing.html&quot;&gt;Using nginx as HTTP load balancer&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Rate limiting&lt;/h2&gt; 
&lt;p&gt;See our &lt;a href=&quot;https://blog.nginx.org/blog/rate-limiting-nginx&quot;&gt;Rate Limiting with NGINX&lt;/a&gt; blog post for an overview of core concepts for provisioning NGINX as an API Gateway.&lt;/p&gt; 
&lt;h2&gt;Content caching&lt;/h2&gt; 
&lt;p&gt;See &lt;a href=&quot;https://blog.nginx.org/blog/nginx-caching-guide&quot;&gt;A Guide to Caching with NGINX and NGINX Plus&lt;/a&gt; blog post for an overview of how to use NGINX as a content cache (e.g. edge server of a content delivery network).&lt;/p&gt; 
&lt;h1&gt;Building from source&lt;/h1&gt; 
&lt;p&gt;The following steps can be used to build NGINX from source code available in this repository.&lt;/p&gt; 
&lt;h2&gt;Installing dependencies&lt;/h2&gt; 
&lt;p&gt;Most Linux distributions will require several dependencies to be installed in order to build NGINX. The following instructions are specific to the &lt;code&gt;apt&lt;/code&gt; package manager, widely available on most Ubuntu/Debian distributions and their derivatives.&lt;/p&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-tip&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-light-bulb mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Tip&lt;/p&gt;
 &lt;p&gt;It is always a good idea to update your package repository lists prior to installing new packages.&lt;/p&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;h3&gt;Installing compiler and make utility&lt;/h3&gt; 
&lt;p&gt;Use the following command to install the GNU C compiler and Make utility.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install gcc make
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Installing dependency libraries&lt;/h3&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install libpcre3-dev zlib1g-dev
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-warning&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-alert mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Warning&lt;/p&gt;
 &lt;p&gt;This is the minimal set of dependency libraries needed to build NGINX with rewriting and gzip capabilities. Other dependencies may be required if you choose to build NGINX with additional modules. Monitor the output of the &lt;code&gt;configure&lt;/code&gt; command discussed in the following sections for information on which modules may be missing. For example, if you plan to use SSL certificates to encrypt traffic with TLS, you&#39;ll need to install the OpenSSL library. To do so, issue the following command.&lt;/p&gt; 
&lt;/div&gt; 
&lt;blockquote&gt; 
 &lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install libssl-dev
&lt;/code&gt;&lt;/pre&gt; 
&lt;/blockquote&gt; 
&lt;h2&gt;Cloning the NGINX GitHub repository&lt;/h2&gt; 
&lt;p&gt;Using your preferred method, clone the NGINX repository into your development directory. See &lt;a href=&quot;https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository&quot;&gt;Cloning a GitHub Repository&lt;/a&gt; for additional help.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/nginx/nginx.git
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Configuring the build&lt;/h2&gt; 
&lt;p&gt;Prior to building NGINX, you must run the &lt;code&gt;configure&lt;/code&gt; script with &lt;a href=&quot;https://nginx.org/en/docs/configure.html&quot;&gt;appropriate flags&lt;/a&gt;. This will generate a Makefile in your NGINX source root directory that can then be used to compile NGINX with &lt;a href=&quot;https://nginx.org/en/docs/configure.html&quot;&gt;options specified during configuration&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;From the NGINX source code repository&#39;s root directory:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;auto/configure
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;Configuring the build without any flags will compile NGINX with the default set of options. Please refer to &lt;a href=&quot;https://nginx.org/en/docs/configure.html&quot;&gt;https://nginx.org/en/docs/configure.html&lt;/a&gt; for a full list of available build configuration options.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h2&gt;Compiling&lt;/h2&gt; 
&lt;p&gt;The &lt;code&gt;configure&lt;/code&gt; script will generate a &lt;code&gt;Makefile&lt;/code&gt; in the NGINX source root directory upon successful execution. To compile NGINX into a binary, issue the following command from that same directory:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;make
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Location of binary and installation&lt;/h2&gt; 
&lt;p&gt;After successful compilation, a binary will be generated at &lt;code&gt;&amp;lt;NGINX_SRC_ROOT_DIR&amp;gt;/objs/nginx&lt;/code&gt;. To install this binary, issue the following command from the source root directory:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo make install
&lt;/code&gt;&lt;/pre&gt; 
&lt;div class=&quot;markdown-alert markdown-alert-important&quot;&gt;
 &lt;p class=&quot;markdown-alert-title&quot;&gt;
  &lt;svg class=&quot;octicon octicon-report mr-2&quot; viewbox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;
   &lt;path d=&quot;M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z&quot;&gt;&lt;/path&gt;
  &lt;/svg&gt;Important&lt;/p&gt;
 &lt;p&gt;The binary will be installed into the &lt;code&gt;/usr/local/nginx/&lt;/code&gt; directory.&lt;/p&gt; 
&lt;/div&gt; 
&lt;h2&gt;Running and testing the installed binary&lt;/h2&gt; 
&lt;p&gt;To run the installed binary, issue the following command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo /usr/local/nginx/sbin/nginx
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You may test NGINX operation using &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl localhost
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The output of which should start with:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;Welcome to nginx!&amp;lt;/title&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1&gt;Asking questions and reporting issues&lt;/h1&gt; 
&lt;p&gt;See our &lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/SUPPORT.md&quot;&gt;Support&lt;/a&gt; guidelines for information on how discuss the codebase, ask troubleshooting questions, and report issues.&lt;/p&gt; 
&lt;h1&gt;Contributing code&lt;/h1&gt; 
&lt;p&gt;Please see the &lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/CONTRIBUTING.md&quot;&gt;Contributing&lt;/a&gt; guide for information on how to contribute code.&lt;/p&gt; 
&lt;h1&gt;Additional help and resources&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;See the &lt;a href=&quot;https://blog.nginx.org/&quot;&gt;NGINX Community Blog&lt;/a&gt; for more tips, tricks and HOW-TOs related to NGINX and related projects.&lt;/li&gt; 
 &lt;li&gt;Access &lt;a href=&quot;https://nginx.org/&quot;&gt;nginx.org&lt;/a&gt;, your go-to source for all documentation, information and software related to the NGINX suite of projects.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Changelog&lt;/h1&gt; 
&lt;p&gt;See our &lt;a href=&quot;https://nginx.org/en/CHANGES&quot;&gt;changelog&lt;/a&gt; to keep track of updates.&lt;/p&gt; 
&lt;h1&gt;License&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/nginx/nginx/master/LICENSE&quot;&gt;2-clause BSD-like license&lt;/a&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;p&gt;Additional documentation available at: &lt;a href=&quot;https://nginx.org/en/docs&quot;&gt;https://nginx.org/en/docs&lt;/a&gt;&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/8cc58475ddf16bd7ccef7b31f832afed2e7f19fc455d7bf219f372cc7f96f037/nginx/nginx" medium="image" />
      
    </item>
    
    <item>
      <title>DavidXanatos/TaskExplorer</title>
      <link>https://github.com/DavidXanatos/TaskExplorer</link>
      <description>&lt;p&gt;Power full Task Manager&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;TaskExplorer&lt;/h1&gt; 
&lt;p&gt;Task Explorer is a powerful task management tool designed not only to monitor running applications but to provide deep insight into what those applications are doing. Its user interface prioritizes speed and efficiency, delivering real-time data on processes with minimal interaction. Instead of requiring multiple windows or sub-windows, Task Explorer displays relevant information in accessible panels. When selecting a process, detailed information is displayed in the lower half of the screen, allowing you to navigate through the data seamlessly using the arrow keys. The dynamic data refresh allows users to observe changes in real-time, offering additional clarity and insight into system performance and behavior.&lt;/p&gt; 
&lt;h2&gt;Features&lt;/h2&gt; 
&lt;p&gt;Task Explorer offers an array of advanced features to provide comprehensive visibility into the system. The &lt;strong&gt;Thread Panel&lt;/strong&gt; displays a stack trace for the selected thread, offering immediate insights into the current actions of an application, which is particularly useful for diagnosing deadlocks or performance bottlenecks. The &lt;strong&gt;Memory Panel&lt;/strong&gt; allows users to view and edit process memory, featuring an advanced memory editor with string search capabilities. In the &lt;strong&gt;Handles Panel&lt;/strong&gt;, all open handles are displayed, including essential details such as file names, current file positions, and sizes, giving a clear view of the disk operations a program is performing.&lt;/p&gt; 
&lt;p&gt;The &lt;strong&gt;Socket Panel&lt;/strong&gt; provides visibility into all open connections or sockets for each process, with additional data rate information. It also has the option to show pseudo UDP connections based on ETW data, allowing users to monitor network communications effectively. The &lt;strong&gt;Modules Panel&lt;/strong&gt; lists all loaded DLLs and memory-mapped files, with the ability to unload or inject DLLs as needed. Additionally, the application includes a variety of other useful panels, including &lt;strong&gt;Token&lt;/strong&gt;, &lt;strong&gt;Environment&lt;/strong&gt;, &lt;strong&gt;Windows&lt;/strong&gt;, &lt;strong&gt;GDI&lt;/strong&gt;, and &lt;strong&gt;.NET&lt;/strong&gt; panels.&lt;/p&gt; 
&lt;p&gt;By double-clicking a process, you can open the &lt;strong&gt;Task Info Panels&lt;/strong&gt; in a separate window, enabling the simultaneous inspection of multiple processes. The system monitoring capabilities are robust as well, featuring toolbar graphs that show real-time usage of system resources such as CPU, handles, network traffic, and disk access. The &lt;strong&gt;System Info Panels&lt;/strong&gt; display all open files and sockets and allow users to control system services, including drivers. Dedicated performance panels for CPU, Memory, Disk I/O, Network, and GPU resources offer detailed graphs, making it easy to monitor and optimize system performance.&lt;/p&gt; 
&lt;p&gt;For users who need more screen space, the &lt;strong&gt;System Info Panel&lt;/strong&gt; can be fully collapsed or opened in a separate window, maximizing the available area for the task panels.&lt;/p&gt; 
&lt;h2&gt;Screen Shots&lt;/h2&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/DavidXanatos/TaskExplorer/master/.github/images/thread_view.png&quot; alt=&quot;image&quot; /&gt; &lt;img src=&quot;https://raw.githubusercontent.com/DavidXanatos/TaskExplorer/master/.github/images/handle_view.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt; 
&lt;h2&gt;System Requirements&lt;/h2&gt; 
&lt;p&gt;Task Explorer is compatible with Windows 7 or higher, on both 32-bit and 64-bit systems.&lt;/p&gt; 
&lt;h2&gt;Additional Information&lt;/h2&gt; 
&lt;p&gt;Task Explorer is built using the Qt Framework, ensuring a cross-platform user interface with plans to eventually port the tool to Linux, which could make it one of the first advanced, GUI-based task managers for the platform. On Windows, Task Explorer leverages the Process Hacker library and uses a custom-compiled version of the systeminformer.sys driver from the &lt;a href=&quot;https://github.com/winsiderss/systeminformer/&quot;&gt;SystemInformer&lt;/a&gt; project, ensuring robust performance and system monitoring capabilities.&lt;/p&gt; 
&lt;h2&gt;Support&lt;/h2&gt; 
&lt;p&gt;If you find Task Explorer useful, please consider supporting the project on Patreon: &lt;a href=&quot;https://www.patreon.com/DavidXanatos&quot;&gt;https://www.patreon.com/DavidXanatos&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;Icons provided by &lt;a href=&quot;http://icons8.com/&quot;&gt;Icons8&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/3f3abdd401ff671a2fb92cdc223ac13095aef7fe2f4659a405703170fa776f89/DavidXanatos/TaskExplorer" medium="image" />
      
    </item>
    
    <item>
      <title>curl/curl</title>
      <link>https://github.com/curl/curl</link>
      <description>&lt;p&gt;A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;&lt;a href=&quot;https://curl.se/&quot;&gt;&lt;img src=&quot;https://curl.se/logo/curl-logo.svg?sanitize=true&quot; alt=&quot;curl logo&quot; /&gt;&lt;/a&gt;&lt;/h1&gt; 
&lt;p&gt;curl is a command-line tool for transferring data from or to a server using URLs. It supports these protocols: DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS.&lt;/p&gt; 
&lt;p&gt;Learn how to use curl by reading &lt;a href=&quot;https://curl.se/docs/manpage.html&quot;&gt;the man page&lt;/a&gt; or &lt;a href=&quot;https://everything.curl.dev/&quot;&gt;everything curl&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Find out how to install curl by reading &lt;a href=&quot;https://curl.se/docs/install.html&quot;&gt;the INSTALL document&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;libcurl is the library curl is using to do its job. It is readily available to be used by your software. Read &lt;a href=&quot;https://curl.se/libcurl/c/libcurl.html&quot;&gt;the libcurl man page&lt;/a&gt; to learn how.&lt;/p&gt; 
&lt;h2&gt;Open Source&lt;/h2&gt; 
&lt;p&gt;curl is Open Source and is distributed under an MIT-like &lt;a href=&quot;https://curl.se/docs/copyright.html&quot;&gt;license&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Contact&lt;/h2&gt; 
&lt;p&gt;Contact us on a suitable &lt;a href=&quot;https://curl.se/mail/&quot;&gt;mailing list&lt;/a&gt; or use GitHub &lt;a href=&quot;https://github.com/curl/curl/issues&quot;&gt;issues&lt;/a&gt;/ &lt;a href=&quot;https://github.com/curl/curl/pulls&quot;&gt;pull requests&lt;/a&gt;/ &lt;a href=&quot;https://github.com/curl/curl/discussions&quot;&gt;discussions&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;All contributors to the project are listed in &lt;a href=&quot;https://curl.se/docs/thanks.html&quot;&gt;the THANKS document&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Commercial support&lt;/h2&gt; 
&lt;p&gt;For commercial support, maybe private and dedicated help with your problems or applications using (lib)curl visit &lt;a href=&quot;https://curl.se/support.html&quot;&gt;the support page&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Website&lt;/h2&gt; 
&lt;p&gt;Visit the &lt;a href=&quot;https://curl.se/&quot;&gt;curl website&lt;/a&gt; for the latest news and downloads.&lt;/p&gt; 
&lt;h2&gt;Source code&lt;/h2&gt; 
&lt;p&gt;Download the latest source from the Git server:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git clone https://github.com/curl/curl
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Security problems&lt;/h2&gt; 
&lt;p&gt;Report suspected security problems &lt;a href=&quot;https://curl.se/dev/vuln-disclosure.html&quot;&gt;privately&lt;/a&gt; and not in public.&lt;/p&gt; 
&lt;h2&gt;Backers&lt;/h2&gt; 
&lt;p&gt;Thank you to all our backers 🙏 &lt;a href=&quot;https://opencollective.com/curl#section-contribute&quot;&gt;Become a backer&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Sponsors&lt;/h2&gt; 
&lt;p&gt;Support this project by becoming a &lt;a href=&quot;https://curl.se/sponsors.html&quot;&gt;sponsor&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/569041/a7c0b500-5cae-11e9-9287-1d94b1db9c95" medium="image" />
      
    </item>
    
    <item>
      <title>HansKristian-Work/vkd3d-proton</title>
      <link>https://github.com/HansKristian-Work/vkd3d-proton</link>
      <description>&lt;p&gt;Fork of VKD3D. Development branches for Proton&#39;s Direct3D 12 implementation.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;vkd3d-proton&lt;/h1&gt; 
&lt;p&gt;vkd3d-proton is a fork of VKD3D, which aims to implement the full Direct3D 12 API on top of Vulkan. The project serves as the development effort for Direct3D 12 support in &lt;a href=&quot;https://github.com/ValveSoftware/Proton&quot;&gt;Proton&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Upstream&lt;/h2&gt; 
&lt;p&gt;The original project is available at &lt;a href=&quot;https://gitlab.winehq.org/wine/vkd3d&quot;&gt;WineHQ&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Priorities&lt;/h2&gt; 
&lt;p&gt;Performance and game compatibility are important targets, at the expense of compatibility with older drivers and systems. Modern Vulkan extensions and features are aggressively made use of to improve game performance and compatibility. It is recommended to use the very latest drivers you can get your hands on for the best experience. Backwards compatibility with the vkd3d standalone API is not a goal of this project.&lt;/p&gt; 
&lt;h2&gt;Drivers&lt;/h2&gt; 
&lt;p&gt;There are some hard requirements on drivers to be able to implement D3D12 in a reasonably performant way.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Vulkan 1.3&lt;/li&gt; 
 &lt;li&gt;Descriptor indexing with at least 1000000 UpdateAfterBind descriptors for all types except UniformBuffer. Essentially all features in &lt;code&gt;VkPhysicalDeviceDescriptorIndexingFeatures&lt;/code&gt; must be supported.&lt;/li&gt; 
 &lt;li&gt;Further, the following device features are required: 
  &lt;ul&gt; 
   &lt;li&gt;&lt;code&gt;samplerMirrorClampToEdge&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;shaderDrawParameters&lt;/code&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VK_EXT_robustness2&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VK_KHR_push_descriptor&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Some notable extensions that &lt;strong&gt;should&lt;/strong&gt; be supported for optimal or correct behavior. These extensions will likely become mandatory later.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;VK_EXT_image_view_min_lod&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;code&gt;VK_EXT_mutable_descriptor_type&lt;/code&gt; (or the vendor &lt;code&gt;VALVE&lt;/code&gt; alias) and &lt;code&gt;VK_EXT_descriptor_buffer&lt;/code&gt; are also highly recommended, but not mandatory.&lt;/p&gt; 
&lt;h3&gt;AMD (RADV)&lt;/h3&gt; 
&lt;p&gt;For AMD, RADV is the recommended driver and the one that sees most testing on AMD GPUs. The minimum requirement at the moment is Mesa 22.0.&lt;/p&gt; 
&lt;p&gt;NOTE: For older Mesa versions, use the v2.6 release.&lt;/p&gt; 
&lt;h3&gt;NVIDIA&lt;/h3&gt; 
&lt;p&gt;The &lt;a href=&quot;https://developer.nvidia.com/vulkan-driver&quot;&gt;Vulkan beta drivers&lt;/a&gt; generally contain the latest driver fixes that we identify while getting games to work. The latest drivers (stable, beta or Vulkan beta tracks) are always preferred. If you&#39;re having problems, always try the latest drivers. At minimum, 535 series drivers are needed, which fixes a bunch of bugs.&lt;/p&gt; 
&lt;h3&gt;Intel&lt;/h3&gt; 
&lt;p&gt;We have not done any testing against Intel GPUs yet.&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Cloning the repo&lt;/h2&gt; 
&lt;p&gt;To clone the repo you should run:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git clone --recursive https://github.com/HansKristian-Work/vkd3d-proton
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;in order to pull in all the submodules which are needed for building.&lt;/p&gt; 
&lt;h2&gt;Building vkd3d-proton&lt;/h2&gt; 
&lt;h3&gt;Requirements:&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.winehq.org/&quot;&gt;wine&lt;/a&gt; (for &lt;code&gt;widl&lt;/code&gt;) [for native builds] 
  &lt;ul&gt; 
   &lt;li&gt;On Windows this may be substituted for &lt;a href=&quot;http://strawberryperl.com/&quot;&gt;Strawberry Perl&lt;/a&gt; as it ships &lt;code&gt;widl&lt;/code&gt; and is easy to find and install -- although this dependency may be eliminated in the future.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://mesonbuild.com/&quot;&gt;Meson&lt;/a&gt; build system (at least version 0.49)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/KhronosGroup/glslang&quot;&gt;glslang&lt;/a&gt; compiler&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;http://mingw-w64.org/&quot;&gt;Mingw-w64&lt;/a&gt; compiler, headers and tools (at least version 7.0) [for cross-builds for d3d12.dll which are default]&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Building:&lt;/h3&gt; 
&lt;h4&gt;The simple way&lt;/h4&gt; 
&lt;p&gt;Inside the vkd3d-proton directory, run:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;./package-release.sh master /your/target/directory --no-package
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This will create a folder &lt;code&gt;vkd3d-master&lt;/code&gt; in &lt;code&gt;/your/target/directory&lt;/code&gt;, which contains both 32-bit and 64-bit versions of vkd3d-proton, which can be set up in the same way as the release versions as noted above.&lt;/p&gt; 
&lt;p&gt;If you want to build natively (ie. for &lt;code&gt;libvkd3d-proton.so&lt;/code&gt;), pass &lt;code&gt;--native&lt;/code&gt; to the build script. This option will make it build using your system&#39;s compilers.&lt;/p&gt; 
&lt;p&gt;In order to preserve the build directories for development, pass &lt;code&gt;--dev-build&lt;/code&gt; to the script. This option implies &lt;code&gt;--no-package&lt;/code&gt;. After making changes to the source code, you can then do the following to rebuild vkd3d-proton:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# change to build.86 for 32-bit
ninja -C /your/target/directory/build.64 install
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Compiling manually (cross for d3d12.dll, default)&lt;/h4&gt; 
&lt;pre&gt;&lt;code&gt;# 64-bit build.
meson --cross-file build-win64.txt --buildtype release --prefix /your/vkd3d-proton/directory build.64
ninja -C build.64 install

# 32-bit build
meson --cross-file build-win32.txt --buildtype release --prefix /your/vkd3d-proton/directory build.86
ninja -C build.86 install
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Compiling manually (native)&lt;/h4&gt; 
&lt;pre&gt;&lt;code&gt;# 64-bit build.
meson --buildtype release --prefix /your/vkd3d-proton/directory build.64
ninja -C build.64 install

# 32-bit build
CC=&quot;gcc -m32&quot; CXX=&quot;g++ -m32&quot; \
PKG_CONFIG_PATH=&quot;/usr/lib32/pkgconfig:/usr/lib/i386-linux-gnu/pkgconfig:/usr/lib/pkgconfig&quot; \
meson --buildtype release --prefix /your/vkd3d-proton/directory build.86
ninja -C build.86 install
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Cross-compilation build for aarch64&lt;/h4&gt; 
&lt;p&gt;First, setup a distrobox using Steam&#39;s runtime for it.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;distrobox create --image registry.gitlab.steamos.cloud/steamrt/steamrt4/sdk/arm64-on-amd64 --name aarch64
distrobox enter aarch64
# Inside container
sudo apt install mingw-w64-tools
meson setup build-aarch64 \
  --buildtype release \
  --cross-file /usr/share/meson/cross/aarch64-linux-gnu-gcc.txt \
  --cross-file ./build-widl.txt \
  -Denable_extras=true \
  -Denable_tests=true \
  --prefix /tmp/vkd3d-proton-aarch64
ninja -C build-aarch64 install
cp build-aarch64/tests/d3d12 /tmp/vkd3d-proton-aarch64/bin
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Using vkd3d-proton&lt;/h2&gt; 
&lt;p&gt;The intended way to use vkd3d-proton is as native Win32 DLLs (d3d12.dll and d3d12core.dll). These serve as a drop-in replacement for D3D12, and can be used in Wine (Proton or vanilla flavors), or on Windows.&lt;/p&gt; 
&lt;p&gt;vkd3d-proton does not supply the necessary DXGI components on its own. Instead, DXVK (2.1+) and vkd3d-proton share a DXGI implementation.&lt;/p&gt; 
&lt;h3&gt;A note on using vkd3d-proton on Windows&lt;/h3&gt; 
&lt;p&gt;Native Windows use is mostly relevant for developer testing purposes. Do not expect games running on Windows 7 or 8.1 to magically make use of vkd3d-proton, as many games will only even attempt to load d3d12.dll if they are running on Windows 10.&lt;/p&gt; 
&lt;h3&gt;Native Linux build&lt;/h3&gt; 
&lt;p&gt;A native Linux binary can be built, but it is not intended to be compatible with upstream Wine. A native option is mostly relevant for development purposes for the time being.&lt;/p&gt; 
&lt;h2&gt;Environment variables&lt;/h2&gt; 
&lt;p&gt;Most of the environment variables used by vkd3d-proton are for debugging purposes. The environment variables are not considered a part of API and might be changed or removed in the future versions of vkd3d-proton.&lt;/p&gt; 
&lt;p&gt;Some of debug variables are lists of elements. Elements must be separated by commas or semicolons.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_CONFIG&lt;/code&gt; - a list of options that change the behavior of vkd3d-proton. 
  &lt;ul&gt; 
   &lt;li&gt;&lt;code&gt;vk_debug&lt;/code&gt; - enables Vulkan debug extensions and loads validation layer.&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;skip_application_workarounds&lt;/code&gt; - Skips all application workarounds. For debugging purposes.&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;nodxr&lt;/code&gt; - Disables DXR support.&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;dxr&lt;/code&gt; - DXR is normally enabled automatically. This config forces it to be enabled even when considered unsafe.&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;dxr12&lt;/code&gt; - Enables experimental support for DXR 1.2 if &lt;code&gt;VK_EXT_opacity_micromap&lt;/code&gt; is available.&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;force_static_cbv&lt;/code&gt; - Unsafe speed hack on NVIDIA. May or may not give a significant performance uplift.&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;single_queue&lt;/code&gt; - Do not use asynchronous compute or transfer queues.&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;no_upload_hvv&lt;/code&gt; - Blocks any attempt to use host-visible VRAM (large/resizable BAR) for the UPLOAD heap. May free up vital VRAM in certain critical situations, at cost of lower GPU performance. A fraction of VRAM is reserved for resizable BAR allocations either way, so it should not be a real issue even on lower VRAM cards.&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;force_host_cached&lt;/code&gt; - Forces all host visible allocations to be CACHED, which greatly accelerates captures.&lt;/li&gt; 
   &lt;li&gt;&lt;code&gt;no_invariant_position&lt;/code&gt; - Avoids workarounds for invariant position. The workaround is enabled by default.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_DEBUG&lt;/code&gt; - controls the debug level for log messages produced by vkd3d-proton. Accepts the following values: none, err, info, fixme, warn, trace.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_SHADER_DEBUG&lt;/code&gt; - controls the debug level for log messages produced by the shader compilers. See &lt;code&gt;VKD3D_DEBUG&lt;/code&gt; for accepted values.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_LOG_FILE&lt;/code&gt; - If set, redirects &lt;code&gt;VKD3D_DEBUG&lt;/code&gt; logging output to a file instead.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_VULKAN_DEVICE&lt;/code&gt; - a zero-based device index. Use to force the selected Vulkan device.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_FILTER_DEVICE_NAME&lt;/code&gt; - skips devices that don&#39;t include this substring.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_DISABLE_EXTENSIONS&lt;/code&gt; - a list of Vulkan extensions that vkd3d-proton should not use even if available.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_TEST_DEBUG&lt;/code&gt; - enables additional debug messages in tests. Set to 0, 1 or 2.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_TEST_MATCH&lt;/code&gt; - a match string. Only the tests whose names exactly match the string will be run, e.g. &lt;code&gt;VKD3D_TEST_FILTER=clear_render_target&lt;/code&gt; will only match tests named &#39;clear_render_target&#39;. Useful for debugging or developing new tests.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_TEST_FILTER&lt;/code&gt; - a filter string. Only the tests whose names matches the filter string will be run, e.g. &lt;code&gt;VKD3D_TEST_FILTER=clear_render&lt;/code&gt; will match tests named &#39;clear_render_target&#39; or &#39;target_clear_render&#39;. Useful for debugging or developing new tests.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_TEST_EXCLUDE&lt;/code&gt; - excludes tests of which the name is included in the string, e.g. &lt;code&gt;VKD3D_TEST_EXCLUDE=test_root_signature_priority,test_conservative_rasterization_dxil&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_TEST_PLATFORM&lt;/code&gt; - can be set to &quot;wine&quot;, &quot;windows&quot; or &quot;other&quot;. The test platform controls the behavior of todo(), todo_if(), bug_if() and broken() conditions in tests.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_TEST_BUG&lt;/code&gt; - set to 0 to disable bug_if() conditions in tests.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_PROFILE_PATH&lt;/code&gt; - If profiling is enabled in the build, a profiling block is emitted to &lt;code&gt;${VKD3D_PROFILE_PATH}.${pid}&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_SWAPCHAIN_PRESENT_MODE&lt;/code&gt; - accepts a Vulkan present mode name. Forces the use of the specified present mode if supported. Currently accepts &lt;code&gt;IMMEDIATE&lt;/code&gt;, &lt;code&gt;MAILBOX&lt;/code&gt;, &lt;code&gt;FIFO&lt;/code&gt;, &lt;code&gt;FIFO_RELAXED&lt;/code&gt;, &lt;code&gt;FIFO_LATEST_READY&lt;/code&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Frame rate limit&lt;/h3&gt; 
&lt;p&gt;The &lt;code&gt;VKD3D_FRAME_RATE&lt;/code&gt; environment variable can be used to limit the frame rate. A value of &lt;code&gt;0&lt;/code&gt; uncaps the frame rate, while any positive value will limit rendering to the given number of frames per second.&lt;/p&gt; 
&lt;h2&gt;Shader cache&lt;/h2&gt; 
&lt;p&gt;By default, vkd3d-proton manages its own driver cache. This cache is intended to cache DXBC/DXIL -&amp;gt; SPIR-V conversion. This reduces stutter (when pipelines are created last minute and app relies on hot driver cache) and load times (when applications do the right thing of loading PSOs up front).&lt;/p&gt; 
&lt;p&gt;Behavior is designed to be close to DXVK state cache.&lt;/p&gt; 
&lt;h4&gt;Default behavior&lt;/h4&gt; 
&lt;p&gt;&lt;code&gt;vkd3d-proton.cache&lt;/code&gt; (and &lt;code&gt;vkd3d-proton.cache.write&lt;/code&gt;) are placed in the current working directory. Generally, this is the game install folder when running in Steam.&lt;/p&gt; 
&lt;h4&gt;Custom directory&lt;/h4&gt; 
&lt;p&gt;&lt;code&gt;VKD3D_SHADER_CACHE_PATH=/path/to/directory&lt;/code&gt; overrides the directory where &lt;code&gt;vkd3d-proton.cache&lt;/code&gt; is placed.&lt;/p&gt; 
&lt;h4&gt;Disable cache&lt;/h4&gt; 
&lt;p&gt;&lt;code&gt;VKD3D_SHADER_CACHE_PATH=0&lt;/code&gt; disables the internal cache, and any caching would have to be explicitly managed by application.&lt;/p&gt; 
&lt;h3&gt;Behavior of ID3D12PipelineLibrary&lt;/h3&gt; 
&lt;p&gt;When explicit shader cache is used, the need for application managed pipeline libraries is greatly diminished, and the cache applications interact with is a dummy cache. If the vkd3d-proton shader cache is disabled, ID3D12PipelineLibrary stores everything relevant for a full cache, i.e. SPIR-V and PSO driver cache blob. &lt;code&gt;VKD3D_CONFIG=pipeline_library_app_cache&lt;/code&gt; is an alternative to &lt;code&gt;VKD3D_SHADER_CACHE_PATH=0&lt;/code&gt; and can be automatically enabled based on app-profiles if relevant in the future if applications manage the caches better than vkd3d-proton can do automagically.&lt;/p&gt; 
&lt;h2&gt;CPU profiling (development)&lt;/h2&gt; 
&lt;p&gt;Pass &lt;code&gt;-Denable_profiling=true&lt;/code&gt; to Meson to enable a profiled build. With a profiled build, use &lt;code&gt;VKD3D_PROFILE_PATH&lt;/code&gt; environment variable. The profiling dumps out a binary blob which can be analyzed with &lt;code&gt;programs/vkd3d-profile.py&lt;/code&gt;. The profile is a trivial system which records number of iterations and total ticks (ns) spent. It is easy to instrument parts of code you are working on optimizing.&lt;/p&gt; 
&lt;h2&gt;Advanced shader debugging&lt;/h2&gt; 
&lt;p&gt;These features are only meant to be used by vkd3d-proton developers. For any builtin RenderDoc related functionality pass &lt;code&gt;-Denable_renderdoc=true&lt;/code&gt; to Meson.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_SHADER_DUMP_PATH&lt;/code&gt; - path where shader bytecode is dumped. Bytecode is dumped in format of &lt;code&gt;$hash.{spv,dxbc,dxil}&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_SHADER_OVERRIDE&lt;/code&gt; - path to where overridden shaders can be found. If application is creating a pipeline with &lt;code&gt;$hash&lt;/code&gt; and &lt;code&gt;$VKD3D_SHADER_OVERRIDE/$hash.spv&lt;/code&gt; exists, that SPIR-V file will be used instead.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_AUTO_CAPTURE_SHADER&lt;/code&gt; - If this is set to a shader hash, and the RenderDoc layer is enabled, vkd3d-proton will automatically make a capture when a specific shader is encountered.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;VKD3D_AUTO_CAPTURE_COUNTS&lt;/code&gt; - A comma-separated list of indices. This can be used to control which queue submissions to capture. E.g., use &lt;code&gt;VKD3D_AUTO_CAPTURE_COUNTS=0,4,10&lt;/code&gt; to capture the 0th (first submission), 4th and 10th submissions which are candidates for capturing. If &lt;code&gt;VKD3D_AUTO_CAPTURE_COUNTS&lt;/code&gt; is &lt;code&gt;-1&lt;/code&gt;, the entire app runtime can be turned into one big capture. This is only intended to be used when capturing something like the test suite, or tiny applications with a finite runtime to make it easier to debug cross submission work.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;If only &lt;code&gt;VKD3D_AUTO_CAPTURE_COUNTS&lt;/code&gt; is set, any queue submission is considered for capturing. If only &lt;code&gt;VKD3D_AUTO_CAPTURE_SHADER&lt;/code&gt; is set, &lt;code&gt;VKD3D_AUTO_CAPTURE_COUNTS&lt;/code&gt; is considered to be equal to &lt;code&gt;&quot;0&quot;&lt;/code&gt;, i.e. a capture is only made on first encounter with the target shader. If both are set, the capture counter is only incremented and considered when a submission contains the use of the target shader.&lt;/p&gt; 
&lt;h3&gt;Breadcrumbs debugging&lt;/h3&gt; 
&lt;p&gt;For debugging GPU hangs, it&#39;s useful to know where crashes happen. If the build has trace enabled (non-release builds), breadcrumbs support is also enabled.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;VKD3D_CONFIG=breadcrumbs&lt;/code&gt; will instrument command lists with &lt;code&gt;VK_AMD_buffer_marker&lt;/code&gt; or &lt;code&gt;VK_NV_device_checkpoints&lt;/code&gt;. On GPU device lost or timeout, crash dumps are written to the log. For best results on RADV, use &lt;code&gt;RADV_DEBUG=syncshaders&lt;/code&gt;. The logs will print a digested form of the command lists which were executing at the time, and attempt to narrow down the possible range of commands which could have caused a crash.&lt;/p&gt; 
&lt;h3&gt;Shader logging&lt;/h3&gt; 
&lt;p&gt;It is possible to log the output of replaced shaders, essentially a custom shader printf. To enable this feature, &lt;code&gt;VK_KHR_buffer_device_address&lt;/code&gt; must be supported. First, use &lt;code&gt;VKD3D_SHADER_DEBUG_RING_SIZE_LOG2=28&lt;/code&gt; for example to set up a 256 MiB ring buffer in host memory. Since this buffer is allocated in host memory, feel free to make it as large as you want, as it does not consume VRAM. A worker thread will read the data as it comes in and log it. There is potential here to emit more structured information later. The main reason this is implemented instead of the validation layer printf system is run-time performance, and avoids any possible accidental hiding of bugs by introducing validation layers which add locking, etc. Using &lt;code&gt;debugPrintEXT&lt;/code&gt; is also possible if that fits better with your debugging scenario. With this shader replacement scheme, we&#39;re able to add shader logging as unintrusive as possible.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# Inside folder full of override shaders, build everything with:
make -C /path/to/include/shader-debug M=$PWD
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The shader can then include &lt;code&gt;#include &quot;debug_channel.h&quot;&lt;/code&gt; and use various functions below.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void DEBUG_CHANNEL_INIT(uvec3 ID);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;is used somewhere in your replaced shader. This should be initialized with &lt;code&gt;gl_GlobalInvocationID&lt;/code&gt; or similar. This ID will show up in the log. For each subgroup which calls &lt;code&gt;DEBUG_CHANNEL_INIT&lt;/code&gt;, an instance counter is generated. This allows you to correlate several messages which all originate from the same instance counter, which is logged alongside the ID. An invocation can be uniquely identified with the instance + &lt;code&gt;DEBUG_CHANNEL_INIT&lt;/code&gt; id. &lt;code&gt;DEBUG_CHANNEL_INIT&lt;/code&gt; can be called from non-uniform control flow, as it does not use &lt;code&gt;barrier()&lt;/code&gt; or similar constructs. It can also be used in vertex and fragment shaders for this reason.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;void DEBUG_CHANNEL_MSG();
void DEBUG_CHANNEL_MSG(uint v0);
void DEBUG_CHANNEL_MSG(uint v0, uint v1, ...); // Up to 4 components, can be expanded as needed up to 16.
void DEBUG_CHANNEL_MSG(int v0);
void DEBUG_CHANNEL_MSG(int v0, int v1, ...); // Up to 4 components, ...
void DEBUG_CHANNEL_MSG(float v0);
void DEBUG_CHANNEL_MSG(float v0, float v1, ...); // Up to 4 components, ...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;These functions log, formatting is &lt;code&gt;#%x&lt;/code&gt; for uint, &lt;code&gt;%d&lt;/code&gt; for int and &lt;code&gt;%f&lt;/code&gt; for float type.&lt;/p&gt; 
&lt;h2&gt;Descriptor debugging&lt;/h2&gt; 
&lt;p&gt;If &lt;code&gt;-Denable_descriptor_qa=true&lt;/code&gt; is enabled in build, you can set the &lt;code&gt;VKD3D_DESCRIPTOR_QA_LOG&lt;/code&gt; env-var to a file. All descriptor updates and copies are logged so that it&#39;s possible to correlate descriptors with GPU crash dumps. &lt;code&gt;enable_descriptor_qa&lt;/code&gt; is not enabled by default, since it adds some flat overhead in an extremely hot code path.&lt;/p&gt; 
&lt;h3&gt;GPU-assisted debugging&lt;/h3&gt; 
&lt;p&gt;If &lt;code&gt;VKD3D_CONFIG=descriptor_qa_checks&lt;/code&gt; is set with a build which enables &lt;code&gt;-Denable_descriptor_qa=true&lt;/code&gt;, all shaders will be instrumented to check for invalid access. In the log, you will see this to make sure the feature is enabled.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;932:info:vkd3d_descriptor_debug_init_once: Enabling descriptor QA checks!
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The main motivation is the tight integration and high performance. GPU-assisted debugging can be run at well over playable speeds.&lt;/p&gt; 
&lt;h4&gt;Descriptor heap index out of bounds&lt;/h4&gt; 
&lt;pre&gt;&lt;code&gt;============
Fault type: HEAP_OUT_OF_RANGE
Fault type: MISMATCH_DESCRIPTOR_TYPE
CBV_SRV_UAV heap cookie: 1800
Shader hash and instruction: edbaf1b5ed344467 (1)
Accessed resource/view cookie: 0
Shader desired descriptor type: 8 (STORAGE_BUFFER)
Found descriptor type in heap: 0 (NONE)
Failed heap index: 1024000
==========
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The instruction &lt;code&gt;(1)&lt;/code&gt;, is reported as well, and a disassembly of the shader in question can be used to pinpoint exactly where things are going wrong. Dump all shaders with &lt;code&gt;VKD3D_SHADER_DUMP_PATH=/my/folder&lt;/code&gt;, and run &lt;code&gt;spirv-cross -V /my/folder/edbaf1b5ed344467.spv&lt;/code&gt;. (NOTE: clear out the folder before dumping, existing files are not overwritten). The faulting instruction can be identified by looking at last argument, e.g.:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;uint fixup_index = descriptor_qa_check(heap_index, descriptor_type, 1u /* instruction ID */);
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Mismatch descriptor type&lt;/h4&gt; 
&lt;pre&gt;&lt;code&gt;============
Fault type: MISMATCH_DESCRIPTOR_TYPE
CBV_SRV_UAV heap cookie: 1800 // Refer to VKD3D_DESCRIPTOR_QA_LOG
Shader hash and instruction: edbaf1b5ed344467 (1)
Accessed resource/view cookie: 1802 // Refer to VKD3D_DESCRIPTOR_QA_LOG
Shader desired descriptor type: 8 (STORAGE_BUFFER)
Found descriptor type in heap: 1 (SAMPLED_IMAGE)
Failed heap index: 1025
==========
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Accessing destroyed resource&lt;/h4&gt; 
&lt;pre&gt;&lt;code&gt;============
Fault type: DESTROYED_RESOURCE
CBV_SRV_UAV heap cookie: 1800
Shader hash and instruction: edbaf1b5ed344467 (2)
Accessed resource/view cookie: 1806
Shader desired descriptor type: 1 (SAMPLED_IMAGE)
Found descriptor type in heap: 1 (SAMPLED_IMAGE)
Failed heap index: 1029
==========
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Debugging descriptor crashes with RADV dumps (hardcore ultra nightmare mode)&lt;/h3&gt; 
&lt;p&gt;For when you&#39;re absolutely desperate, there is a way to debug GPU hangs. First, install &lt;a href=&quot;https://gitlab.freedesktop.org/tomstdenis/umr&quot;&gt;umr&lt;/a&gt; and make the binary setsuid.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;ACO_DEBUG=force-waitcnt RADV_DEBUG=hang VKD3D_DESCRIPTOR_QA_LOG=/somewhere/desc.txt %command%&lt;/code&gt;&lt;/p&gt; 
&lt;p&gt;It is possible to use &lt;code&gt;RADV_DEBUG=hang,umr&lt;/code&gt; as well, but from within Wine, there are weird things happening where UMR dumps do not always succeed. Instead, it is possible to invoke umr manually from an SSH shell when the GPU hangs.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#!/bin/bash

mkdir -p &quot;$HOME/umr-dump&quot;

# For Navi, older GPUs might have different rings. See RADV source.
umr -R gfx_0.0.0 &amp;gt; &quot;$HOME/umr-dump/ring.txt&quot; 2&amp;gt;&amp;amp;1
umr -O halt_waves -wa gfx_0.0.0 &amp;gt; &quot;$HOME/umr-dump/halt-waves-1.txt&quot; 2&amp;gt;&amp;amp;1
umr -O bits,halt_waves -wa gfx_0.0.0 &amp;gt; &quot;$HOME/umr-dump/halt-waves-2.txt&quot; 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;A folder is placed in &lt;code&gt;~/radv_dumps*&lt;/code&gt; by RADV, and the UMR script will place wave dumps in &lt;code&gt;~/umr-dump&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;First, we can study the wave dumps to see where things crash, e.g.:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    pgm[6@0x800120e26c00 + 0x584 ] = 0xf0001108		image_load v47, v[4:5], s[48:55] dmask:0x1 dim:SQ_RSRC_IMG_2D unorm
    pgm[6@0x800120e26c00 + 0x588 ] = 0x000c2f04	;;
    pgm[6@0x800120e26c00 + 0x58c ] = 0xbf8c3f70		s_waitcnt vmcnt(0)
 *  pgm[6@0x800120e26c00 + 0x590 ] = 0x930118c0		s_mul_i32 s1, 64, s24
    pgm[6@0x800120e26c00 + 0x594 ] = 0xf40c0c09		s_load_dwordx8 s[48:55], s[18:19], s1
    pgm[6@0x800120e26c00 + 0x598 ] = 0x02000000	;;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;excp: 256 is a memory error (at least on 5700xt).&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;TRAPSTS[50000100]:
	                excp:      256 |         illegal_inst:        0 |           buffer_oob:        0 |           excp_cycle:        0 |
	       excp_wave64hi:        0 |          xnack_error:        1 |              dp_rate:        2 |      excp_group_mask:        0 |
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;We can inspect all VGPRs and all SGPRs, here for the image descriptor.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    [  48..  51] = { 0130a000, c0500080, 810dc1df, 93b00204 }
    [  52..  55] = { 00000000, 00400000, 002b0000, 800130c8 }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Decode the VA and study &lt;code&gt;bo_history.log&lt;/code&gt;. There is a script in RADV which lets you query history for a VA. This lets us verify that the VA in question was freed at some point. At point of writing, there is no easy way to decode raw descriptor blobs, but when you&#39;re desperate enough you can do it by hand 😐&lt;/p&gt; 
&lt;p&gt;In &lt;code&gt;pipeline.log&lt;/code&gt; we have the full SPIR-V (with OpSource reference to the source DXIL/DXBC) and disassembly of the crashed pipeline. Here we can study the code to figure out which descriptor was read.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;    // s7 is the descriptor heap index, s1 is the offset (64 bytes per image descriptor),
    // s[18:19] is the descriptor heap.
    s_mul_i32 s1, 64, s7                                        ; 930107c0
    s_load_dwordx8 s[48:55], s[18:19], s1                       ; f40c0c09 02000000
    s_waitcnt lgkmcnt(0)                                        ; bf8cc07f
    image_load v47, v[4:5], s[48:55] dmask:0x1 dim:SQ_RSRC_IMG_2D unorm ; f0001108 000c2f04
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code&gt;    [   4..   7] = { 03200020, ffff8000, 0000002b, 00000103 }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Which is descriptor index #259. Based on this, we can inspect the descriptor QA log and verify that the application did indeed do something invalid, which caused the GPU hang.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/6170b030a1b17b52bf7e578c8e91d0d74370af00156e78be12b9ddfc46c50268/HansKristian-Work/vkd3d-proton" medium="image" />
      
    </item>
    
    <item>
      <title>microsoft/mimalloc</title>
      <link>https://github.com/microsoft/mimalloc</link>
      <description>&lt;p&gt;mimalloc is a compact general purpose allocator with excellent performance.&lt;/p&gt;&lt;hr&gt;&lt;img align=&quot;left&quot; width=&quot;100&quot; height=&quot;100&quot; src=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/doc/mimalloc-logo.png&quot; /&gt; 
&lt;div align=&quot;right&quot;&gt; 
 &lt;sup&gt; v3:&lt;/sup&gt;
 &lt;a href=&quot;https://github.com/microsoft/mimalloc/actions/workflows/test.yaml&quot;&gt;&lt;img src=&quot;https://github.com/microsoft/mimalloc/actions/workflows/test.yaml/badge.svg?branch=dev3&quot; /&gt;&lt;/a&gt; 
 &lt;sup&gt; v2:&lt;/sup&gt;
 &lt;a href=&quot;https://github.com/microsoft/mimalloc/actions/workflows/test.yaml&quot;&gt;&lt;img src=&quot;https://github.com/microsoft/mimalloc/actions/workflows/test.yaml/badge.svg?branch=dev2&quot; /&gt;&lt;/a&gt; 
 &lt;sup&gt; v1:&lt;/sup&gt;
 &lt;a href=&quot;https://github.com/microsoft/mimalloc/actions/workflows/test.yaml&quot;&gt;&lt;img src=&quot;https://github.com/microsoft/mimalloc/actions/workflows/test.yaml/badge.svg?branch=dev&quot; /&gt;&lt;/a&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;
 &lt;sup&gt;v3:&lt;/sup&gt;
 &lt;a href=&quot;https://dev.azure.com/Daan0324/mimalloc/_build?definitionId=1&amp;amp;_a=summary&quot;&gt;&lt;img src=&quot;https://dev.azure.com/Daan0324/mimalloc/_apis/build/status/microsoft.mimalloc?branchName=dev3&quot; /&gt;&lt;/a&gt; 
&lt;/div&gt; 
&lt;h1&gt;mimalloc&lt;/h1&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;mimalloc (pronounced &quot;me-malloc&quot;) is a general purpose allocator with excellent &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#performance&quot;&gt;performance&lt;/a&gt; characteristics. Initially developed by Daan Leijen for the runtime systems of the &lt;a href=&quot;https://koka-lang.github.io&quot;&gt;Koka&lt;/a&gt; and &lt;a href=&quot;https://github.com/leanprover/lean&quot;&gt;Lean&lt;/a&gt; languages.&lt;/p&gt; 
&lt;p&gt;Latest release : &lt;code&gt;v3.3.2&lt;/code&gt; (2026-04-29) recommended.&lt;br /&gt; Latest v2 release: &lt;code&gt;v2.3.2&lt;/code&gt; (2026-04-29) stable.&lt;br /&gt; Latest v1 release: &lt;code&gt;v1.9.10&lt;/code&gt; (2026-04-29) legacy.&lt;/p&gt; 
&lt;p&gt;mimalloc is a drop-in replacement for &lt;code&gt;malloc&lt;/code&gt; and can be used in other programs without code changes, for example, on dynamically linked ELF-based systems (Linux, BSD, etc.) you can use it as:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; LD_PRELOAD=/usr/lib/libmimalloc.so  myprogram
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;It also includes a way to dynamically override the default allocator in &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#override_on_windows&quot;&gt;Windows&lt;/a&gt;. Notable aspects of the design include:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;small and consistent&lt;/strong&gt;: the library is about 10k LOC using simple and consistent data structures. This makes it very suitable to integrate and adapt in other projects. For runtime systems it provides hooks for a monotonic &lt;em&gt;heartbeat&lt;/em&gt; and deferred freeing (for bounded worst-case times with reference counting). Partly due to its simplicity, mimalloc has been ported to many systems (Windows, macOS, Linux, WASM, various BSD&#39;s, Haiku, MUSL, etc) and has excellent support for dynamic overriding. At the same time, it is an industrial strength allocator that runs (very) large scale distributed services on thousands of machines with excellent worst case latencies.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;free list sharding&lt;/strong&gt;: instead of one big free list (per size class) we have many smaller lists per &quot;mimalloc page&quot; which reduces fragmentation and increases locality -- things that are allocated close in time get allocated close in memory. (A mimalloc page contains blocks of one size class and is usually 64KiB on a 64-bit system).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;free list multi-sharding&lt;/strong&gt;: the big idea! Not only do we shard the free list per mimalloc page, but for each page we have multiple free lists. In particular, there is one list for thread-local &lt;code&gt;free&lt;/code&gt; operations, and another one for concurrent &lt;code&gt;free&lt;/code&gt; operations. Free-ing from another thread can now be a single CAS without needing sophisticated coordination between threads. Since there will be thousands of separate free lists, contention is naturally distributed over the heap, and the chance of contending on a single location will be low -- this is quite similar to randomized algorithms like skip lists where adding a random oracle removes the need for a more complex algorithm.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;eager page purging&lt;/strong&gt;: when a &quot;page&quot; becomes empty (with increased chance due to free list sharding) the memory is marked to the OS as unused (reset or decommitted) reducing (real) memory pressure and fragmentation, especially in long running programs.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;secure&lt;/strong&gt;: &lt;em&gt;mimalloc&lt;/em&gt; can be built in secure mode, adding guard pages, randomized allocation, encrypted free lists, etc. to protect against various heap vulnerabilities. The performance penalty is usually around 10% on average over our benchmarks.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;first-class heaps&lt;/strong&gt;: efficiently create and use multiple heaps to allocate across different regions. A heap can be destroyed at once instead of deallocating each object separately. New: v3 has true first-class heaps where one can allocate in a heap from any thread.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;bounded&lt;/strong&gt;: it does not suffer from &lt;em&gt;blowup&lt;/em&gt; [1], has bounded worst-case allocation times (&lt;em&gt;wcat&lt;/em&gt;) (upto OS primitives), bounded space overhead (~0.2% meta-data, with low internal fragmentation), and has no internal points of contention using only atomic operations.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;fast&lt;/strong&gt;: In our benchmarks (see &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#performance&quot;&gt;below&lt;/a&gt;), &lt;em&gt;mimalloc&lt;/em&gt; outperforms other leading allocators (&lt;em&gt;jemalloc&lt;/em&gt;, &lt;em&gt;tcmalloc&lt;/em&gt;, &lt;em&gt;Hoard&lt;/em&gt;, etc), and often uses less memory. A nice property is that it does consistently well over a wide range of benchmarks. There is also good huge OS page support for larger server programs.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The &lt;a href=&quot;https://microsoft.github.io/mimalloc&quot;&gt;documentation&lt;/a&gt; gives a full overview of the API. You can read more on the design of mimalloc in the &lt;a href=&quot;https://www.microsoft.com/en-us/research/publication/mimalloc-free-list-sharding-in-action&quot;&gt;technical report&lt;/a&gt; which also has detailed benchmark results.&lt;/p&gt; 
&lt;p&gt;Enjoy!&lt;/p&gt; 
&lt;h3&gt;Versions&lt;/h3&gt; 
&lt;p&gt;There are three maintained versions of mimalloc. These are mostly equal except for how the OS memory is handled. New development is mostly on v3, while v1 and v2 are maintained with security and bug fixes.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;v3&lt;/strong&gt;: recommended: simplifies the lock-free design of previous versions and improves sharing of memory between threads. On certain large workloads this version may use (much) less memory. Also supports true first-class heaps (that can allocate from any thread) and has more efficient heap-walking (for the CPython GC for example). (release tags: &lt;code&gt;v3.x&lt;/code&gt;, development branch &lt;code&gt;dev3&lt;/code&gt;).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;v2&lt;/strong&gt;: stable mimalloc version. Uses thread-local segments to reduce fragmentation. (release tags: &lt;code&gt;v2.x&lt;/code&gt;, development branch &lt;code&gt;dev2&lt;/code&gt; and &lt;code&gt;main&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;v1&lt;/strong&gt;: legacy version: initial design of mimalloc (release tags: &lt;code&gt;v1.9.x&lt;/code&gt;, development branch &lt;code&gt;dev&lt;/code&gt;). Send PR&#39;s against this version if possible.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Releases&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;2026-04-29, &lt;code&gt;v1.9.10&lt;/code&gt;, &lt;code&gt;v2.3.2&lt;/code&gt;, &lt;code&gt;v3.3.2&lt;/code&gt;: various bug and security fixes through LLM audit (by @Zoxc). Only increase minimal purge size automatically if allow_thp is set to 2. Enable large OS alignment on all platforms (fixing OS large pages on Windows). Fix accounting of committed memory on Linux/macOS. Update MSVC atomics implementation when using C mode. Upstream Emscripten fixes. Proper atomic do-once implementation.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2026-04-20, &lt;code&gt;v1.9.9&lt;/code&gt;, &lt;code&gt;v2.3.1&lt;/code&gt;, &lt;code&gt;v3.3.1&lt;/code&gt;: various bug and security fixes. Special thanks to @jinpzhanAMD, @res2k, and @GoldJohnKing for their help in improving Windows finalization, and @Zoxc for his help in finding various issues.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2026-04-15, &lt;code&gt;v1.9.8&lt;/code&gt;, &lt;code&gt;v2.3.0&lt;/code&gt;, &lt;code&gt;v3.3.0&lt;/code&gt;: initial support for github (binary) releases, fix visiting of full pages during collection (performance), fix THP alignment (performance), fix arm64 cross-compilation on Windows, enable guard pages in debug mode, always use uncommitted areas between arenas (security), enable static overloading of &lt;code&gt;malloc&lt;/code&gt; etc. on Windows with the static CRT (by @Noxybot), fix TLS slot leak on Windows (v3), enable clean DLL load/unload with statically linked mimalloc (v3), fix race in &lt;code&gt;mi_heap_destroy&lt;/code&gt; (v3), by default put page meta info separate from allocated objects (v3,security), fix C++ overrides for emscripten. Various bugs found by DeepTest include: fix offset for &lt;code&gt;mi_heap_realloc_aligned&lt;/code&gt;, fix &lt;code&gt;mi_(w)dupenv_s&lt;/code&gt; buffer size, fix potential overflow in size options, and error codes for &lt;code&gt;mi_reallocarr(ay)&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2026-02-03, &lt;code&gt;v3.2.8&lt;/code&gt; (rc3): Fix thread reinitialize issue on macOS. Fix SIMD codegen bug on older GCC versions. Extend Windows TLS slot limit from 64 to 1088. Report commit statistics more precise. Fixes issue in free-page search in arenas.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2026-01-15, &lt;code&gt;v1.9.7&lt;/code&gt;, &lt;code&gt;v2.2.7&lt;/code&gt;, &lt;code&gt;v3.2.7&lt;/code&gt; (rc2): Fix zero initializing blocks that were OS allocated.&lt;br /&gt; For v3 various bug and performance fixes. Fix Debian 32-bit compilation.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2026-01-08, &lt;code&gt;v1.9.6&lt;/code&gt;, &lt;code&gt;v2.2.6&lt;/code&gt;, &lt;code&gt;v3.2.6&lt;/code&gt; (rc1): Important bug fixes. Many improvements to v3 including true first-class heaps where one can allocate in heap from any thread, and track statistics per heap as well. Added &lt;code&gt;MIMALLOC_ALLOW_THP&lt;/code&gt; option. This is by default enabled except on Android. When THP is detected on v3, mimalloc will set the &lt;code&gt;MIMALLOC_MINIMAL_PURGE_SIZE&lt;/code&gt; to 2MiB to avoid breaking up potential THP huge pages. v3 uses faster TLS access on Windows, and has improved performance for &lt;code&gt;mi_calloc&lt;/code&gt; and aligned allocations. Fixed rare race condition on older v3, fixed potential buffer overflow in debug statistics, add API for returning allocated sizes on allocation and free.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2025-06-13, &lt;code&gt;v3.1.5&lt;/code&gt;: Bug fix release where memory was not always correctly committed (issue #1098).&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2025-06-09, &lt;code&gt;v1.9.4&lt;/code&gt;, &lt;code&gt;v2.2.4&lt;/code&gt;, &lt;code&gt;v3.1.4&lt;/code&gt; (beta) : Some important bug fixes, including a case where OS memory was not always fully released. Improved v3 performance, build on XBox, fix build on Android, support interpose for older macOS versions, use MADV_FREE_REUSABLE on macOS, always check commit success, better support for Windows fixed TLS offset, etc.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2025-03-28, &lt;code&gt;v1.9.3&lt;/code&gt;, &lt;code&gt;v2.2.3&lt;/code&gt;, &lt;code&gt;v3.0.3&lt;/code&gt; (beta) : Various small bug and build fixes, including: fix arm32 pre v7 builds, fix mingw build, get runtime statistics, improve statistic commit counts, fix execution on non BMI1 x64 systems.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2025-03-06, &lt;code&gt;v1.9.2&lt;/code&gt;, &lt;code&gt;v2.2.2&lt;/code&gt;, &lt;code&gt;v3.0.2-beta&lt;/code&gt;: Various small bug and build fixes. Add &lt;code&gt;mi_options_print&lt;/code&gt;, &lt;code&gt;mi_arenas_print&lt;/code&gt;, and the experimental &lt;code&gt;mi_stat_get&lt;/code&gt; and &lt;code&gt;mi_stat_get_json&lt;/code&gt;. Add &lt;code&gt;mi_thread_set_in_threadpool&lt;/code&gt; and &lt;code&gt;mi_heap_set_numa_affinity&lt;/code&gt; (v3 only). Add vcpkg portfile. Upgrade mimalloc-redirect to v1.3.2. &lt;code&gt;MI_OPT_ARCH&lt;/code&gt; is off by default now but still assumes armv8.1-a on arm64 for fast atomic operations. Add QNX support.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2025-01-03, &lt;code&gt;v1.8.9&lt;/code&gt;, &lt;code&gt;v2.1.9&lt;/code&gt;, &lt;code&gt;v3.0.1-alpha&lt;/code&gt;: Interim release. Support Windows arm64. New &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#guarded&quot;&gt;guarded&lt;/a&gt; build that can place OS guard pages behind objects to catch buffer overflows as they occur. Many small fixes: build on Windows arm64, cygwin, riscV, and dragonfly; fix Windows static library initialization to account for thread local destructors (in Rust/C++); macOS tag change; macOS TLS slot fix; improve stats; consistent &lt;code&gt;mimalloc.dll&lt;/code&gt; on Windows (instead of &lt;code&gt;mimalloc-override.dll&lt;/code&gt;); fix mimalloc-redirect on Win11 H2; add 0-byte to canary; upstream CPython fixes; reduce .bss size; allow fixed TLS slot on Windows for improved performance.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#older-release-notes&quot;&gt;Older release notes&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Special thanks to:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Sergiy Kuryata for his contributions on reducing memory commit -- especially on Windows with the Windows thread pool (now implemented in v3).&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://devnexen.blogspot.com/&quot;&gt;David Carlier&lt;/a&gt; (@devnexen) for his many contributions, and making mimalloc work better on many less common operating systems, like Haiku, Dragonfly, etc.&lt;/li&gt; 
 &lt;li&gt;Mary Feofanova (@mary3000), Evgeniy Moiseenko, and Manuel Pöter (@mpoeter) for making mimalloc TSAN checkable, and finding memory model bugs using the &lt;a href=&quot;https://plv.mpi-sws.org/genmc/&quot;&gt;genMC&lt;/a&gt; model checker.&lt;/li&gt; 
 &lt;li&gt;Weipeng Liu (@pongba), Zhuowei Li, Junhua Wang, and Jakub Szymanski, for their early support of mimalloc and deployment at large scale services, leading to many improvements in the mimalloc algorithms for large workloads.&lt;/li&gt; 
 &lt;li&gt;Jason Gibson (@jasongibson) for exhaustive testing on large scale workloads and server environments, and finding complex bugs in (early versions of) &lt;code&gt;mimalloc&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Manuel Pöter (@mpoeter) and Sam Gross(@colesbury) for finding an ABA concurrency issue in abandoned segment reclamation. Sam also created the &lt;a href=&quot;https://github.com/colesbury/nogil&quot;&gt;no GIL&lt;/a&gt; Python fork which uses mimalloc internally.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Usage&lt;/h3&gt; 
&lt;p&gt;mimalloc is used in various large scale low-latency services and programs, for example:&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.bing.com&quot;&gt;&lt;img height=&quot;50&quot; align=&quot;left&quot; src=&quot;https://upload.wikimedia.org/wikipedia/commons/e/e9/Bing_logo.svg?sanitize=true&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://azure.microsoft.com/&quot;&gt;&lt;img height=&quot;50&quot; align=&quot;left&quot; src=&quot;https://upload.wikimedia.org/wikipedia/commons/a/a8/Microsoft_Azure_Logo.svg?sanitize=true&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/cosmos-db/&quot;&gt;&lt;img height=&quot;100&quot; align=&quot;left&quot; src=&quot;https://miro.medium.com/v2/1*TcATfAZhqi8TlZyx4vZAHg.png&quot; style=&quot;border-radius:10px&quot; /&gt; &lt;/a&gt;&lt;a href=&quot;https://deathstrandingpc.505games.com&quot;&gt;&lt;img height=&quot;100&quot; src=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/doc/ds-logo.png&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://docs.unrealengine.com/4.26/en-US/WhatsNew/Builds/ReleaseNotes/4_25/&quot;&gt;&lt;img height=&quot;100&quot; src=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/doc/unreal-logo.svg?sanitize=true&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://ablab.github.io/software/spades/&quot;&gt;&lt;img height=&quot;100&quot; src=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/doc/spades-logo.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;Building&lt;/h1&gt; 
&lt;h2&gt;Windows&lt;/h2&gt; 
&lt;p&gt;Open &lt;code&gt;ide/vs2022/mimalloc.sln&lt;/code&gt; in Visual Studio 2022 and build. The &lt;code&gt;mimalloc-lib&lt;/code&gt; project builds a static library (in &lt;code&gt;out/msvc-x64&lt;/code&gt;), while the &lt;code&gt;mimalloc-override-dll&lt;/code&gt; project builds a DLL for overriding malloc in the entire program.&lt;/p&gt; 
&lt;h2&gt;Linux, macOS, BSD, etc.&lt;/h2&gt; 
&lt;p&gt;We use &lt;a href=&quot;https://cmake.org&quot;&gt;&lt;code&gt;cmake&lt;/code&gt;&lt;/a&gt; as the build system:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; mkdir -p out/release
&amp;gt; cd out/release
&amp;gt; cmake ../..
&amp;gt; make
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This builds the library as a shared (dynamic) library (&lt;code&gt;.so&lt;/code&gt; or &lt;code&gt;.dylib&lt;/code&gt;), a static library (&lt;code&gt;.a&lt;/code&gt;), and as a single object file (&lt;code&gt;.o&lt;/code&gt;).&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;&amp;gt; sudo make install&lt;/code&gt; (install the library and header files in &lt;code&gt;/usr/local/lib&lt;/code&gt; and &lt;code&gt;/usr/local/include&lt;/code&gt;)&lt;/p&gt; 
&lt;p&gt;You can build the debug version which does many internal checks and maintains detailed statistics as:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; mkdir -p out/debug
&amp;gt; cd out/debug
&amp;gt; cmake -DCMAKE_BUILD_TYPE=Debug ../..
&amp;gt; make
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This will name the shared library as &lt;code&gt;libmimalloc-debug.so&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Finally, you can build a &lt;em&gt;secure&lt;/em&gt; version that uses guard pages, encrypted free lists, etc., as:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; mkdir -p out/secure
&amp;gt; cd out/secure
&amp;gt; cmake -DMI_SECURE=ON ../..
&amp;gt; make
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This will name the shared library as &lt;code&gt;libmimalloc-secure.so&lt;/code&gt;. Use &lt;code&gt;cmake ../.. -LH&lt;/code&gt; to see all the available build options.&lt;/p&gt; 
&lt;p&gt;The examples use the default compiler. If you like to use another, use:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; CC=clang CXX=clang++ cmake ../..
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Cmake with Visual Studio&lt;/h2&gt; 
&lt;p&gt;You can also use cmake on Windows. Open a Visual Studio 2022 development prompt and invoke &lt;code&gt;cmake&lt;/code&gt; with the right &lt;a href=&quot;https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2017%202022.html&quot;&gt;generator&lt;/a&gt; and architecture, like:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; cmake ..\.. -G &quot;Visual Studio 17 2022&quot; -A x64 -DMI_OVERRIDE=ON
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The cmake build type is specified when actually building, for example:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; cmake --build . --config=Release
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can also install the &lt;a href=&quot;https://learn.microsoft.com/en-us/cpp/build/clang-support-msbuild?view=msvc-170#install-1&quot;&gt;LLVM toolset&lt;/a&gt; on Windows to build with the &lt;code&gt;clang-cl&lt;/code&gt; compiler directly:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; cmake ../.. -G &quot;Visual Studio 17 2022&quot; -T ClangCl
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Single Source&lt;/h2&gt; 
&lt;p&gt;You can also directly build the single &lt;code&gt;src/static.c&lt;/code&gt; file as part of your project without needing &lt;code&gt;cmake&lt;/code&gt; at all. Make sure to also add the mimalloc &lt;code&gt;include&lt;/code&gt; directory to the include path.&lt;/p&gt; 
&lt;h1&gt;Using the Library&lt;/h1&gt; 
&lt;p&gt;The preferred usage is including &lt;code&gt;&amp;lt;mimalloc.h&amp;gt;&lt;/code&gt;, linking with the shared- or static library, and using the &lt;code&gt;mi_malloc&lt;/code&gt; API exclusively for allocation. For example,&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; gcc -o myprogram -lmimalloc myfile.c
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;mimalloc uses only safe OS calls (&lt;code&gt;mmap&lt;/code&gt; and &lt;code&gt;VirtualAlloc&lt;/code&gt;) and can co-exist with other allocators linked to the same program. If you use &lt;code&gt;cmake&lt;/code&gt;, you can simply use:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;find_package(mimalloc 1.8 REQUIRED)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;in your &lt;code&gt;CMakeLists.txt&lt;/code&gt; to find a locally installed mimalloc. Then use either:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;target_link_libraries(myapp PUBLIC mimalloc)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;to link with the shared (dynamic) library, or:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;target_link_libraries(myapp PUBLIC mimalloc-static)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;to link with the static library. See &lt;code&gt;test\CMakeLists.txt&lt;/code&gt; for an example.&lt;/p&gt; 
&lt;p&gt;For best performance in C++ programs, it is also recommended to override the global &lt;code&gt;new&lt;/code&gt; and &lt;code&gt;delete&lt;/code&gt; operators. For convenience, mimalloc provides &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/include/mimalloc-new-delete.h&quot;&gt;&lt;code&gt;mimalloc-new-delete.h&lt;/code&gt;&lt;/a&gt; which does this for you -- just include it in a single(!) source file in your project. In C++, mimalloc also provides the &lt;code&gt;mi_stl_allocator&lt;/code&gt; struct which implements the &lt;code&gt;std::allocator&lt;/code&gt; interface.&lt;/p&gt; 
&lt;p&gt;You can pass environment variables to print verbose messages (&lt;code&gt;MIMALLOC_VERBOSE=1&lt;/code&gt;) and statistics (&lt;code&gt;MIMALLOC_SHOW_STATS=1&lt;/code&gt;) (in the debug version):&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; env MIMALLOC_SHOW_STATS=1 ./cfrac 175451865205073170563711388363

175451865205073170563711388363 = 374456281610909315237213 * 468551

subproc 0
 blocks          peak       total     current       block      total#
  bin S    4:    75.3 KiB    55.2 MiB     0          32   B       1.8 M    ok
  bin S    6:    31.0 KiB   180.4 KiB     0          48   B       3.8 K    ok
  bin S    8:    64   B      64   B       0          64   B       1        ok
  bin S    9:   160   B     160   B       0          80   B       2        ok
  bin S   17:     1.2 KiB     1.2 KiB     0         320   B       4        ok
  bin S   21:   640   B       3.1 KiB     0         640   B       5        ok
  bin S   33:     5.0 KiB     5.0 KiB     0           5.0 KiB     1        ok

  binned    :    84.2 Ki     41.5 Mi      0                                ok
  huge      :     0           0           0                                ok
  total     :    84.2 KiB    41.5 MiB     0
  malloc req:                29.7 MiB

 pages           peak       total     current       block      total#
  touched   :   152.8 KiB   152.8 KiB   152.8 KiB
  pages     :     8          14           0                                ok
  abandoned :     1         249           0                                ok
  reclaima  :     0
  reclaimf  :   249
  reabandon :     0
  waits     :     0
  extended  :    38
  retire    :    35
  searches  :     0.7 avg

 arenas          peak       total     current       block      total#
  reserved  :     1.0 GiB     1.0 GiB     1.0 GiB
  committed :     4.8 MiB     4.8 MiB     4.4 MiB
  reset     :     0
  purged    :   385.5 Ki
  arenas    :     1
  rollback  :     0
  mmaps     :     3
  commits   :     0
  resets    :     1
  purges    :     2
  guarded   :     0
  heaps     :     1           1           1

 process         peak       total     current       block      total#
  threads   :     1           1           1
  numa nodes:     1
  elapsed   :     0.553 s
  process   : user: 0.557 s, system: 0.013 s, faults: 29, peak rss: 2.1 MiB, peak commit: 4.8 MiB
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The above model of using the &lt;code&gt;mi_&lt;/code&gt; prefixed API is not always possible though in existing programs that already use the standard malloc interface, and another option is to override the standard malloc interface completely and redirect all calls to the &lt;em&gt;mimalloc&lt;/em&gt; library instead .&lt;/p&gt; 
&lt;h2&gt;Environment Options&lt;/h2&gt; 
&lt;p&gt;You can set further options either programmatically (using &lt;a href=&quot;https://microsoft.github.io/mimalloc/group__options.html&quot;&gt;&lt;code&gt;mi_option_set&lt;/code&gt;&lt;/a&gt;), or via environment variables:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;MIMALLOC_SHOW_STATS=1&lt;/code&gt;: show statistics when the program terminates.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;MIMALLOC_VERBOSE=1&lt;/code&gt;: show verbose messages (including statistics).&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;MIMALLOC_SHOW_ERRORS=1&lt;/code&gt;: show error and warning messages.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Advanced options:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;MIMALLOC_ARENA_EAGER_COMMIT=2&lt;/code&gt;: turns on eager commit for the large arenas (usually 1GiB) from which mimalloc allocates segments and pages. Set this to 2 (default) to only enable this on overcommit systems (e.g. Linux). Set this to 1 to enable explicitly on other systems as well (like Windows or macOS) which may improve performance (as the whole arena is committed at once). Note that eager commit only increases the commit but not the actual the peak resident set (rss) so it is generally ok to enable this.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;MIMALLOC_PURGE_DELAY=N&lt;/code&gt;: the delay in &lt;code&gt;N&lt;/code&gt; milli-seconds (by default &lt;code&gt;1000&lt;/code&gt; in v3) after which mimalloc will purge OS pages that are not in use. This signals to the OS that the underlying physical memory can be reused which can reduce memory fragmentation especially in long running (server) programs. Setting &lt;code&gt;N&lt;/code&gt; to &lt;code&gt;0&lt;/code&gt; purges immediately when a page becomes unused which can improve memory usage but also decreases performance. Setting it to &lt;code&gt;-1&lt;/code&gt; disables purging completely.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;MIMALLOC_PURGE_DECOMMITS=1&lt;/code&gt;: By default &quot;purging&quot; memory means unused memory is decommitted (&lt;code&gt;MEM_DECOMMIT&lt;/code&gt; on Windows, &lt;code&gt;MADV_DONTNEED&lt;/code&gt; (which decresease rss immediately) on &lt;code&gt;mmap&lt;/code&gt; systems). Set this to 0 to instead &quot;reset&quot; unused memory on a purge (&lt;code&gt;MEM_RESET&lt;/code&gt; on Windows, generally &lt;code&gt;MADV_FREE&lt;/code&gt; (which does not decrease rss immediately) on &lt;code&gt;mmap&lt;/code&gt; systems). Mimalloc generally does not &quot;free&quot; OS memory but only &quot;purges&quot; OS memory, in other words, it tries to keep virtual address ranges and decommits within those ranges (to make the underlying physical memory available to other processes).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Further options for large workloads and services:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;MIMALLOC_ALLOW_THP=1&lt;/code&gt;: By default always allow transparent huge pages (THP) on Linux systems. On Android only this is by default off. When set to &lt;code&gt;0&lt;/code&gt;, THP is disabled for the process that mimalloc runs in. If enabled, mimalloc also sets the &lt;code&gt;MIMALLOC_MINIMAL_PURGE_SIZE&lt;/code&gt; in v3 to 2MiB to avoid potentially breaking up transparent huge pages when purging memory.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;MIMALLOC_USE_NUMA_NODES=N&lt;/code&gt;: pretend there are at most &lt;code&gt;N&lt;/code&gt; NUMA nodes. If not set, the actual NUMA nodes are detected at runtime. Setting &lt;code&gt;N&lt;/code&gt; to 1 may avoid problems in some virtual environments. Also, setting it to a lower number than the actual NUMA nodes is fine and will only cause threads to potentially allocate more memory across actual NUMA nodes (but this can happen in any case as NUMA local allocation is always a best effort but not guaranteed).&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;MIMALLOC_ALLOW_LARGE_OS_PAGES=0&lt;/code&gt;: Set to 1 to use large OS pages (2 or 4MiB) when available; for some workloads this can significantly improve performance. However, large OS pages cannot be purged or shared with other processes so may lead to increased memory usage in some cases. Use &lt;code&gt;MIMALLOC_VERBOSE&lt;/code&gt; to check if the large OS pages are enabled -- usually one needs to explicitly give permissions for large OS pages (as on &lt;a href=&quot;https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/enable-the-lock-pages-in-memory-option-windows?view=sql-server-2017&quot;&gt;Windows&lt;/a&gt; and &lt;a href=&quot;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/tuning_and_optimizing_red_hat_enterprise_linux_for_oracle_9i_and_10g_databases/sect-oracle_9i_and_10g_tuning_guide-large_memory_optimization_big_pages_and_huge_pages-configuring_huge_pages_in_red_hat_enterprise_linux_4_or_5&quot;&gt;Linux&lt;/a&gt;). However, sometimes the OS is very slow to reserve contiguous physical memory for large OS pages so use with care on systems that can have fragmented memory (for that reason, we generally recommend to use &lt;code&gt;MIMALLOC_RESERVE_HUGE_OS_PAGES&lt;/code&gt; instead whenever possible).&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;MIMALLOC_RESERVE_HUGE_OS_PAGES=N&lt;/code&gt;: where &lt;code&gt;N&lt;/code&gt; is the number of 1GiB &lt;em&gt;huge&lt;/em&gt; OS pages. This reserves the huge pages at startup and sometimes this can give a large (latency) performance improvement on big workloads. Usually it is better to not use &lt;code&gt;MIMALLOC_ALLOW_LARGE_OS_PAGES=1&lt;/code&gt; in combination with this setting. Just like large OS pages, use with care as reserving contiguous physical memory can take a long time when memory is fragmented (but reserving the huge pages is done at startup only once). Note that we usually need to explicitly give permission for huge OS pages (as on &lt;a href=&quot;https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/enable-the-lock-pages-in-memory-option-windows?view=sql-server-2017&quot;&gt;Windows&lt;/a&gt; and &lt;a href=&quot;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/tuning_and_optimizing_red_hat_enterprise_linux_for_oracle_9i_and_10g_databases/sect-oracle_9i_and_10g_tuning_guide-large_memory_optimization_big_pages_and_huge_pages-configuring_huge_pages_in_red_hat_enterprise_linux_4_or_5&quot;&gt;Linux&lt;/a&gt;)). The huge pages are usually allocated evenly among NUMA nodes. We can use &lt;code&gt;MIMALLOC_RESERVE_HUGE_OS_PAGES_AT=N&lt;/code&gt; where &lt;code&gt;N&lt;/code&gt; is the numa node (starting at 0) to allocate all the huge pages at a specific numa node instead.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Use caution when using &lt;code&gt;fork&lt;/code&gt; in combination with either large or huge OS pages: on a fork, the OS uses copy-on-write for all pages in the original process including the huge OS pages. When any memory is now written in that area, the OS will copy the entire 1GiB huge page (or 2MiB large page) which can cause the memory usage to grow in large increments.&lt;/p&gt; 
&lt;h2&gt;Secure Mode&lt;/h2&gt; 
&lt;p&gt;&lt;em&gt;mimalloc&lt;/em&gt; can be build in secure mode by using the &lt;code&gt;-DMI_SECURE=ON&lt;/code&gt; flags in &lt;code&gt;cmake&lt;/code&gt;. This build enables various mitigations to make mimalloc more robust against exploits. In particular:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;All internal mimalloc page meta-data is surrounded by guard pages (so a buffer overflow exploit cannot reach into the metadata).&lt;/li&gt; 
 &lt;li&gt;All free list pointers are &lt;a href=&quot;https://github.com/microsoft/mimalloc/raw/783e3377f79ee82af43a0793910a9f2d01ac7863/include/mimalloc-internal.h#L396&quot;&gt;encoded&lt;/a&gt; with per-page keys which is used both to prevent overwrites with a known pointer, as well as to detect heap corruption.&lt;/li&gt; 
 &lt;li&gt;Double free&#39;s are detected (and ignored).&lt;/li&gt; 
 &lt;li&gt;The free lists are initialized in a random order and allocation randomly chooses between extension and reuse within a page to mitigate against attacks that rely on a predicable allocation order. Similarly, the larger heap blocks allocated by mimalloc from the OS are also address randomized.&lt;/li&gt; 
 &lt;li&gt;If enabling &lt;code&gt;-DMI_SECURE_FULL=ON&lt;/code&gt; there will also be guard pages at the end of each (64KiB) mimalloc page (thus interleaving valid block data with inaccessible gaps). This setting is not recommended in general as it is more expensive and can lead to reaching the maximum VMA limit on Linux systems if the heap gets too large.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;As always, evaluate with care as part of an overall security strategy as all of the above are mitigations but not guarantees.&lt;/p&gt; 
&lt;h2&gt;Debug Mode&lt;/h2&gt; 
&lt;p&gt;When &lt;em&gt;mimalloc&lt;/em&gt; is built using debug mode, (&lt;code&gt;-DCMAKE_BUILD_TYPE=Debug&lt;/code&gt;), various checks are done at runtime to catch development errors.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Statistics are maintained in detail for each object size. They can be shown using &lt;code&gt;MIMALLOC_SHOW_STATS=1&lt;/code&gt; at runtime.&lt;/li&gt; 
 &lt;li&gt;All objects have padding at the end to detect (byte precise) heap block overflows.&lt;/li&gt; 
 &lt;li&gt;Double free&#39;s, and freeing invalid heap pointers are detected.&lt;/li&gt; 
 &lt;li&gt;Corrupted free-lists and some forms of use-after-free are detected.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Guarded Mode&lt;/h2&gt; 
&lt;p&gt;&lt;span id=&quot;guarded&quot;&gt;&lt;em&gt;mimalloc&lt;/em&gt; can be build in guarded mode using the &lt;code&gt;-DMI_GUARDED=ON&lt;/code&gt; flags in &lt;code&gt;cmake&lt;/code&gt;.&lt;/span&gt; This is &lt;code&gt;ON&lt;/code&gt; by default when building a debug version of mimalloc. Guarded mode enables placing OS guard pages behind certain object allocations to catch buffer overflows as they occur. This can be invaluable to catch buffer-overflow bugs in large programs. However, it also means that any object allocated with a guard page takes at least 8 KiB memory for the guard page and its alignment. As such, allocating a guard page for every allocation may be too expensive both in terms of memory, and in terms of performance with many system calls. Therefore, there are various environment variables (and options) to tune this:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;MIMALLOC_GUARDED_SAMPLE_RATE=N&lt;/code&gt;: Set the sample rate to &lt;code&gt;N&lt;/code&gt; (by default 0). This mode places a guard page behind every &lt;code&gt;N&lt;/code&gt; suitable object allocations (per thread). Since the performance in guarded mode without placing guard pages is close to release mode, this can be used to enable guard pages even in production to catch latent buffer overflow bugs. Set the sample rate to &lt;code&gt;1&lt;/code&gt; to guard every object, and to &lt;code&gt;0&lt;/code&gt; to place no guard pages at all.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;MIMALLOC_GUARDED_SAMPLE_SEED=N&lt;/code&gt;: Start sampling at &lt;code&gt;N&lt;/code&gt; (by default random). Can be used to reproduce a buffer overflow if needed.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;MIMALLOC_GUARDED_MIN=N&lt;/code&gt;, &lt;code&gt;MIMALLOC_GUARDED_MAX=N&lt;/code&gt;: Minimal and maximal &lt;em&gt;rounded&lt;/em&gt; object sizes for which a guard page is considered (&lt;code&gt;0&lt;/code&gt; and &lt;code&gt;1GiB&lt;/code&gt; respectively). If you suspect a buffer overflow occurs with an object of size 141, set the minimum and maximum to &lt;code&gt;148&lt;/code&gt; and the sample rate to &lt;code&gt;1&lt;/code&gt; to have all of those guarded.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;&lt;code&gt;MIMALLOC_GUARDED_PRECISE=1&lt;/code&gt;: If we have an object of size 13, we would usually place it an aligned 16 bytes in front of the guard page. Using &lt;code&gt;MIMALLOC_GUARDED_PRECISE&lt;/code&gt; places it exactly 13 bytes before a page so that even a 1 byte overflow is detected. This violates the C/C++ minimal alignment guarantees though so use with care.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Overriding Standard Malloc&lt;/h1&gt; 
&lt;p&gt;Overriding the standard &lt;code&gt;malloc&lt;/code&gt; (and &lt;code&gt;new&lt;/code&gt;) can be done either &lt;em&gt;dynamically&lt;/em&gt; or &lt;em&gt;statically&lt;/em&gt;.&lt;/p&gt; 
&lt;h2&gt;Dynamic override&lt;/h2&gt; 
&lt;p&gt;This is the recommended way to override the standard malloc interface.&lt;/p&gt; 
&lt;h3&gt;Dynamic Override on Linux, BSD&lt;/h3&gt; 
&lt;p&gt;On these ELF-based systems we preload the mimalloc shared library so all calls to the standard &lt;code&gt;malloc&lt;/code&gt; interface are resolved to the &lt;em&gt;mimalloc&lt;/em&gt; library.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; env LD_PRELOAD=/usr/lib/libmimalloc.so myprogram
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can set extra environment variables to check that mimalloc is running, like:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; env MIMALLOC_VERBOSE=1 LD_PRELOAD=/usr/lib/libmimalloc.so myprogram
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;or run with the debug version to get detailed statistics:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; env MIMALLOC_SHOW_STATS=1 LD_PRELOAD=/usr/lib/libmimalloc-debug.so myprogram
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Dynamic Override on MacOS&lt;/h3&gt; 
&lt;p&gt;On macOS we can also preload the mimalloc shared library so all calls to the standard &lt;code&gt;malloc&lt;/code&gt; interface are resolved to the &lt;em&gt;mimalloc&lt;/em&gt; library.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; env DYLD_INSERT_LIBRARIES=/usr/lib/libmimalloc.dylib myprogram
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Note that certain security restrictions may apply when doing this from the &lt;a href=&quot;https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash&quot;&gt;shell&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Dynamic Override on Windows&lt;/h3&gt; 
&lt;p&gt;&lt;span id=&quot;override_on_windows&quot;&gt;We use a separate redirection DLL to override mimalloc on Windows&lt;/span&gt; such that we redirect all malloc/free calls that go through the (dynamic) C runtime allocator, including those from other DLL&#39;s or libraries. As it intercepts all allocation calls on a low level, it can be used on large programs that include other 3rd party components. There are four requirements to make the overriding work well:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Use the C-runtime library as a DLL (using the &lt;code&gt;/MD&lt;/code&gt; or &lt;code&gt;/MDd&lt;/code&gt; switch).&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Link your program explicitly with the &lt;code&gt;mimalloc.dll.lib&lt;/code&gt; export library for the &lt;code&gt;mimalloc.dll&lt;/code&gt;. (which must be compiled with &lt;code&gt;-DMI_OVERRIDE=ON&lt;/code&gt;, which is the default though). To ensure the &lt;code&gt;mimalloc.dll&lt;/code&gt; is actually loaded at run-time it is easiest to insert some call to the mimalloc API in the &lt;code&gt;main&lt;/code&gt; function, like &lt;code&gt;mi_version()&lt;/code&gt; (or use the &lt;code&gt;/include:mi_version&lt;/code&gt; switch on the linker command, or similarly, &lt;code&gt;#pragma comment(linker, &quot;/include:mi_version&quot;)&lt;/code&gt; in some source file). See the &lt;code&gt;mimalloc-test-override&lt;/code&gt; project for an example on how to use this.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;The &lt;code&gt;mimalloc-redirect.dll&lt;/code&gt; must be put in the same directory as the main &lt;code&gt;mimalloc.dll&lt;/code&gt; at runtime (as it is a dependency of that DLL). The redirection DLL ensures that all calls to the C runtime malloc API get redirected to mimalloc functions (which reside in &lt;code&gt;mimalloc.dll&lt;/code&gt;).&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Ensure the &lt;code&gt;mimalloc.dll&lt;/code&gt; comes as early as possible in the import list of the final executable (so it can intercept all potential allocations). You can use &lt;code&gt;minject -l &amp;lt;exe&amp;gt;&lt;/code&gt; to check this if needed.&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;For best performance on Windows with C++, it is also recommended to also override the &lt;code&gt;new&lt;/code&gt;/&lt;code&gt;delete&lt;/code&gt; operations (by including &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/include/mimalloc-new-delete.h&quot;&gt;&lt;code&gt;mimalloc-new-delete.h&lt;/code&gt;&lt;/a&gt; a single(!) source file in your project).&lt;/p&gt; 
&lt;p&gt;The environment variable &lt;code&gt;MIMALLOC_DISABLE_REDIRECT=1&lt;/code&gt; can be used to disable dynamic overriding at run-time. Use &lt;code&gt;MIMALLOC_VERBOSE=1&lt;/code&gt; to check if mimalloc was successfully redirected.&lt;/p&gt; 
&lt;p&gt;For different platforms than x64, you may need a specific &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/bin&quot;&gt;redirection dll&lt;/a&gt;. Furthermore, we cannot always re-link an executable or ensure &lt;code&gt;mimalloc.dll&lt;/code&gt; comes first in the import table. In such cases the &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/bin&quot;&gt;&lt;code&gt;minject&lt;/code&gt;&lt;/a&gt; tool can be used to patch the executable&#39;s import tables.&lt;/p&gt; 
&lt;h2&gt;Static override&lt;/h2&gt; 
&lt;p&gt;On Unix-like systems, you can also statically link with &lt;em&gt;mimalloc&lt;/em&gt; to override the standard malloc interface. The recommended way is to link the final program with the &lt;em&gt;mimalloc&lt;/em&gt; single object file (&lt;code&gt;mimalloc.o&lt;/code&gt;). We use an object file instead of a library file as linkers give preference to that over archives to resolve symbols. To ensure that the standard malloc interface resolves to the &lt;em&gt;mimalloc&lt;/em&gt; library, link it as the first object file. For example:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; gcc -o myprogram mimalloc.o  myfile1.c ...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Another way to override statically that works on all platforms, is to link statically to mimalloc (as shown in the introduction) and include a header file in each source file that re-defines &lt;code&gt;malloc&lt;/code&gt; etc. to &lt;code&gt;mi_malloc&lt;/code&gt;. This is provided by &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/include/mimalloc-override.h&quot;&gt;&lt;code&gt;mimalloc-override.h&lt;/code&gt;&lt;/a&gt;. This only works reliably though if all sources are under your control or otherwise mixing of pointers from different heaps may occur!&lt;/p&gt; 
&lt;p&gt;Note: recently we also enabled static overloading on Windows. In that case you need to link with the static CRT &lt;em&gt;release&lt;/em&gt; runtime (&lt;code&gt;/MT&lt;/code&gt;) and link with the static &lt;code&gt;mimalloc(-debug).obj&lt;/code&gt; (to take precendence over the definitions in the CRT library).&lt;/p&gt; 
&lt;h1&gt;Tools&lt;/h1&gt; 
&lt;p&gt;Generally, we recommend using the standard allocator with memory tracking tools, but mimalloc can also be build to support the &lt;a href=&quot;https://github.com/google/sanitizers/wiki/AddressSanitizer&quot;&gt;address sanitizer&lt;/a&gt; or the excellent &lt;a href=&quot;https://valgrind.org/&quot;&gt;Valgrind&lt;/a&gt; tool. Moreover, it can be build to support Windows event tracing (&lt;a href=&quot;https://learn.microsoft.com/en-us/windows-hardware/test/wpt/event-tracing-for-windows&quot;&gt;ETW&lt;/a&gt;). This has a small performance overhead but does allow detecting memory leaks and byte-precise buffer overflows directly on final executables. See also the &lt;code&gt;test/test-wrong.c&lt;/code&gt; file to test with various tools.&lt;/p&gt; 
&lt;h2&gt;Valgrind&lt;/h2&gt; 
&lt;p&gt;To build with &lt;a href=&quot;https://valgrind.org/&quot;&gt;valgrind&lt;/a&gt; support, use the &lt;code&gt;MI_TRACK_VALGRIND=ON&lt;/code&gt; cmake option:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; cmake ../.. -DMI_TRACK_VALGRIND=ON
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This can also be combined with secure mode or debug mode. You can then run your programs directly under valgrind:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; valgrind &amp;lt;myprogram&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you rely on overriding &lt;code&gt;malloc&lt;/code&gt;/&lt;code&gt;free&lt;/code&gt; by mimalloc (instead of using the &lt;code&gt;mi_malloc&lt;/code&gt;/&lt;code&gt;mi_free&lt;/code&gt; API directly), you also need to tell &lt;code&gt;valgrind&lt;/code&gt; to not intercept those calls itself, and use:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; MIMALLOC_SHOW_STATS=1 valgrind  --soname-synonyms=somalloc=*mimalloc* -- &amp;lt;myprogram&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;By setting the &lt;code&gt;MIMALLOC_SHOW_STATS&lt;/code&gt; environment variable you can check that mimalloc is indeed used and not the standard allocator. Even though the &lt;a href=&quot;https://valgrind.org/docs/manual/manual-core.html#opt.soname-synonyms&quot;&gt;Valgrind option&lt;/a&gt; is called &lt;code&gt;--soname-synonyms&lt;/code&gt;, this also works when overriding with a static library or object file. To dynamically override mimalloc using &lt;code&gt;LD_PRELOAD&lt;/code&gt; together with &lt;code&gt;valgrind&lt;/code&gt;, use:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; valgrind --trace-children=yes --soname-synonyms=somalloc=*mimalloc* /usr/bin/env LD_PRELOAD=/usr/lib/libmimalloc.so -- &amp;lt;myprogram&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;See also the &lt;code&gt;test/test-wrong.c&lt;/code&gt; file to test with &lt;code&gt;valgrind&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Valgrind support is in its initial development -- please report any issues.&lt;/p&gt; 
&lt;h2&gt;ASAN&lt;/h2&gt; 
&lt;p&gt;To build with the address sanitizer, use the &lt;code&gt;-DMI_TRACK_ASAN=ON&lt;/code&gt; cmake option:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; cmake ../.. -DMI_TRACK_ASAN=ON
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This can also be combined with secure mode or debug mode. You can then run your programs as:&#39;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; ASAN_OPTIONS=verbosity=1 &amp;lt;myprogram&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;When you link a program with an address sanitizer build of mimalloc, you should generally compile that program too with the address sanitizer enabled. For example, assuming you build mimalloc in &lt;code&gt;out/debug&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;clang -g -o test-wrong -Iinclude test/test-wrong.c out/debug/libmimalloc-asan-debug.a -lpthread -fsanitize=address -fsanitize-recover=address
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Since the address sanitizer redirects the standard allocation functions, on some platforms (macOSX for example) it is required to compile mimalloc with &lt;code&gt;-DMI_OVERRIDE=OFF&lt;/code&gt;. Address sanitizer support is in its initial development -- please report any issues.&lt;/p&gt; 
&lt;h2&gt;ETW&lt;/h2&gt; 
&lt;p&gt;Event tracing for Windows (&lt;a href=&quot;https://learn.microsoft.com/en-us/windows-hardware/test/wpt/event-tracing-for-windows&quot;&gt;ETW&lt;/a&gt;) provides a high performance way to capture all allocations though mimalloc and analyze them later. To build with ETW support, use the &lt;code&gt;-DMI_TRACK_ETW=ON&lt;/code&gt; cmake option.&lt;/p&gt; 
&lt;p&gt;You can then capture an allocation trace using the Windows performance recorder (WPR), using the &lt;code&gt;src/prim/windows/etw-mimalloc.wprp&lt;/code&gt; profile. In an admin prompt, you can use:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;&amp;gt; wpr -start src\prim\windows\etw-mimalloc.wprp -filemode
&amp;gt; &amp;lt;my_mimalloc_program&amp;gt;
&amp;gt; wpr -stop &amp;lt;my_mimalloc_program&amp;gt;.etl
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;and then open &lt;code&gt;&amp;lt;my_mimalloc_program&amp;gt;.etl&lt;/code&gt; in the Windows Performance Analyzer (WPA), or use a tool like &lt;a href=&quot;https://github.com/xinglonghe/TraceControl&quot;&gt;TraceControl&lt;/a&gt; that is specialized for analyzing mimalloc traces.&lt;/p&gt; 
&lt;h1&gt;Performance&lt;/h1&gt; 
&lt;p&gt;Last update: 2021-01-30&lt;/p&gt; 
&lt;p&gt;We tested &lt;em&gt;mimalloc&lt;/em&gt; against many other top allocators over a wide range of benchmarks, ranging from various real world programs to synthetic benchmarks that see how the allocator behaves under more extreme circumstances. In our benchmark suite, &lt;em&gt;mimalloc&lt;/em&gt; outperforms other leading allocators (&lt;em&gt;jemalloc&lt;/em&gt;, &lt;em&gt;tcmalloc&lt;/em&gt;, &lt;em&gt;Hoard&lt;/em&gt;, etc), and has a similar memory footprint. A nice property is that it does consistently well over the wide range of benchmarks.&lt;/p&gt; 
&lt;p&gt;General memory allocators are interesting as there exists no algorithm that is optimal -- for a given allocator one can usually construct a workload where it does not do so well. The goal is thus to find an allocation strategy that performs well over a wide range of benchmarks without suffering from (too much) underperformance in less common situations.&lt;/p&gt; 
&lt;p&gt;As always, interpret these results with care since some benchmarks test synthetic or uncommon situations that may never apply to your workloads. For example, most allocators do not do well on &lt;code&gt;xmalloc-testN&lt;/code&gt; but that includes even the best industrial allocators like &lt;em&gt;jemalloc&lt;/em&gt; and &lt;em&gt;tcmalloc&lt;/em&gt; that are used in some of the world&#39;s largest systems (like Chrome or FreeBSD).&lt;/p&gt; 
&lt;p&gt;Also, the benchmarks here do not measure the behaviour on very large and long-running server workloads, or worst-case latencies of allocation. Much work has gone into &lt;code&gt;mimalloc&lt;/code&gt; to work well on such workloads (for example, to reduce virtual memory fragmentation on long-running services) but such optimizations are not always reflected in the current benchmark suite.&lt;/p&gt; 
&lt;p&gt;We show here only an overview -- for more specific details and further benchmarks we refer to the &lt;a href=&quot;https://www.microsoft.com/en-us/research/publication/mimalloc-free-list-sharding-in-action&quot;&gt;technical report&lt;/a&gt;. The benchmark suite is automated and available separately as &lt;a href=&quot;https://github.com/daanx/mimalloc-bench&quot;&gt;mimalloc-bench&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Benchmark Results on a 16-core AMD 5950x (Zen3)&lt;/h2&gt; 
&lt;p&gt;Testing on the 16-core AMD 5950x processor at 3.4Ghz (4.9Ghz boost), with 32GiB memory at 3600Mhz, running Ubuntu 20.04 with glibc 2.31 and GCC 9.3.0.&lt;/p&gt; 
&lt;p&gt;We measure three versions of &lt;em&gt;mimalloc&lt;/em&gt;: the main version &lt;code&gt;mi&lt;/code&gt; (tag:v1.7.0), the new v2.0 beta version as &lt;code&gt;xmi&lt;/code&gt; (tag:v2.0.0), and the main version in secure mode as &lt;code&gt;smi&lt;/code&gt; (tag:v1.7.0).&lt;/p&gt; 
&lt;p&gt;The other allocators are Google&#39;s &lt;a href=&quot;https://github.com/gperftools/gperftools&quot;&gt;&lt;em&gt;tcmalloc&lt;/em&gt;&lt;/a&gt; (&lt;code&gt;tc&lt;/code&gt;, tag:gperftools-2.8.1) used in Chrome, Facebook&#39;s &lt;a href=&quot;https://github.com/jemalloc/jemalloc&quot;&gt;&lt;em&gt;jemalloc&lt;/em&gt;&lt;/a&gt; (&lt;code&gt;je&lt;/code&gt;, tag:5.2.1) by Jason Evans used in Firefox and FreeBSD, the Intel thread building blocks &lt;a href=&quot;https://github.com/intel/tbb&quot;&gt;allocator&lt;/a&gt; (&lt;code&gt;tbb&lt;/code&gt;, tag:v2020.3), &lt;a href=&quot;https://github.com/mjansson/rpmalloc&quot;&gt;rpmalloc&lt;/a&gt; (&lt;code&gt;rp&lt;/code&gt;,tag:1.4.1) by Mattias Jansson, the original scalable &lt;a href=&quot;https://github.com/emeryberger/Hoard&quot;&gt;&lt;em&gt;Hoard&lt;/em&gt;&lt;/a&gt; (git:d880f72) allocator by Emery Berger [1], the memory compacting &lt;a href=&quot;https://github.com/plasma-umass/Mesh&quot;&gt;&lt;em&gt;Mesh&lt;/em&gt;&lt;/a&gt; (git:67ff31a) allocator by Bobby Powers &lt;em&gt;et al&lt;/em&gt; [8], and finally the default system allocator (&lt;code&gt;glibc&lt;/code&gt;, 2.31) (based on &lt;em&gt;PtMalloc2&lt;/em&gt;).&lt;/p&gt; 
&lt;img width=&quot;90%&quot; src=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/doc/bench-2021/bench-amd5950x-2021-01-30-a.svg?sanitize=true&quot; /&gt; 
&lt;img width=&quot;90%&quot; src=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/doc/bench-2021/bench-amd5950x-2021-01-30-b.svg?sanitize=true&quot; /&gt; 
&lt;p&gt;Any benchmarks ending in &lt;code&gt;N&lt;/code&gt; run on all 32 logical cores in parallel. Results are averaged over 10 runs and reported relative to mimalloc (where 1.2 means it took 1.2× longer to run). The legend also contains the &lt;em&gt;overall relative score&lt;/em&gt; between the allocators where 100 points is the maximum if an allocator is fastest on all benchmarks.&lt;/p&gt; 
&lt;p&gt;The single threaded &lt;em&gt;cfrac&lt;/em&gt; benchmark by Dave Barrett is an implementation of continued fraction factorization which uses many small short-lived allocations. All allocators do well on such common usage, where &lt;em&gt;mimalloc&lt;/em&gt; is just a tad faster than &lt;em&gt;tcmalloc&lt;/em&gt; and &lt;em&gt;jemalloc&lt;/em&gt;.&lt;/p&gt; 
&lt;p&gt;The &lt;em&gt;leanN&lt;/em&gt; program is interesting as a large realistic and concurrent workload of the &lt;a href=&quot;https://github.com/leanprover/lean&quot;&gt;Lean&lt;/a&gt; theorem prover compiling its own standard library, and there is a 13% speedup over &lt;em&gt;tcmalloc&lt;/em&gt;. This is quite significant: if Lean spends 20% of its time in the allocator that means that &lt;em&gt;mimalloc&lt;/em&gt; is 1.6× faster than &lt;em&gt;tcmalloc&lt;/em&gt; here. (This is surprising as that is not measured in a pure allocation benchmark like &lt;em&gt;alloc-test&lt;/em&gt;. We conjecture that we see this outsized improvement here because &lt;em&gt;mimalloc&lt;/em&gt; has better locality in the allocation which improves performance for the &lt;em&gt;other&lt;/em&gt; computations in a program as well).&lt;/p&gt; 
&lt;p&gt;The single threaded &lt;em&gt;redis&lt;/em&gt; benchmark again show that most allocators do well on such workloads.&lt;/p&gt; 
&lt;p&gt;The &lt;em&gt;larsonN&lt;/em&gt; server benchmark by Larson and Krishnan [2] allocates and frees between threads. They observed this behavior (which they call &lt;em&gt;bleeding&lt;/em&gt;) in actual server applications, and the benchmark simulates this. Here, &lt;em&gt;mimalloc&lt;/em&gt; is quite a bit faster than &lt;em&gt;tcmalloc&lt;/em&gt; and &lt;em&gt;jemalloc&lt;/em&gt; probably due to the object migration between different threads.&lt;/p&gt; 
&lt;p&gt;The &lt;em&gt;mstressN&lt;/em&gt; workload performs many allocations and re-allocations, and migrates objects between threads (as in &lt;em&gt;larsonN&lt;/em&gt;). However, it also creates and destroys the &lt;em&gt;N&lt;/em&gt; worker threads a few times keeping some objects alive beyond the life time of the allocating thread. We observed this behavior in many larger server applications.&lt;/p&gt; 
&lt;p&gt;The &lt;a href=&quot;https://github.com/mjansson/rpmalloc-benchmark&quot;&gt;&lt;em&gt;rptestN&lt;/em&gt;&lt;/a&gt; benchmark by Mattias Jansson is a allocator test originally designed for &lt;em&gt;rpmalloc&lt;/em&gt;, and tries to simulate realistic allocation patterns over multiple threads. Here the differences between allocators become more apparent.&lt;/p&gt; 
&lt;p&gt;The second benchmark set tests specific aspects of the allocators and shows even more extreme differences between them.&lt;/p&gt; 
&lt;p&gt;The &lt;em&gt;alloc-test&lt;/em&gt;, by &lt;a href=&quot;http://ithare.com/testing-memory-allocators-ptmalloc2-tcmalloc-hoard-jemalloc-while-trying-to-simulate-real-world-loads/&quot;&gt;OLogN Technologies AG&lt;/a&gt;, is a very allocation intensive benchmark doing millions of allocations in various size classes. The test is scaled such that when an allocator performs almost identically on &lt;em&gt;alloc-test1&lt;/em&gt; as &lt;em&gt;alloc-testN&lt;/em&gt; it means that it scales linearly.&lt;/p&gt; 
&lt;p&gt;The &lt;em&gt;sh6bench&lt;/em&gt; and &lt;em&gt;sh8bench&lt;/em&gt; benchmarks are developed by &lt;a href=&quot;http://www.microquill.com/&quot;&gt;MicroQuill&lt;/a&gt; as part of SmartHeap. In &lt;em&gt;sh6bench&lt;/em&gt; &lt;em&gt;mimalloc&lt;/em&gt; does much better than the others (more than 2.5× faster than &lt;em&gt;jemalloc&lt;/em&gt;). We cannot explain this well but believe it is caused in part by the &quot;reverse&quot; free-ing pattern in &lt;em&gt;sh6bench&lt;/em&gt;. The &lt;em&gt;sh8bench&lt;/em&gt; is a variation with object migration between threads; whereas &lt;em&gt;tcmalloc&lt;/em&gt; did well on &lt;em&gt;sh6bench&lt;/em&gt;, the addition of object migration causes it to be 10× slower than before.&lt;/p&gt; 
&lt;p&gt;The &lt;em&gt;xmalloc-testN&lt;/em&gt; benchmark by Lever and Boreham [5] and Christian Eder, simulates an asymmetric workload where some threads only allocate, and others only free -- they observed this pattern in larger server applications. Here we see that the &lt;em&gt;mimalloc&lt;/em&gt; technique of having non-contended sharded thread free lists pays off as it outperforms others by a very large margin. Only &lt;em&gt;rpmalloc&lt;/em&gt;, &lt;em&gt;tbb&lt;/em&gt;, and &lt;em&gt;glibc&lt;/em&gt; also scale well on this benchmark.&lt;/p&gt; 
&lt;p&gt;The &lt;em&gt;cache-scratch&lt;/em&gt; benchmark by Emery Berger [1], and introduced with the Hoard allocator to test for &lt;em&gt;passive-false&lt;/em&gt; sharing of cache lines. With a single thread they all perform the same, but when running with multiple threads the potential allocator induced false sharing of the cache lines can cause large run-time differences. Crundal [6] describes in detail why the false cache line sharing occurs in the &lt;em&gt;tcmalloc&lt;/em&gt; design, and also discusses how this can be avoided with some small implementation changes. Only the &lt;em&gt;tbb&lt;/em&gt;, &lt;em&gt;rpmalloc&lt;/em&gt; and &lt;em&gt;mesh&lt;/em&gt; allocators also avoid the cache line sharing completely, while &lt;em&gt;Hoard&lt;/em&gt; and &lt;em&gt;glibc&lt;/em&gt; seem to mitigate the effects. Kukanov and Voss [7] describe in detail how the design of &lt;em&gt;tbb&lt;/em&gt; avoids the false cache line sharing.&lt;/p&gt; 
&lt;h2&gt;On a 36-core Intel Xeon&lt;/h2&gt; 
&lt;p&gt;For completeness, here are the results on a big Amazon &lt;a href=&quot;https://aws.amazon.com/ec2/instance-types/#Compute_Optimized&quot;&gt;c5.18xlarge&lt;/a&gt; instance consisting of a 2×18-core Intel Xeon (Cascade Lake) at 3.4GHz (boost 3.5GHz) with 144GiB ECC memory, running Ubuntu 20.04 with glibc 2.31, GCC 9.3.0, and Clang 10.0.0. This time, the mimalloc allocators (mi, xmi, and smi) were compiled with the Clang compiler instead of GCC. The results are similar to the AMD results but it is interesting to see the differences in the &lt;em&gt;larsonN&lt;/em&gt;, &lt;em&gt;mstressN&lt;/em&gt;, and &lt;em&gt;xmalloc-testN&lt;/em&gt; benchmarks.&lt;/p&gt; 
&lt;img width=&quot;90%&quot; src=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/doc/bench-2021/bench-c5-18xlarge-2021-01-30-a.svg?sanitize=true&quot; /&gt; 
&lt;img width=&quot;90%&quot; src=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/doc/bench-2021/bench-c5-18xlarge-2021-01-30-b.svg?sanitize=true&quot; /&gt; 
&lt;h2&gt;Peak Working Set&lt;/h2&gt; 
&lt;p&gt;The following figure shows the peak working set (rss) of the allocators on the benchmarks (on the c5.18xlarge instance).&lt;/p&gt; 
&lt;img width=&quot;90%&quot; src=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/doc/bench-2021/bench-c5-18xlarge-2021-01-30-rss-a.svg?sanitize=true&quot; /&gt; 
&lt;img width=&quot;90%&quot; src=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/doc/bench-2021/bench-c5-18xlarge-2021-01-30-rss-b.svg?sanitize=true&quot; /&gt; 
&lt;p&gt;Note that the &lt;em&gt;xmalloc-testN&lt;/em&gt; memory usage should be disregarded as it allocates more the faster the program runs. Similarly, memory usage of &lt;em&gt;larsonN&lt;/em&gt;, &lt;em&gt;mstressN&lt;/em&gt;, &lt;em&gt;rptestN&lt;/em&gt; and &lt;em&gt;sh8bench&lt;/em&gt; can vary depending on scheduling and speed. Nevertheless, we hope to improve the memory usage on &lt;em&gt;mstressN&lt;/em&gt; and &lt;em&gt;rptestN&lt;/em&gt; (just as &lt;em&gt;cfrac&lt;/em&gt;, &lt;em&gt;larsonN&lt;/em&gt; and &lt;em&gt;sh8bench&lt;/em&gt; have a small working set which skews the results).&lt;/p&gt; 
&lt;!--
# Previous Benchmarks

Todo: should we create a separate page for this?

## Benchmark Results on 36-core Intel: 2020-01-20

Testing on a big Amazon EC2 compute instance
([c5.18xlarge](https://aws.amazon.com/ec2/instance-types/#Compute_Optimized))
consisting of a 72 processor Intel Xeon at 3GHz
with 144GiB ECC memory, running	Ubuntu 18.04.1 with glibc 2.27 and GCC 7.4.0.
The measured allocators are _mimalloc_ (xmi, tag:v1.4.0, page reset enabled)
and its secure build as _smi_,
Google&#39;s [_tcmalloc_](https://github.com/gperftools/gperftools) (tc, tag:gperftools-2.7) used in Chrome,
Facebook&#39;s [_jemalloc_](https://github.com/jemalloc/jemalloc) (je, tag:5.2.1) by Jason Evans used in Firefox and FreeBSD,
the Intel thread building blocks [allocator](https://github.com/intel/tbb) (tbb, tag:2020),
[rpmalloc](https://github.com/mjansson/rpmalloc) (rp,tag:1.4.0) by Mattias Jansson,
the original scalable [_Hoard_](https://github.com/emeryberger/Hoard) (tag:3.13) allocator by Emery Berger \[1],
the memory compacting [_Mesh_](https://github.com/plasma-umass/Mesh) (git:51222e7) allocator by
Bobby Powers _et al_ \[8],
and finally the default system allocator (glibc, 2.27) (based on _PtMalloc2_).

&lt;img width=&quot;90%&quot; src=&quot;doc/bench-2020/bench-c5-18xlarge-2020-01-20-a.svg&quot;/&gt;
&lt;img width=&quot;90%&quot; src=&quot;doc/bench-2020/bench-c5-18xlarge-2020-01-20-b.svg&quot;/&gt;

The following figure shows the peak working set (rss) of the allocators
on the benchmarks (on the c5.18xlarge instance).

&lt;img width=&quot;90%&quot; src=&quot;doc/bench-2020/bench-c5-18xlarge-2020-01-20-rss-a.svg&quot;/&gt;
&lt;img width=&quot;90%&quot; src=&quot;doc/bench-2020/bench-c5-18xlarge-2020-01-20-rss-b.svg&quot;/&gt;


## On 24-core AMD Epyc, 2020-01-16

For completeness, here are the results on a
[r5a.12xlarge](https://aws.amazon.com/ec2/instance-types/#Memory_Optimized) instance
having a 48 processor AMD Epyc 7000 at 2.5GHz with 384GiB of memory.
The results are similar to the Intel results but it is interesting to
see the differences in the _larsonN_, _mstressN_, and _xmalloc-testN_ benchmarks.

&lt;img width=&quot;90%&quot; src=&quot;doc/bench-2020/bench-r5a-12xlarge-2020-01-16-a.svg&quot;/&gt;
&lt;img width=&quot;90%&quot; src=&quot;doc/bench-2020/bench-r5a-12xlarge-2020-01-16-b.svg&quot;/&gt;

--&gt; 
&lt;h1&gt;References&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;[1] Emery D. Berger, Kathryn S. McKinley, Robert D. Blumofe, and Paul R. Wilson. &lt;em&gt;Hoard: A Scalable Memory Allocator for Multithreaded Applications&lt;/em&gt; the Ninth International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS-IX). Cambridge, MA, November 2000. &lt;a href=&quot;http://www.cs.utexas.edu/users/mckinley/papers/asplos-2000.pdf&quot;&gt;pdf&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;[2] P. Larson and M. Krishnan. &lt;em&gt;Memory allocation for long-running server applications&lt;/em&gt;. In ISMM, Vancouver, B.C., Canada, 1998. &lt;a href=&quot;http://citeseer.ist.psu.edu/viewdoc/download?doi=10.1.1.45.1947&amp;amp;rep=rep1&amp;amp;type=pdf&quot;&gt;pdf&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;[3] D. Grunwald, B. Zorn, and R. Henderson. &lt;em&gt;Improving the cache locality of memory allocation&lt;/em&gt;. In R. Cartwright, editor, Proceedings of the Conference on Programming Language Design and Implementation, pages 177–186, New York, NY, USA, June 1993. &lt;a href=&quot;http://citeseer.ist.psu.edu/viewdoc/download?doi=10.1.1.43.6621&amp;amp;rep=rep1&amp;amp;type=pdf&quot;&gt;pdf&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;[4] J. Barnes and P. Hut. &lt;em&gt;A hierarchical O(n*log(n)) force-calculation algorithm&lt;/em&gt;. Nature, 324:446-449, 1986.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;[5] C. Lever, and D. Boreham. &lt;em&gt;Malloc() Performance in a Multithreaded Linux Environment.&lt;/em&gt; In USENIX Annual Technical Conference, Freenix Session. San Diego, CA. Jun. 2000. Available at &lt;a href=&quot;https://github.com/kuszmaul/SuperMalloc/tree/master/tests&quot;&gt;https://github.com/kuszmaul/SuperMalloc/tree/master/tests&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;[6] Timothy Crundal. &lt;em&gt;Reducing Active-False Sharing in TCMalloc&lt;/em&gt;. 2016. CS16S1 project at the Australian National University. &lt;a href=&quot;http://courses.cecs.anu.edu.au/courses/CSPROJECTS/16S1/Reports/Timothy_Crundal_Report.pdf&quot;&gt;pdf&lt;/a&gt;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;[7] Alexey Kukanov, and Michael J Voss. &lt;em&gt;The Foundations for Scalable Multi-Core Software in Intel Threading Building Blocks.&lt;/em&gt; Intel Technology Journal 11 (4). 2007&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;[8] Bobby Powers, David Tench, Emery D. Berger, and Andrew McGregor. &lt;em&gt;Mesh: Compacting Memory Management for C/C++&lt;/em&gt; In Proceedings of the 40th ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI&#39;19), June 2019, pages 333-–346.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;!--
- \[9] Paul Liétar, Theodore Butler, Sylvan Clebsch, Sophia Drossopoulou, Juliana Franco, Matthew J Parkinson,
  Alex Shamis, Christoph M Wintersteiger, and David Chisnall.
  _Snmalloc: A Message Passing Allocator._
  In Proceedings of the 2019 ACM SIGPLAN International Symposium on Memory Management, 122–135. ACM. 2019.
--&gt; 
&lt;h1&gt;Contributing&lt;/h1&gt; 
&lt;p&gt;This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit &lt;a href=&quot;https://cla.microsoft.com&quot;&gt;https://cla.microsoft.com&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.&lt;/p&gt; 
&lt;h1&gt;Older Release Notes&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;2024-05-21, &lt;code&gt;v1.8.7&lt;/code&gt;, &lt;code&gt;v2.1.7&lt;/code&gt;: Fix build issues on less common platforms. Started upstreaming patches from the CPython &lt;a href=&quot;https://github.com/python/cpython/issues/113141#issuecomment-2119255217&quot;&gt;integration&lt;/a&gt;. Upstream &lt;code&gt;vcpkg&lt;/code&gt; patches.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2024-05-13, &lt;code&gt;v1.8.6&lt;/code&gt;, &lt;code&gt;v2.1.6&lt;/code&gt;: Fix build errors on various (older) platforms. Refactored aligned allocation.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2024-04-22, &lt;code&gt;v1.8.4&lt;/code&gt;, &lt;code&gt;v2.1.4&lt;/code&gt;: Fixes various bugs and build issues. Add &lt;code&gt;MI_LIBC_MUSL&lt;/code&gt; cmake flag for musl builds. Free-ing code is refactored into a separate module (&lt;code&gt;free.c&lt;/code&gt;). Mimalloc page info is simplified with the block size directly available (and new &lt;code&gt;block_size_shift&lt;/code&gt; to improve aligned block free-ing). New approach to collection of abandoned segments: When a thread terminates the segments it owns are abandoned (containing still live objects) and these can be reclaimed by other threads. We no longer use a list of abandoned segments but this is now done using bitmaps in arena&#39;s which is more concurrent (and more aggressive). Abandoned memory can now also be reclaimed if a thread frees an object in an abandoned page (which can be disabled using &lt;code&gt;mi_option_abandoned_reclaim_on_free&lt;/code&gt;). The option &lt;code&gt;mi_option_max_segment_reclaim&lt;/code&gt; gives a maximum percentage of abandoned segments that can be reclaimed per try (=10%).&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2023-04-24, &lt;code&gt;v1.8.2&lt;/code&gt;, &lt;code&gt;v2.1.2&lt;/code&gt;: Fixes build issues on freeBSD, musl, and C17 (UE 5.1.1). Reduce code size/complexity by removing regions and segment-cache&#39;s and only use arenas with improved memory purging -- this may improve memory usage as well for larger services. Renamed options for consistency. Improved Valgrind and ASAN checking.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2023-04-03, &lt;code&gt;v1.8.1&lt;/code&gt;, &lt;code&gt;v2.1.1&lt;/code&gt;: Fixes build issues on some platforms.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2023-03-29, &lt;code&gt;v1.8.0&lt;/code&gt;, &lt;code&gt;v2.1.0&lt;/code&gt;: Improved support dynamic overriding on Windows 11. Improved tracing precision with &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#asan&quot;&gt;asan&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#valgrind&quot;&gt;Valgrind&lt;/a&gt;, and added Windows event tracing &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#ETW&quot;&gt;ETW&lt;/a&gt; (contributed by Xinglong He). Created an OS abstraction layer to make it easier to port and separate platform dependent code (in &lt;code&gt;src/prim&lt;/code&gt;). Fixed C++ STL compilation on older Microsoft C++ compilers, and various small bug fixes.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2022-12-23, &lt;code&gt;v1.7.9&lt;/code&gt;, &lt;code&gt;v2.0.9&lt;/code&gt;: Supports building with &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#asan&quot;&gt;asan&lt;/a&gt; and improved &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#valgrind&quot;&gt;Valgrind&lt;/a&gt; support. Support arbitrary large alignments (in particular for &lt;code&gt;std::pmr&lt;/code&gt; pools). Added C++ STL allocators attached to a specific heap (thanks @vmarkovtsev). Heap walks now visit all object (including huge objects). Support Windows nano server containers (by Johannes Schindelin,@dscho). Various small bug fixes.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2022-11-03, &lt;code&gt;v1.7.7&lt;/code&gt;, &lt;code&gt;v2.0.7&lt;/code&gt;: Initial support for &lt;a href=&quot;https://raw.githubusercontent.com/microsoft/mimalloc/main/#valgrind&quot;&gt;Valgrind&lt;/a&gt; for leak testing and heap block overflow detection. Initial support for attaching heaps to a specific memory area (only in v2). Fix &lt;code&gt;realloc&lt;/code&gt; behavior for zero size blocks, remove restriction to integral multiple of the alignment in &lt;code&gt;alloc_align&lt;/code&gt;, improved aligned allocation performance, reduced contention with many threads on few processors (thank you @dposluns!), vs2022 support, support &lt;code&gt;pkg-config&lt;/code&gt;, .&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2022-04-14, &lt;code&gt;v1.7.6&lt;/code&gt;, &lt;code&gt;v2.0.6&lt;/code&gt;: fix fallback path for aligned OS allocation on Windows, improve Windows aligned allocation even when compiling with older SDK&#39;s, fix dynamic overriding on macOS Monterey, fix MSVC C++ dynamic overriding, fix warnings under Clang 14, improve performance if many OS threads are created and destroyed, fix statistics for large object allocations, using MIMALLOC_VERBOSE=1 has no maximum on the number of error messages, various small fixes.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2022-02-14, &lt;code&gt;v1.7.5&lt;/code&gt;, &lt;code&gt;v2.0.5&lt;/code&gt; (alpha): fix malloc override on Windows 11, fix compilation with musl, potentially reduced committed memory, add &lt;code&gt;bin/minject&lt;/code&gt; for Windows, improved wasm support, faster aligned allocation, various small fixes.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2021-11-14, &lt;code&gt;v1.7.3&lt;/code&gt;, &lt;code&gt;v2.0.3&lt;/code&gt; (beta): improved WASM support, improved macOS support and performance (including M1), improved performance for v2 for large objects, Python integration improvements, more standard installation directories, various small fixes.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2021-06-17, &lt;code&gt;v1.7.2&lt;/code&gt;, &lt;code&gt;v2.0.2&lt;/code&gt; (beta): support M1, better installation layout on Linux, fix thread_id on Android, prefer 2-6TiB area for aligned allocation to work better on pre-windows 8, various small fixes.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2021-04-06, &lt;code&gt;v1.7.1&lt;/code&gt;, &lt;code&gt;v2.0.1&lt;/code&gt; (beta): fix bug in arena allocation for huge pages, improved aslr on large allocations, initial M1 support (still experimental).&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2021-01-31, &lt;code&gt;v2.0.0&lt;/code&gt;: beta release 2.0: new slice algorithm for managing internal mimalloc pages.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2021-01-31, &lt;code&gt;v1.7.0&lt;/code&gt;: stable release 1.7: support explicit user provided memory regions, more precise statistics, improve macOS overriding, initial support for Apple M1, improved DragonFly support, faster memcpy on Windows, various small fixes.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2020-09-24, &lt;code&gt;v1.6.7&lt;/code&gt;: stable release 1.6: using standard C atomics, passing tsan testing, improved handling of failing to commit on Windows, add &lt;a href=&quot;https://github.com/microsoft/mimalloc/raw/master/include/mimalloc.h#L156&quot;&gt;&lt;code&gt;mi_process_info&lt;/code&gt;&lt;/a&gt; api call.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2020-08-06, &lt;code&gt;v1.6.4&lt;/code&gt;: stable release 1.6: improved error recovery in low-memory situations, support for IllumOS and Haiku, NUMA support for Vista/XP, improved NUMA detection for AMD Ryzen, ubsan support.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2020-05-05, &lt;code&gt;v1.6.3&lt;/code&gt;: stable release 1.6: improved behavior in out-of-memory situations, improved malloc zones on macOS, build PIC static libraries by default, add option to abort on out-of-memory, line buffered statistics.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2020-04-20, &lt;code&gt;v1.6.2&lt;/code&gt;: stable release 1.6: fix compilation on Android, MingW, Raspberry, and Conda, stability fix for Windows 7, fix multiple mimalloc instances in one executable, fix &lt;code&gt;strnlen&lt;/code&gt; overload, fix aligned debug padding.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2020-02-17, &lt;code&gt;v1.6.1&lt;/code&gt;: stable release 1.6: minor updates (build with clang-cl, fix alignment issue for small objects).&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2020-02-09, &lt;code&gt;v1.6.0&lt;/code&gt;: stable release 1.6: fixed potential memory leak, improved overriding and thread local support on FreeBSD, NetBSD, DragonFly, and macOSX. New byte-precise heap block overflow detection in debug mode (besides the double-free detection and free-list corruption detection). Add &lt;code&gt;nodiscard&lt;/code&gt; attribute to most allocation functions. Enable &lt;code&gt;MIMALLOC_PAGE_RESET&lt;/code&gt; by default. New reclamation strategy for abandoned heap pages for better memory footprint.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2020-02-09, &lt;code&gt;v1.5.0&lt;/code&gt;: stable release 1.5: improved free performance, small bug fixes.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2020-01-22, &lt;code&gt;v1.4.0&lt;/code&gt;: stable release 1.4: improved performance for delayed OS page reset, more eager concurrent free, addition of STL allocator, fixed potential memory leak.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2020-01-15, &lt;code&gt;v1.3.0&lt;/code&gt;: stable release 1.3: bug fixes, improved randomness and &lt;a href=&quot;https://github.com/microsoft/mimalloc/raw/783e3377f79ee82af43a0793910a9f2d01ac7863/include/mimalloc-internal.h#L396&quot;&gt;stronger free list encoding&lt;/a&gt; in secure mode.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2019-12-22, &lt;code&gt;v1.2.2&lt;/code&gt;: stable release 1.2: minor updates.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2019-11-22, &lt;code&gt;v1.2.0&lt;/code&gt;: stable release 1.2: bug fixes, improved secure mode (free list corruption checks, double free mitigation). Improved dynamic overriding on Windows.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2019-10-07, &lt;code&gt;v1.1.0&lt;/code&gt;: stable release 1.1.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2019-09-01, &lt;code&gt;v1.0.8&lt;/code&gt;: pre-release 8: more robust windows dynamic overriding, initial huge page support.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;2019-08-10, &lt;code&gt;v1.0.6&lt;/code&gt;: pre-release 6: various performance improvements.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/0f7a13ce27d884ebe94332c05dd96ca78344b5e54797ea450849bcd49ee8d271/microsoft/mimalloc" medium="image" />
      
    </item>
    
    <item>
      <title>uber/h3</title>
      <link>https://github.com/uber/h3</link>
      <description>&lt;p&gt;Hexagonal hierarchical geospatial indexing system&lt;/p&gt;&lt;hr&gt;&lt;img align=&quot;right&quot; src=&quot;https://uber.github.io/img/h3Logo-color.svg?sanitize=true&quot; alt=&quot;H3 Logo&quot; width=&quot;200&quot; /&gt; 
&lt;h1&gt;H3: A Hexagonal Hierarchical Geospatial Indexing System&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/uber/h3/actions&quot;&gt;&lt;img src=&quot;https://github.com/uber/h3/workflows/test-linux/badge.svg?sanitize=true&quot; alt=&quot;test-linux&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/uber/h3/actions&quot;&gt;&lt;img src=&quot;https://github.com/uber/h3/workflows/test-macos/badge.svg?sanitize=true&quot; alt=&quot;test-macos&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/uber/h3/actions&quot;&gt;&lt;img src=&quot;https://github.com/uber/h3/workflows/test-windows/badge.svg?sanitize=true&quot; alt=&quot;test-windows&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/uber/h3/actions&quot;&gt;&lt;img src=&quot;https://github.com/uber/h3/workflows/test-website/badge.svg?sanitize=true&quot; alt=&quot;test-website&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://coveralls.io/github/uber/h3?branch=master&quot;&gt;&lt;img src=&quot;https://coveralls.io/repos/github/uber/h3/badge.svg?branch=master&quot; alt=&quot;Coverage Status&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://raw.githubusercontent.com/uber/h3/master/LICENSE&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/License-Apache%202.0-blue.svg?sanitize=true&quot; alt=&quot;License&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;H3 is a geospatial indexing system using a hexagonal grid that can be (approximately) subdivided into finer and finer hexagonal grids, combining the benefits of a hexagonal grid with &lt;a href=&quot;https://code.google.com/archive/p/s2-geometry-library/&quot;&gt;S2&lt;/a&gt;&#39;s hierarchical subdivisions.&lt;/p&gt; 
&lt;p&gt;Documentation is available at &lt;a href=&quot;https://h3geo.org/&quot;&gt;https://h3geo.org/&lt;/a&gt;. Developer documentation in Markdown format is available under the &lt;a href=&quot;https://raw.githubusercontent.com/uber/h3/master/dev-docs/&quot;&gt;dev-docs&lt;/a&gt; directory.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Post &lt;strong&gt;bug reports or feature requests&lt;/strong&gt; to the &lt;a href=&quot;https://github.com/uber/h3/issues&quot;&gt;GitHub Issues page&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Ask &lt;strong&gt;questions&lt;/strong&gt; by posting to the &lt;a href=&quot;https://stackoverflow.com/questions/tagged/h3&quot;&gt;H3 tag on StackOverflow&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;There is also an &lt;a href=&quot;https://join.slack.com/t/h3-core/shared_invite/zt-g6u5r1hf-W_~uVJmfeiWtMQuBGc1NNg&quot;&gt;H3 Slack workspace&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Installing&lt;/h2&gt; 
&lt;p&gt;We recommend using prebuilt bindings if they are available for your programming language. Bindings for &lt;a href=&quot;https://github.com/uber/h3-java&quot;&gt;Java&lt;/a&gt;, &lt;a href=&quot;https://github.com/uber/h3-js&quot;&gt;JavaScript&lt;/a&gt;, &lt;a href=&quot;https://github.com/uber/h3-py&quot;&gt;Python&lt;/a&gt;, and &lt;a href=&quot;https://h3geo.org/docs/community/bindings&quot;&gt;others&lt;/a&gt; are available.&lt;/p&gt; 
&lt;p&gt;On macOS, you can install H3 using &lt;code&gt;brew&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;brew install h3
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Otherwise, to build H3 from source, please see the following instructions.&lt;/p&gt; 
&lt;h3&gt;Building from source&lt;/h3&gt; 
&lt;p&gt;Still here? To build the H3 C library, you&#39;ll need a C compiler (tested with &lt;code&gt;gcc&lt;/code&gt; and &lt;code&gt;clang&lt;/code&gt;), &lt;a href=&quot;https://cmake.org/&quot;&gt;CMake&lt;/a&gt;, and &lt;a href=&quot;https://www.gnu.org/software/make/&quot;&gt;Make&lt;/a&gt;. If you intend to contribute to H3, you must have &lt;a href=&quot;https://clang.llvm.org/docs/ClangFormat.html&quot;&gt;clang-format&lt;/a&gt; installed and we recommend installing &lt;a href=&quot;https://cmake.org/cmake/help/v3.0/manual/ccmake.1.html&quot;&gt;ccmake&lt;/a&gt; and &lt;a href=&quot;http://ltp.sourceforge.net/coverage/lcov.php&quot;&gt;LCOV&lt;/a&gt; to configure the &lt;code&gt;cmake&lt;/code&gt; arguments to build and run the tests and generate the code coverage report. We also recommend using &lt;code&gt;gcc&lt;/code&gt; for the code coverage as some versions of &lt;code&gt;clang&lt;/code&gt; generate annotations that aren&#39;t compatible with &lt;code&gt;lcov&lt;/code&gt;. &lt;a href=&quot;https://www.doxygen.nl/index.html&quot;&gt;Doxygen&lt;/a&gt; is needed to build the API documentation.&lt;/p&gt; 
&lt;h4&gt;Install build-time dependencies&lt;/h4&gt; 
&lt;ul&gt; 
 &lt;li&gt;Alpine&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code&gt;# Installing the bare build requirements
apk add cmake make gcc libtool musl-dev
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Debian/Ubuntu&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code&gt;# Installing the bare build requirements
sudo apt install cmake make gcc libtool
# Installing useful tools for development
sudo apt install clang-format cmake-curses-gui lcov doxygen
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;macOS (using &lt;code&gt;brew&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;First make sure you &lt;a href=&quot;http://osxdaily.com/2014/02/12/install-command-line-tools-mac-os-x/&quot;&gt;have the developer tools installed&lt;/a&gt; and then&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# Installing the bare build requirements
brew install cmake
# Installing useful tools for development
brew install clang-format lcov doxygen
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Windows (Visual Studio)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You will need to install CMake and Visual Studio, including the Visual C++ compiler. For building on Windows, please follow the &lt;a href=&quot;https://raw.githubusercontent.com/uber/h3/master/dev-docs/build_windows.md&quot;&gt;Windows build instructions&lt;/a&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;FreeBSD&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code&gt;# Installing the build requirements
sudo pkg install bash cmake gmake doxygen lcov
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Compilation&lt;/h4&gt; 
&lt;p&gt;When checking out the H3 Git repository, by default you will check out the latest development version of H3. When using H3 in an application, you will want to check out the most recently released version:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git checkout v$(&amp;lt;VERSION)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;From the repository root, you can compile H3 with:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;All subsequent &lt;code&gt;make&lt;/code&gt; commands should be run from within the &lt;code&gt;build&lt;/code&gt; directory.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: There are several ways to build H3 with CMake; the method above is just one example that restricts all build artifacts to the &lt;code&gt;build&lt;/code&gt; directory.&lt;/p&gt; 
&lt;p&gt;You can install system-wide with:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo make install
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If using the method above, from the repository root, you can clean all build artifacts with:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;rm -rf build
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Testing&lt;/h4&gt; 
&lt;p&gt;After making the project, you can test with &lt;code&gt;make test&lt;/code&gt;. You can run a faster test suite that excludes the most expensive tests with &lt;code&gt;make test-fast&lt;/code&gt;.&lt;/p&gt; 
&lt;h4&gt;Coverage&lt;/h4&gt; 
&lt;p&gt;You can generate a code coverage report if &lt;code&gt;lcov&lt;/code&gt; is installed, and if the project was built with the &lt;code&gt;CMAKE_BUILD_TYPE=Debug&lt;/code&gt; and &lt;code&gt;ENABLE_COVERAGE=ON&lt;/code&gt; options. For example, from a clean repository, you could run:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_COVERAGE=ON ..
make
make coverage
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can then view a detailed HTML coverage report by opening &lt;code&gt;coverage/index.html&lt;/code&gt; in your browser.&lt;/p&gt; 
&lt;h4&gt;Benchmarks&lt;/h4&gt; 
&lt;p&gt;You can run timing benchmarks by building with the &lt;code&gt;CMAKE_BUILD_TYPE=Release&lt;/code&gt;, and running &lt;code&gt;make benchmarks&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
make benchmarks
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Documentation&lt;/h4&gt; 
&lt;p&gt;You can build developer documentation with &lt;code&gt;make docs&lt;/code&gt; if Doxygen was installed when CMake was run. Index of the documentation will be &lt;code&gt;dev-docs/_build/html/index.html&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;After making the project, you can build KML files to visualize the hexagon grid with &lt;code&gt;make kml&lt;/code&gt;. The files will be placed in &lt;code&gt;KML&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;To build the documentation website, see the &lt;a href=&quot;https://raw.githubusercontent.com/uber/h3/master/website/&quot;&gt;website/&lt;/a&gt; directory.&lt;/p&gt; 
&lt;h2&gt;Usage&lt;/h2&gt; 
&lt;h3&gt;From the command line&lt;/h3&gt; 
&lt;p&gt;To get the H3 index for some location:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;./bin/latLngToCell --resolution 10 --latitude 40.689167 --longitude -74.044444
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;10 is the H3 resolution, between 0 (coarsest) and 15 (finest). The coordinates entered are the latitude and longitude, in degrees, you want the index for (these coordinates are the Statue of Liberty). You should get an H3 index as output, like &lt;code&gt;8a2a1072b59ffff&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;You can then take this index and get some information about it, for example:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;./bin/cellToBoundary --index 8a2a1072b59ffff
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This will produce the vertices of the hexagon at this location:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;8a2a1072b59ffff
{
   40.690058601 -74.044151762
   40.689907695 -74.045061792
   40.689270936 -74.045341418
   40.688785091 -74.044711031
   40.688935993 -74.043801021
   40.689572744 -74.043521377
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can get the center coordinate of the hexagon like so:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;./bin/cellToLatLng --index 8a2a1072b59ffff
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This will produce some coordinate:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;40.6894218437 -74.0444313999
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;From C&lt;/h3&gt; 
&lt;p&gt;The above features of H3 can also be used from C. For example, you can compile and run &lt;a href=&quot;https://raw.githubusercontent.com/uber/h3/master/examples/index.c&quot;&gt;examples/index.c&lt;/a&gt; like so:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;cc -lh3 examples/index.c -o example
./example
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You should get output like:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;The index is: 8a2a1072b59ffff
Boundary vertex #0: 40.690059, -74.044152
Boundary vertex #1: 40.689908, -74.045062
Boundary vertex #2: 40.689271, -74.045341
Boundary vertex #3: 40.688785, -74.044711
Boundary vertex #4: 40.688936, -74.043801
Boundary vertex #5: 40.689573, -74.043521
Center coordinates: 40.689422, -74.044431
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;Pull requests and Github issues are welcome. Please see our &lt;a href=&quot;https://raw.githubusercontent.com/uber/h3/master/CONTRIBUTING.md&quot;&gt;contributing guide&lt;/a&gt; for more information.&lt;/p&gt; 
&lt;p&gt;Before we can merge your changes, you must agree to the &lt;a href=&quot;https://cla-assistant.io/uber/h3&quot;&gt;Uber Contributor License Agreement&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Legal and Licensing&lt;/h2&gt; 
&lt;p&gt;H3 is licensed under the &lt;a href=&quot;https://raw.githubusercontent.com/uber/h3/master/LICENSE&quot;&gt;Apache 2.0 License&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;DGGRID Copyright (c) 2015 Southern Oregon University&lt;/p&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/114948816/18b86b00-4ccc-11ea-8c4b-48010a7f3c6c" medium="image" />
      
    </item>
    
    <item>
      <title>telekom-security/tpotce</title>
      <link>https://github.com/telekom-security/tpotce</link>
      <description>&lt;p&gt;🍯 T-Pot - The All In One Multi Honeypot Platform 🐝&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;T-Pot - The All In One Multi Honeypot Platform&lt;/h1&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/doc/tpotsocial.png&quot; alt=&quot;T-Pot&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;T-Pot is the all in one, optionally distributed, multiarch (amd64, arm64) honeypot plattform, supporting 20+ honeypots and countless visualization options using the Elastic Stack, animated live attack maps and lots of security tools to further improve the deception experience. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;TL;DR&lt;/h1&gt; 
&lt;ol&gt; 
 &lt;li&gt;Meet the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#system-requirements&quot;&gt;system requirements&lt;/a&gt;. The T-Pot installation needs at least 8-16 GB RAM, 128 GB free disk space as well as a working (outgoing non-filtered) internet connection.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;Download&lt;/a&gt; or use a running, supported distribution.&lt;/li&gt; 
 &lt;li&gt;Install the ISO with as minimal packages / services as possible (&lt;code&gt;ssh&lt;/code&gt; required)&lt;/li&gt; 
 &lt;li&gt;Install &lt;code&gt;curl&lt;/code&gt;: &lt;code&gt;$ sudo [apt, dnf, zypper] install curl&lt;/code&gt; if not installed already&lt;/li&gt; 
 &lt;li&gt;Run installer as non-root from &lt;code&gt;$HOME&lt;/code&gt;:&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;env bash -c &quot;$(curl -sL https://github.com/telekom-security/tpotce/raw/master/install.sh)&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Follow instructions, read messages, check for possible port conflicts and reboot&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- TOC --&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#t-pot---the-all-in-one-multi-honeypot-platform&quot;&gt;T-Pot - The All In One Multi Honeypot Platform&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#tldr&quot;&gt;TL;DR&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#disclaimer&quot;&gt;Disclaimer&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#technical-concept&quot;&gt;Technical Concept&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#honeypots-and-tools&quot;&gt;Honeypots and Tools&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#technical-architecture&quot;&gt;Technical Architecture&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#services&quot;&gt;Services&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#user-types&quot;&gt;User Types&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#system-requirements&quot;&gt;System Requirements&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#running-in-a-vm&quot;&gt;Running in a VM&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#running-on-hardware&quot;&gt;Running on Hardware&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#running-in-a-cloud&quot;&gt;Running in a Cloud&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#required-ports&quot;&gt;Required Ports&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#llm-based-honeypots&quot;&gt;LLM-Based Honeypots&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#ollama&quot;&gt;Ollama&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#chatgpt&quot;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#system-placement&quot;&gt;System Placement&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#installation&quot;&gt;Installation&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;Choose your distro&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#raspberry-pi-4-8gb-support&quot;&gt;Raspberry Pi 4 (8GB) Support&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#get-and-install-t-pot&quot;&gt;Get and install T-Pot&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#macos--windows&quot;&gt;macOS &amp;amp; Windows&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#red-hat-enterprise-linux&quot;&gt;Red Hat Enterprise Linux&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#installation-types&quot;&gt;Installation Types&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#standard--hive&quot;&gt;Standard / Hive&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#distributed&quot;&gt;Distributed&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#uninstall-t-pot&quot;&gt;Uninstall T-Pot&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#first-start&quot;&gt;First Start&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#standalone-first-start&quot;&gt;Standalone First Start&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#distributed-deployment&quot;&gt;Distributed Deployment&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#planning-and-certificates&quot;&gt;Planning and Certificates&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#deploying-sensors&quot;&gt;Deploying Sensors&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#removing-sensors&quot;&gt;Removing Sensors&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#community-data-submission&quot;&gt;Community Data Submission&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#opt-in-hpfeeds-data-submission&quot;&gt;Opt-In HPFEEDS Data Submission&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#remote-access-and-tools&quot;&gt;Remote Access and Tools&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#ssh&quot;&gt;SSH&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#t-pot-landing-page&quot;&gt;T-Pot Landing Page&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#kibana-dashboard&quot;&gt;Kibana Dashboard&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#attack-map&quot;&gt;Attack Map&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#cyberchef&quot;&gt;Cyberchef&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#elasticvue&quot;&gt;Elasticvue&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#spiderfoot&quot;&gt;Spiderfoot&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#configuration&quot;&gt;Configuration&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#t-pot-config-file&quot;&gt;T-Pot Config File&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#customize-t-pot-honeypots-and-services&quot;&gt;Customize T-Pot Honeypots and Services&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#maintenance&quot;&gt;Maintenance&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#general-updates&quot;&gt;General Updates&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#update-script&quot;&gt;Update Script&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#daily-reboot&quot;&gt;Daily Reboot&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#known-issues&quot;&gt;Known Issues&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#docker-images-fail-to-download&quot;&gt;Docker Images Fail to Download&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#t-pot-networking-fails&quot;&gt;T-Pot Networking Fails&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#start-t-pot&quot;&gt;Start T-Pot&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#stop-t-pot&quot;&gt;Stop T-Pot&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#t-pot-data-folder&quot;&gt;T-Pot Data Folder&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#log-persistence&quot;&gt;Log Persistence&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#factory-reset&quot;&gt;Factory Reset&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#show-containers&quot;&gt;Show Containers&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#blackhole&quot;&gt;Blackhole&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#add-users-to-nginx-t-pot-webui&quot;&gt;Add Users to Nginx (T-Pot WebUI)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#import-and-export-kibana-objects&quot;&gt;Import and Export Kibana Objects&lt;/a&gt; 
    &lt;ul&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#export&quot;&gt;Export&lt;/a&gt;&lt;/li&gt; 
     &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#import&quot;&gt;Import&lt;/a&gt;&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#troubleshooting&quot;&gt;Troubleshooting&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#logs&quot;&gt;Logs&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#ram-and-storage&quot;&gt;RAM and Storage&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#contact&quot;&gt;Contact&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#issues&quot;&gt;Issues&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#discussions&quot;&gt;Discussions&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#licenses&quot;&gt;Licenses&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#credits&quot;&gt;Credits&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#the-developers-and-development-communities-of&quot;&gt;The developers and development communities of&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#the-following-companies-and-organizations&quot;&gt;&lt;strong&gt;The following companies and organizations&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#and-of-course-you-for-joining-the-community&quot;&gt;&lt;strong&gt;And of course &lt;em&gt;&lt;strong&gt;YOU&lt;/strong&gt;&lt;/em&gt; for joining the community!&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#testimonials&quot;&gt;Testimonials&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#thank-you-&quot;&gt;Thank you 💖&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;!-- TOC --&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;Disclaimer&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;You install and run T-Pot within your responsibility. Choose your deployment wisely as a system compromise can never be ruled out.&lt;/li&gt; 
 &lt;li&gt;For fast help research the &lt;a href=&quot;https://github.com/telekom-security/tpotce/issues&quot;&gt;Issues&lt;/a&gt; and &lt;a href=&quot;https://github.com/telekom-security/tpotce/discussions&quot;&gt;Discussions&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;The software is designed and offered with best effort in mind. As a community and open source project it uses lots of other open source software and may contain bugs and issues. Report responsibly.&lt;/li&gt; 
 &lt;li&gt;Honeypots - by design - should not host any sensitive data. Make sure you don&#39;t add any.&lt;/li&gt; 
 &lt;li&gt;By default, your data is submitted to &lt;a href=&quot;https://www.sicherheitstacho.eu/start/main&quot;&gt;Sicherheitstacho&lt;/a&gt;. You can disable this in the config (&lt;code&gt;~/tpotce/docker-compose.yml&lt;/code&gt;) by &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#community-data-submission&quot;&gt;removing&lt;/a&gt; the &lt;code&gt;ewsposter&lt;/code&gt; section. But in this case sharing really is caring! &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Technical Concept&lt;/h1&gt; 
&lt;p&gt;T-Pot&#39;s main components have been moved into the &lt;code&gt;tpotinit&lt;/code&gt; Docker image allowing T-Pot to now support multiple Linux distributions, even macOS and Windows (although both limited to the feature set of Docker Desktop). T-Pot uses &lt;a href=&quot;https://www.docker.com/&quot;&gt;docker&lt;/a&gt; and &lt;a href=&quot;https://docs.docker.com/compose/&quot;&gt;docker compose&lt;/a&gt; to reach its goal of running as many honeypots and tools as possible simultaneously and thus utilizing the host&#39;s hardware to its maximum. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Honeypots and Tools&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;T-Pot offers docker images for the following honeypots:&lt;br /&gt; &lt;a href=&quot;https://github.com/huuck/ADBHoney&quot;&gt;adbhoney&lt;/a&gt;, &lt;a href=&quot;https://github.com/mariocandela/beelzebub&quot;&gt;beelzebub&lt;/a&gt;, &lt;a href=&quot;https://github.com/Cymmetria/ciscoasa_honeypot&quot;&gt;ciscoasa&lt;/a&gt;, &lt;a href=&quot;https://github.com/MalwareTech/CitrixHoneypot&quot;&gt;citrixhoneypot&lt;/a&gt;, &lt;a href=&quot;http://conpot.org/&quot;&gt;conpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/cowrie/cowrie&quot;&gt;cowrie&lt;/a&gt;, &lt;a href=&quot;https://github.com/aelth/ddospot&quot;&gt;ddospot&lt;/a&gt;, &lt;a href=&quot;https://github.com/nsmfoo/dicompot&quot;&gt;dicompot&lt;/a&gt;, &lt;a href=&quot;https://github.com/DinoTools/dionaea&quot;&gt;dionaea&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/bontchev/elasticpot&quot;&gt;elasticpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/skeeto/endlessh&quot;&gt;endlessh&lt;/a&gt;, &lt;a href=&quot;https://github.com/0x4D31/galah&quot;&gt;galah&lt;/a&gt;, &lt;a href=&quot;https://github.com/ryanolee/go-pot&quot;&gt;go-pot&lt;/a&gt;, &lt;a href=&quot;https://github.com/mushorg/glutton&quot;&gt;glutton&lt;/a&gt;, &lt;a href=&quot;https://github.com/pbssubhash/h0neytr4p&quot;&gt;h0neytr4p&lt;/a&gt;, &lt;a href=&quot;https://github.com/yunginnanet/HellPot&quot;&gt;hellpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/johnnykv/heralding&quot;&gt;heralding&lt;/a&gt;, &lt;a href=&quot;https://github.com/mmta/honeyaml&quot;&gt;honeyaml&lt;/a&gt;, &lt;a href=&quot;https://github.com/qeeqbox/honeypots&quot;&gt;honeypots&lt;/a&gt;, &lt;a href=&quot;https://github.com/armedpot/honeytrap/&quot;&gt;honeytrap&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/bontchev/ipphoney&quot;&gt;ipphoney&lt;/a&gt;, &lt;a href=&quot;https://github.com/thomaspatzke/Log4Pot&quot;&gt;log4pot&lt;/a&gt;, &lt;a href=&quot;https://github.com/awhitehatter/mailoney&quot;&gt;mailoney&lt;/a&gt;, &lt;a href=&quot;https://github.com/schmalle/medpot&quot;&gt;medpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/sa7mon/miniprint&quot;&gt;miniprint&lt;/a&gt;, &lt;a href=&quot;https://github.com/cypwnpwnsocute/RedisHoneyPot&quot;&gt;redishoneypot&lt;/a&gt;, &lt;a href=&quot;https://github.com/SentryPeer/SentryPeer&quot;&gt;sentrypeer&lt;/a&gt;, &lt;a href=&quot;http://mushmush.org/&quot;&gt;snare&lt;/a&gt;, &lt;a href=&quot;http://mushmush.org/&quot;&gt;tanner&lt;/a&gt;, &lt;a href=&quot;https://github.com/gbrindisi/wordpot&quot;&gt;wordpot&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Alongside the following tools:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/willfarrell/docker-autoheal&quot;&gt;Autoheal&lt;/a&gt; a tool to automatically restart containers with failed healthchecks.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://gchq.github.io/CyberChef/&quot;&gt;Cyberchef&lt;/a&gt; a web app for encryption, encoding, compression and data analysis.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.elastic.co/videos&quot;&gt;Elastic Stack&lt;/a&gt; to beautifully visualize all the events captured by T-Pot.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/cars10/elasticvue/&quot;&gt;Elasticvue&lt;/a&gt; a web front end for browsing and interacting with an Elasticsearch cluster.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/0x4D31/fatt&quot;&gt;Fatt&lt;/a&gt; a pyshark based script for extracting network metadata and fingerprints from pcap files and live network traffic.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/t3chn0m4g3/t-pot-attack-map&quot;&gt;T-Pot-Attack-Map&lt;/a&gt; a beautifully animated attack map for T-Pot.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://lcamtuf.coredump.cx/p0f3/&quot;&gt;P0f&lt;/a&gt; is a tool for purely passive traffic fingerprinting.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/smicallef/spiderfoot&quot;&gt;Spiderfoot&lt;/a&gt; an open source intelligence automation tool.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://suricata.io/&quot;&gt;Suricata&lt;/a&gt; a Network Security Monitoring engine.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;... to give you the best out-of-the-box experience possible and an easy-to-use multi-honeypot system. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Technical Architecture&lt;/h2&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/doc/architecture.png&quot; alt=&quot;Architecture&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;The source code and configuration files are fully stored in the T-Pot GitHub repository. The docker images are built and preconfigured for the T-Pot environment.&lt;/p&gt; 
&lt;p&gt;The individual Dockerfiles and configurations are located in the &lt;a href=&quot;https://github.com/telekom-security/tpotce/tree/master/docker&quot;&gt;docker folder&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Services&lt;/h2&gt; 
&lt;p&gt;T-Pot offers a number of services which are basically divided into five groups:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;System services provided by the OS 
  &lt;ul&gt; 
   &lt;li&gt;SSH for secure remote access.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Elastic Stack 
  &lt;ul&gt; 
   &lt;li&gt;Elasticsearch for storing events.&lt;/li&gt; 
   &lt;li&gt;Logstash for ingesting, receiving and sending events to Elasticsearch.&lt;/li&gt; 
   &lt;li&gt;Kibana for displaying events on beautifully rendered dashboards.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Tools 
  &lt;ul&gt; 
   &lt;li&gt;NGINX provides secure remote access (reverse proxy) to Kibana, CyberChef, Elasticvue, GeoIP AttackMap, Spiderfoot and allows for T-Pot sensors to securely transmit event data to the T-Pot hive.&lt;/li&gt; 
   &lt;li&gt;CyberChef a web app for encryption, encoding, compression and data analysis.&lt;/li&gt; 
   &lt;li&gt;Elasticvue a web front end for browsing and interacting with an Elasticsearch cluster.&lt;/li&gt; 
   &lt;li&gt;T-Pot Attack Map a beautifully animated attack map for T-Pot.&lt;/li&gt; 
   &lt;li&gt;Spiderfoot an open source intelligence automation tool.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Honeypots 
  &lt;ul&gt; 
   &lt;li&gt;A selection of the 23 available honeypots based on the selected &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Network Security Monitoring (NSM) 
  &lt;ul&gt; 
   &lt;li&gt;Fatt a pyshark based script for extracting network metadata and fingerprints from pcap files and live network traffic.&lt;/li&gt; 
   &lt;li&gt;P0f is a tool for purely passive traffic fingerprinting.&lt;/li&gt; 
   &lt;li&gt;Suricata a Network Security Monitoring engine. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;User Types&lt;/h2&gt; 
&lt;p&gt;During the installation and during the usage of T-Pot there are two different types of accounts you will be working with. Make sure you know the differences of the different account types, since it is &lt;strong&gt;by far&lt;/strong&gt; the most common reason for authentication errors.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Service&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Account Type&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Username / Group&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;SSH&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;OS&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;OS_USERNAME&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;The user you chose during the installation of the OS.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Nginx&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;BasicAuth&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;WEB_USER&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;web_user&amp;gt;&lt;/code&gt; you chose during the installation of T-Pot.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;CyberChef&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;BasicAuth&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;WEB_USER&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;web_user&amp;gt;&lt;/code&gt; you chose during the installation of T-Pot.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Elasticvue&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;BasicAuth&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;WEB_USER&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;web_user&amp;gt;&lt;/code&gt; you chose during the installation of T-Pot.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Geoip Attack Map&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;BasicAuth&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;WEB_USER&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;web_user&amp;gt;&lt;/code&gt; you chose during the installation of T-Pot.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Spiderfoot&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;BasicAuth&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;WEB_USER&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;web_user&amp;gt;&lt;/code&gt; you chose during the installation of T-Pot.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;T-Pot&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;OS&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;tpot&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;tpot&lt;/code&gt; this user / group is always reserved by the T-Pot services.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;T-Pot Logs&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;BasicAuth&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;&amp;lt;LS_WEB_USER&amp;gt;&lt;/code&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;LS_WEB_USER&lt;/code&gt; are automatically managed.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;System Requirements&lt;/h1&gt; 
&lt;p&gt;Depending on the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;supported Linux distro images&lt;/a&gt;, hive / sensor, installing on &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#running-on-hardware&quot;&gt;real hardware&lt;/a&gt;, in a &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#running-in-a-vm&quot;&gt;virtual machine&lt;/a&gt; or other environments there are different kind of requirements to be met regarding OS, RAM, storage and network for a successful installation of T-Pot (you can always adjust &lt;code&gt;~/tpotce/docker-compose.yml&lt;/code&gt; and &lt;code&gt;~/tpotce/.env&lt;/code&gt;to your needs to overcome these requirements). &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;T-Pot Type&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;RAM&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Storage&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Hive&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;16GB&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;256GB SSD&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;As a rule of thumb, the more honeypots, sensors &amp;amp; data, the more RAM and storage is needed.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Sensor&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;8GB&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;128GB SSD&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Since honeypot logs are persisted (~/tpotce/data) for 30 days, storage depends on attack volume.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;T-Pot does require ...&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;an IPv4 address via DHCP or statically assigned&lt;/li&gt; 
 &lt;li&gt;a working, non-proxied, internet connection ... for a successful installation and operation. &lt;br /&gt;&lt;br /&gt; &lt;em&gt;If you need proxy support or otherwise non-standard features, you should check the docs of the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;supported Linux distro images&lt;/a&gt; and / or the &lt;a href=&quot;https://docs.docker.com/&quot;&gt;Docker documentation&lt;/a&gt;.&lt;/em&gt; &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Running in a VM&lt;/h2&gt; 
&lt;p&gt;All of the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;supported Linux distro images&lt;/a&gt; will run in a VM which means T-Pot will just run fine. The following were tested / reported to work:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://mac.getutm.app/&quot;&gt;UTM (Intel &amp;amp; Apple Silicon)&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.virtualbox.org/&quot;&gt;VirtualBox&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.vmware.com/products/fusion/fusion-evaluation.html&quot;&gt;VMWare Fusion&lt;/a&gt; and &lt;a href=&quot;https://www.vmware.com/products/workstation-pro.html&quot;&gt;VMWare Workstation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;KVM is reported to work as well.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Some configuration / setup hints:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;While Intel versions run stable, Apple Silicon (arm64) support has known issues which in UTM may require switching &lt;code&gt;Display&lt;/code&gt; to &lt;code&gt;Console Only&lt;/code&gt; during initial installation of the OS and afterwards back to &lt;code&gt;Full Graphics&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;During configuration you may need to enable promiscuous mode for the network interface in order for fatt, suricata and p0f to work properly.&lt;/li&gt; 
 &lt;li&gt;If you want to use a wifi card as a primary NIC for T-Pot, please be aware that not all network interface drivers support all wireless cards. In VirtualBox e.g. you have to choose the &lt;em&gt;&quot;MT SERVER&quot;&lt;/em&gt; model of the NIC. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Running on Hardware&lt;/h2&gt; 
&lt;p&gt;T-Pot is only limited by the hardware support of the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;supported Linux distro images&lt;/a&gt;. It is recommended to check the HCL (hardware compatibility list) and test the supported distros with T-Pot before investing in dedicated hardware. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Running in a Cloud&lt;/h2&gt; 
&lt;p&gt;T-Pot is tested on and known to run on ...&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Telekom OTC using the post install method ... others may work, but remain untested.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Some users report working installations on other clouds and hosters, i.e. Azure and GCP. Hardware requirements may be different. If you are unsure you should research &lt;a href=&quot;https://github.com/telekom-security/tpotce/issues&quot;&gt;issues&lt;/a&gt; and &lt;a href=&quot;https://github.com/telekom-security/tpotce/discussions&quot;&gt;discussions&lt;/a&gt; and run some functional tests. With T-Pot 24.04.0 and forward we made sure to remove settings that were known to interfere with cloud based installations. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Required Ports&lt;/h2&gt; 
&lt;p&gt;Besides the ports generally needed by the OS, i.e. obtaining a DHCP lease, DNS, etc. T-Pot will require the following ports for incoming / outgoing connections. Review the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#technical-architecture&quot;&gt;T-Pot Architecture&lt;/a&gt; for a visual representation. Also some ports will show up as duplicates, which is fine since used in different editions.&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Port&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Protocol&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Direction&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;80, 443&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;outgoing&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;T-Pot Management: Install, Updates, Logs (i.e. OS, GitHub, DockerHub, Sicherheitstacho, etc.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;11434&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;outgoing&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;LLM based honeypots: Access your Ollama installation&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;64294&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;T-Pot Management: Sensor data transmission to hive (through NGINX reverse proxy) to 127.0.0.1:64305&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;64295&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;T-Pot Management: Access to SSH&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;64297&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;T-Pot Management Access to NGINX reverse proxy&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;5555&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: ADBHoney&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;22&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Beelzebub (LLM required)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;5000&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;udp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: CiscoASA&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;8443&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: CiscoASA&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;443&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: CitrixHoneypot&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;80, 102, 502, 1025, 2404, 10001, 44818, 47808, 50100&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Conpot&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;161, 623&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;udp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Conpot&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;22, 23&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Cowrie&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;19, 53, 123, 1900&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;udp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Ddospot&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;11112&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Dicompot&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;21, 42, 135, 443, 445, 1433, 1723, 1883, 3306, 8081&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Dionaea&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;69&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;udp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Dionaea&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;9200&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Elasticpot&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;22&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Endlessh&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;80, 443, 8080, 8443&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Galah (LLM required)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;8080&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Go-pot&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;80, 443&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: H0neytr4p&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;21, 22, 23, 25, 80, 110, 143, 443, 993, 995, 1080, 5432, 5900&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Heralding&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;3000&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Honeyaml&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;21, 22, 23, 25, 80, 110, 143, 389, 443, 445, 631, 1080, 1433, 1521, 3306, 3389, 5060, 5432, 5900, 6379, 6667, 8080, 9100, 9200, 11211&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: qHoneypots&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;53, 123, 161, 5060&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;udp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: qHoneypots&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;631&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: IPPHoney&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;80, 443, 8080, 9200, 25565&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Log4Pot&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;25&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Mailoney&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;2575&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Medpot&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;9100&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Miniprint&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;6379&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Redishoneypot&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;5060&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp/udp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: SentryPeer&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;80&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Snare (Tanner)&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;8090&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;tcp&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;incoming&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;Honeypot: Wordpot&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Ports and availability of SaaS services may vary based on your geographical location.&lt;/p&gt; 
&lt;p&gt;For some honeypots to reach full functionality (i.e. Cowrie or Log4Pot) outgoing connections are necessary as well, in order for them to download the attacker&#39;s malware. Please see the individual honeypot&#39;s documentation to learn more by following the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#technical-concept&quot;&gt;links&lt;/a&gt; to their repositories.&lt;/p&gt; 
&lt;h2&gt;LLM-Based Honeypots&lt;/h2&gt; 
&lt;p&gt;We think LLM-Based Honeypots mark the &lt;strong&gt;beginning&lt;/strong&gt; of a game change for the deception / honeypot field. Consequently, starting with the release of &lt;strong&gt;T-Pot 24.04.1&lt;/strong&gt;, two LLM-based honeypots, &lt;strong&gt;Beelzebub&lt;/strong&gt; and &lt;strong&gt;Galah&lt;/strong&gt;, have been introduced. These honeypots require an installation of &lt;strong&gt;Ollama&lt;/strong&gt;, which needs to be configured in the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#t-pot-config-file&quot;&gt;T-Pot configuration file&lt;/a&gt;. You can also adjust the settings in this file for &lt;strong&gt;ChatGPT&lt;/strong&gt; support, but note that changes will also be required in the docker compose file (&lt;code&gt;~/tpotce/compose/llm.yml&lt;/code&gt;) to accommodate these adjustments.&lt;br /&gt;&lt;br /&gt; Follow the links in the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#honeypots-and-tools&quot;&gt;Honeypots and Tools&lt;/a&gt; section to find out more about &lt;strong&gt;Beelzebub&lt;/strong&gt; and &lt;strong&gt;Galah&lt;/strong&gt;.&lt;/p&gt; 
&lt;h3&gt;Ollama&lt;/h3&gt; 
&lt;p&gt;🚨 &lt;strong&gt;CPU-based usage is not recommended&lt;/strong&gt;, not even for testing.&lt;br /&gt;&lt;br /&gt; To set up and run &lt;strong&gt;Ollama&lt;/strong&gt;, refer to the &lt;a href=&quot;https://github.com/ollama/ollama&quot;&gt;Ollama GitHub repository&lt;/a&gt; for instructions. For entry-level or testing purposes, results can be achieved using a &lt;strong&gt;Nvidia RTX 4060 Ti 16GB&lt;/strong&gt; or equivalent (AMD&#39;s ROCm is also supported by Ollama), with models like &lt;strong&gt;openchat&lt;/strong&gt; and &lt;strong&gt;Llama3&lt;/strong&gt;. As a general rule with LLM-based systems, the better and more hardware you use, the faster and more accurate the results will be, especially when tasks are offloaded to multiple GPUs and larger models.&lt;/p&gt; 
&lt;h3&gt;ChatGPT&lt;/h3&gt; 
&lt;p&gt;ChatGPT support for these honeypots will remain untested in relation to T-Pot. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;System Placement&lt;/h1&gt; 
&lt;p&gt;It is recommended to get yourself familiar with how T-Pot and the honeypots work before you start exposing towards the internet. For a quickstart run a T-Pot installation in a virtual machine. &lt;br /&gt;&lt;br /&gt; Once you are familiar with how things work you should choose a network you suspect intruders in or from (i.e. the internet). Otherwise T-Pot will most likely not capture any attacks (unless you want to prove a point)! For starters it is recommended to put T-Pot in an unfiltered zone, where all TCP and UDP traffic is forwarded to T-Pot&#39;s network interface. To avoid probing for T-Pot&#39;s management ports you should put T-Pot behind a firewall and forward all TCP / UDP traffic in the port range of 1-64000 to T-Pot while allowing access to ports &amp;gt; 64000 only from trusted IPs and / or only expose the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#required-ports&quot;&gt;ports&lt;/a&gt; relevant to your use-case. If you wish to catch malware traffic on unknown ports you should not limit the ports you forward since glutton and honeytrap dynamically bind any TCP port that is not occupied by other honeypot daemons and thus give you a better representation of the risks your setup is exposed to. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;Installation&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;Download&lt;/a&gt; one of the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;supported Linux distro images&lt;/a&gt;, follow the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#tldr&quot;&gt;TL;DR&lt;/a&gt; instructions or &lt;code&gt;git clone&lt;/code&gt; the T-Pot repository and run the installer &lt;code&gt;~/tpotce/install.sh&lt;/code&gt;. Running T-Pot on top of a running and supported Linux system is possible, but a clean installation is recommended to avoid port conflicts with running services. The T-Pot installer will require direct access to the internet as described &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#required-ports&quot;&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Choose your distro&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Steps to Follow:&lt;/strong&gt;&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Download a supported Linux distribution from the list below. (NOTE: Red Hat Enterprise Linux &amp;gt;= 8 is supported, but omitted from the list below due to its subscription-based nature. See &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#red-hat-enterprise-linux&quot;&gt;Red Hat Enterprise Linux&lt;/a&gt; for details).&lt;/li&gt; 
 &lt;li&gt;During installation choose a &lt;strong&gt;minimum&lt;/strong&gt;, &lt;strong&gt;netinstall&lt;/strong&gt; or &lt;strong&gt;server&lt;/strong&gt; version that will only install essential packages.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Never&lt;/strong&gt; install a graphical desktop environment such as Gnome or KDE. T-Pot will fail to work with it due to port conflicts.&lt;/li&gt; 
 &lt;li&gt;Make sure to install SSH, so you can connect to the machine remotely.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Distribution Name&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;x64&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;arm64&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://almalinux.org&quot;&gt;Alma Linux OS 9.x Minimal ISO&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://repo.almalinux.org/almalinux/9.7/isos/x86_64/AlmaLinux-9.7-x86_64-minimal.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://repo.almalinux.org/almalinux/9.7/isos/aarch64/AlmaLinux-9.7-aarch64-minimal.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.debian.org/CD/netinst/index.en.html&quot;&gt;Debian 13 Network Install&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-13.3.0-amd64-netinst.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://cdimage.debian.org/debian-cd/current/arm64/iso-cd/debian-13.3.0-arm64-netinst.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://fedoraproject.org/server/download&quot;&gt;Fedora Server 42 Network Install&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://download.fedoraproject.org/pub/fedora/linux/releases/42/Server/x86_64/iso/Fedora-Server-netinst-x86_64-42-1.1.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://download.fedoraproject.org/pub/fedora/linux/releases/42/Server/aarch64/iso/Fedora-Server-netinst-aarch64-42-1.1.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://get.opensuse.org/tumbleweed/#download&quot;&gt;OpenSuse Tumbleweed Network Image&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://download.opensuse.org/tumbleweed/iso/openSUSE-Tumbleweed-NET-x86_64-Current.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://download.opensuse.org/ports/aarch64/tumbleweed/iso/openSUSE-Tumbleweed-NET-aarch64-Current.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://rockylinux.org/download&quot;&gt;Rocky Linux OS 9.x Minimal ISO&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.7-x86_64-minimal.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://download.rockylinux.org/pub/rocky/9/isos/aarch64/Rocky-9.7-aarch64-minimal.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://ubuntu.com/download/server&quot;&gt;Ubuntu 24.04.x Live Server&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://releases.ubuntu.com/24.04/ubuntu-24.04.3-live-server-amd64.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://cdimage.ubuntu.com/releases/24.04/release/ubuntu-24.04.3-live-server-arm64.iso&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;br /&gt; 
&lt;h2&gt;Raspberry Pi 4 (8GB) Support&lt;/h2&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;Distribution Name&lt;/th&gt; 
   &lt;th style=&quot;text-align:left&quot;&gt;arm64&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://www.raspberrypi.com&quot;&gt;Raspberry Pi OS (&lt;strong&gt;64Bit, Lite&lt;/strong&gt;)&lt;/a&gt;&lt;/td&gt; 
   &lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://downloads.raspberrypi.com/raspios_lite_arm64/images/raspios_lite_arm64-2024-03-15/2024-03-15-raspios-bookworm-arm64-lite.img.xz&quot;&gt;download&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Get and install T-Pot&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;Clone the GitHub repository: &lt;code&gt;$ git clone https://github.com/telekom-security/tpotce&lt;/code&gt; or follow the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#tldr&quot;&gt;TL;DR&lt;/a&gt; and skip this section.&lt;/li&gt; 
 &lt;li&gt;Change into the &lt;strong&gt;tpotce/&lt;/strong&gt; folder: &lt;code&gt;$ cd tpotce&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Run the installer as non-root: &lt;code&gt;$ ./install.sh&lt;/code&gt;: 
  &lt;ul&gt; 
   &lt;li&gt;⚠️ &lt;em&gt;&lt;strong&gt;Depending on your Linux distribution of choice the installer will:&lt;/strong&gt;&lt;/em&gt; 
    &lt;ul&gt; 
     &lt;li&gt;Change the SSH port to &lt;code&gt;tcp/64295&lt;/code&gt;&lt;/li&gt; 
     &lt;li&gt;Disable the DNS Stub Listener to avoid port conflicts with honeypots&lt;/li&gt; 
     &lt;li&gt;Set SELinux to Monitor Mode&lt;/li&gt; 
     &lt;li&gt;Set the firewall target for the public zone to ACCEPT&lt;/li&gt; 
     &lt;li&gt;Add Docker&#39;s repository and install Docker&lt;/li&gt; 
     &lt;li&gt;Install recommended packages&lt;/li&gt; 
     &lt;li&gt;Remove packages known to cause issues&lt;/li&gt; 
     &lt;li&gt;Add the current user to the docker group (allow docker interaction without &lt;code&gt;sudo&lt;/code&gt;)&lt;/li&gt; 
     &lt;li&gt;Add &lt;code&gt;dps&lt;/code&gt; and &lt;code&gt;dpsw&lt;/code&gt; aliases (&lt;code&gt;grc docker ps -a&lt;/code&gt;, &lt;code&gt;watch -c &quot;grc --colour=on docker ps -a&lt;/code&gt;)&lt;/li&gt; 
     &lt;li&gt;Add &lt;code&gt;la&lt;/code&gt;, &lt;code&gt;ll&lt;/code&gt; and &lt;code&gt;ls&lt;/code&gt; aliases (for &lt;code&gt;exa&lt;/code&gt;, a improved &lt;code&gt;ls&lt;/code&gt; command)&lt;/li&gt; 
     &lt;li&gt;Add &lt;code&gt;mi&lt;/code&gt; (for &lt;code&gt;micro&lt;/code&gt;, a great alternative to &lt;code&gt;vi&lt;/code&gt; and / or &lt;code&gt;nano&lt;/code&gt;)&lt;/li&gt; 
     &lt;li&gt;Display open ports on the host (compare with T-Pot &lt;a href=&quot;https://github.com/telekom-security/tpotce#required-ports&quot;&gt;required&lt;/a&gt; ports)&lt;/li&gt; 
     &lt;li&gt;Add and enable &lt;code&gt;tpot.service&lt;/code&gt; to &lt;code&gt;/etc/systemd/system&lt;/code&gt; so T-Pot can automatically start and stop&lt;/li&gt; 
    &lt;/ul&gt; &lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;Follow the installer instructions, you will have to enter your user (&lt;code&gt;sudo&lt;/code&gt; or &lt;code&gt;root&lt;/code&gt;) password at least once&lt;/li&gt; 
 &lt;li&gt;Check the installer messages for errors and open ports that might cause port conflicts&lt;/li&gt; 
 &lt;li&gt;Reboot: &lt;code&gt;$ sudo reboot&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;macOS &amp;amp; Windows&lt;/h2&gt; 
&lt;p&gt;Sometimes it is just nice if you can spin up a T-Pot instance on macOS or Windows, i.e. for development, testing or just the fun of it. As Docker Desktop is rather limited not all honeypot types or T-Pot features are supported. Also remember, by default the macOS and Windows firewall are blocking access from remote, so testing is limited to the host. For production it is recommended to run T-Pot on &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;Linux&lt;/a&gt;.&lt;br /&gt; To get things up and running just follow these steps:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Install Docker Desktop for &lt;a href=&quot;https://docs.docker.com/desktop/install/mac-install/&quot;&gt;macOS&lt;/a&gt; or &lt;a href=&quot;https://docs.docker.com/desktop/install/windows-install/&quot;&gt;Windows&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Clone the GitHub repository: &lt;code&gt;git clone https://github.com/telekom-security/tpotce&lt;/code&gt; (in Windows make sure the code is checked out with &lt;code&gt;LF&lt;/code&gt; instead of &lt;code&gt;CRLF&lt;/code&gt;!)&lt;/li&gt; 
 &lt;li&gt;Go to: &lt;code&gt;cd ~/tpotce&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Copy &lt;code&gt;cp compose/mac_win.yml ./docker-compose.yml&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Create a &lt;code&gt;WEB_USER&lt;/code&gt; by running &lt;code&gt;~/tpotce/genuser.sh&lt;/code&gt; (macOS) or &lt;code&gt;~/tpotce/genuserwin.ps1&lt;/code&gt; (Windows)&lt;/li&gt; 
 &lt;li&gt;Adjust the &lt;code&gt;.env&lt;/code&gt; file by changing &lt;code&gt;TPOT_OSTYPE=linux&lt;/code&gt; to either &lt;code&gt;mac&lt;/code&gt; or &lt;code&gt;win&lt;/code&gt;:&lt;pre&gt;&lt;code&gt;# OSType (linux, mac, win)
#  Most docker features are available on linux
TPOT_OSTYPE=mac
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt;You have to ensure on your own there are no port conflicts keeping T-Pot from starting up.&lt;/li&gt; 
 &lt;li&gt;Start T-Pot: &lt;code&gt;docker compose up&lt;/code&gt; or &lt;code&gt;docker compose up -d&lt;/code&gt; if you want T-Pot to run in the background.&lt;/li&gt; 
 &lt;li&gt;Stop T-Pot: &lt;code&gt;CTRL-C&lt;/code&gt; (it if was running in the foreground) and / or &lt;code&gt;docker compose down -v&lt;/code&gt; to stop T-Pot entirely.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Red Hat Enterprise Linux&lt;/h2&gt; 
&lt;p&gt;Red Hat Enterprise Linux (RHEL) is a somewhat unique case in that:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Connections to Red Hat repositories depend on a Red Hat subscription. You will not be able to update the OS or install new packages if the targeted machine is not subscribed. &lt;strong&gt;If your server is not attached to a Red Hat subscription, installation will fail!&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;Ansible is installed from a RHEL-specific repository by the installer. Do not attempt to install it from the upstream repositories.&lt;/li&gt; 
 &lt;li&gt;Docker is installed from EPEL, which is installed by the installer script. Do not attempt to install it from the community installer script.&lt;/li&gt; 
 &lt;li&gt;T-Pot will only install successfully on RHEL &amp;gt;= 8. One of the convenience dependencies (&lt;code&gt;grc&lt;/code&gt;) depends on Python 2, which was removed after RHEL 7. It is omitted from the RHEL installation of T-Pot.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Installation Types&lt;/h2&gt; 
&lt;h3&gt;Standard / Hive&lt;/h3&gt; 
&lt;p&gt;With T-Pot Standard / Hive all services, tools, honeypots, etc. will be installed on to a single host which also serves as a Hive endpoint. Make sure to meet the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#system-requirements&quot;&gt;system requirements&lt;/a&gt;. You can adjust &lt;code&gt;~/tpotce/docker-compose.yml&lt;/code&gt; to your personal use-case or create your very own configuration using &lt;code&gt;~/tpotce/compose/customizer.py&lt;/code&gt; for a tailored T-Pot experience to your needs. Once the installation is finished you can proceed to &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#first-start&quot;&gt;First Start&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h3&gt;Distributed&lt;/h3&gt; 
&lt;p&gt;The distributed version of T-Pot requires at least two hosts&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;the T-Pot &lt;strong&gt;Hive&lt;/strong&gt;, the standard installation of T-Pot (install this first!),&lt;/li&gt; 
 &lt;li&gt;and a T-Pot &lt;strong&gt;Sensor&lt;/strong&gt;, which will host only the honeypots, some tools and transmit log data to the &lt;strong&gt;Hive&lt;/strong&gt;.&lt;/li&gt; 
 &lt;li&gt;The &lt;strong&gt;Sensor&lt;/strong&gt; will not start before finalizing the &lt;strong&gt;Sensor&lt;/strong&gt; installation as described in &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#distributed-deployment&quot;&gt;Distributed Deployment&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Uninstall T-Pot&lt;/h2&gt; 
&lt;p&gt;Uninstallation of T-Pot is only available on the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;supported Linux distros&lt;/a&gt;.&lt;br /&gt; To uninstall T-Pot run &lt;code&gt;~/tpotce/uninstall.sh&lt;/code&gt; and follow the uninstaller instructions, you will have to enter your password at least once.&lt;br /&gt; Once the uninstall is finished reboot the machine &lt;code&gt;sudo reboot&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;First Start&lt;/h1&gt; 
&lt;p&gt;Once the T-Pot Installer successfully finishes, the system needs to be rebooted (&lt;code&gt;sudo reboot&lt;/code&gt;). Once rebooted you can log into the system using the user you setup during the installation of the system. Logins are according to the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#user-types&quot;&gt;User Types&lt;/a&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;user: &lt;strong&gt;[&lt;code&gt;&amp;lt;OS_USERNAME&amp;gt;&lt;/code&gt;]&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;pass: &lt;strong&gt;[password]&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can login via SSH to access the command line: &lt;code&gt;ssh -l &amp;lt;OS_USERNAME&amp;gt; -p 64295 &amp;lt;your.ip&amp;gt;&lt;/code&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;user: &lt;strong&gt;[&lt;code&gt;&amp;lt;OS_USERNAME&amp;gt;&lt;/code&gt;]&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;pass: &lt;strong&gt;[password, ssh key recommended]&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can also login from your browser and access the T-Pot WebUI and tools: &lt;code&gt;https://&amp;lt;your.ip&amp;gt;:64297&lt;/code&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;user: &lt;strong&gt;[&lt;code&gt;&amp;lt;WEB_USER&amp;gt;&lt;/code&gt;]&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;pass: &lt;strong&gt;[password]&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Standalone First Start&lt;/h2&gt; 
&lt;p&gt;There is not much to do except to login and check via &lt;code&gt;dps&lt;/code&gt; if all services and honeypots are starting up correctly and login to Kibana and / or Geoip Attack Map to monitor the attacks. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Distributed Deployment&lt;/h2&gt; 
&lt;h3&gt;Planning and Certificates&lt;/h3&gt; 
&lt;p&gt;The distributed deployment involves planning as &lt;strong&gt;T-Pot Init&lt;/strong&gt; will only create a self-signed certificate for the IP of the &lt;strong&gt;Hive&lt;/strong&gt; host which usually is suitable for simple setups. Since &lt;strong&gt;logstash&lt;/strong&gt; will check for a valid certificate upon connection, a distributed setup involving &lt;strong&gt;Hive&lt;/strong&gt; to be reachable on multiple IPs (i.e. RFC 1918 and public NAT IP) and maybe even a domain name will result in a connection error where the certificate cannot be validated as such a setup needs a certificate with a common name and SANs (Subject Alternative Name).&lt;br /&gt; Before deploying any sensors make sure you have planned out domain names and IPs properly to avoid issues with the certificate. For more details see &lt;a href=&quot;https://github.com/telekom-security/tpotce/issues/1543&quot;&gt;issue #1543&lt;/a&gt;.&lt;br /&gt; Adjust the example to your IP / domain setup and follow the commands to change the certificate of &lt;strong&gt;Hive&lt;/strong&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo systemctl stop tpot

sudo openssl req \
    -nodes \
    -x509 \
    -sha512 \
    -newkey rsa:8192 \
    -keyout &quot;$HOME/tpotce/data/nginx/cert/nginx.key&quot; \
    -out &quot;$HOME/tpotce/data/nginx/cert/nginx.crt&quot; \
    -days 3650 \
    -subj &#39;/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd&#39; \
    -addext &quot;subjectAltName = IP:192.168.1.200, IP:1.2.3.4, DNS:my.primary.domain, DNS:my.secondary.domain&quot;
    
sudo chmod 774 $HOME/tpotce/data/nginx/cert/*
sudo chown tpot:tpot $HOME/tpotce/data/nginx/cert/*

sudo systemctl start tpot
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The T-Pot configuration file (&lt;code&gt;.env&lt;/code&gt;) does allow to disable the SSL verification for logstash connections from &lt;strong&gt;Sensor&lt;/strong&gt; to the &lt;strong&gt;Hive&lt;/strong&gt; by setting &lt;code&gt;LS_SSL_VERIFICATION=none&lt;/code&gt;. For security reasons this is only recommended for lab or test environments.&lt;br /&gt;&lt;br /&gt; If you choose to use a valid certificate for the &lt;strong&gt;Hive&lt;/strong&gt; signed by a CA (i.e. Let&#39;s Encrypt), logstash, and therefore the &lt;strong&gt;Sensor&lt;/strong&gt;, should have no problems to connect and transmit its logs to the &lt;strong&gt;Hive&lt;/strong&gt;.&lt;/p&gt; 
&lt;h3&gt;Deploying Sensors&lt;/h3&gt; 
&lt;p&gt;Once you have rebooted the &lt;strong&gt;Sensor&lt;/strong&gt; as instructed by the installer you can continue with the distributed deployment by logging into &lt;strong&gt;Hive&lt;/strong&gt; and go to &lt;code&gt;cd ~/tpotce&lt;/code&gt; folder. Make sure you understood the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#planning-and-certificates&quot;&gt;Planning and Certificates&lt;/a&gt; before continuing with the actual deployment.&lt;/p&gt; 
&lt;p&gt;If you have not done already generate a SSH key to securely login to the &lt;strong&gt;Sensor&lt;/strong&gt; and to allow &lt;code&gt;Ansible&lt;/code&gt; to run a playbook on the sensor:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Run &lt;code&gt;ssh-keygen&lt;/code&gt;, follow the instructions and leave the passphrase empty:&lt;pre&gt;&lt;code&gt;Generating public/private rsa key pair.
Enter file in which to save the key (/home/&amp;lt;your_user&amp;gt;/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/&amp;lt;your_user&amp;gt;/.ssh/id_rsa
Your public key has been saved in /home/&amp;lt;your_user&amp;gt;/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt;Deploy the key to the Sensor by running &lt;code&gt;ssh-copy-id -p 64295 &amp;lt;Sensor_SSH_USER&amp;gt;@&amp;lt;Sensor_IP&amp;gt;)&lt;/code&gt;:&lt;pre&gt;&lt;code&gt;/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &quot;/home/&amp;lt;your_user&amp;gt;/.ssh/id_rsa.pub&quot;
The authenticity of host &#39;[&amp;lt;Sensor_IP&amp;gt;]:64295 ([&amp;lt;Sensor_IP&amp;gt;]:64295)&#39; can&#39;t be stablished.
ED25519 key fingerprint is SHA256:naIDxFiw/skPJadTcgmWZQtgt+CdfRbUCoZn5RmkOnQ.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
&amp;lt;your_user&amp;gt;@172.20.254.124&#39;s password:

Number of key(s) added: 1

Now try logging into the machine, with:   &quot;ssh -p &#39;64295&#39; &#39;&amp;lt;your_user&amp;gt;@&amp;lt;Sensor_IP&amp;gt;&#39;&quot;
and check to make sure that only the key(s) you wanted were added.
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt;As suggested follow the instructions to test the connection &lt;code&gt;ssh -p &#39;64295&#39; &#39;&amp;lt;your_user&amp;gt;@&amp;lt;Sensor_IP&amp;gt;&#39;&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Once the key is successfully deployed run &lt;code&gt;./deploy.sh&lt;/code&gt; and follow the instructions. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Removing Sensors&lt;/h3&gt; 
&lt;p&gt;Identify the &lt;code&gt;TPOT_HIVE_USER&lt;/code&gt; ENV on the Sensor in the &lt;code&gt;$HOME/tpotce/.env&lt;/code&gt; config (it is a base64 encoded string). Now identify the same string in the &lt;code&gt;LS_WEB_USER&lt;/code&gt; ENV on the Hive in the &lt;code&gt;$HOME/tpotce/.env&lt;/code&gt; config. Remove the string and restart T-Pot.&lt;br /&gt; Now you can safely delete the Sensor machine.&lt;/p&gt; 
&lt;h2&gt;Community Data Submission&lt;/h2&gt; 
&lt;p&gt;T-Pot is provided in order to make it accessible to everyone interested in honeypots. By default, the captured data is submitted to a community backend. This community backend uses the data to feed &lt;a href=&quot;https://sicherheitstacho.eu&quot;&gt;Sicherheitstacho&lt;/a&gt;. You may opt out of the submission by removing the &lt;code&gt;# Ewsposter service&lt;/code&gt; from &lt;code&gt;~/tpotce/docker-compose.yml&lt;/code&gt; by following these steps:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Stop T-Pot services: &lt;code&gt;systemctl stop tpot&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Open &lt;code&gt;~/tpotce/docker-compose.yml&lt;/code&gt;: &lt;code&gt;micro ~/tpotce/docker-compose.yml&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Remove the following lines, save and exit micro (&lt;code&gt;CTRL+Q&lt;/code&gt;):&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;# Ewsposter service
  ewsposter:
    container_name: ewsposter
    restart: always
    depends_on:
      tpotinit:
        condition: service_healthy
    networks:
     - ewsposter_local
    environment:
     - EWS_HPFEEDS_ENABLE=false
     - EWS_HPFEEDS_HOST=host
     - EWS_HPFEEDS_PORT=port
     - EWS_HPFEEDS_CHANNELS=channels
     - EWS_HPFEEDS_IDENT=user
     - EWS_HPFEEDS_SECRET=secret
     - EWS_HPFEEDS_TLSCERT=false
     - EWS_HPFEEDS_FORMAT=json
    image: ${TPOT_REPO}/ewsposter:${TPOT_VERSION}
    pull_policy: ${TPOT_PULL_POLICY}
    volumes:
     - ${TPOT_DATA_PATH}:/data
     - ${TPOT_DATA_PATH}/ews/conf/ews.ip:/opt/ewsposter/ews.ip
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;4&quot;&gt; 
 &lt;li&gt;Start T-Pot services: &lt;code&gt;systemctl start tpot&lt;/code&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;It is encouraged not to disable the data submission as it is the main purpose of the community approach - as you all know &lt;strong&gt;sharing is caring&lt;/strong&gt; 😍 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Opt-In HPFEEDS Data Submission&lt;/h2&gt; 
&lt;p&gt;As an Opt-In it is possible to share T-Pot data with 3rd party HPFEEDS brokers.&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Follow the instructions &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#community-data-submission&quot;&gt;here&lt;/a&gt; to stop the T-Pot services and open &lt;code&gt;~/tpotce/docker-compose.yml&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Scroll down to the &lt;code&gt;ewsposter&lt;/code&gt; section and adjust the HPFEEDS settings to your needs.&lt;/li&gt; 
 &lt;li&gt;If you need to add a CA certificate add it to &lt;code&gt;~/tpotce/data/ews/conf&lt;/code&gt; and set &lt;code&gt;EWS_HPFEEDS_TLSCERT=/data/ews/conf/&amp;lt;your_ca.crt&amp;gt;&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Start T-Pot services: &lt;code&gt;systemctl start tpot&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h1&gt;Remote Access and Tools&lt;/h1&gt; 
&lt;p&gt;Remote access to your host / T-Pot is possible with SSH (on &lt;strong&gt;&lt;code&gt;tcp/64295&lt;/code&gt;&lt;/strong&gt;) and some services and tools come with T-Pot to make some of your research tasks a lot easier. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;SSH&lt;/h2&gt; 
&lt;p&gt;According to the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#user-types&quot;&gt;User Types&lt;/a&gt; you can login via SSH to access the command line: &lt;code&gt;ssh -l &amp;lt;OS_USERNAME&amp;gt; -p 64295 &amp;lt;your.ip&amp;gt;&lt;/code&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;user: &lt;strong&gt;[&lt;code&gt;&amp;lt;OS_USERNAME&amp;gt;&lt;/code&gt;]&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;pass: &lt;strong&gt;[password]&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;T-Pot Landing Page&lt;/h2&gt; 
&lt;p&gt;According to the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#user-types&quot;&gt;User Types&lt;/a&gt; you can open the T-Pot Landing Page from your browser via &lt;code&gt;https://&amp;lt;your.ip&amp;gt;:64297&lt;/code&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;user: &lt;strong&gt;[&lt;code&gt;&amp;lt;WEB_USER&amp;gt;&lt;/code&gt;]&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;pass: &lt;strong&gt;[password]&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/doc/tpotwebui.png&quot; alt=&quot;T-Pot-WebUI&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Kibana Dashboard&lt;/h2&gt; 
&lt;p&gt;On the T-Pot Landing Page just click on &lt;code&gt;Kibana&lt;/code&gt; and you will be forwarded to Kibana. You can select from a large variety of dashboards and visualizations all tailored to the T-Pot supported honeypots.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/doc/kibana_a.png&quot; alt=&quot;Dashbaord&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Attack Map&lt;/h2&gt; 
&lt;p&gt;On the T-Pot Landing Page just click on &lt;code&gt;Attack Map&lt;/code&gt; and you will be forwarded to the Attack Map. Since the Attack Map utilizes web sockets you may need to re-enter the &lt;code&gt;&amp;lt;WEB_USER&amp;gt;&lt;/code&gt; credentials.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/doc/attackmap.png&quot; alt=&quot;AttackMap&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Cyberchef&lt;/h2&gt; 
&lt;p&gt;On the T-Pot Landing Page just click on &lt;code&gt;Cyberchef&lt;/code&gt; and you will be forwarded to Cyberchef.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/doc/cyberchef.png&quot; alt=&quot;Cyberchef&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Elasticvue&lt;/h2&gt; 
&lt;p&gt;On the T-Pot Landing Page just click on &lt;code&gt;Elasticvue&lt;/code&gt; and you will be forwarded to Elasticvue.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/doc/elasticvue.png&quot; alt=&quot;Elasticvue&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Spiderfoot&lt;/h2&gt; 
&lt;p&gt;On the T-Pot Landing Page just click on &lt;code&gt;Spiderfoot&lt;/code&gt; and you will be forwarded to Spiderfoot.&lt;/p&gt; 
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/doc/spiderfoot.png&quot; alt=&quot;Spiderfoot&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;Configuration&lt;/h1&gt; 
&lt;h2&gt;T-Pot Config File&lt;/h2&gt; 
&lt;p&gt;T-Pot offers a configuration file providing variables not only for the docker services (i.e. honeypots and tools) but also for the docker compose environment. The configuration file is hidden in &lt;code&gt;~/tpoce/.env&lt;/code&gt;. There is also an example file (&lt;code&gt;env.example&lt;/code&gt;) which holds the default configuration.&lt;br /&gt; Before the first start run &lt;code&gt;~/tpotce/genuser.sh&lt;/code&gt; or setup the &lt;code&gt;WEB_USER&lt;/code&gt; manually as described &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#add-users-to-nginx-t-pot-webui&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Customize T-Pot Honeypots and Services&lt;/h2&gt; 
&lt;p&gt;In &lt;code&gt;~/tpotce/compose&lt;/code&gt; you will find everything you need to adjust the T-Pot Standard / Hive installation:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;customizer.py
llm.yml
mac_win.yml
mini.yml
mobile.yml
sensor.yml
standard.yml
tarpit.yml
tpot_services.yml
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The &lt;code&gt;.yml&lt;/code&gt; files are docker compose files, each representing a different set of honeypots and tools with &lt;code&gt;tpot_services.yml&lt;/code&gt; being a template for &lt;code&gt;customizer.py&lt;/code&gt; to create a customized docker compose file.&lt;br /&gt;&lt;br /&gt; To activate a compose file follow these steps:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Stop T-Pot with &lt;code&gt;systemctl stop tpot&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Copy the docker compose file &lt;code&gt;cp ~/tpotce/compose/&amp;lt;dockercompose.yml&amp;gt; ~/tpotce/docker-compose.yml&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Start T-Pot with &lt;code&gt;systemctl start tpot&lt;/code&gt;.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;To create your customized docker compose file:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Go to &lt;code&gt;cd ~/tpotce/compose&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Run &lt;code&gt;python3 customizer.py&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;The script will guide you through the process of creating your own &lt;code&gt;docker-compose.yml&lt;/code&gt;. As some honeypots and services occupy the same ports it will check if any port conflicts are present and notify regarding the conflicting services. You then can resolve them manually by adjusting &lt;code&gt;docker-compose-custom.yml&lt;/code&gt; or re-run the script.&lt;/li&gt; 
 &lt;li&gt;Stop T-Pot with &lt;code&gt;systemctl stop tpot&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Copy the custom docker compose file: &lt;code&gt;cp docker-compose-custom.yml ~/tpotce&lt;/code&gt; and &lt;code&gt;cd ~/tpotce&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Check if everything works by running &lt;code&gt;docker-compose -f docker-compose-custom.yml up&lt;/code&gt;. In case of errors follow the &lt;a href=&quot;https://docs.docker.com/compose/compose-file/&quot;&gt;Docker Compose Specification&lt;/a&gt; for mitigation. Most likely it is just a port conflict you can adjust by editing the docker compose file.&lt;/li&gt; 
 &lt;li&gt;If everything works just fine press &lt;code&gt;CTRL-C&lt;/code&gt; to stop the containers and run &lt;code&gt;docker-compose -f docker-compose-custom.yml down -v&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Replace docker compose file with the new and successfully tested customized docker compose file &lt;code&gt;mv ~/tpotce/docker-compose-custom.yml ~/tpotce/docker-compose.yml&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Start T-Pot with &lt;code&gt;systemctl start tpot&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h1&gt;Maintenance&lt;/h1&gt; 
&lt;p&gt;T-Pot is designed to be low maintenance. Since almost everything is provided through docker images there is basically nothing you have to do but let it run. We will upgrade the docker images regularly to reduce the risks of compromise; however you should read this section closely.&lt;br /&gt;&lt;br /&gt; Should an update fail, opening an issue or a discussion will help to improve things in the future, but the offered solution will &lt;em&gt;&lt;strong&gt;always&lt;/strong&gt;&lt;/em&gt; be to perform a &lt;em&gt;&lt;strong&gt;fresh install&lt;/strong&gt;&lt;/em&gt; as we simply &lt;em&gt;&lt;strong&gt;cannot&lt;/strong&gt;&lt;/em&gt; provide any support for lost data! &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;General Updates&lt;/h2&gt; 
&lt;p&gt;T-Pot security depends on the updates provided for the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#choose-your-distro&quot;&gt;supported Linux distro images&lt;/a&gt;. Make sure to review the OS documentation and ensure updates are installed regularly by the OS. By default (&lt;code&gt;~/tpotce/.env&lt;/code&gt;) &lt;code&gt;TPOT_PULL_POLICY=always&lt;/code&gt; will ensure that at every T-Pot start docker will check for new docker images and download them before creating the containers. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Update Script&lt;/h2&gt; 
&lt;p&gt;T-Pot releases are offered through GitHub and can be pulled using &lt;code&gt;~/tpotce/update.sh&lt;/code&gt;.&lt;br /&gt; &lt;em&gt;&lt;strong&gt;If you made any relevant changes to the T-Pot config files make sure to create a backup first!&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt; &lt;em&gt;&lt;strong&gt;Updates may have unforeseen consequences. Create a backup of the machine or the files most valuable to your work!&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;The update script will ...&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;em&gt;&lt;strong&gt;mercilessly&lt;/strong&gt;&lt;/em&gt; overwrite local changes to be in sync with the T-Pot master branch&lt;/li&gt; 
 &lt;li&gt;create a full backup of the &lt;code&gt;~/tpotce&lt;/code&gt; folder&lt;/li&gt; 
 &lt;li&gt;update all files in &lt;code&gt;~/tpotce&lt;/code&gt; to be in sync with the T-Pot master branch&lt;/li&gt; 
 &lt;li&gt;restore your custom &lt;code&gt;ews.cfg&lt;/code&gt; from &lt;code&gt;~/tpotce/data/ews/conf&lt;/code&gt; and the T-Pot configuration (&lt;code&gt;~/tpotce/.env&lt;/code&gt;).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Daily Reboot&lt;/h2&gt; 
&lt;p&gt;By default T-Pot will add a daily reboot including some cleaning up. You can adjust this line with &lt;code&gt;sudo crontab -e&lt;/code&gt;&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;#Ansible: T-Pot Daily Reboot
42 2 * * * bash -c &#39;systemctl stop tpot.service &amp;amp;&amp;amp; docker container prune -f; docker image prune -f; docker volume prune -f; /usr/sbin/shutdown -r +1 &quot;T-Pot Daily Reboot&quot;&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Known Issues&lt;/h2&gt; 
&lt;p&gt;The following issues are known, simply follow the described steps to solve them. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h3&gt;Docker Images Fail to Download&lt;/h3&gt; 
&lt;p&gt;Some time ago Docker introduced download &lt;a href=&quot;https://docs.docker.com/docker-hub/download-rate-limit/#:~:text=Docker%20Hub%20limits%20the%20number,pulls%20per%206%20hour%20period.&quot;&gt;rate limits&lt;/a&gt;. If you are frequently downloading Docker images via a single or shared IP, the IP address might have exhausted the Docker download rate limit. Login to your Docker account to extend the rate limit.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo su -
docker login
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;T-Pot Networking Fails&lt;/h3&gt; 
&lt;p&gt;T-Pot is designed to only run on machines with a single NIC. T-Pot will try to grab the interface with the default route, however it is not guaranteed that this will always succeed. At best use T-Pot on machines with only a single NIC.&lt;/p&gt; 
&lt;h2&gt;Start T-Pot&lt;/h2&gt; 
&lt;p&gt;The T-Pot service automatically starts and stops on each reboot (which occurs once on a daily basis as setup in &lt;code&gt;sudo crontab -l&lt;/code&gt; during installation). &lt;br /&gt; If you want to manually start the T-Pot service you can do so via &lt;code&gt;systemctl start tpot&lt;/code&gt; and observe via &lt;code&gt;dpsw&lt;/code&gt; the startup of the containers. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Stop T-Pot&lt;/h2&gt; 
&lt;p&gt;The T-Pot service automatically starts and stops on each reboot (which occurs once on a daily basis as setup in &lt;code&gt;sudo crontab -l&lt;/code&gt; during installation). &lt;br /&gt; If you want to manually stop the T-Pot service you can do so via &lt;code&gt;systemctl stop tpot&lt;/code&gt; and observe via &lt;code&gt;dpsw&lt;/code&gt; the shutdown of the containers. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;T-Pot Data Folder&lt;/h2&gt; 
&lt;p&gt;All persistent log files from the honeypots, tools and T-Pot related services are stored in &lt;code&gt;~/tpotce/data&lt;/code&gt;. This includes collected artifacts which are not transmitted to the Elastic Stack. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Log Persistence&lt;/h2&gt; 
&lt;p&gt;All log data is stored in the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#t-pot-data-folder&quot;&gt;T-Pot Data Folder&lt;/a&gt; and will be persisted for the number of cycles set for &lt;code&gt;TPOT_PERSISTENCE_CYCLES=&amp;lt;1-999&amp;gt;&lt;/code&gt; in the T-Pot configuration file &lt;code&gt;~/tpotce/.env&lt;/code&gt;. It defaults to 30. &lt;br /&gt; Elasticsearch indices are handled by the &lt;code&gt;tpot&lt;/code&gt; Index Lifecycle Policy which can be adjusted directly in Kibana (make sure to &quot;Include managed system policies&quot;). &lt;img src=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/doc/kibana_b.png&quot; alt=&quot;IndexManagement1&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;By default the &lt;code&gt;tpot&lt;/code&gt; Index Lifecycle Policy keeps the indices for 30 days. This offers a good balance between storage and speed. However you may adjust the policy to your needs. &lt;img src=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/doc/kibana_c.png&quot; alt=&quot;IndexManagement2&quot; /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Factory Reset&lt;/h2&gt; 
&lt;p&gt;All log data stored in the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#t-pot-data-folder&quot;&gt;T-Pot Data Folder&lt;/a&gt; (except for Elasticsearch indices, of course) can be erased by running &lt;code&gt;clean.sh&lt;/code&gt;. Sometimes things might break beyond repair and it has never been easier to reset a T-Pot to factory defaults (make sure to enter &lt;code&gt;cd ~/tpotce&lt;/code&gt;).&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Stop T-Pot using &lt;code&gt;systemctl stop tpot&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Move / Backup the &lt;code&gt;~/tpotce/data&lt;/code&gt; folder to a safe place (this is optional, just in case).&lt;/li&gt; 
 &lt;li&gt;Delete the &lt;code&gt;~/tpotce/data&lt;/code&gt; folder using &lt;code&gt;sudo rm -rf ~/tpotce/data&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Reset T-Pot to the last fetched commit:&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code&gt;cd ~/tpotce/
git reset --hard
&lt;/code&gt;&lt;/pre&gt; 
&lt;ol start=&quot;5&quot;&gt; 
 &lt;li&gt;Now you can run &lt;code&gt;~/tpotce/install.sh&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Show Containers&lt;/h2&gt; 
&lt;p&gt;You can show all T-Pot relevant containers by running &lt;code&gt;dps&lt;/code&gt; or &lt;code&gt;dpsw [interval]&lt;/code&gt;. The &lt;code&gt;interval (s)&lt;/code&gt; will re-run &lt;code&gt;dps&lt;/code&gt; periodically. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Blackhole&lt;/h2&gt; 
&lt;p&gt;Blackhole will run T-Pot in kind of a stealth mode manner without permanent visits of publicly known scanners and thus reducing the possibility of being exposed. While this is of course always a cat and mouse game the blackhole feature is null routing all requests from &lt;a href=&quot;https://raw.githubusercontent.com/stamparm/maltrail/master/trails/static/mass_scanner.txt&quot;&gt;known mass scanners&lt;/a&gt; while still catching the events through Suricata. &lt;br /&gt; The feature is activated by setting &lt;code&gt;TPOT_BLACKHOLE=DISABLED&lt;/code&gt; in &lt;code&gt;~/tpotce/.env&lt;/code&gt;, then run &lt;code&gt;systemctl stop tpot&lt;/code&gt; and &lt;code&gt;systemctl start tpot&lt;/code&gt; or &lt;code&gt;sudo reboot&lt;/code&gt;. &lt;br /&gt; Enabling this feature will drastically reduce attackers visibility and consequently result in less activity. However as already mentioned it is neither a guarantee for being completely stealth nor will it prevent fingerprinting of some honeypot services. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Add Users to Nginx (T-Pot WebUI)&lt;/h2&gt; 
&lt;p&gt;Nginx (T-Pot WebUI) allows you to add as many &lt;code&gt;&amp;lt;WEB_USER&amp;gt;&lt;/code&gt; accounts as you want (according to the &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#user-types&quot;&gt;User Types&lt;/a&gt;).&lt;br /&gt; To &lt;strong&gt;add&lt;/strong&gt; a new user run &lt;code&gt;~/tpotce/genuser.sh&lt;/code&gt;.&lt;br /&gt; To &lt;strong&gt;remove&lt;/strong&gt; users open &lt;code&gt;~/tpotce/.env&lt;/code&gt;, locate &lt;code&gt;WEB_USER&lt;/code&gt; and remove the corresponding base64 string (to decode: &lt;code&gt;echo &amp;lt;base64_string&amp;gt; | base64 -d&lt;/code&gt;, or open CyberChef and load &quot;From Base64&quot; recipe).&lt;br /&gt; For the changes to take effect you need to restart T-Pot using &lt;code&gt;systemctl stop tpot&lt;/code&gt; and &lt;code&gt;systemctl start tpot&lt;/code&gt; or &lt;code&gt;sudo reboot&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Import and Export Kibana Objects&lt;/h2&gt; 
&lt;p&gt;Some T-Pot updates will require you to update the Kibana objects. Either to support new honeypots or to improve existing dashboards or visualizations. Make sure to &lt;em&gt;&lt;strong&gt;export&lt;/strong&gt;&lt;/em&gt; first so you do not loose any of your adjustments.&lt;/p&gt; 
&lt;h3&gt;Export&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;Go to Kibana&lt;/li&gt; 
 &lt;li&gt;Click on &quot;Stack Management&quot;&lt;/li&gt; 
 &lt;li&gt;Click on &quot;Saved Objects&quot;&lt;/li&gt; 
 &lt;li&gt;Click on &quot;Export &amp;lt;no.&amp;gt; objects&quot;&lt;/li&gt; 
 &lt;li&gt;Click on &quot;Export all&quot; This will export a NDJSON file with all your objects. Always run a full export to make sure all references are included.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Import&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/dtag-dev-sec/tpotce/raw/master/docker/tpotinit/dist/etc/objects/kibana_export.ndjson.zip&quot;&gt;Download the NDJSON file&lt;/a&gt; and unzip it.&lt;/li&gt; 
 &lt;li&gt;Go to Kibana&lt;/li&gt; 
 &lt;li&gt;Click on &quot;Stack Management&quot;&lt;/li&gt; 
 &lt;li&gt;Click on &quot;Saved Objects&quot;&lt;/li&gt; 
 &lt;li&gt;Click on &quot;Import&quot; and leave the defaults (check for existing objects and automatically overwrite conflicts) if you did not make personal changes to the Kibana objects.&lt;/li&gt; 
 &lt;li&gt;Browse for NDJSON file When asked: &quot;If any of the objects already exist, do you want to automatically overwrite them?&quot; you answer with &quot;Yes, overwrite all&quot;. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h1&gt;Troubleshooting&lt;/h1&gt; 
&lt;p&gt;Generally T-Pot is offered &lt;em&gt;&lt;strong&gt;as is&lt;/strong&gt;&lt;/em&gt; without any commitment regarding support. Issues and discussions can be opened, but be prepared to include basic necessary info, so the community is able to help. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Logs&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;Check if your containers are running correctly: &lt;code&gt;dps&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Check if your system resources are not exhausted: &lt;code&gt;htop&lt;/code&gt;, &lt;code&gt;docker stats&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Check if there is a port conflict:&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code&gt;systemctl stop tpot
grc netstat -tulpen
mi ~/tpotce/docker-compose.yml
docker-compose -f ~/tpotce/docker-compose.yml up
CTRL+C
docker-compose -f ~/tpotce/docker-compose.yml down -v
&lt;/code&gt;&lt;/pre&gt; 
&lt;ul&gt; 
 &lt;li&gt;Check individual container logs: &lt;code&gt;docker logs -f &amp;lt;container_name&amp;gt;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Check &lt;code&gt;tpotinit&lt;/code&gt; log: &lt;code&gt;cat ~/tpotce/data/tpotinit.log&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;RAM and Storage&lt;/h2&gt; 
&lt;p&gt;The Elastic Stack is hungry for RAM, specifically &lt;code&gt;logstash&lt;/code&gt; and &lt;code&gt;elasticsearch&lt;/code&gt;. If the Elastic Stack is unavailable, does not receive any logs or simply keeps crashing it is most likely a RAM or storage issue.&lt;br /&gt; While T-Pot keeps trying to restart the services / containers run &lt;code&gt;docker logs -f &amp;lt;container_name&amp;gt;&lt;/code&gt; (either &lt;code&gt;logstash&lt;/code&gt; or &lt;code&gt;elasticsearch&lt;/code&gt;) and check if there are any warnings or failures involving RAM.&lt;/p&gt; 
&lt;p&gt;Storage failures can be identified easier via &lt;code&gt;htop&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;Contact&lt;/h1&gt; 
&lt;p&gt;T-Pot is provided &lt;em&gt;&lt;strong&gt;as is&lt;/strong&gt;&lt;/em&gt; open source &lt;em&gt;&lt;strong&gt;without&lt;/strong&gt;&lt;/em&gt; any commitment regarding support (&lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#disclaimer&quot;&gt;see the disclaimer&lt;/a&gt;).&lt;/p&gt; 
&lt;p&gt;If you are a security researcher and want to responsibly report an issue please get in touch with our &lt;a href=&quot;https://www.telekom.com/en/corporate-responsibility/data-protection-data-security/security/details/introducing-deutsche-telekom-cert-358316&quot;&gt;CERT&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Issues&lt;/h2&gt; 
&lt;p&gt;Please report issues (errors) on our &lt;a href=&quot;https://github.com/telekom-security/tpotce/issues&quot;&gt;GitHub Issues&lt;/a&gt;, but &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#troubleshooting&quot;&gt;troubleshoot&lt;/a&gt; first. Issues not providing information to address the error will be closed or converted into &lt;a href=&quot;https://raw.githubusercontent.com/telekom-security/tpotce/master/#discussions&quot;&gt;discussions&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Use the search function first, it is possible a similar issue has been addressed or discussed already, with the solution just a search away. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;Discussions&lt;/h2&gt; 
&lt;p&gt;General questions, ideas, show &amp;amp; tell, etc. can be addressed on our &lt;a href=&quot;https://github.com/telekom-security/tpotce/discussions&quot;&gt;GitHub Discussions&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Use the search function, it is possible a similar discussion has been opened already, with an answer just a search away. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;Licenses&lt;/h1&gt; 
&lt;p&gt;The software that T-Pot is built on uses the following licenses. &lt;br /&gt;GPLv2: &lt;a href=&quot;https://github.com/mushorg/conpot/raw/master/LICENSE.txt&quot;&gt;conpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/0x4D31/galah?tab=Apache-2.0-1-ov-file#readme&quot;&gt;galah&lt;/a&gt;, &lt;a href=&quot;https://github.com/DinoTools/dionaea/raw/master/LICENSE&quot;&gt;dionaea&lt;/a&gt;, &lt;a href=&quot;https://github.com/armedpot/honeytrap/raw/master/LICENSE&quot;&gt;honeytrap&lt;/a&gt;, &lt;a href=&quot;https://suricata.io/features/open-source/&quot;&gt;suricata&lt;/a&gt; &lt;br /&gt;GPLv3: &lt;a href=&quot;https://github.com/huuck/ADBHoney&quot;&gt;adbhoney&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/bontchev/elasticpot/-/blob/master/LICENSE&quot;&gt;elasticpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/telekom-security/ewsposter&quot;&gt;ewsposter&lt;/a&gt;, &lt;a href=&quot;https://github.com/thomaspatzke/Log4Pot/raw/master/LICENSE&quot;&gt;log4pot&lt;/a&gt;, &lt;a href=&quot;https://github.com/0x4D31/fatt/raw/master/LICENSE&quot;&gt;fatt&lt;/a&gt;, &lt;a href=&quot;https://github.com/johnnykv/heralding/raw/master/LICENSE.txt&quot;&gt;heralding&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/bontchev/ipphoney/-/blob/master/LICENSE&quot;&gt;ipphoney&lt;/a&gt;, &lt;a href=&quot;https://github.com/sa7mon/miniprint?tab=GPL-3.0-1-ov-file#readme&quot;&gt;miniprint&lt;/a&gt;, &lt;a href=&quot;https://github.com/cypwnpwnsocute/RedisHoneyPot/raw/main/LICENSE&quot;&gt;redishoneypot&lt;/a&gt;, &lt;a href=&quot;https://github.com/SentryPeer/SentryPeer/raw/main/LICENSE.GPL-3.0-only&quot;&gt;sentrypeer&lt;/a&gt;, &lt;a href=&quot;https://github.com/mushorg/snare/raw/master/LICENSE&quot;&gt;snare&lt;/a&gt;, &lt;a href=&quot;https://github.com/mushorg/snare/raw/master/LICENSE&quot;&gt;tanner&lt;/a&gt; &lt;br /&gt;Apache 2 License: &lt;a href=&quot;https://github.com/gchq/CyberChef/raw/master/LICENSE&quot;&gt;cyberchef&lt;/a&gt;, &lt;a href=&quot;https://github.com/nsmfoo/dicompot/raw/master/LICENSE&quot;&gt;dicompot&lt;/a&gt;, &lt;a href=&quot;https://github.com/elasticsearch/elasticsearch/raw/master/LICENSE.txt&quot;&gt;elasticsearch&lt;/a&gt;, &lt;a href=&quot;https://github.com/ryanolee/go-pot?tab=License-1-ov-file#readme&quot;&gt;go-pot&lt;/a&gt;, &lt;a href=&quot;https://github.com/pbssubhash/h0neytr4p?tab=Apache-2.0-1-ov-file#readme&quot;&gt;h0neytr4p&lt;/a&gt;, &lt;a href=&quot;https://github.com/elasticsearch/logstash/raw/master/LICENSE.txt&quot;&gt;logstash&lt;/a&gt;, &lt;a href=&quot;https://github.com/elasticsearch/kibana/raw/master/LICENSE.txt&quot;&gt;kibana&lt;/a&gt;, &lt;a href=&quot;https://github.com/docker/docker/raw/master/LICENSE&quot;&gt;docker&lt;/a&gt; &lt;br /&gt;MIT license: &lt;a href=&quot;https://github.com/willfarrell/docker-autoheal?tab=MIT-1-ov-file#readme&quot;&gt;autoheal&lt;/a&gt;, &lt;a href=&quot;https://github.com/mariocandela/beelzebub?tab=MIT-1-ov-file#readme&quot;&gt;beelzebub&lt;/a&gt;, &lt;a href=&quot;https://github.com/Cymmetria/ciscoasa_honeypot/raw/master/LICENSE&quot;&gt;ciscoasa&lt;/a&gt;, &lt;a href=&quot;https://github.com/aelth/ddospot/raw/master/LICENSE&quot;&gt;ddospot&lt;/a&gt;, &lt;a href=&quot;https://github.com/cars10/elasticvue/raw/master/LICENSE&quot;&gt;elasticvue&lt;/a&gt;, &lt;a href=&quot;https://github.com/mushorg/glutton/raw/master/LICENSE&quot;&gt;glutton&lt;/a&gt;, &lt;a href=&quot;https://github.com/yunginnanet/HellPot/raw/master/LICENSE&quot;&gt;hellpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/mmta/honeyaml?tab=MIT-1-ov-file#readme&quot;&gt;honeyaml&lt;/a&gt;, &lt;a href=&quot;https://github.com/stamparm/maltrail/raw/master/LICENSE&quot;&gt;maltrail&lt;/a&gt; &lt;br /&gt;Unlicense: &lt;a href=&quot;https://github.com/skeeto/endlessh/raw/master/UNLICENSE&quot;&gt;endlessh&lt;/a&gt; &lt;br /&gt;Other: &lt;a href=&quot;https://github.com/MalwareTech/CitrixHoneypot#licencing-agreement-malwaretech-public-licence&quot;&gt;citrixhoneypot&lt;/a&gt;, &lt;a href=&quot;https://github.com/cowrie/cowrie/raw/master/LICENSE.rst&quot;&gt;cowrie&lt;/a&gt;, &lt;a href=&quot;https://github.com/awhitehatter/mailoney&quot;&gt;mailoney&lt;/a&gt;, &lt;a href=&quot;https://www.elastic.co/licensing/elastic-license&quot;&gt;Elastic License&lt;/a&gt;, &lt;a href=&quot;https://github.com/gbrindisi/wordpot&quot;&gt;Wordpot&lt;/a&gt; &lt;br /&gt;AGPL-3.0: &lt;a href=&quot;https://github.com/qeeqbox/honeypots/raw/main/LICENSE&quot;&gt;honeypots&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;https://creativecommons.org/publicdomain/zero/1.0/&quot;&gt;Public Domain (CC)&lt;/a&gt;: &lt;a href=&quot;https://dataverse.harvard.edu/dataverse/harvard/?q=dicom&quot;&gt;Harvard Dataverse&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;Credits&lt;/h1&gt; 
&lt;p&gt;Without open source and the development community we are proud to be a part of, T-Pot would not have been possible! Our thanks are extended but not limited to the following people and organizations: &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h2&gt;The developers and development communities of&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/huuck/ADBHoney/graphs/contributors&quot;&gt;adbhoney&lt;/a&gt;, &lt;a href=&quot;https://github.com/mariocandela/beelzebub/graphs/contributors&quot;&gt;beelzebub&lt;/a&gt;, &lt;a href=&quot;https://github.com/Cymmetria/ciscoasa_honeypot/graphs/contributors&quot;&gt;ciscoasa&lt;/a&gt;, &lt;a href=&quot;https://github.com/MalwareTech/CitrixHoneypot/graphs/contributors&quot;&gt;citrixhoneypot&lt;/a&gt;, &lt;a href=&quot;https://github.com/mushorg/conpot/graphs/contributors&quot;&gt;conpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/cowrie/cowrie/graphs/contributors&quot;&gt;cowrie&lt;/a&gt;, &lt;a href=&quot;https://github.com/aelth/ddospot/graphs/contributors&quot;&gt;ddospot&lt;/a&gt;, &lt;a href=&quot;https://github.com/nsmfoo/dicompot/graphs/contributors&quot;&gt;dicompot&lt;/a&gt;, &lt;a href=&quot;https://github.com/DinoTools/dionaea/graphs/contributors&quot;&gt;dionaea&lt;/a&gt;, &lt;a href=&quot;https://github.com/docker/docker/graphs/contributors&quot;&gt;docker&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/bontchev/elasticpot/-/project_members&quot;&gt;elasticpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/elastic/elasticsearch/graphs/contributors&quot;&gt;elasticsearch&lt;/a&gt;, &lt;a href=&quot;https://github.com/cars10/elasticvue/graphs/contributors&quot;&gt;elasticvue&lt;/a&gt;, &lt;a href=&quot;https://github.com/skeeto/endlessh/graphs/contributors&quot;&gt;endlessh&lt;/a&gt;, &lt;a href=&quot;https://github.com/armedpot/ewsposter/graphs/contributors&quot;&gt;ewsposter&lt;/a&gt;, &lt;a href=&quot;https://github.com/0x4D31/fatt/graphs/contributors&quot;&gt;fatt&lt;/a&gt;, &lt;a href=&quot;https://github.com/0x4D31/galah/graphs/contributors&quot;&gt;galah&lt;/a&gt;, &lt;a href=&quot;https://github.com/mushorg/glutton/graphs/contributors&quot;&gt;glutton&lt;/a&gt;, &lt;a href=&quot;https://github.com/ryanolee/go-pot/graphs/contributors&quot;&gt;go-pot&lt;/a&gt;, &lt;a href=&quot;https://github.com/pbssubhash/h0neytr4p/graphs/contributors&quot;&gt;h0neytr4p&lt;/a&gt;, &lt;a href=&quot;https://github.com/yunginnanet/HellPot/graphs/contributors&quot;&gt;hellpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/johnnykv/heralding/graphs/contributors&quot;&gt;heralding&lt;/a&gt;, &lt;a href=&quot;https://github.com/mmta/honeyaml/graphs/contributors&quot;&gt;honeyaml&lt;/a&gt;, &lt;a href=&quot;https://github.com/qeeqbox/honeypots/graphs/contributors&quot;&gt;honeypots&lt;/a&gt;, &lt;a href=&quot;https://github.com/armedpot/honeytrap/graphs/contributors&quot;&gt;honeytrap&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/bontchev/ipphoney/-/project_members&quot;&gt;ipphoney&lt;/a&gt;, &lt;a href=&quot;https://github.com/elastic/kibana/graphs/contributors&quot;&gt;kibana&lt;/a&gt;, &lt;a href=&quot;https://github.com/elastic/logstash/graphs/contributors&quot;&gt;logstash&lt;/a&gt;, &lt;a href=&quot;https://github.com/thomaspatzke/Log4Pot/graphs/contributors&quot;&gt;log4pot&lt;/a&gt;, &lt;a href=&quot;https://github.com/awhitehatter/mailoney&quot;&gt;mailoney&lt;/a&gt;, &lt;a href=&quot;https://github.com/stamparm/maltrail/graphs/contributors&quot;&gt;maltrail&lt;/a&gt;, &lt;a href=&quot;https://github.com/schmalle/medpot/graphs/contributors&quot;&gt;medpot&lt;/a&gt;, &lt;a href=&quot;https://github.com/sa7mon/miniprint/graphs/contributors&quot;&gt;miniprint&lt;/a&gt;, &lt;a href=&quot;http://lcamtuf.coredump.cx/p0f3/&quot;&gt;p0f&lt;/a&gt;, &lt;a href=&quot;https://github.com/cypwnpwnsocute/RedisHoneyPot/graphs/contributors&quot;&gt;redishoneypot&lt;/a&gt;, &lt;a href=&quot;https://github.com/SentryPeer/SentryPeer/graphs/contributors&quot;&gt;sentrypeer&lt;/a&gt;, &lt;a href=&quot;https://github.com/smicallef/spiderfoot&quot;&gt;spiderfoot&lt;/a&gt;, &lt;a href=&quot;https://github.com/mushorg/snare/graphs/contributors&quot;&gt;snare&lt;/a&gt;, &lt;a href=&quot;https://github.com/mushorg/tanner/graphs/contributors&quot;&gt;tanner&lt;/a&gt;, &lt;a href=&quot;https://github.com/OISF/suricata/graphs/contributors&quot;&gt;suricata&lt;/a&gt;, &lt;a href=&quot;https://github.com/gbrindisi/wordpot&quot;&gt;wordpot&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;&lt;strong&gt;The following companies and organizations&lt;/strong&gt;&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://www.docker.com/&quot;&gt;docker&lt;/a&gt;, &lt;a href=&quot;https://www.elastic.co/&quot;&gt;elastic.io&lt;/a&gt;, &lt;a href=&quot;https://www.honeynet.org/&quot;&gt;honeynet project&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;&lt;strong&gt;And of course &lt;em&gt;&lt;strong&gt;YOU&lt;/strong&gt;&lt;/em&gt; for joining the community!&lt;/strong&gt;&lt;/h2&gt; 
&lt;br /&gt; 
&lt;h1&gt;Testimonials&lt;/h1&gt; 
&lt;p&gt;One of the greatest feedback we have gotten so far is by one of the Conpot developers:&lt;br /&gt; &lt;em&gt;&lt;strong&gt;&quot;[...] I highly recommend T-Pot which is ... it&#39;s not exactly a swiss army knife .. it&#39;s more like a swiss army soldier, equipped with a swiss army knife. Inside a tank. A swiss tank. [...]&quot;&lt;/strong&gt;&lt;/em&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;And from @robcowart (creator of &lt;a href=&quot;https://github.com/robcowart/elastiflow&quot;&gt;ElastiFlow&lt;/a&gt;):&lt;br /&gt; &lt;em&gt;&lt;strong&gt;&quot;#TPot is one of the most well put together turnkey honeypot solutions. It is a must-have for anyone wanting to analyze and understand the behavior of malicious actors and the threat they pose to your organization.&quot;&lt;/strong&gt;&lt;/em&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt; 
&lt;h1&gt;Thank you 💖&lt;/h1&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/27275442/4e4eaa80-d1a8-11e9-91de-09de33490d6b" medium="image" />
      
    </item>
    
    <item>
      <title>redis/redis</title>
      <link>https://github.com/redis/redis</link>
      <description>&lt;p&gt;For developers, who are building real-time data-driven applications, Redis is the preferred, fastest, and most feature-rich cache, data structure server, and document and vector query engine.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;a href=&quot;https://codecov.io/github/redis/redis&quot;&gt;&lt;img src=&quot;https://codecov.io/github/redis/redis/graph/badge.svg?token=6bVHb5fRuz&quot; alt=&quot;codecov&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;This document serves as both a quick start guide to Redis and a detailed resource for building it from source.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;New to Redis? Start with &lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#what-is-redis&quot;&gt;What is Redis&lt;/a&gt; and &lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#getting-started&quot;&gt;Getting Started&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Ready to build from source? Jump to &lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-redis-from-source&quot;&gt;Build Redis from Source&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Want to contribute? See the &lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#code-contributions&quot;&gt;Code contributions&lt;/a&gt; section and &lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Looking for detailed documentation? Navigate to &lt;a href=&quot;https://redis.io/docs/&quot;&gt;redis.io/docs&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Table of contents&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#what-is-redis&quot;&gt;What is Redis?&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#key-use-cases&quot;&gt;Key use cases&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#why-choose-redis&quot;&gt;Why choose Redis?&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#what-is-redis-open-source&quot;&gt;What is Redis Open Source?&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#getting-started&quot;&gt;Getting started&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#redis-starter-projects&quot;&gt;Redis starter projects&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#using-redis-with-client-libraries&quot;&gt;Using Redis with client libraries&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#using-redis-with-redis-cli&quot;&gt;Using Redis with redis-cli&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#using-redis-with-redis-insight&quot;&gt;Using Redis with Redis Insight&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#redis-data-types-processing-engines-and-capabilities&quot;&gt;Redis data types, processing engines, and capabilities&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#cloud-hosted-redis&quot;&gt;Cloud hosted Redis&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#community&quot;&gt;Community&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-redis-from-source&quot;&gt;Build Redis from source&lt;/a&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-and-run-redis-with-all-data-structures---ubuntu-2004-focal&quot;&gt;Build and run Redis with all data structures - Ubuntu 20.04 (Focal)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-and-run-redis-with-all-data-structures---ubuntu-2204-jammy&quot;&gt;Build and run Redis with all data structures - Ubuntu 22.04 (Jammy)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-and-run-redis-with-all-data-structures---ubuntu-2404-noble&quot;&gt;Build and run Redis with all data structures - Ubuntu 24.04 (Noble)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-and-run-redis-with-all-data-structures---debian-11-bullseye--12-bookworm&quot;&gt;Build and run Redis with all data structures - Debian 11 (Bullseye) / 12 (Bookworm)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-and-run-redis-with-all-data-structures---almalinux-810--rocky-linux-810&quot;&gt;Build and run Redis with all data structures - AlmaLinux 8.10 / Rocky Linux 8.10&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-and-run-redis-with-all-data-structures---almalinux-95--rocky-linux-95&quot;&gt;Build and run Redis with all data structures - AlmaLinux 9.5 / Rocky Linux 9.5&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-and-run-redis-with-all-data-structures---macos-13-ventura-and-macos-14-sonoma&quot;&gt;Build and run Redis with all data structures - macOS 13 (Ventura) and macOS 14 (Sonoma)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-and-run-redis-with-all-data-structures---macos-15-sequoia&quot;&gt;Build and run Redis with all data structures - macOS 15 (Sequoia)&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#building-redis---flags-and-general-notes&quot;&gt;Building Redis - flags and general notes&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#fixing-build-problems-with-dependencies-or-cached-build-options&quot;&gt;Fixing build problems with dependencies or cached build options&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#fixing-problems-building-32-bit-binaries&quot;&gt;Fixing problems building 32 bit binaries&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#allocator&quot;&gt;Allocator&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#monotonic-clock&quot;&gt;Monotonic clock&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#verbose-build&quot;&gt;Verbose build&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#running-redis-with-tls&quot;&gt;Running Redis with TLS&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#code-contributions&quot;&gt;Code contributions&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#redis-trademarks&quot;&gt;Redis Trademarks&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;What is Redis?&lt;/h2&gt; 
&lt;p&gt;For developers, who are building real-time data-driven applications, Redis is the preferred, fastest, and most feature-rich cache, data structure server, and document and vector query engine.&lt;/p&gt; 
&lt;h3&gt;Key use cases&lt;/h3&gt; 
&lt;p&gt;Redis excels in various applications, including:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Caching:&lt;/strong&gt; Supports multiple eviction policies, key expiration, and hash-field expiration.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Distributed Session Store:&lt;/strong&gt; Offers flexible session data modeling (string, JSON, hash).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Data Structure Server:&lt;/strong&gt; Provides low-level data structures (strings, lists, sets, hashes, sorted sets, JSON, etc.) with high-level semantics (counters, queues, leaderboards, rate limiters) and supports transactions &amp;amp; scripting.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;NoSQL Data Store:&lt;/strong&gt; Key-value, document, and time series data storage.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Search and Query Engine:&lt;/strong&gt; Indexing for hash/JSON documents, supporting vector search, full-text search, geospatial queries, ranking, and aggregations via Redis Search.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Event Store &amp;amp; Message Broker:&lt;/strong&gt; Implements queues (lists), priority queues (sorted sets), event deduplication (sets), streams, and pub/sub with probabilistic stream processing capabilities.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Vector Store for GenAI:&lt;/strong&gt; Integrates with AI applications (e.g. LangGraph, mem0) for short-term memory, long-term memory, LLM response caching (semantic caching), and retrieval augmented generation (RAG).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Real-Time Analytics:&lt;/strong&gt; Powers personalization, recommendations, fraud detection, and risk assessment.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Why choose Redis?&lt;/h2&gt; 
&lt;p&gt;Redis is a popular choice for developers worldwide due to its combination of speed, flexibility, and rich feature set. Here&#39;s why people choose Redis for:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Performance:&lt;/strong&gt; Because Redis keeps data primarily in memory and uses efficient data structures, it achieves extremely low latency (often sub-millisecond) for both read and write operations. This makes it ideal for applications demanding real-time responsiveness.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Flexibility:&lt;/strong&gt; Redis isn&#39;t just a key-value store, it provides native support for a wide range of data structures and capabilities listed in &lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#what-is-redis&quot;&gt;What is Redis?&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Extensibility:&lt;/strong&gt; Redis is not limited to the built-in data structures, it has a &lt;a href=&quot;https://redis.io/docs/latest/develop/reference/modules/&quot;&gt;modules API&lt;/a&gt; that makes it possible to extend Redis functionality and rapidly implement new Redis commands&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Simplicity:&lt;/strong&gt; Redis has a simple, text-based protocol and &lt;a href=&quot;https://redis.io/docs/latest/commands/&quot;&gt;well-documented command set&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Ubiquity:&lt;/strong&gt; Redis is battle tested in production workloads at a massive scale. There is a good chance you indirectly interact with Redis several times daily&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Versatility&lt;/strong&gt;: Redis is the de facto standard for use cases such as: 
  &lt;ul&gt; 
   &lt;li&gt;&lt;strong&gt;Caching:&lt;/strong&gt; quickly access frequently used data without needing to query your primary database&lt;/li&gt; 
   &lt;li&gt;&lt;strong&gt;Session management:&lt;/strong&gt; read and write user session data without hurting user experience or slowing down every API call&lt;/li&gt; 
   &lt;li&gt;&lt;strong&gt;Querying, sorting, and analytics:&lt;/strong&gt; perform deduplication, full text search, and secondary indexing on in-memory data as fast as possible&lt;/li&gt; 
   &lt;li&gt;&lt;strong&gt;Messaging and interservice communication:&lt;/strong&gt; job queues, message brokering, pub/sub, and streams for communicating between services&lt;/li&gt; 
   &lt;li&gt;&lt;strong&gt;Vector operations:&lt;/strong&gt; Long-term and short-term LLM memory, RAG content retrieval, semantic caching, semantic routing, and vector similarity search&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;In summary, Redis provides a powerful, fast, and flexible toolkit for solving a wide variety of data management challenges. If you want to know more, here is a list of starting points:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/&quot;&gt;&lt;strong&gt;Introduction to Redis data types&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/commands/&quot;&gt;&lt;strong&gt;The full list of Redis commands&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/ai/&quot;&gt;&lt;strong&gt;Redis for AI&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/documentation/&quot;&gt;&lt;strong&gt;Redis documentation&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;What is Redis Open Source?&lt;/h2&gt; 
&lt;p&gt;Redis Community Edition (Redis CE) was renamed Redis Open Source with the v8.0 release.&lt;/p&gt; 
&lt;p&gt;Redis Ltd. also offers &lt;a href=&quot;https://redis.io/enterprise/&quot;&gt;Redis Software&lt;/a&gt;, a self-managed software with additional compliance, reliability, and resiliency for enterprise scaling, and &lt;a href=&quot;https://redis.io/cloud/&quot;&gt;Redis Cloud&lt;/a&gt;, a fully managed service integrated with Google Cloud, Azure, and AWS for production-ready apps.&lt;/p&gt; 
&lt;p&gt;Read more about the differences between Redis Open Source and Redis &lt;a href=&quot;https://redis.io/technology/advantages/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Getting started&lt;/h2&gt; 
&lt;p&gt;If you want to get up and running with Redis quickly without needing to build from source, use one of the following methods:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://cloud.redis.io/&quot;&gt;&lt;strong&gt;Redis Cloud&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://hub.docker.com/_/redis&quot;&gt;&lt;strong&gt;Official Redis Docker images (Alpine/Debian)&lt;/strong&gt;&lt;/a&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;docker run -d -p 6379:6379 redis:latest
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Redis binary distributions&lt;/strong&gt; 
  &lt;ul&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/redis/redis-snap&quot;&gt;&lt;strong&gt;Snap&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/redis/homebrew-redis&quot;&gt;&lt;strong&gt;Homebrew&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/redis/redis-rpm&quot;&gt;&lt;strong&gt;RPM&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
   &lt;li&gt;&lt;a href=&quot;https://github.com/redis/redis-debian&quot;&gt;&lt;strong&gt;Debian&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/get-started/&quot;&gt;&lt;strong&gt;Redis quick start guides&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;If you prefer to &lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-redis-from-source&quot;&gt;build Redis from source&lt;/a&gt; - see instructions below.&lt;/p&gt; 
&lt;h3&gt;Redis starter projects&lt;/h3&gt; 
&lt;p&gt;To get started as quickly as possible in your language of choice, use one of the following starter projects:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/redis-developer/redis-starter-python&quot;&gt;&lt;strong&gt;Python (redis-py)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/redis-developer/redis-starter-csharp&quot;&gt;&lt;strong&gt;C#/.NET (NRedisStack/StackExchange.Redis)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/redis-developer/redis-starter-go&quot;&gt;&lt;strong&gt;Go (go-redis)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/redis-developer/redis-starter-js&quot;&gt;&lt;strong&gt;JavaScript (node-redis)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/redis-developer/redis-starter-java&quot;&gt;&lt;strong&gt;Java/Spring (Jedis)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Using Redis with client libraries&lt;/h3&gt; 
&lt;p&gt;To connect your application to Redis, you will need a client library. Redis has documented client libraries in most popular languages, with community-supported client libraries in additional languages.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/clients/redis-py/&quot;&gt;&lt;strong&gt;Python (redis-py)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/integrate/redisvl/&quot;&gt;&lt;strong&gt;Python (RedisVL)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/clients/dotnet/&quot;&gt;&lt;strong&gt;C#/.NET (NRedisStack/StackExchange.Redis)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/clients/nodejs/&quot;&gt;&lt;strong&gt;JavaScript (node-redis)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/clients/jedis/&quot;&gt;&lt;strong&gt;Java (Jedis)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/clients/lettuce/&quot;&gt;&lt;strong&gt;Java (Lettuce)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/clients/go/&quot;&gt;&lt;strong&gt;Go (go-redis)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/clients/php/&quot;&gt;&lt;strong&gt;PHP (Predis)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/clients/hiredis/&quot;&gt;&lt;strong&gt;C (hiredis)&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/clients/&quot;&gt;&lt;strong&gt;Full list of client libraries&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Using Redis with redis-cli&lt;/h3&gt; 
&lt;p&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/tools/cli/&quot;&gt;&lt;code&gt;redis-cli&lt;/code&gt;&lt;/a&gt; is Redis&#39; command line interface. It is available as part of all the binary distributions and when you build Redis from source.&lt;/p&gt; 
&lt;p&gt;You can start a redis-server instance, and then, in another terminal try the following:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd src
./redis-cli
&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;redis&amp;gt; ping
PONG
redis&amp;gt; set foo bar
OK
redis&amp;gt; get foo
&quot;bar&quot;
redis&amp;gt; incr mycounter
(integer) 1
redis&amp;gt; incr mycounter
(integer) 2
redis&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Using Redis with Redis Insight&lt;/h3&gt; 
&lt;p&gt;For a more visual and user-friendly experience, use &lt;a href=&quot;https://redis.io/docs/latest/develop/tools/insight/&quot;&gt;Redis Insight&lt;/a&gt; - a tool that lets you explore data, design, develop, and optimize your applications while also serving as a platform for Redis education and onboarding. Redis Insight integrates &lt;a href=&quot;https://redis.io/chat&quot;&gt;Redis Copilot&lt;/a&gt;, a natural language AI assistant that improves the experience when working with data and commands.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/tools/insight/&quot;&gt;&lt;strong&gt;Redis Insight documentation&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://github.com/RedisInsight/RedisInsight&quot;&gt;&lt;strong&gt;Redis Insight GitHub repository&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Redis data types, processing engines, and capabilities&lt;/h2&gt; 
&lt;p&gt;Redis provides a variety of data types, processing engines, and capabilities to support a wide range of use cases:&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Features marked with an asterisk (*) require Redis to be compiled with the &lt;code&gt;BUILD_WITH_MODULES=yes&lt;/code&gt; flag when &lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#build-redis-from-source&quot;&gt;building Redis from source&lt;/a&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/strings&quot;&gt;&lt;strong&gt;String:&lt;/strong&gt;&lt;/a&gt; Sequences of bytes, including text, serialized objects, and binary arrays used for caching, counters, and bitwise operations.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/json/&quot;&gt;&lt;strong&gt;JSON:&lt;/strong&gt;&lt;/a&gt; Nested JSON documents that are indexed and searchable using JSONPath expressions and with &lt;a href=&quot;https://redis.io/docs/latest/develop/ai/search-and-query/&quot;&gt;Redis Search&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/arrays/&quot;&gt;&lt;strong&gt;Array:&lt;/strong&gt;&lt;/a&gt; Sparse, index-addressable collection of string values&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/hashes/&quot;&gt;&lt;strong&gt;Hash:&lt;/strong&gt;&lt;/a&gt; Field-value maps used to represent basic objects and store groupings of key-value pairs with support for &lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/hashes/#field-expiration&quot;&gt;hash field expiration (TTL)&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/ai/search-and-query/&quot;&gt;&lt;strong&gt;Redis Search:&lt;/strong&gt;&lt;/a&gt; Use Redis as a document database, a vector database, a secondary index, and a search engine. Define indexes for hash and JSON documents and then use a rich query language for vector search, full-text search, geospatial queries, and aggregations.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/lists/&quot;&gt;&lt;strong&gt;List:&lt;/strong&gt;&lt;/a&gt; Linked lists of string values used as stacks, queues, and for queue management.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/sets/&quot;&gt;&lt;strong&gt;Set:&lt;/strong&gt;&lt;/a&gt; Unordered collection of unique strings used for tracking unique items, relations, and common set operations (intersections, unions, differences).&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/sorted-sets/&quot;&gt;&lt;strong&gt;Sorted set:&lt;/strong&gt;&lt;/a&gt; Collection of unique strings ordered by an associated score used for leaderboards and rate limiters.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/vector-sets/&quot;&gt;&lt;strong&gt;Vector set (beta):&lt;/strong&gt;&lt;/a&gt; Collection of vector embeddings used for semantic similarity search, semantic caching, semantic routing, and Retrieval Augmented Generation (RAG).&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/geospatial/&quot;&gt;&lt;strong&gt;Geospatial indexes:&lt;/strong&gt;&lt;/a&gt; Coordinates used for finding nearby points within a given radius or bounding box.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/bitmaps/&quot;&gt;&lt;strong&gt;Bitmap:&lt;/strong&gt;&lt;/a&gt; A set of bit-oriented operations defined on the string type used for efficient set representations and object permissions.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/bitfields/&quot;&gt;&lt;strong&gt;Bitfield:&lt;/strong&gt;&lt;/a&gt; Binary-encoded strings that let you set, increment, and get integer values of arbitrary bit length used for limited-range counters, numeric values, and multi-level object permissions such as role-based access control (RBAC)&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/probabilistic/hyperloglogs/&quot;&gt;&lt;strong&gt;Hyperloglog:&lt;/strong&gt;&lt;/a&gt; A probabilistic data structure for approximating the cardinality of a set used for analytics such as counting unique visits, form fills, etc.&lt;/li&gt; 
 &lt;li&gt;*&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/probabilistic/bloom-filter/&quot;&gt;&lt;strong&gt;Bloom filter:&lt;/strong&gt;&lt;/a&gt; A probabilistic data structure to check if a given value is present in a set. Used for fraud detection, ad placement, and unique column (i.e. username/email/slug) checks.&lt;/li&gt; 
 &lt;li&gt;*&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/probabilistic/cuckoo-filter/&quot;&gt;&lt;strong&gt;Cuckoo filter:&lt;/strong&gt;&lt;/a&gt; A probabilistic data structure for checking if a given value is present in a set while also allowing limited counting and deletions used in targeted advertising and coupon code validation.&lt;/li&gt; 
 &lt;li&gt;*&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/probabilistic/t-digest/&quot;&gt;&lt;strong&gt;t-digest:&lt;/strong&gt;&lt;/a&gt; A probabilistic data structure used for estimating the percentile of a large dataset without having to store and order all the data points. Used for hardware/software monitoring, online gaming, network traffic monitoring, and predictive maintenance.&lt;/li&gt; 
 &lt;li&gt;*&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/probabilistic/top-k/&quot;&gt;&lt;strong&gt;Top-k:&lt;/strong&gt;&lt;/a&gt; A probabilistic data structure for finding the most frequent values in a data stream used for trend discovery.&lt;/li&gt; 
 &lt;li&gt;*&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/probabilistic/count-min-sketch/&quot;&gt;&lt;strong&gt;Count-min sketch:&lt;/strong&gt;&lt;/a&gt; A probabilistic data structure for estimating how many times a given value appears in a data stream used for sales volume calculations.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/timeseries/&quot;&gt;&lt;strong&gt;Time series:&lt;/strong&gt;&lt;/a&gt; Data points indexed in time order used for monitoring sensor data, asset tracking, and predictive analytics&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/interact/pubsub/&quot;&gt;&lt;strong&gt;Pub/sub&lt;/strong&gt;:&lt;/a&gt; A lightweight messaging capability. Publishers send messages to a channel, and subscribers receive messages from that channel.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/streams/&quot;&gt;&lt;strong&gt;Stream&lt;/strong&gt;:&lt;/a&gt; An append-only log with random access capabilities and complex consumption strategies such as consumer groups. Used for event sourcing, sensor monitoring, and notifications.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/interact/transactions/&quot;&gt;&lt;strong&gt;Transaction:&lt;/strong&gt;&lt;/a&gt; Allows the execution of a group of commands in a single step. A request sent by another client will never be served in the middle of the execution of a transaction. This guarantees that the commands are executed as a single isolated operation.&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redis.io/docs/latest/develop/interact/programmability/eval-intro/&quot;&gt;&lt;strong&gt;Programmability:&lt;/strong&gt;&lt;/a&gt; Upload and execute Lua scripts on the server. Scripts can employ programmatic control structures and use most of the commands while executing to access the database. Because scripts are executed on the server, reading and writing data from scripts is very efficient.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Cloud hosted Redis&lt;/h2&gt; 
&lt;p&gt;Fully-managed Redis with real-time performance at scale.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://redis.io/cloud/&quot;&gt;&lt;strong&gt;Redis Cloud&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Community&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://redis.io/community/&quot;&gt;&lt;strong&gt;Redis Community Resources&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Build Redis from source&lt;/h2&gt; 
&lt;p&gt;This section refers to building Redis from source. If you want to get up and running with Redis quickly without needing to build from source see the &lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/#getting-started&quot;&gt;Getting started section&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Build and run Redis with all data structures - Ubuntu 20.04 (Focal)&lt;/h3&gt; 
&lt;p&gt;Tested with the following Docker image:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;ubuntu:20.04&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Install required dependencies&lt;/p&gt; &lt;p&gt;Update your package lists and install the necessary development tools and libraries:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;apt-get update
apt-get install -y sudo
sudo apt-get install -y --no-install-recommends ca-certificates wget dpkg-dev gcc g++ libc6-dev libssl-dev make git python3 python3-pip python3-venv python3-dev unzip rsync clang automake autoconf gcc-10 g++-10 libtool
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Use GCC 10 as the default compiler&lt;/p&gt; &lt;p&gt;Update the system&#39;s default compiler to GCC 10:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Install CMake&lt;/p&gt; &lt;p&gt;Install CMake using &lt;code&gt;pip3&lt;/code&gt; and link it for system-wide access:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;pip3 install cmake==3.31.6
sudo ln -sf /usr/local/bin/cmake /usr/bin/cmake
cmake --version
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Note: CMake version 3.31.6 is the latest supported version. Newer versions cannot be used.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Download the Redis source&lt;/p&gt; &lt;p&gt;Download a specific version of the Redis source code archive from GitHub.&lt;/p&gt; &lt;p&gt;Replace &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; with the Redis version, for example: &lt;code&gt;8.0.0&lt;/code&gt;.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
wget -O redis-&amp;lt;version&amp;gt;.tar.gz https://github.com/redis/redis/archive/refs/tags/&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Extract the source archive&lt;/p&gt; &lt;p&gt;Create a directory for the source code and extract the contents into it:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
tar xvf redis-&amp;lt;version&amp;gt;.tar.gz
rm redis-&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Build Redis&lt;/p&gt; &lt;p&gt;Set the necessary environment variables and compile Redis:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src/redis-&amp;lt;version&amp;gt;
export BUILD_TLS=yes BUILD_WITH_MODULES=yes INSTALL_RUST_TOOLCHAIN=yes DISABLE_WERRORS=yes
make -j &quot;$(nproc)&quot; all
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Run Redis&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src/redis-&amp;lt;version&amp;gt;
./src/redis-server redis-full.conf
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Build and run Redis with all data structures - Ubuntu 22.04 (Jammy)&lt;/h3&gt; 
&lt;p&gt;Tested with the following Docker image:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;ubuntu:22.04&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Install required dependencies&lt;/p&gt; &lt;p&gt;Update your package lists and install the necessary development tools and libraries:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;apt-get update
apt-get install -y sudo
sudo apt-get install -y --no-install-recommends ca-certificates wget dpkg-dev gcc g++ libc6-dev libssl-dev make git cmake python3 python3-pip python3-venv python3-dev unzip rsync clang automake autoconf libtool
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Install CMake&lt;/p&gt; &lt;p&gt;Install CMake using &lt;code&gt;pip3&lt;/code&gt; and link it for system-wide access:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;pip3 install cmake==3.31.6
sudo ln -sf /usr/local/bin/cmake /usr/bin/cmake
cmake --version
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Note: CMake version 3.31.6 is the latest supported version. Newer versions cannot be used.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Download the Redis source&lt;/p&gt; &lt;p&gt;Download a specific version of the Redis source code archive from GitHub.&lt;/p&gt; &lt;p&gt;Replace &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; with the Redis version, for example: &lt;code&gt;8.0.0&lt;/code&gt;.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
wget -O redis-&amp;lt;version&amp;gt;.tar.gz https://github.com/redis/redis/archive/refs/tags/&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Extract the source archive&lt;/p&gt; &lt;p&gt;Create a directory for the source code and extract the contents into it:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
tar xvf redis-&amp;lt;version&amp;gt;.tar.gz
rm redis-&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Build Redis&lt;/p&gt; &lt;p&gt;Set the necessary environment variables and build Redis:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src/redis-&amp;lt;version&amp;gt;
export BUILD_TLS=yes BUILD_WITH_MODULES=yes INSTALL_RUST_TOOLCHAIN=yes DISABLE_WERRORS=yes
make -j &quot;$(nproc)&quot; all
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Run Redis&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src/redis-&amp;lt;version&amp;gt;
./src/redis-server redis-full.conf
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Build and run Redis with all data structures - Ubuntu 24.04 (Noble)&lt;/h3&gt; 
&lt;p&gt;Tested with the following Docker image:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;ubuntu:24.04&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Install required dependencies&lt;/p&gt; &lt;p&gt;Update your package lists and install the necessary development tools and libraries:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;apt-get update
apt-get install -y sudo
sudo apt-get install -y --no-install-recommends ca-certificates wget dpkg-dev gcc g++ libc6-dev libssl-dev make git cmake python3 python3-pip python3-venv python3-dev unzip rsync clang automake autoconf libtool
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Download the Redis source&lt;/p&gt; &lt;p&gt;Download a specific version of the Redis source code archive from GitHub.&lt;/p&gt; &lt;p&gt;Replace &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; with the Redis version, for example: &lt;code&gt;8.0.0&lt;/code&gt;.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
wget -O redis-&amp;lt;version&amp;gt;.tar.gz https://github.com/redis/redis/archive/refs/tags/&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Extract the source archive&lt;/p&gt; &lt;p&gt;Create a directory for the source code and extract the contents into it:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
tar xvf redis-&amp;lt;version&amp;gt;.tar.gz
rm redis-&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Build Redis&lt;/p&gt; &lt;p&gt;Set the necessary environment variables and build Redis:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src/redis-&amp;lt;version&amp;gt;
export BUILD_TLS=yes BUILD_WITH_MODULES=yes INSTALL_RUST_TOOLCHAIN=yes DISABLE_WERRORS=yes
make -j &quot;$(nproc)&quot; all
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Run Redis&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src/redis-&amp;lt;version&amp;gt;
./src/redis-server redis-full.conf
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Build and run Redis with all data structures - Debian 11 (Bullseye) / 12 (Bookworm)&lt;/h3&gt; 
&lt;p&gt;Tested with the following Docker images:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;debian:bullseye&lt;/li&gt; 
 &lt;li&gt;debian:bullseye-slim&lt;/li&gt; 
 &lt;li&gt;debian:bookworm&lt;/li&gt; 
 &lt;li&gt;debian:bookworm-slim&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Install required dependencies&lt;/p&gt; &lt;p&gt;Update your package lists and install the necessary development tools and libraries:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;apt-get update
apt-get install -y sudo
sudo apt-get install -y --no-install-recommends ca-certificates wget dpkg-dev gcc g++ libc6-dev libssl-dev make git cmake python3 python3-pip python3-venv python3-dev unzip rsync clang automake autoconf libtool
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Download the Redis source&lt;/p&gt; &lt;p&gt;Download a specific version of the Redis source code archive from GitHub.&lt;/p&gt; &lt;p&gt;Replace &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; with the Redis version, for example: &lt;code&gt;8.0.0&lt;/code&gt;.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
wget -O redis-&amp;lt;version&amp;gt;.tar.gz https://github.com/redis/redis/archive/refs/tags/&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Extract the source archive&lt;/p&gt; &lt;p&gt;Create a directory for the source code and extract the contents into it:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
tar xvf redis-&amp;lt;version&amp;gt;.tar.gz
rm redis-&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Build Redis&lt;/p&gt; &lt;p&gt;Set the necessary environment variables and build Redis:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src/redis-&amp;lt;version&amp;gt;
export BUILD_TLS=yes BUILD_WITH_MODULES=yes INSTALL_RUST_TOOLCHAIN=yes DISABLE_WERRORS=yes
make -j &quot;$(nproc)&quot; all
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Run Redis&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src/redis-&amp;lt;version&amp;gt;
./src/redis-server redis-full.conf
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Build and run Redis with all data structures - AlmaLinux 8.10 / Rocky Linux 8.10&lt;/h3&gt; 
&lt;p&gt;Tested with the following Docker images:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;almalinux:8.10&lt;/li&gt; 
 &lt;li&gt;almalinux:8.10-minimal&lt;/li&gt; 
 &lt;li&gt;rockylinux/rockylinux:8.10&lt;/li&gt; 
 &lt;li&gt;rockylinux/rockylinux:8.10-minimal&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Prepare the system&lt;/p&gt; &lt;p&gt;For 8.10-minimal, install &lt;code&gt;sudo&lt;/code&gt; and &lt;code&gt;dnf&lt;/code&gt; as follows:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;microdnf install dnf sudo -y
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;For 8.10 (regular), install sudo as follows:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;dnf install sudo -y
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Clean the package metadata, enable required repositories, and install development tools:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sudo dnf clean all
sudo tee /etc/yum.repos.d/goreleaser.repo &amp;gt; /dev/null &amp;lt;&amp;lt;EOF
[goreleaser]
name=GoReleaser
baseurl=https://repo.goreleaser.com/yum/
enabled=1
gpgcheck=0
EOF
sudo dnf update -y
sudo dnf groupinstall &quot;Development Tools&quot; -y
sudo dnf config-manager --set-enabled powertools
sudo dnf install -y epel-release
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Install required dependencies&lt;/p&gt; &lt;p&gt;Update your package lists and install the necessary development tools and libraries:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sudo dnf install -y --nobest --skip-broken pkg-config wget gcc-toolset-13-gcc gcc-toolset-13-gcc-c++ git make openssl openssl-devel python3.11 python3.11-pip python3.11-devel unzip rsync clang curl libtool automake autoconf jq systemd-devel
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Create a Python virtual environment:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;python3.11 -m venv /opt/venv
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Enable the GCC toolset:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sudo cp /opt/rh/gcc-toolset-13/enable /etc/profile.d/gcc-toolset-13.sh
echo &quot;source /etc/profile.d/gcc-toolset-13.sh&quot; | sudo tee -a /etc/bashrc
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Install CMake&lt;/p&gt; &lt;p&gt;Install CMake 3.25.1 manually:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;CMAKE_VERSION=3.25.1
ARCH=$(uname -m)
if [ &quot;$ARCH&quot; = &quot;x86_64&quot; ]; then
  CMAKE_FILE=cmake-${CMAKE_VERSION}-linux-x86_64.sh
else
  CMAKE_FILE=cmake-${CMAKE_VERSION}-linux-aarch64.sh
fi
wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_FILE}
chmod +x ${CMAKE_FILE}
./${CMAKE_FILE} --skip-license --prefix=/usr/local --exclude-subdir
rm ${CMAKE_FILE}
cmake --version
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Download the Redis source&lt;/p&gt; &lt;p&gt;Download a specific version of the Redis source code archive from GitHub.&lt;/p&gt; &lt;p&gt;Replace &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; with the Redis version, for example: &lt;code&gt;8.0.0&lt;/code&gt;.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
wget -O redis-&amp;lt;version&amp;gt;.tar.gz https://github.com/redis/redis/archive/refs/tags/&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Extract the source archive&lt;/p&gt; &lt;p&gt;Create a directory for the source code and extract the contents into it:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
tar xvf redis-&amp;lt;version&amp;gt;.tar.gz
rm redis-&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Build Redis&lt;/p&gt; &lt;p&gt;Enable the GCC toolset, set the necessary environment variables, and build Redis:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;source /etc/profile.d/gcc-toolset-13.sh
cd /usr/src/redis-&amp;lt;version&amp;gt;
export BUILD_TLS=yes BUILD_WITH_MODULES=yes INSTALL_RUST_TOOLCHAIN=yes DISABLE_WERRORS=yes
make -j &quot;$(nproc)&quot; all
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Run Redis&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src/redis-&amp;lt;version&amp;gt;
./src/redis-server redis-full.conf
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Build and run Redis with all data structures - AlmaLinux 9.5 / Rocky Linux 9.5&lt;/h3&gt; 
&lt;p&gt;Tested with the following Docker images:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;almalinux:9.5&lt;/li&gt; 
 &lt;li&gt;almalinux:9.5-minimal&lt;/li&gt; 
 &lt;li&gt;rockylinux/rockylinux:9.5&lt;/li&gt; 
 &lt;li&gt;rockylinux/rockylinux:9.5-minimal&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Prepare the system&lt;/p&gt; &lt;p&gt;For 9.5-minimal, install &lt;code&gt;sudo&lt;/code&gt; and &lt;code&gt;dnf&lt;/code&gt; as follows:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;microdnf install dnf sudo -y
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;For 9.5 (regular), install sudo as follows:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;dnf install sudo -y
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Clean the package metadata, enable required repositories, and install development tools:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sudo tee /etc/yum.repos.d/goreleaser.repo &amp;gt; /dev/null &amp;lt;&amp;lt;EOF
[goreleaser]
name=GoReleaser
baseurl=https://repo.goreleaser.com/yum/
enabled=1
gpgcheck=0
EOF
sudo dnf clean all
sudo dnf makecache
sudo dnf update -y
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Install required dependencies&lt;/p&gt; &lt;p&gt;Update your package lists and install the necessary development tools and libraries:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sudo dnf install -y --nobest --skip-broken pkg-config xz wget which gcc-toolset-13-gcc gcc-toolset-13-gcc-c++ git make openssl openssl-devel python3 python3-pip python3-devel unzip rsync clang curl libtool automake autoconf jq systemd-devel
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Create a Python virtual environment:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;python3 -m venv /opt/venv
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Enable the GCC toolset:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sudo cp /opt/rh/gcc-toolset-13/enable /etc/profile.d/gcc-toolset-13.sh
echo &quot;source /etc/profile.d/gcc-toolset-13.sh&quot; | sudo tee -a /etc/bashrc
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Install CMake&lt;/p&gt; &lt;p&gt;Install CMake 3.25.1 manually:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;CMAKE_VERSION=3.25.1
ARCH=$(uname -m)
if [ &quot;$ARCH&quot; = &quot;x86_64&quot; ]; then
  CMAKE_FILE=cmake-${CMAKE_VERSION}-linux-x86_64.sh
else
  CMAKE_FILE=cmake-${CMAKE_VERSION}-linux-aarch64.sh
fi
wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_FILE}
chmod +x ${CMAKE_FILE}
./${CMAKE_FILE} --skip-license --prefix=/usr/local --exclude-subdir
rm ${CMAKE_FILE}
cmake --version
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Download the Redis source&lt;/p&gt; &lt;p&gt;Download a specific version of the Redis source code archive from GitHub.&lt;/p&gt; &lt;p&gt;Replace &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; with the Redis version, for example: &lt;code&gt;8.0.0&lt;/code&gt;.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
wget -O redis-&amp;lt;version&amp;gt;.tar.gz https://github.com/redis/redis/archive/refs/tags/&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Extract the source archive&lt;/p&gt; &lt;p&gt;Create a directory for the source code and extract the contents into it:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src
tar xvf redis-&amp;lt;version&amp;gt;.tar.gz
rm redis-&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Build Redis&lt;/p&gt; &lt;p&gt;Enable the GCC toolset, set the necessary environment variables, and build Redis:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;source /etc/profile.d/gcc-toolset-13.sh
cd /usr/src/redis-&amp;lt;version&amp;gt;
export BUILD_TLS=yes BUILD_WITH_MODULES=yes INSTALL_RUST_TOOLCHAIN=yes DISABLE_WERRORS=yes
make -j &quot;$(nproc)&quot; all
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Run Redis&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd /usr/src/redis-&amp;lt;version&amp;gt;
./src/redis-server redis-full.conf
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Build and run Redis with all data structures - macOS 13 (Ventura) and macOS 14 (Sonoma)&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Install Homebrew&lt;/p&gt; &lt;p&gt;If Homebrew is not already installed, follow the installation instructions on the &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew home page&lt;/a&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Install required packages&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;export HOMEBREW_NO_AUTO_UPDATE=1
brew update
brew install coreutils
brew install make
brew install openssl
brew install llvm@18
brew install cmake
brew install gnu-sed
brew install automake
brew install libtool
brew install wget
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Install Rust&lt;/p&gt; &lt;p&gt;Rust is required to build the JSON package.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;RUST_INSTALLER=rust-1.80.1-$(if [ &quot;$(uname -m)&quot; = &quot;arm64&quot; ]; then echo &quot;aarch64&quot;; else echo &quot;x86_64&quot;; fi)-apple-darwin
wget --quiet -O ${RUST_INSTALLER}.tar.xz https://static.rust-lang.org/dist/${RUST_INSTALLER}.tar.xz
tar -xf ${RUST_INSTALLER}.tar.xz
(cd ${RUST_INSTALLER} &amp;amp;&amp;amp; sudo ./install.sh)
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Download the Redis source&lt;/p&gt; &lt;p&gt;Download a specific version of the Redis source code archive from GitHub.&lt;/p&gt; &lt;p&gt;Replace &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; with the Redis version, for example: &lt;code&gt;8.0.0&lt;/code&gt;.&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd ~/src
wget -O redis-&amp;lt;version&amp;gt;.tar.gz https://github.com/redis/redis/archive/refs/tags/&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Extract the source archive&lt;/p&gt; &lt;p&gt;Create a directory for the source code and extract the contents into it:&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd ~/src
tar xvf redis-&amp;lt;version&amp;gt;.tar.gz
rm redis-&amp;lt;version&amp;gt;.tar.gz
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Build Redis&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;cd ~/src/redis-&amp;lt;version&amp;gt;
export HOMEBREW_PREFIX=&quot;$(brew --prefix)&quot;
export BUILD_WITH_MODULES=yes
export BUILD_TLS=yes
export DISABLE_WERRORS=yes
PATH=&quot;$HOMEBREW_PREFIX/opt/libtool/libexec/gnubin:$HOMEBREW_PREFIX/opt/llvm@18/bin:$HOMEBREW_PREFIX/opt/make/libexec/gnubin:$HOMEBREW_PREFIX/opt/gnu-sed/libexec/gnubin:$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH&quot;
export LDFLAGS=&quot;-L$HOMEBREW_PREFIX/opt/llvm@18/lib&quot;
export CPPFLAGS=&quot;-I$HOMEBREW_PREFIX/opt/llvm@18/include&quot;
mkdir -p build_dir/etc
make -C redis-8.0 -j &quot;$(nproc)&quot; all OS=macos
make -C redis-8.0 install PREFIX=$(pwd)/build_dir OS=macos
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Run Redis&lt;/p&gt; &lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
build_dir/bin/redis-server redis-full.conf
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Build and run Redis with all data structures - macOS 15 (Sequoia)&lt;/h3&gt; 
&lt;p&gt;Support and instructions will be provided at a later date.&lt;/p&gt; 
&lt;h3&gt;Building Redis - flags and general notes&lt;/h3&gt; 
&lt;p&gt;Redis can be compiled and used on Linux, OSX, OpenBSD, NetBSD, FreeBSD. We support big endian and little endian architectures, and both 32 bit and 64-bit systems.&lt;/p&gt; 
&lt;p&gt;It may compile on Solaris derived systems (for instance SmartOS) but our support for this platform is &lt;em&gt;best effort&lt;/em&gt; and Redis is not guaranteed to work as well as on Linux, OSX, and *BSD.&lt;/p&gt; 
&lt;p&gt;To build Redis with all the data structures (including JSON, time series, Bloom filter, cuckoo filter, count-min sketch, top-k, and t-digest) and with Redis Query Engine, make sure first that all the prerequisites are installed (see build instructions above, per operating system). You need to use the following flag in the make command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make BUILD_WITH_MODULES=yes
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Note: &lt;code&gt;BUILD_WITH_MODULES=yes&lt;/code&gt; is not supported on 32 bit systems.&lt;/p&gt; 
&lt;p&gt;To build Redis with just the core data structures, use:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To build with TLS support, you need OpenSSL development libraries (e.g. libssl-dev on Debian/Ubuntu) and the following flag in the make command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make BUILD_TLS=yes
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To build with systemd support, you need systemd development libraries (such as libsystemd-dev on Debian/Ubuntu or systemd-devel on CentOS), and the following flag:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make USE_SYSTEMD=yes
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To append a suffix to Redis program names, add the following flag:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make PROG_SUFFIX=&quot;-alt&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can build a 32 bit Redis binary using:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make 32bit
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;After building Redis, it is a good idea to test it using:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make test
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If TLS is built, running the tests with TLS enabled (you will need &lt;code&gt;tcl-tls&lt;/code&gt; installed):&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;./utils/gen-test-certs.sh
./runtest --tls
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Fixing build problems with dependencies or cached build options&lt;/h3&gt; 
&lt;p&gt;Redis has some dependencies which are included in the &lt;code&gt;deps&lt;/code&gt; directory. &lt;code&gt;make&lt;/code&gt; does not automatically rebuild dependencies even if something in the source code of dependencies changes.&lt;/p&gt; 
&lt;p&gt;When you update the source code with &lt;code&gt;git pull&lt;/code&gt; or when code inside the dependencies tree is modified in any other way, make sure to use the following command in order to really clean everything and rebuild from scratch:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make distclean
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This will clean: jemalloc, lua, hiredis, linenoise and other dependencies.&lt;/p&gt; 
&lt;p&gt;Also, if you force certain build options like 32bit target, no C compiler optimizations (for debugging purposes), and other similar build time options, those options are cached indefinitely until you issue a &lt;code&gt;make distclean&lt;/code&gt; command.&lt;/p&gt; 
&lt;h3&gt;Fixing problems building 32 bit binaries&lt;/h3&gt; 
&lt;p&gt;If after building Redis with a 32 bit target you need to rebuild it with a 64 bit target, or the other way around, you need to perform a &lt;code&gt;make distclean&lt;/code&gt; in the root directory of the Redis distribution.&lt;/p&gt; 
&lt;p&gt;In case of build errors when trying to build a 32 bit binary of Redis, try the following steps:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Install the package libc6-dev-i386 (also try g++-multilib).&lt;/li&gt; 
 &lt;li&gt;Try using the following command line instead of &lt;code&gt;make 32bit&lt;/code&gt;: &lt;code&gt;make CFLAGS=&quot;-m32 -march=native&quot; LDFLAGS=&quot;-m32&quot;&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Allocator&lt;/h3&gt; 
&lt;p&gt;Selecting a non-default memory allocator when building Redis is done by setting the &lt;code&gt;MALLOC&lt;/code&gt; environment variable. Redis is compiled and linked against libc malloc by default, except for jemalloc being the default on Linux systems. This default was picked because jemalloc has proven to have fewer fragmentation problems than libc malloc.&lt;/p&gt; 
&lt;p&gt;To force compiling against libc malloc, use:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make MALLOC=libc
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To compile against jemalloc on Mac OS X systems, use:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make MALLOC=jemalloc
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Monotonic clock&lt;/h3&gt; 
&lt;p&gt;By default, Redis will build using the POSIX clock_gettime function as the monotonic clock source. On most modern systems, the internal processor clock can be used to improve performance. Cautions can be found here: &lt;a href=&quot;http://oliveryang.net/2015/09/pitfalls-of-TSC-usage/&quot;&gt;http://oliveryang.net/2015/09/pitfalls-of-TSC-usage/&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;On ARM aarch64 systems, the hardware clock is enabled by default because the ARM Generic Timer is architecturally guaranteed to be available and monotonic on all ARMv8-A processors (see the &lt;em&gt;“The Generic Timer in AArch64 state”&lt;/em&gt; section of the &lt;em&gt;Arm Architecture Reference Manual for Armv8-A&lt;/em&gt;).&lt;/p&gt; 
&lt;p&gt;To build with support for the processor&#39;s internal instruction clock on other architectures, use:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make CFLAGS=&quot;-DUSE_PROCESSOR_CLOCK&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Verbose build&lt;/h3&gt; 
&lt;p&gt;Redis will build with a user-friendly colorized output by default. If you want to see a more verbose output, use the following:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make V=1
&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Running Redis with TLS&lt;/h3&gt; 
&lt;p&gt;Please consult the &lt;a href=&quot;https://raw.githubusercontent.com/redis/redis/unstable/TLS.md&quot;&gt;TLS.md&lt;/a&gt; file for more information on how to use Redis with TLS.&lt;/p&gt; 
&lt;h3&gt;Running Redis with the Query Engine and optional proprietary Intel SVS-VAMANA optimisations&lt;/h3&gt; 
&lt;p&gt;&lt;strong&gt;License Disclaimer&lt;/strong&gt; If you are using Redis Open Source under AGPLv3 or SSPLv1, you cannot use it together with the Intel Optimizations (Leanvec and LVQ binaries). The reason is that the Intel SVS license is not compatible with those licenses. The Leanvec and LVQ techniques are closed source and are only available for use with Redis Open Source when distributed under the RSALv2 license. For more details, please refer to the information provided by Intel &lt;a href=&quot;https://github.com/intel/ScalableVectorSearch&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;By default, Redis with the Redis Query Engine supports SVS-VAMANA index with global 8-bit quantisation. To compile Redis with the Intel SVS-VAMANA optimisations, LeanVec and LVQ, use the following:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;make BUILD_INTEL_SVS_OPT=yes
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Alternatively, you can export the variable before running the build step for your platform:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;export BUILD_INTEL_SVS_OPT=yes
make
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Code contributions&lt;/h2&gt; 
&lt;p&gt;By contributing code to the Redis project in any form, including sending a pull request via GitHub, a code fragment or patch via private email or public discussion groups, you agree to release your code under the terms of the Redis Software Grant and Contributor License Agreement. Please see the &lt;a href=&quot;http://CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt; file in this source distribution for more information. For security bugs and vulnerabilities, please see &lt;a href=&quot;http://SECURITY.md&quot;&gt;SECURITY.md&lt;/a&gt; and the description of the ability of users to backport security patches under Redis Open Source 7.4+ under BSDv3. Open Source Redis releases are subject to the following licenses:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;Version 7.2.x and prior releases are subject to BSDv3. These contributions to the original Redis core project are owned by their contributors and licensed under the 3BSDv3 license as referenced in the REDISCONTRIBUTIONS.txt file. Any copy of that license in this repository applies only to those contributions;&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Versions 7.4.x to 7.8.x are subject to your choice of RSALv2 or SSPLv1; and&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Version 8.0.x and subsequent releases are subject to the tri-license RSALv2/SSPLv1/AGPLv3 at your option as referenced in the LICENSE.txt file.&lt;/p&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Redis Trademarks&lt;/h2&gt; 
&lt;p&gt;The purpose of a trademark is to identify the goods and services of a person or company without causing confusion. As the registered owner of its name and logo, Redis accepts certain limited uses of its trademarks, but it has requirements that must be followed as described in its Trademark Guidelines available at: &lt;a href=&quot;https://redis.io/legal/trademark-policy/&quot;&gt;https://redis.io/legal/trademark-policy/&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/6fbd5cdf4c6121061a125043671b4faf5ce7027b72ded2d878afb5446ce92bea/redis/redis" medium="image" />
      
    </item>
    
    <item>
      <title>OISF/suricata</title>
      <link>https://github.com/OISF/suricata</link>
      <description>&lt;p&gt;Suricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Suricata&lt;/h1&gt; 
&lt;p&gt;&lt;a href=&quot;https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&amp;amp;can=1&amp;amp;q=proj:suricata&quot;&gt;&lt;img src=&quot;https://oss-fuzz-build-logs.storage.googleapis.com/badges/suricata.svg?sanitize=true&quot; alt=&quot;Fuzzing Status&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://codecov.io/gh/OISF/suricata&quot;&gt;&lt;img src=&quot;https://codecov.io/gh/OISF/suricata/branch/main/graph/badge.svg?token=QRyyn2BSo1&quot; alt=&quot;codecov&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Introduction&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://suricata.io&quot;&gt;Suricata&lt;/a&gt; is a network IDS, IPS and NSM engine developed by the &lt;a href=&quot;https://oisf.net&quot;&gt;OISF&lt;/a&gt; and the Suricata community.&lt;/p&gt; 
&lt;h2&gt;Resources&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://suricata.io&quot;&gt;Home Page&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://redmine.openinfosecfoundation.org/projects/suricata&quot;&gt;Bug Tracker&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.suricata.io&quot;&gt;User Guide&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.suricata.io/en/latest/devguide/index.html&quot;&gt;Dev Guide&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://docs.suricata.io/en/latest/install.html&quot;&gt;Installation Guide&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://forum.suricata.io&quot;&gt;User Support Forum&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;We&#39;re happily taking patches and other contributions. Please see our &lt;a href=&quot;https://docs.suricata.io/en/latest/devguide/contributing/contribution-process.html&quot;&gt;Contribution Process&lt;/a&gt; for how to get started.&lt;/p&gt; 
&lt;p&gt;Suricata is a complex piece of software dealing with mostly untrusted input. Mishandling this input will have serious consequences:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;in IPS mode a crash may knock a network offline&lt;/li&gt; 
 &lt;li&gt;in passive mode a compromise of the IDS may lead to loss of critical and confidential data&lt;/li&gt; 
 &lt;li&gt;missed detection may lead to undetected compromise of the network&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;In other words, we think the stakes are pretty high, especially since in many common cases the IDS/IPS will be directly reachable by an attacker.&lt;/p&gt; 
&lt;p&gt;For this reason, we have developed a QA process that is quite extensive. A consequence is that contributing to Suricata can be a somewhat lengthy process.&lt;/p&gt; 
&lt;p&gt;On a high level, the steps are:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;GitHub-CI based checks. This runs automatically when a pull request is made.&lt;/li&gt; 
 &lt;li&gt;Review by devs from the team and community&lt;/li&gt; 
 &lt;li&gt;QA runs from private QA setups. These are private due to the nature of the test traffic.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Overview of Suricata&#39;s QA steps&lt;/h3&gt; 
&lt;p&gt;OISF team members are able to submit builds to our private QA setup. It will run a series of build tests and a regression suite to confirm no existing features break.&lt;/p&gt; 
&lt;p&gt;The final QA runs takes a few hours minimally, and generally runs overnight. It currently runs:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;extensive build tests on different OS&#39;, compilers, optimization levels, configure features&lt;/li&gt; 
 &lt;li&gt;static code analysis using cppcheck, scan-build&lt;/li&gt; 
 &lt;li&gt;runtime code analysis using valgrind, AddressSanitizer, LeakSanitizer&lt;/li&gt; 
 &lt;li&gt;regression tests for past bugs&lt;/li&gt; 
 &lt;li&gt;output validation of logging&lt;/li&gt; 
 &lt;li&gt;unix socket testing&lt;/li&gt; 
 &lt;li&gt;pcap based fuzz testing using ASAN and LSAN&lt;/li&gt; 
 &lt;li&gt;traffic replay based IDS and IPS tests&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Next to these tests, based on the type of code change further tests can be run manually:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;traffic replay testing (multi-gigabit)&lt;/li&gt; 
 &lt;li&gt;large pcap collection processing (multi-terabytes)&lt;/li&gt; 
 &lt;li&gt;fuzz testing (might take multiple days or even weeks)&lt;/li&gt; 
 &lt;li&gt;pcap based performance testing&lt;/li&gt; 
 &lt;li&gt;live performance testing&lt;/li&gt; 
 &lt;li&gt;various other manual tests based on evaluation of the proposed changes&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;It&#39;s important to realize that almost all of the tests above are used as acceptance tests. If something fails, it&#39;s up to you to address this in your code.&lt;/p&gt; 
&lt;p&gt;One step of the QA is currently run post-merge. We submit builds to the Coverity Scan program. Due to limitations of this (free) service, we can submit once a day max. Of course it can happen that after the merge the community will find issues. For both cases we request you to help address the issues as they may come up.&lt;/p&gt; 
&lt;h2&gt;FAQ&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Q: Will you accept my PR?&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;A: That depends on a number of things, including the code quality. With new features it also depends on whether the team and/or the community think the feature is useful, how much it affects other code and features, the risk of performance regressions, etc.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Q: When will my PR be merged?&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;A: It depends, if it&#39;s a major feature or considered a high risk change, it will probably go into the next major version.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Q: Why was my PR closed?&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;A: As documented in the &lt;a href=&quot;https://docs.suricata.io/en/latest/devguide/contributing/github-pr-workflow.html&quot;&gt;Suricata GitHub workflow&lt;/a&gt;, we expect a new pull request for every change.&lt;/p&gt; 
&lt;p&gt;Normally, the team (or community) will give feedback on a pull request after which it is expected to be replaced by an improved PR. So look at the comments. If you disagree with the comments we can still discuss them in the closed PR.&lt;/p&gt; 
&lt;p&gt;If the PR was closed without comments it&#39;s likely due to QA failure. If the GitHub-CI checks failed, the PR should be fixed right away. No need for a discussion about it, unless you believe the QA failure is incorrect.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Q: The compiler/code analyser/tool is wrong, what now?&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;A: To assist in the automation of the QA, we&#39;re not accepting warnings or errors to stay. In some cases this could mean that we add a suppression if the tool supports that (e.g. valgrind, DrMemory). Some warnings can be disabled. In some exceptional cases the only &#39;solution&#39; is to refactor the code to work around a static code checker limitation false positive. While frustrating, we prefer this over leaving warnings in the output. Warnings tend to get ignored and then increase risk of hiding other warnings.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Q: I think your QA test is wrong&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;A: If you really think it is, we can discuss how to improve it. But don&#39;t come to this conclusion too quickly, more often it&#39;s the code that turns out to be wrong.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Q: Do you require signing of a contributor license agreement?&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;A: Yes, we do this to keep the ownership of Suricata in one hand: the Open Information Security Foundation. See &lt;a href=&quot;http://suricata.io/about/open-source/&quot;&gt;http://suricata.io/about/open-source/&lt;/a&gt; and &lt;a href=&quot;http://suricata.io/about/contribution-agreement/&quot;&gt;http://suricata.io/about/contribution-agreement/&lt;/a&gt;&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/550d07119f1b83765f19518af919534918f6a23bc032fc84b72fa316dd931174/OISF/suricata" medium="image" />
      
    </item>
    
    <item>
      <title>dorianborian/sesame-robot</title>
      <link>https://github.com/dorianborian/sesame-robot</link>
      <description>&lt;p&gt;An open and affordable mini quadruped robot based on ESP32.&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;The Sesame Robot Project&lt;/h1&gt; 
&lt;hr /&gt; 
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/badge/License-APACHE2.0-yellow&quot; alt=&quot;License&quot; /&gt; &lt;img src=&quot;https://img.shields.io/badge/Microcontroller-ESP32-blue&quot; alt=&quot;Microcontroller&quot; /&gt; &lt;img src=&quot;https://img.shields.io/badge/Firmware-C%2B%2B-blue?logo=c%2B%2B&quot; alt=&quot;Firmware&quot; /&gt; &lt;img src=&quot;https://img.shields.io/badge/IDE-Arduino-00979D?logo=arduino&amp;amp;logoColor=white&quot; alt=&quot;IDE&quot; /&gt; &lt;img src=&quot;https://img.shields.io/github/stars/dorianborian/sesame-robot?style=social&quot; alt=&quot;GitHub stars&quot; /&gt; &lt;img src=&quot;https://img.shields.io/github/forks/dorianborian/sesame-robot?style=social&quot; alt=&quot;GitHub forks&quot; /&gt;&lt;/p&gt; 
&lt;img width=&quot;100%&quot; height=&quot;728&quot; alt=&quot;sesame-cover&quot; src=&quot;https://github.com/user-attachments/assets/f0cc6ad0-135b-4515-8750-900f224ed7ae&quot; /&gt; 
&lt;p align=&quot;center&quot;&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=NIgoQVQF_Ng&quot;&gt; &lt;img src=&quot;https://github.com/user-attachments/assets/1663e022-0680-4053-97b4-53e669a6f07d&quot; width=&quot;49%&quot; alt=&quot;tutorial-button&quot; /&gt; &lt;/a&gt; &lt;a href=&quot;https://discord.gg/XDXkhQd8bC&quot;&gt; &lt;img src=&quot;https://github.com/user-attachments/assets/378fcb48-5b12-4b46-9dcb-452432d49913&quot; width=&quot;49%&quot; alt=&quot;discord-button&quot; /&gt; &lt;/a&gt; &lt;/p&gt; 
&lt;hr /&gt; 
&lt;p&gt;&lt;strong&gt;Greetings, from your new best friend.&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Sesame is an accessible Open-Source robotics project based on the ESP32 microcontroller system, with an emphasis on expression and movement. This project is designed for makers and engineers of all skill levels! Sesame offers a dynamic platform designed to start working with walking robots. To build a sesame robot, you will need basic soldering skills, $50-60 in hardware components, access to a 3D printer, and a basic understanding of Arduino IDE.&lt;/p&gt; 
&lt;p&gt;This repository contains the CAD design files, STL files, build and wiring guides, and the base/expanded firmware for the ESP32-based controller. There is also some included debugging firmware that may be helpful in getting your Sesame up and running.&lt;/p&gt; 
&lt;h2&gt;Features&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Quadruped Design:&lt;/strong&gt; Uses 8 servo motors (2 per leg) to achieve roughly 8 total degrees of freedom.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Emotive Display:&lt;/strong&gt; Features a 128x64 OLED screen acting as a reactive face that syncs with movement.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Fully Printable:&lt;/strong&gt; Designed entirely for 3D printing in PLA with minimal supports.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Network Connectivity:&lt;/strong&gt; Connect to your WiFi network for remote control and API access.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;JSON API:&lt;/strong&gt; RESTful API for programmatic control from Python, JavaScript, and more.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Conversational Faces:&lt;/strong&gt; Expressive emotion library with talk variants for voice assistant projects.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Sesame Studio:&lt;/strong&gt; New animation composer software to easily create custom movements.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Sesame Companion App:&lt;/strong&gt; Python application for voice control and advanced interactions.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Serial CLI:&lt;/strong&gt; Control the robot and trigger animations via a Serial Command Line Interface or the web UI.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Pre-programmed Emotes:&lt;/strong&gt; Includes animations for Walking, Waving, Dancing, Pointing, Resting, and more.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Watch the launch video on YouTube&lt;/h2&gt; 
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=1UDsWkcQZhc&quot;&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/710cb5a6-163e-47e7-a294-5e2d2ab07627&quot; width=&quot;70%&quot; alt=&quot;thumb-youtube&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Getting Started&lt;/h2&gt; 
&lt;p&gt;Follow these steps to build your own Sesame Robot:&lt;/p&gt; 
&lt;h3&gt;1. Gather Parts&lt;/h3&gt; 
&lt;p&gt;Check the &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dorianborian/sesame-robot/main/hardware/bom/README.md&quot;&gt;Bill of Materials (BOM)&lt;/a&gt;&lt;/strong&gt; for a complete list of required electronics and hardware.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Microcontroller: Lolin S2 Mini (recommended for DIY builds), Sesame Distro Board V2 (included in Build Kits, pre-flashed), or ESP32-DevKitC-32E with Distro Board V1 (legacy)&lt;/li&gt; 
 &lt;li&gt;Actuators: 8x MG90 Servos&lt;/li&gt; 
 &lt;li&gt;Power: 5V 3A source (USB-C PD for S2 Mini and V2 Distro Board, or battery + buck converter; see BOM for the 2× 10440 Li-ion + 2× AAA holder option)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;2. Print Parts&lt;/h3&gt; 
&lt;p&gt;Download the STLs and follow the &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dorianborian/sesame-robot/main/hardware/printing/README.md&quot;&gt;Printing Guide&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Designed for PLA&lt;/li&gt; 
 &lt;li&gt;Minimal supports required&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;3. Build &amp;amp; Wire&lt;/h3&gt; 
&lt;p&gt;Follow the &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dorianborian/sesame-robot/main/docs/build-guide/README.md&quot;&gt;Build Guide&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dorianborian/sesame-robot/main/docs/wiring-guide/README.md&quot;&gt;Wiring Guide&lt;/a&gt;&lt;/strong&gt; to assemble the frame and connect the electronics.&lt;/p&gt; 
&lt;h3&gt;4. Flash Firmware&lt;/h3&gt; 
&lt;p&gt;Upload the code from the &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dorianborian/sesame-robot/main/firmware/README.md&quot;&gt;Firmware Directory&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Requires Arduino IDE&lt;/li&gt; 
 &lt;li&gt;Configure WiFi AP settings&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;5. Create Animations&lt;/h3&gt; 
&lt;p&gt;Use &lt;strong&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dorianborian/sesame-robot/main/software/sesame-studio/README.md&quot;&gt;Sesame Studio&lt;/a&gt;&lt;/strong&gt; to visually design poses and sequences for your robot.&lt;/p&gt; 
&lt;img width=&quot;100%&quot; height=&quot;728&quot; alt=&quot;sesame-wakeup-gif&quot; src=&quot;https://github.com/user-attachments/assets/a4951195-4253-40a4-a87d-d14fad57ff5f&quot; /&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Software &amp;amp; Firmware&lt;/h2&gt; 
&lt;h3&gt;Sesame Studio&lt;/h3&gt; 
&lt;p&gt;Sesame Studio is a standalone desktop application included in &lt;code&gt;software/sesame-studio/&lt;/code&gt;. It allows you to:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Visually pose the robot using a schematic interface.&lt;/li&gt; 
 &lt;li&gt;Generate C++ code for servo angles automatically.&lt;/li&gt; 
 &lt;li&gt;Sequence frames into complex animations.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dorianborian/sesame-robot/main/software/sesame-studio/README.md&quot;&gt;&lt;strong&gt;&amp;gt; Go to Sesame Studio&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h3&gt;Sesame Simulator&lt;/h3&gt; 
&lt;p&gt;The Sesame Simulator, created by Jay Li, is a Rust-based 3D simulation environment for testing Sesame&#39;s movements and kinematics in a virtual space. It features:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Physics-based Simulation:&lt;/strong&gt; Test walking and balance without hardware.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Web-based Interface:&lt;/strong&gt; Run the simulator directly in your browser.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;URDF Integration:&lt;/strong&gt; Accurate modeling of Sesame&#39;s physical properties.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;a href=&quot;https://one-for-all.github.io/sesame-robot-sim/&quot;&gt;&lt;strong&gt;&amp;gt; Go to Sesame Simulator&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h3&gt;Sesame Companion App&lt;/h3&gt; 
&lt;p&gt;The Sesame Companion App is a Python-based application that enables advanced control and interaction with your robot over your local network. It leverages the new JSON API and network mode features to provide:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Voice Assistant Integration:&lt;/strong&gt; Control Sesame with voice commands and see real-time emotional expressions.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Remote Control:&lt;/strong&gt; Command your robot from anywhere on your local network.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Face Control:&lt;/strong&gt; Change expressions dynamically based on conversation or context.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;API Examples:&lt;/strong&gt; Reference implementation for building your own integrations.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The Companion App works with robots running the latest firmware with network mode enabled.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://github.com/dorianborian/sesame-companion-app&quot;&gt;&lt;strong&gt;&amp;gt; Go to Sesame Companion App Repository&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h3&gt;Firmware&lt;/h3&gt; 
&lt;p&gt;The ESP32 firmware (&lt;code&gt;sesame-firmware-main.ino&lt;/code&gt;) handles the kinematics, face display, and WiFi control interface.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Web UI:&lt;/strong&gt; Control the robot from your phone via the built-in Access Point.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Custom Faces:&lt;/strong&gt; Add your own bitmaps (guide in firmware docs).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dorianborian/sesame-robot/main/firmware/README.md&quot;&gt;&lt;strong&gt;&amp;gt; Go to Firmware Docs&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;hr /&gt; 
&lt;h2&gt;Contributing&lt;/h2&gt; 
&lt;p&gt;This robot is a platform for building new features, cosmetics, tools, and ideas. Since the current firmware is a basic implementation, pull requests are very welcome for:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Kinematics improvements&lt;/li&gt; 
 &lt;li&gt;New animations&lt;/li&gt; 
 &lt;li&gt;Improved Web UI/UX&lt;/li&gt; 
 &lt;li&gt;Sensor integration (Ultrasonic, Gyro, etc.)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;I would also love to see forks of this project with new hardware, software, faces, etc. Be sure to send me a message if you end up building one, and I might feature you on my website or channel!&lt;/p&gt; 
&lt;hr /&gt; 
&lt;p&gt;&lt;em&gt;Created by &lt;a href=&quot;https://www.doriantodd.com/&quot;&gt;Dorian Todd&lt;/a&gt;. Need help with your Sesame Robot? Send me a message on Discord, my username is &quot;starphee&quot;&lt;/em&gt;&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/d05aa40794d88d23bd7005d536646aba482c866ad5c8bf902096a0b37cc155e1/dorianborian/sesame-robot" medium="image" />
      
    </item>
    
    <item>
      <title>valkey-io/valkey</title>
      <link>https://github.com/valkey-io/valkey</link>
      <description>&lt;p&gt;A flexible distributed key-value database that is optimized for caching and other realtime workloads.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;a href=&quot;https://codecov.io/gh/valkey-io/valkey&quot;&gt;&lt;img src=&quot;https://codecov.io/gh/valkey-io/valkey/graph/badge.svg?token=KYYSJAYC5F&quot; alt=&quot;codecov&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://securityscorecards.dev/viewer/?uri=github.com/valkey-io/valkey&quot;&gt;&lt;img src=&quot;https://api.securityscorecards.dev/projects/github.com/valkey-io/valkey/badge&quot; alt=&quot;OpenSSF Scorecard&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;This project was forked from the open source Redis project right before the transition to their new source available licenses.&lt;/p&gt; 
&lt;p&gt;This README is just a fast &lt;em&gt;quick start&lt;/em&gt; document. More details can be found under &lt;a href=&quot;https://valkey.io/&quot;&gt;valkey.io&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;What is Valkey?&lt;/h1&gt; 
&lt;p&gt;Valkey is a high-performance data structure server that primarily serves key/value workloads. It supports a wide range of native structures and an extensible plugin system for adding new data structures and access patterns.&lt;/p&gt; 
&lt;h1&gt;Building Valkey using &lt;code&gt;Makefile&lt;/code&gt;&lt;/h1&gt; 
&lt;p&gt;Valkey can be compiled and used on Linux, macOS, OpenBSD, NetBSD, FreeBSD. We support big endian and little endian architectures, and both 32 bit and 64 bit systems.&lt;/p&gt; 
&lt;p&gt;It may compile on Solaris derived systems (for instance SmartOS) but our support for this platform is &lt;em&gt;best effort&lt;/em&gt; and Valkey is not guaranteed to work as well as in Linux, macOS, and *BSD.&lt;/p&gt; 
&lt;p&gt;It is as simple as:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To build with TLS support, you&#39;ll need OpenSSL development libraries (e.g. libssl-dev on Debian/Ubuntu).&lt;/p&gt; 
&lt;p&gt;To build TLS support as Valkey built-in:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make BUILD_TLS=yes
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To build TLS as Valkey module:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make BUILD_TLS=module
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Note that sentinel mode does not support TLS module.&lt;/p&gt; 
&lt;p&gt;To build with experimental RDMA support you&#39;ll need RDMA development libraries (e.g. librdmacm-dev and libibverbs-dev on Debian/Ubuntu).&lt;/p&gt; 
&lt;p&gt;To build RDMA support as Valkey built-in:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make BUILD_RDMA=yes
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To build RDMA as Valkey module:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make BUILD_RDMA=module
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To build with systemd support, you&#39;ll need systemd development libraries (such as libsystemd-dev on Debian/Ubuntu or systemd-devel on CentOS) and run:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make USE_SYSTEMD=yes
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To build with enhanced stack traces that include file names and line numbers for all functions (including static functions), use libbacktrace:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make USE_LIBBACKTRACE=yes
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To build Valkey without the Lua engine:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make BUILD_LUA=no
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To append a suffix to Valkey program names, use:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make PROG_SUFFIX=&quot;-alt&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can build a 32 bit Valkey binary using:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make 32bit
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;After building Valkey, it is a good idea to test it using:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make test
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The above runs the main integration tests. Additional tests are started using:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make test-unit     # Unit tests
% make test-modules  # Tests of the module API
% make test-sentinel # Valkey Sentinel integration tests
% make test-cluster  # Valkey Cluster integration tests
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;More about running the integration tests can be found in &lt;a href=&quot;https://raw.githubusercontent.com/valkey-io/valkey/unstable/tests/README.md&quot;&gt;tests/README.md&lt;/a&gt; and for unit tests, see &lt;a href=&quot;https://raw.githubusercontent.com/valkey-io/valkey/unstable/src/unit/README.md&quot;&gt;src/unit/README.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Performance monitoring&lt;/h2&gt; 
&lt;p&gt;Valkey Performance Dashboards provide a consolidated view of throughput trends across versions, helping contributors validate improvements and identify regressions quickly.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://valkey.io/performance/&quot;&gt;Performance Overview&lt;/a&gt; - Compare throughput across Valkey versions&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://perf-dashboard.valkey.io/public-dashboards/3e45bf8ded3043edaa941331cd1a94e2&quot;&gt;Unstable Branch Dashboard&lt;/a&gt; - Track performance of all commits in the unstable branch&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Fixing build problems with dependencies or cached build options&lt;/h2&gt; 
&lt;p&gt;Valkey has some dependencies which are included in the &lt;code&gt;deps&lt;/code&gt; directory. &lt;code&gt;make&lt;/code&gt; does not automatically rebuild dependencies even if something in the source code of dependencies changes.&lt;/p&gt; 
&lt;p&gt;When you update the source code with &lt;code&gt;git pull&lt;/code&gt; or when code inside the dependencies tree is modified in any other way, make sure to use the following command in order to really clean everything and rebuild from scratch:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make distclean
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This will clean: jemalloc, lua, libvalkey, linenoise and other dependencies.&lt;/p&gt; 
&lt;p&gt;Also if you force certain build options like 32bit target, no C compiler optimizations (for debugging purposes), and other similar build time options, those options are cached indefinitely until you issue a &lt;code&gt;make distclean&lt;/code&gt; command.&lt;/p&gt; 
&lt;h2&gt;Fixing problems building 32 bit binaries&lt;/h2&gt; 
&lt;p&gt;If after building Valkey with a 32 bit target you need to rebuild it with a 64 bit target, or the other way around, you need to perform a &lt;code&gt;make distclean&lt;/code&gt; in the root directory of the Valkey distribution.&lt;/p&gt; 
&lt;p&gt;In case of build errors when trying to build a 32 bit binary of Valkey, try the following steps:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Install the package libc6-dev-i386 (also try g++-multilib).&lt;/li&gt; 
 &lt;li&gt;Try using the following command line instead of &lt;code&gt;make 32bit&lt;/code&gt;: &lt;code&gt;make CFLAGS=&quot;-m32 -march=native&quot; LDFLAGS=&quot;-m32&quot;&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Allocator&lt;/h2&gt; 
&lt;p&gt;Selecting a non-default memory allocator when building Valkey is done by setting the &lt;code&gt;MALLOC&lt;/code&gt; environment variable. Valkey is compiled and linked against libc malloc by default, with the exception of jemalloc being the default on Linux systems. This default was picked because jemalloc has proven to have fewer fragmentation problems than libc malloc.&lt;/p&gt; 
&lt;p&gt;To force compiling against libc malloc, use:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make MALLOC=libc
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To compile against jemalloc on Mac OS X systems, use:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make MALLOC=jemalloc
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Monotonic clock&lt;/h2&gt; 
&lt;p&gt;By default, Valkey uses the processor&#39;s internal instruction clock (TSC on x86, CNTVCT on ARM) for monotonic time tracking, which provides approximately 3x faster time access compared to POSIX clock_gettime (~10-30ns vs ~100ns). This is enabled by default on supported architectures (x86_64 Linux and aarch64) and automatically falls back to POSIX clock_gettime on unsupported systems.&lt;/p&gt; 
&lt;p&gt;For more information about processor clock usage, see: &lt;a href=&quot;http://oliveryang.net/2015/09/pitfalls-of-TSC-usage/&quot;&gt;http://oliveryang.net/2015/09/pitfalls-of-TSC-usage/&lt;/a&gt;&lt;/p&gt; 
&lt;p&gt;To disable the processor clock and force POSIX clock_gettime, use:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make CFLAGS=&quot;-DNO_PROCESSOR_CLOCK&quot;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Verbose build&lt;/h2&gt; 
&lt;p&gt;Valkey will build with a user-friendly colorized output by default. If you want to see a more verbose output, use the following:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make V=1
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1&gt;Running Valkey&lt;/h1&gt; 
&lt;p&gt;To run Valkey with the default configuration, just type:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% cd src
% ./valkey-server
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you want to provide your valkey.conf, you have to run it using an additional parameter (the path of the configuration file):&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% cd src
% ./valkey-server /path/to/valkey.conf
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;It is possible to alter the Valkey configuration by passing parameters directly as options using the command line. Examples:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% ./valkey-server --port 9999 --replicaof 127.0.0.1 6379
% ./valkey-server /etc/valkey/6379.conf --loglevel debug
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;All the options in valkey.conf are also supported as options using the command line, with exactly the same name.&lt;/p&gt; 
&lt;h1&gt;Running Valkey with TLS:&lt;/h1&gt; 
&lt;h2&gt;Running manually&lt;/h2&gt; 
&lt;p&gt;To manually run a Valkey server with TLS mode (assuming &lt;code&gt;./utils/gen-test-certs.sh&lt;/code&gt; was invoked so sample certificates/keys are available):&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;TLS built-in mode:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;./src/valkey-server --tls-port 6379 --port 0 \
    --tls-cert-file ./tests/tls/valkey.crt \
    --tls-key-file ./tests/tls/valkey.key \
    --tls-ca-cert-file ./tests/tls/ca.crt
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;TLS module mode:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;./src/valkey-server --tls-port 6379 --port 0 \
    --tls-cert-file ./tests/tls/valkey.crt \
    --tls-key-file ./tests/tls/valkey.key \
    --tls-ca-cert-file ./tests/tls/ca.crt \
    --loadmodule src/valkey-tls.so
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Note that you can disable TCP by specifying &lt;code&gt;--port 0&lt;/code&gt; explicitly. It&#39;s also possible to have both TCP and TLS available at the same time, but you&#39;ll have to assign different ports.&lt;/p&gt; 
&lt;p&gt;Use &lt;code&gt;valkey-cli&lt;/code&gt; to connect to the Valkey server:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;./src/valkey-cli --tls \
    --cert ./tests/tls/valkey.crt \
    --key ./tests/tls/valkey.key \
    --cacert ./tests/tls/ca.crt
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Specifying &lt;code&gt;--tls-replication yes&lt;/code&gt; makes a replica connect to the primary.&lt;/p&gt; 
&lt;p&gt;Using &lt;code&gt;--tls-cluster yes&lt;/code&gt; makes Valkey Cluster use TLS across nodes.&lt;/p&gt; 
&lt;h1&gt;Running Valkey with RDMA:&lt;/h1&gt; 
&lt;p&gt;Note that Valkey Over RDMA is an experimental feature. It may be changed or removed in any minor or major version. Currently, it is only supported on Linux.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; &lt;p&gt;RDMA built-in mode:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;./src/valkey-server --protected-mode no \
     --rdma-bind 192.168.122.100 --rdma-port 6379
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;RDMA module mode:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;./src/valkey-server --protected-mode no \
     --loadmodule src/valkey-rdma.so --rdma-bind 192.168.122.100 --rdma-port 6379
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;It&#39;s possible to change bind address/port of RDMA by runtime command:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;192.168.122.100:6379&amp;gt; CONFIG SET rdma-port 6380
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;It&#39;s also possible to have both RDMA and TCP available, and there is no conflict of TCP(6379) and RDMA(6379), Ex:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% ./src/valkey-server --protected-mode no \
     --loadmodule src/valkey-rdma.so --rdma-bind 192.168.122.100 --rdma-port 6379 \
     --port 6379
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Note that the network card (192.168.122.100 of this example) should support RDMA. To test a server supports RDMA or not:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% rdma res show (a new version iproute2 package)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Or:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% ibv_devices
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1&gt;Playing with Valkey&lt;/h1&gt; 
&lt;p&gt;You can use valkey-cli to play with Valkey. Start a valkey-server instance, then in another terminal try the following:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% cd src
% ./valkey-cli
valkey&amp;gt; ping
PONG
valkey&amp;gt; set foo bar
OK
valkey&amp;gt; get foo
&quot;bar&quot;
valkey&amp;gt; incr mycounter
(integer) 1
valkey&amp;gt; incr mycounter
(integer) 2
valkey&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;h1&gt;Installing Valkey&lt;/h1&gt; 
&lt;p&gt;In order to install Valkey binaries into /usr/local/bin, just use:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% make install
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can use &lt;code&gt;make PREFIX=/some/other/directory install&lt;/code&gt; if you wish to use a different destination.&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: For compatibility with Redis, we create symlinks from the Redis names (&lt;code&gt;redis-server&lt;/code&gt;, &lt;code&gt;redis-cli&lt;/code&gt;, etc.) to the Valkey binaries installed by &lt;code&gt;make install&lt;/code&gt;. The symlinks are created in same directory as the Valkey binaries. The symlinks are removed when using &lt;code&gt;make uninstall&lt;/code&gt;. The creation of the symlinks can be skipped by setting the makefile variable &lt;code&gt;USE_REDIS_SYMLINKS=no&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;make install&lt;/code&gt; will just install binaries in your system, but will not configure init scripts and configuration files in the appropriate place. This is not needed if you just want to play a bit with Valkey, but if you are installing it the proper way for a production system, we have a script that does this for Ubuntu and Debian systems:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;% cd utils
% ./install_server.sh
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: &lt;code&gt;install_server.sh&lt;/code&gt; will not work on macOS; it is built for Linux only.&lt;/p&gt; 
&lt;p&gt;The script will ask you a few questions and will setup everything you need to run Valkey properly as a background daemon that will start again on system reboots.&lt;/p&gt; 
&lt;p&gt;You&#39;ll be able to stop and start Valkey using the script named &lt;code&gt;/etc/init.d/valkey_&amp;lt;portnumber&amp;gt;&lt;/code&gt;, for instance &lt;code&gt;/etc/init.d/valkey_6379&lt;/code&gt;.&lt;/p&gt; 
&lt;h1&gt;Building using &lt;code&gt;CMake&lt;/code&gt;&lt;/h1&gt; 
&lt;p&gt;In addition to the traditional &lt;code&gt;Makefile&lt;/code&gt; build, Valkey supports an alternative, &lt;strong&gt;experimental&lt;/strong&gt;, build system using &lt;code&gt;CMake&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;To build and install &lt;code&gt;Valkey&lt;/code&gt;, in &lt;code&gt;Release&lt;/code&gt; mode (an optimized build), type this into your terminal:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir build-release
cd $_
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/valkey
sudo make install
# Valkey is now installed under /opt/valkey
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Other options supported by Valkey&#39;s &lt;code&gt;CMake&lt;/code&gt; build system:&lt;/p&gt; 
&lt;h2&gt;Special build flags&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;-DBUILD_TLS=&amp;lt;yes|no&amp;gt;&lt;/code&gt; enable TLS build for Valkey. Default: &lt;code&gt;no&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-DBUILD_RDMA=&amp;lt;no|module&amp;gt;&lt;/code&gt; enable RDMA module build (only module mode supported). Default: &lt;code&gt;no&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-DBUILD_MALLOC=&amp;lt;libc|jemalloc|tcmalloc|tcmalloc_minimal&amp;gt;&lt;/code&gt; choose the allocator to use. Default on Linux: &lt;code&gt;jemalloc&lt;/code&gt;, for other OS: &lt;code&gt;libc&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-DBUILD_SANITIZER=&amp;lt;address|thread|undefined&amp;gt;&lt;/code&gt; build with address sanitizer enabled. Default: disabled (no sanitizer)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-DBUILD_UNIT_GTESTS=[yes|no]&lt;/code&gt; when set, the build will produce unit tests executable &lt;code&gt;valkey-unit-gtests&lt;/code&gt;. Default: &lt;code&gt;no&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-DBUILD_TEST_MODULES=[yes|no]&lt;/code&gt; when set, the build will include the modules located under the &lt;code&gt;tests/modules&lt;/code&gt; folder. Default: &lt;code&gt;no&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-DBUILD_EXAMPLE_MODULES=[yes|no]&lt;/code&gt; when set, the build will include the example modules located under the &lt;code&gt;src/modules&lt;/code&gt; folder. Default: &lt;code&gt;no&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Common flags&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;-DCMAKE_BUILD_TYPE=&amp;lt;Debug|Release...&amp;gt;&lt;/code&gt; define the build type, see CMake manual for more details&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-DCMAKE_INSTALL_PREFIX=/installation/path&lt;/code&gt; override this value to define a custom install prefix. Default: &lt;code&gt;/usr/local&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-G&quot;&amp;lt;Generator Name&amp;gt;&quot;&lt;/code&gt; generate build files for &quot;Generator Name&quot;. By default, CMake will generate &lt;code&gt;Makefile&lt;/code&gt;s.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Verbose build&lt;/h2&gt; 
&lt;p&gt;&lt;code&gt;CMake&lt;/code&gt; generates a user-friendly colorized output by default. If you want to see a more verbose output, use the following:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;make VERBOSE=1
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Troubleshooting&lt;/h2&gt; 
&lt;p&gt;During the &lt;code&gt;CMake&lt;/code&gt; stage, &lt;code&gt;CMake&lt;/code&gt; caches variables in a local file named &lt;code&gt;CMakeCache.txt&lt;/code&gt;. All variables generated by Valkey are removed from the cache once consumed (this is done by calling to &lt;code&gt;unset(VAR-NAME CACHE)&lt;/code&gt;). However, some variables, like the compiler path, are kept in cache. To start a fresh build either remove the cache file &lt;code&gt;CMakeCache.txt&lt;/code&gt; from the build folder, or delete the build folder completely.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;It is important to re-run &lt;code&gt;CMake&lt;/code&gt; when adding new source files.&lt;/strong&gt;&lt;/p&gt; 
&lt;h2&gt;Integration with IDE&lt;/h2&gt; 
&lt;p&gt;During the &lt;code&gt;CMake&lt;/code&gt; stage of the build, &lt;code&gt;CMake&lt;/code&gt; generates a JSON file named &lt;code&gt;compile_commands.json&lt;/code&gt; and places it under the build folder. This file is used by many IDEs and text editors for providing code completion (via &lt;code&gt;clangd&lt;/code&gt;).&lt;/p&gt; 
&lt;p&gt;A small caveat is that these tools will look for &lt;code&gt;compile_commands.json&lt;/code&gt; under the Valkey&#39;s top folder. A common workaround is to create a symbolic link to it:&lt;/p&gt; 
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /path/to/valkey/
# We assume here that your build folder is `build-release`
ln -sf $(pwd)/build-release/compile_commands.json $(pwd)/compile_commands.json
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Restart your IDE and voila&lt;/p&gt; 
&lt;h1&gt;Code contributions&lt;/h1&gt; 
&lt;p&gt;Please see the &lt;a href=&quot;https://github.com/valkey-io/valkey/raw/unstable/CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt;. For security bugs and vulnerabilities, please see &lt;a href=&quot;https://github.com/valkey-io/valkey/raw/unstable/SECURITY.md&quot;&gt;SECURITY.md&lt;/a&gt;.&lt;/p&gt; 
&lt;h1&gt;Valkey is an open community project under LF Projects&lt;/h1&gt; 
&lt;p&gt;Valkey a Series of LF Projects, LLC 2810 N Church St, PMB 57274 Wilmington, Delaware 19802-4447&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/5e0b16c090ded941e2e3fe418d8facd1042212ff8c958ba29514edebb977e2a7/valkey-io/valkey" medium="image" />
      
    </item>
    
    <item>
      <title>openzfs/zfs</title>
      <link>https://github.com/openzfs/zfs</link>
      <description>&lt;p&gt;OpenZFS on Linux and FreeBSD&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;img src=&quot;https://openzfs.github.io/openzfs-docs/_static/img/logo/480px-Open-ZFS-Secondary-Logo-Colour-halfsize.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt; 
&lt;p&gt;OpenZFS is an advanced file system and volume manager which was originally developed for Solaris and is now maintained by the OpenZFS community. This repository contains the code for running OpenZFS on Linux and FreeBSD.&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;https://codecov.io/gh/openzfs/zfs&quot;&gt;&lt;img src=&quot;https://codecov.io/gh/openzfs/zfs/branch/master/graph/badge.svg?sanitize=true&quot; alt=&quot;codecov&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://scan.coverity.com/projects/openzfs-zfs&quot;&gt;&lt;img src=&quot;https://scan.coverity.com/projects/1973/badge.svg?sanitize=true&quot; alt=&quot;coverity&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;Official Resources&lt;/h1&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href=&quot;https://openzfs.github.io/openzfs-docs/&quot;&gt;Documentation&lt;/a&gt; - for using and developing this repo&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://zfsonlinux.org&quot;&gt;ZoL site&lt;/a&gt; - Linux release info &amp;amp; links&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://openzfs.github.io/openzfs-docs/Project%20and%20Community/Mailing%20Lists.html&quot;&gt;Mailing lists&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href=&quot;https://openzfs.org/&quot;&gt;OpenZFS site&lt;/a&gt; - for conference videos and info on other platforms (illumos, OSX, Windows, etc)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Installation&lt;/h1&gt; 
&lt;p&gt;Full documentation for installing OpenZFS on your favorite operating system can be found at the &lt;a href=&quot;https://openzfs.github.io/openzfs-docs/Getting%20Started/index.html&quot;&gt;Getting Started Page&lt;/a&gt;.&lt;/p&gt; 
&lt;h1&gt;Contribute &amp;amp; Develop&lt;/h1&gt; 
&lt;p&gt;We have a separate document with &lt;a href=&quot;https://raw.githubusercontent.com/openzfs/zfs/master/.github/CONTRIBUTING.md&quot;&gt;contribution guidelines&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;We have a &lt;a href=&quot;https://raw.githubusercontent.com/openzfs/zfs/master/CODE_OF_CONDUCT.md&quot;&gt;Code of Conduct&lt;/a&gt;.&lt;/p&gt; 
&lt;h1&gt;Release&lt;/h1&gt; 
&lt;p&gt;OpenZFS is released under a CDDL license. For more details see the NOTICE, LICENSE and COPYRIGHT files; &lt;code&gt;UCRL-CODE-235197&lt;/code&gt;&lt;/p&gt; 
&lt;h1&gt;Supported Kernels and Distributions&lt;/h1&gt; 
&lt;h2&gt;Linux&lt;/h2&gt; 
&lt;p&gt;Given the wide variety of Linux environments, we prioritize development and testing on stable, supported kernels and distributions.&lt;/p&gt; 
&lt;h3&gt;Kernel (&lt;a href=&quot;https://kernel.org&quot;&gt;kernel.org&lt;/a&gt;)&lt;/h3&gt; 
&lt;p&gt;All &lt;strong&gt;longterm&lt;/strong&gt; kernels from &lt;a href=&quot;https://kernel.org&quot;&gt;kernel.org&lt;/a&gt; are supported. &lt;strong&gt;stable&lt;/strong&gt; kernels are usually supported in the next OpenZFS release.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Supported longterm kernels&lt;/strong&gt;: &lt;strong&gt;6.18&lt;/strong&gt;, &lt;strong&gt;6.12&lt;/strong&gt;, &lt;strong&gt;6.6&lt;/strong&gt;, &lt;strong&gt;6.1&lt;/strong&gt;, &lt;strong&gt;5.15&lt;/strong&gt;, &lt;strong&gt;5.10&lt;/strong&gt;.&lt;/p&gt; 
&lt;h3&gt;Red Hat Enterprise Linux (RHEL)&lt;/h3&gt; 
&lt;p&gt;All RHEL (and compatible systems: AlmaLinux OS, Rocky Linux, etc) on the &lt;strong&gt;full&lt;/strong&gt; or &lt;strong&gt;maintenance&lt;/strong&gt; support tracks are supported.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Supported RHEL releases&lt;/strong&gt;: &lt;strong&gt;8.10&lt;/strong&gt;, &lt;strong&gt;9.7&lt;/strong&gt;, &lt;strong&gt;10.1&lt;/strong&gt;.&lt;/p&gt; 
&lt;h3&gt;Ubuntu&lt;/h3&gt; 
&lt;p&gt;All Ubuntu &lt;strong&gt;LTS&lt;/strong&gt; releases are supported.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Supported Ubuntu releases&lt;/strong&gt;: &lt;strong&gt;24.04 “Noble”&lt;/strong&gt;, &lt;strong&gt;22.04 “Jammy”&lt;/strong&gt;.&lt;/p&gt; 
&lt;h3&gt;Debian&lt;/h3&gt; 
&lt;p&gt;All Debian &lt;strong&gt;stable&lt;/strong&gt; and &lt;strong&gt;LTS&lt;/strong&gt; releases are supported.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Supported Debian releases&lt;/strong&gt;: &lt;strong&gt;13 “Trixie”&lt;/strong&gt;, &lt;strong&gt;12 “Bookworm”&lt;/strong&gt;, &lt;strong&gt;11 “Bullseye”&lt;/strong&gt;.&lt;/p&gt; 
&lt;h3&gt;Other Distributions&lt;/h3&gt; 
&lt;p&gt;Generally, if a distribution is following an LTS kernel, it should work well with OpenZFS.&lt;/p&gt; 
&lt;h2&gt;FreeBSD&lt;/h2&gt; 
&lt;p&gt;All FreeBSD releases receiving &lt;a href=&quot;https://www.freebsd.org/security/#sup&quot;&gt;security support&lt;/a&gt; are supported by OpenZFS.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Supported FreeBSD releases&lt;/strong&gt;: &lt;strong&gt;15.0&lt;/strong&gt;, &lt;strong&gt;14.4&lt;/strong&gt;, &lt;strong&gt;13.5&lt;/strong&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/437011/9b105700-57c3-11ea-98bb-79fbe7aa1db6" medium="image" />
      
    </item>
    
    <item>
      <title>eclipse-mosquitto/mosquitto</title>
      <link>https://github.com/eclipse-mosquitto/mosquitto</link>
      <description>&lt;p&gt;Eclipse Mosquitto - An open source MQTT broker&lt;/p&gt;&lt;hr&gt;&lt;h1&gt;Eclipse Mosquitto&lt;/h1&gt; 
&lt;p&gt;Mosquitto is an open source implementation of a server for version 5.0, 3.1.1, and 3.1 of the MQTT protocol. It also includes a C and C++ client library, the &lt;code&gt;mosquitto_pub&lt;/code&gt; &lt;code&gt;mosquitto_rr&lt;/code&gt;, and &lt;code&gt;mosquitto_sub&lt;/code&gt; utilities for publishing and subscribing, and the &lt;code&gt;mosquitto_ctrl&lt;/code&gt;, &lt;code&gt;mosquitto_signal&lt;/code&gt;, and &lt;code&gt;mosquitto_passwd&lt;/code&gt; applications for helping administer the broker.&lt;/p&gt; 
&lt;h2&gt;Links&lt;/h2&gt; 
&lt;p&gt;See the following links for more information on MQTT:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Community page: &lt;a href=&quot;http://mqtt.org/&quot;&gt;http://mqtt.org/&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;MQTT v3.1.1 standard: &lt;a href=&quot;https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html&quot;&gt;https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;MQTT v5.0 standard: &lt;a href=&quot;https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html&quot;&gt;https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Mosquitto project information is available at the following locations:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Main homepage: &lt;a href=&quot;https://mosquitto.org/&quot;&gt;https://mosquitto.org/&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Find existing bugs or submit a new bug: &lt;a href=&quot;https://github.com/eclipse-mosquitto/mosquitto/issues&quot;&gt;https://github.com/eclipse-mosquitto/mosquitto/issues&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Source code repository: &lt;a href=&quot;https://github.com/eclipse-mosquitto/mosquitto&quot;&gt;https://github.com/eclipse-mosquitto/mosquitto&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;There is also a public test server available at &lt;a href=&quot;https://test.mosquitto.org/&quot;&gt;https://test.mosquitto.org/&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Installing&lt;/h2&gt; 
&lt;p&gt;See &lt;a href=&quot;https://mosquitto.org/download/&quot;&gt;https://mosquitto.org/download/&lt;/a&gt; for details on installing binaries for various platforms.&lt;/p&gt; 
&lt;h2&gt;Quick start&lt;/h2&gt; 
&lt;p&gt;If you have installed a binary package the broker should have been started automatically. If not, it can be started with a very basic configuration:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mosquitto
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then use &lt;code&gt;mosquitto_sub&lt;/code&gt; to subscribe to a topic:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mosquitto_sub -t &#39;test/topic&#39; -v
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;And to publish a message:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;mosquitto_pub -t &#39;test/topic&#39; -m &#39;hello world&#39;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Note that starting the broker like this allows anonymous/unauthenticated access but only from the local computer, so it&#39;s only really useful for initial testing.&lt;/p&gt; 
&lt;p&gt;If you want to have clients from another computer connect, you will need to provide a configuration file. If you have installed from a binary package, you will probably already have a configuration file at somewhere like &lt;code&gt;/etc/mosquitto/mosquitto.conf&lt;/code&gt;. If you&#39;ve compiled from source, you can write your config file then run as &lt;code&gt;mosquitto -c /path/to/mosquitto.conf&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;To start your config file you define a listener and you will need to think about what authentication you require. It is not advised to run your broker with anonymous access when it is publicly available.&lt;/p&gt; 
&lt;p&gt;For details on how to do this, look at the &lt;a href=&quot;https://mosquitto.org/documentation/authentication-methods/&quot;&gt;authentication methods&lt;/a&gt; available and the &lt;a href=&quot;https://mosquitto.org/documentation/dynamic-security/&quot;&gt;dynamic security plugin&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Documentation&lt;/h2&gt; 
&lt;p&gt;Documentation for the broker, clients and client library API can be found in the man pages, which are available online at &lt;a href=&quot;https://mosquitto.org/man/&quot;&gt;https://mosquitto.org/man/&lt;/a&gt;. There are also pages with an introduction to the features of MQTT, the &lt;code&gt;mosquitto_passwd&lt;/code&gt; utility for dealing with username/passwords, and a description of the configuration file options available for the broker.&lt;/p&gt; 
&lt;p&gt;Detailed client library API documentation can be found at &lt;a href=&quot;https://mosquitto.org/api/&quot;&gt;https://mosquitto.org/api/&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Building from source&lt;/h2&gt; 
&lt;p&gt;To build from source the recommended route for end users is to download the archive from &lt;a href=&quot;https://mosquitto.org/download/&quot;&gt;https://mosquitto.org/download/&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;On Windows and Mac, use &lt;code&gt;cmake&lt;/code&gt; to build. On other platforms, just run &lt;code&gt;make&lt;/code&gt; to build. For Windows, see also &lt;code&gt;README-windows.md&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;If you are building from the git repository then the documentation will not already be built. Use &lt;code&gt;make binary&lt;/code&gt; to skip building the man pages, or install &lt;code&gt;docbook-xsl&lt;/code&gt; on Debian/Ubuntu systems.&lt;/p&gt; 
&lt;h3&gt;Build Dependencies&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;cJSON - required&lt;/li&gt; 
 &lt;li&gt;c-ares (libc-ares-dev on Debian based systems) - optional, enable with &lt;code&gt;WITH_SRV=yes&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;libedit - for mosquitto_ctrl interactive shell - optional, disable with &lt;code&gt;WITH_EDITLINE=no&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;libmicrohttpd - for broker http api support - optional, disable with &lt;code&gt;WITH_HTTP_API=no&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;openssl (libssl-dev on Debian based systems) - optional, disable with &lt;code&gt;WITH_TLS=no&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;pthreads - for client library thread support. This is required to support the &lt;code&gt;mosquitto_loop_start()&lt;/code&gt; and &lt;code&gt;mosquitto_loop_stop()&lt;/code&gt; functions. If compiled without pthread support, the library isn&#39;t guaranteed to be thread safe.&lt;/li&gt; 
 &lt;li&gt;sqlite3 - for persistence support in the broker - optional, disable with &lt;code&gt;WITH_SQLITE=no&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;uthash / utlist - bundled versions of these headers are provided, disable their use with &lt;code&gt;WITH_BUNDLED_DEPS=no&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;xsltproc (xsltproc and docbook-xsl on Debian based systems) - only needed when building from git sources - disable with &lt;code&gt;WITH_DOCS=no&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Equivalent options for enabling/disabling features are available when using the CMake build. It is also possible to enable/disable building of specific plugins in the CMake build.&lt;/p&gt; 
&lt;h3&gt;Building mosquitto - Using vcpkg&lt;/h3&gt; 
&lt;p&gt;You can download and install mosquitto using the &lt;a href=&quot;https://github.com/Microsoft/vcpkg&quot;&gt;vcpkg&lt;/a&gt; dependency manager:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install mosquitto
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The mosquitto port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please &lt;a href=&quot;https://github.com/Microsoft/vcpkg&quot;&gt;create an issue or pull request&lt;/a&gt; on the vcpkg repository.&lt;/p&gt; 
&lt;h2&gt;Credits&lt;/h2&gt; 
&lt;p&gt;Mosquitto was written by Roger Light &lt;a href=&quot;mailto:roger@atchoo.org&quot;&gt;roger@atchoo.org&lt;/a&gt;. There have been substantial contributions by other people in the community both in terms of code and other help.&lt;/p&gt;</description>
      
      <media:content url="https://repository-images.githubusercontent.com/53614190/b11dd480-90b3-11eb-903d-8c48f62e3172" medium="image" />
      
    </item>
    
    <item>
      <title>robertdavidgraham/masscan</title>
      <link>https://github.com/robertdavidgraham/masscan</link>
      <description>&lt;p&gt;TCP port scanner, spews SYN packets asynchronously, scanning entire Internet in under 5 minutes.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/robertdavidgraham/masscan/actions/workflows/unittests.yml/?branch=master&quot;&gt;&lt;img src=&quot;https://github.com/robertdavidgraham/masscan/actions/workflows/unittests.yml/badge.svg?branch=master&quot; alt=&quot;unittests&quot; /&gt;&lt;/a&gt;&lt;/p&gt; 
&lt;h1&gt;MASSCAN: Mass IP port scanner&lt;/h1&gt; 
&lt;p&gt;This is an Internet-scale port scanner. It can scan the entire Internet in under 5 minutes, transmitting 10 million packets per second, from a single machine.&lt;/p&gt; 
&lt;p&gt;Its usage (parameters, output) is similar to &lt;code&gt;nmap&lt;/code&gt;, the most famous port scanner. When in doubt, try one of those features -- features that support widespread scanning of many machines are supported, while in-depth scanning of single machines aren&#39;t.&lt;/p&gt; 
&lt;p&gt;Internally, it uses asynchronous transmission, similar to port scanners like &lt;code&gt;scanrand&lt;/code&gt;, &lt;code&gt;unicornscan&lt;/code&gt;, and &lt;code&gt;ZMap&lt;/code&gt;. It&#39;s more flexible, allowing arbitrary port and address ranges.&lt;/p&gt; 
&lt;p&gt;NOTE: masscan uses its own &lt;strong&gt;ad hoc TCP/IP stack&lt;/strong&gt;. Anything other than simple port scans may cause conflict with the local TCP/IP stack. This means you need to use either the &lt;code&gt;--src-ip&lt;/code&gt; option to run from a different IP address, or use &lt;code&gt;--src-port&lt;/code&gt; to configure which source ports masscan uses, then also configure the internal firewall (like &lt;code&gt;pf&lt;/code&gt; or &lt;code&gt;iptables&lt;/code&gt;) to firewall those ports from the rest of the operating system.&lt;/p&gt; 
&lt;p&gt;This tool is free, but consider contributing money to its development: Bitcoin wallet address: 1MASSCANaHUiyTtR3bJ2sLGuMw5kDBaj4T&lt;/p&gt; 
&lt;h1&gt;Building&lt;/h1&gt; 
&lt;p&gt;On Debian/Ubuntu, it goes something like the following. It doesn&#39;t really have any dependencies other than a C compiler (such as &lt;code&gt;gcc&lt;/code&gt; or &lt;code&gt;clang&lt;/code&gt;).&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This puts the program in the &lt;code&gt;masscan/bin&lt;/code&gt; subdirectory. To install it (on Linux) run:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;make install
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The source consists of a lot of small files, so building goes a lot faster by using the multi-threaded build. This requires more than 2gigs on a Raspberry Pi (and breaks), so you might use a smaller number, like &lt;code&gt;-j4&lt;/code&gt; rather than all possible threads.&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;make -j
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;While Linux is the primary target platform, the code runs well on many other systems (Windows, macOS, etc.). Here&#39;s some additional build info:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Windows w/ Visual Studio: use the VS10 project&lt;/li&gt; 
 &lt;li&gt;Windows w/ MinGW: just type &lt;code&gt;make&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Windows w/ cygwin: won&#39;t work&lt;/li&gt; 
 &lt;li&gt;Mac OS X /w XCode: use the XCode4 project&lt;/li&gt; 
 &lt;li&gt;Mac OS X /w cmdline: just type &lt;code&gt;make&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;FreeBSD: type &lt;code&gt;gmake&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;other: try just compiling all the files together, &lt;code&gt;cc src/*.c -o bin/masscan&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;On macOS, the x86 binaries seem to work just as fast under ARM emulation.&lt;/p&gt; 
&lt;h1&gt;Usage&lt;/h1&gt; 
&lt;p&gt;Usage is similar to &lt;code&gt;nmap&lt;/code&gt;. To scan a network segment for some ports:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This will:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;scan the &lt;code&gt;10.x.x.x&lt;/code&gt; subnet, and &lt;code&gt;2603:3001:2d00:da00::x&lt;/code&gt; subnets&lt;/li&gt; 
 &lt;li&gt;scans port 80 and the range 8000 to 8100, or 102 ports total, on both subnets&lt;/li&gt; 
 &lt;li&gt;print output to &lt;code&gt;&amp;lt;stdout&amp;gt;&lt;/code&gt; that can be redirected to a file&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;To see the complete list of options, use the &lt;code&gt;--echo&lt;/code&gt; feature. This dumps the current configuration and exits. This output can be used as input back into the program:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo &amp;gt; xxx.conf
# masscan -c xxx.conf --rate 1000
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Banner checking&lt;/h2&gt; 
&lt;p&gt;Masscan can do more than just detect whether ports are open. It can also complete the TCP connection and interaction with the application at that port in order to grab simple &quot;banner&quot; information.&lt;/p&gt; 
&lt;p&gt;Masscan supports banner checking on the following protocols:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;FTP&lt;/li&gt; 
 &lt;li&gt;HTTP&lt;/li&gt; 
 &lt;li&gt;IMAP4&lt;/li&gt; 
 &lt;li&gt;memcached&lt;/li&gt; 
 &lt;li&gt;POP3&lt;/li&gt; 
 &lt;li&gt;SMTP&lt;/li&gt; 
 &lt;li&gt;SSH&lt;/li&gt; 
 &lt;li&gt;SSL&lt;/li&gt; 
 &lt;li&gt;SMBv1&lt;/li&gt; 
 &lt;li&gt;SMBv2&lt;/li&gt; 
 &lt;li&gt;Telnet&lt;/li&gt; 
 &lt;li&gt;RDP&lt;/li&gt; 
 &lt;li&gt;VNC&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The problem with this is that masscan contains its own TCP/IP stack separate from the system you run it on. When the local system receives a SYN-ACK from the probed target, it responds with a RST packet that kills the connection before masscan can grab the banner.&lt;/p&gt; 
&lt;p&gt;The easiest way to prevent this is to assign masscan a separate IP address. This would look like one of the following examples:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
  # masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The address you choose has to be on the local subnet and not otherwise be used by another system. Masscan will warn you that you&#39;ve made a mistake, but you might&#39;ve messed up the other machine&#39;s communications for several minutes, so be careful.&lt;/p&gt; 
&lt;p&gt;In some cases, such as WiFi, this isn&#39;t possible. In those cases, you can firewall the port that masscan uses. This prevents the local TCP/IP stack from seeing the packet, but masscan still sees it since it bypasses the local stack. For Linux, this would look like:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You probably want to pick ports that don&#39;t conflict with ports Linux might otherwise choose for source-ports. You can see the range Linux uses, and reconfigure that range, by looking in the file:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;/proc/sys/net/ipv4/ip_local_port_range
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;On the latest version of Kali Linux (2018-August), that range is 32768 to 60999, so you should choose ports either below 32768 or 61000 and above.&lt;/p&gt; 
&lt;p&gt;Setting an &lt;code&gt;iptables&lt;/code&gt; rule only lasts until the next reboot. You need to lookup how to save the configuration depending upon your distro, such as using &lt;code&gt;iptables-save&lt;/code&gt; and/or &lt;code&gt;iptables-persistent&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;On Mac OS X and BSD, there are similar steps. To find out the ranges to avoid, use a command like the following:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;On FreeBSD and older MacOS, use an &lt;code&gt;ipfw&lt;/code&gt; command:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# sudo ipfw add 1 deny tcp from any to any 40000 in
# masscan 10.0.0.0/8 -p80 --banners --source-port 40000
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;On newer MacOS and OpenBSD, use the &lt;code&gt;pf&lt;/code&gt; packet-filter utility. Edit the file &lt;code&gt;/etc/pf.conf&lt;/code&gt; to add a line like the following:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;block in proto tcp from any to any port 40000:40015
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then to enable the firewall, run the command:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# pfctl -E    
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If the firewall is already running, then either reboot or reload the rules with the following command:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# pfctl -f /etc/pf.conf
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Windows doesn&#39;t respond with RST packets, so neither of these techniques are necessary. However, masscan is still designed to work best using its own IP address, so you should run that way when possible, even when it is not strictly necessary.&lt;/p&gt; 
&lt;p&gt;The same thing is needed for other checks, such as the &lt;code&gt;--heartbleed&lt;/code&gt; check, which is just a form of banner checking.&lt;/p&gt; 
&lt;h2&gt;How to scan the entire Internet&lt;/h2&gt; 
&lt;p&gt;While useful for smaller, internal networks, the program is really designed with the entire Internet in mind. It might look something like this:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# masscan 0.0.0.0/0 -p0-65535
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Scanning the entire Internet is bad. For one thing, parts of the Internet react badly to being scanned. For another thing, some sites track scans and add you to a ban list, which will get you firewalled from useful parts of the Internet. Therefore, you want to exclude a lot of ranges. To blacklist or exclude ranges, you want to use the following syntax:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This just prints the results to the command-line. You probably want them saved to a file instead. Therefore, you want something like:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This saves the results in an XML file, allowing you to easily dump the results in a database or something.&lt;/p&gt; 
&lt;p&gt;But, this only goes at the default rate of 100 packets/second, which will take forever to scan the Internet. You need to speed it up as so:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# masscan 0.0.0.0/0 -p0-65535 --max-rate 100000
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This increases the rate to 100,000 packets/second, which will scan the entire Internet (minus excludes) in about 10 hours per port (or 655,360 hours if scanning all ports).&lt;/p&gt; 
&lt;p&gt;The thing to notice about this command-line is that these are all &lt;code&gt;nmap&lt;/code&gt; compatible options. In addition, &quot;invisible&quot; options compatible with &lt;code&gt;nmap&lt;/code&gt; are also set for you: &lt;code&gt;-sS -Pn -n --randomize-hosts --send-eth&lt;/code&gt;. Likewise, the format of the XML file is inspired by &lt;code&gt;nmap&lt;/code&gt;. There are, of course, a lot of differences, because the &lt;em&gt;asynchronous&lt;/em&gt; nature of the program leads to a fundamentally different approach to the problem.&lt;/p&gt; 
&lt;p&gt;The above command-line is a bit cumbersome. Instead of putting everything on the command-line, it can be stored in a file instead. The above settings would look like this:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# My Scan
rate =  100000.00
output-format = xml
output-status = all
output-filename = scan.xml
ports = 0-65535
range = 0.0.0.0-255.255.255.255
excludefile = exclude.txt
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To use this configuration file, use the &lt;code&gt;-c&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# masscan -c myscan.conf
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This also makes things easier when you repeat a scan.&lt;/p&gt; 
&lt;p&gt;By default, masscan first loads the configuration file &lt;code&gt;/etc/masscan/masscan.conf&lt;/code&gt;. Any later configuration parameters override what&#39;s in this default configuration file. That&#39;s where I put my &quot;excludefile&quot; parameter so that I don&#39;t ever forget it. It just works automatically.&lt;/p&gt; 
&lt;h2&gt;Getting output&lt;/h2&gt; 
&lt;p&gt;By default, masscan produces fairly large text files, but it&#39;s easy to convert them into any other format. There are five supported output formats:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt; &lt;p&gt;xml: Just use the parameter &lt;code&gt;-oX &amp;lt;filename&amp;gt;&lt;/code&gt;. Or, use the parameters &lt;code&gt;--output-format xml&lt;/code&gt; and &lt;code&gt;--output-filename &amp;lt;filename&amp;gt;&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;binary: This is the masscan builtin format. It produces much smaller files so that when I scan the Internet my disk doesn&#39;t fill up. They need to be parsed, though. The command-line option &lt;code&gt;--readscan&lt;/code&gt; will read binary scan files. Using &lt;code&gt;--readscan&lt;/code&gt; with the &lt;code&gt;-oX&lt;/code&gt; option will produce an XML version of the results file.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;grepable: This is an implementation of the Nmap -oG output that can be easily parsed by command-line tools. Just use the parameter &lt;code&gt;-oG &amp;lt;filename&amp;gt;&lt;/code&gt;. Or, use the parameters &lt;code&gt;--output-format grepable&lt;/code&gt; and &lt;code&gt;--output-filename &amp;lt;filename&amp;gt;&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;json: This saves the results in JSON format. Just use the parameter &lt;code&gt;-oJ &amp;lt;filename&amp;gt;&lt;/code&gt;. Or, use the parameters &lt;code&gt;--output-format json&lt;/code&gt; and &lt;code&gt;--output-filename &amp;lt;filename&amp;gt;&lt;/code&gt;.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;list: This is a simple list with one host and port pair per line. Just use the parameter &lt;code&gt;-oL &amp;lt;filename&amp;gt;&lt;/code&gt;. Or, use the parameters &lt;code&gt;--output-format list&lt;/code&gt; and &lt;code&gt;--output-filename &amp;lt;filename&amp;gt;&lt;/code&gt;. The format is:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;&amp;lt;port state&amp;gt; &amp;lt;protocol&amp;gt; &amp;lt;port number&amp;gt; &amp;lt;IP address&amp;gt; &amp;lt;POSIX timestamp&amp;gt;  
open tcp 80 XXX.XXX.XXX.XXX 1390380064
&lt;/code&gt;&lt;/pre&gt; &lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;Comparison with Nmap&lt;/h2&gt; 
&lt;p&gt;Where reasonable, every effort has been taken to make the program familiar to &lt;code&gt;nmap&lt;/code&gt; users, even though it&#39;s fundamentally different. Masscan is tuned for wide range scanning of a lot of machines, whereas nmap is designed for intensive scanning of a single machine or a small range.&lt;/p&gt; 
&lt;p&gt;Two important differences are:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;no default ports to scan, you must specify &lt;code&gt;-p &amp;lt;ports&amp;gt;&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;target hosts are IP addresses or simple ranges, not DNS names, nor the funky subnet ranges &lt;code&gt;nmap&lt;/code&gt; can use (like &lt;code&gt;10.0.0-255.0-255&lt;/code&gt;).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can think of &lt;code&gt;masscan&lt;/code&gt; as having the following settings permanently enabled:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;-sS&lt;/code&gt;: this does SYN scan only (currently, will change in the future)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-Pn&lt;/code&gt;: doesn&#39;t ping hosts first, which is fundamental to the async operation&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;-n&lt;/code&gt;: no DNS resolution happens&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--randomize-hosts&lt;/code&gt;: scan completely randomized, always, you can&#39;t change this&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--send-eth&lt;/code&gt;: sends using raw &lt;code&gt;libpcap&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;If you want a list of additional &lt;code&gt;nmap&lt;/code&gt; compatible settings, use the following command:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;# masscan --nmap
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Transmit rate (IMPORTANT!!)&lt;/h2&gt; 
&lt;p&gt;This program spews out packets very fast. On Windows, or from VMs, it can do 300,000 packets/second. On Linux (no virtualization) it&#39;ll do 1.6 million packets-per-second. That&#39;s fast enough to melt most networks.&lt;/p&gt; 
&lt;p&gt;Note that it&#39;ll only melt your own network. It randomizes the target IP addresses so that it shouldn&#39;t overwhelm any distant network.&lt;/p&gt; 
&lt;p&gt;By default, the rate is set to 100 packets/second. To increase the rate to a million use something like &lt;code&gt;--rate 1000000&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;When scanning the IPv4 Internet, you&#39;ll be scanning lots of subnets, so even though there&#39;s a high rate of packets going out, each target subnet will receive a small rate of incoming packets.&lt;/p&gt; 
&lt;p&gt;However, with IPv6 scanning, you&#39;ll tend to focus on a single target subnet with billions of addresses. Thus, your default behavior will overwhelm the target network. Networks often crash under the load that masscan can generate.&lt;/p&gt; 
&lt;h1&gt;Design&lt;/h1&gt; 
&lt;p&gt;This section describes the major design issues of the program.&lt;/p&gt; 
&lt;h2&gt;Code Layout&lt;/h2&gt; 
&lt;p&gt;The file &lt;code&gt;main.c&lt;/code&gt; contains the &lt;code&gt;main()&lt;/code&gt; function, as you&#39;d expect. It also contains the &lt;code&gt;transmit_thread()&lt;/code&gt; and &lt;code&gt;receive_thread()&lt;/code&gt; functions. These functions have been deliberately flattened and heavily commented so that you can read the design of the program simply by stepping line-by-line through each of these.&lt;/p&gt; 
&lt;h2&gt;Asynchronous&lt;/h2&gt; 
&lt;p&gt;This is an &lt;em&gt;asynchronous&lt;/em&gt; design. In other words, it is to &lt;code&gt;nmap&lt;/code&gt; what the &lt;code&gt;nginx&lt;/code&gt; web-server is to &lt;code&gt;Apache&lt;/code&gt;. It has separate transmit and receive threads that are largely independent from each other. It&#39;s the same sort of design found in &lt;code&gt;scanrand&lt;/code&gt;, &lt;code&gt;unicornscan&lt;/code&gt;, and &lt;code&gt;ZMap&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Because it&#39;s asynchronous, it runs as fast as the underlying packet transmit allows.&lt;/p&gt; 
&lt;h2&gt;Randomization&lt;/h2&gt; 
&lt;p&gt;A key difference between Masscan and other scanners is the way it randomizes targets.&lt;/p&gt; 
&lt;p&gt;The fundamental principle is to have a single index variable that starts at zero and is incremented by one for every probe. In C code, this is expressed as:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (i = 0; i &amp;lt; range; i++) {
    scan(i);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;We have to translate the index into an IP address. Let&#39;s say that you want to scan all &quot;private&quot; IP addresses. That would be the table of ranges like:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;192.168.0.0/16
10.0.0.0/8
172.16.0.0/12
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;In this example, the first 64k indexes are appended to 192.168.x.x to form the target address. Then, the next 16-million are appended to 10.x.x.x. The remaining indexes in the range are applied to 172.16.x.x.&lt;/p&gt; 
&lt;p&gt;In this example, we only have three ranges. When scanning the entire Internet, we have in practice more than 100 ranges. That&#39;s because you have to blacklist or exclude a lot of sub-ranges. This chops up the desired range into hundreds of smaller ranges.&lt;/p&gt; 
&lt;p&gt;This leads to one of the slowest parts of the code. We transmit 10 million packets per second and have to convert an index variable to an IP address for each and every probe. We solve this by doing a &quot;binary search&quot; in a small amount of memory. At this packet rate, cache efficiencies start to dominate over algorithm efficiencies. There are a lot of more efficient techniques in theory, but they all require so much memory as to be slower in practice.&lt;/p&gt; 
&lt;p&gt;We call the function that translates from an index into an IP address the &lt;code&gt;pick()&lt;/code&gt; function. In use, it looks like:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;for (i = 0; i &amp;lt; range; i++) {
    ip = pick(addresses, i);
    scan(ip);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Masscan supports not only IP address ranges, but also port ranges. This means we need to pick from the index variable both an IP address and a port. This is fairly straightforward:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;range = ip_count * port_count;
for (i = 0; i &amp;lt; range; i++) {
    ip   = pick(addresses, i / port_count);
    port = pick(ports,     i % port_count);
    scan(ip, port);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This leads to another expensive part of the code. The division/modulus instructions are around 90 clock cycles, or 30 nanoseconds, on x86 CPUs. When transmitting at a rate of 10 million packets/second, we have only 100 nanoseconds per packet. I see no way to optimize this any better. Luckily, though, two such operations can be executed simultaneously, so doing two of these, as shown above, is no more expensive than doing one.&lt;/p&gt; 
&lt;p&gt;There are actually some easy optimizations for the above performance problems, but they all rely upon &lt;code&gt;i++&lt;/code&gt;, the fact that the index variable increases one by one through the scan. Actually, we need to randomize this variable. We need to randomize the order of IP addresses that we scan or we&#39;ll blast the heck out of target networks that aren&#39;t built for this level of speed. We need to spread our traffic evenly over the target.&lt;/p&gt; 
&lt;p&gt;The way we randomize is simply by encrypting the index variable. By definition, encryption is random and creates a 1-to-1 mapping between the original index variable and the output. This means that while we linearly go through the range, the output IP addresses are completely random. In code, this looks like:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;range = ip_count * port_count;
for (i = 0; i &amp;lt; range; i++) {
    x = encrypt(i);
    ip   = pick(addresses, x / port_count);
    port = pick(ports,     x % port_count);
    scan(ip, port);
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This also has a major cost. Since the range is an unpredictable size instead of a nice even power of 2, we can&#39;t use cheap binary techniques like AND (&amp;amp;) and XOR (^). Instead, we have to use expensive operations like MODULUS (%). In my current benchmarks, it&#39;s taking 40 nanoseconds to encrypt the variable.&lt;/p&gt; 
&lt;p&gt;This architecture allows for lots of cool features. For example, it supports &quot;shards&quot;. You can set up 5 machines each doing a fifth of the scan or &lt;code&gt;range / shard_count&lt;/code&gt;. Shards can be multiple machines, or simply multiple network adapters on the same machine, or even (if you want) multiple IP source addresses on the same network adapter.&lt;/p&gt; 
&lt;p&gt;Or, you can use a &#39;seed&#39; or &#39;key&#39; to the encryption function, so that you get a different order each time you scan, like &lt;code&gt;x = encrypt(seed, i)&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;We can also pause the scan by exiting out of the program, and simply remembering the current value of &lt;code&gt;i&lt;/code&gt;, and restart it later. I do that a lot during development. I see something going wrong with my Internet scan, so I hit 
 &lt;ctrl-c&gt;
   to stop the scan, then restart it after I&#39;ve fixed the bug.
 &lt;/ctrl-c&gt;&lt;/p&gt; 
&lt;p&gt;Another feature is retransmits/retries. Packets sometimes get dropped on the Internet, so you can send two packets back-to-back. However, something that drops one packet may drop the immediately following packet. Therefore, you want to send the copy about 1 second apart. This is simple. We already have a &#39;rate&#39; variable, which is the number of packets-per-second rate we are transmitting at, so the retransmit function is simply to use &lt;code&gt;i + rate&lt;/code&gt; as the index. One of these days I&#39;m going to do a study of the Internet, and differentiate &quot;back-to-back&quot;, &quot;1 second&quot;, &quot;10 second&quot;, and &quot;1 minute&quot; retransmits this way in order to see if there is any difference in what gets dropped.&lt;/p&gt; 
&lt;h2&gt;C10 Scalability&lt;/h2&gt; 
&lt;p&gt;The asynchronous technique is known as a solution to the &quot;c10k problem&quot;. Masscan is designed for the next level of scalability, the &quot;C10M problem&quot;.&lt;/p&gt; 
&lt;p&gt;The C10M solution is to bypass the kernel. There are three primary kernel bypasses in Masscan:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;custom network driver&lt;/li&gt; 
 &lt;li&gt;user-mode TCP stack&lt;/li&gt; 
 &lt;li&gt;user-mode synchronization&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Masscan can use the PF_RING DNA driver. This driver DMAs packets directly from user-mode memory to the network driver with zero kernel involvement. That allows software, even with a slow CPU, to transmit packets at the maximum rate the hardware allows. If you put 8 10-gbps network cards in a computer, this means it could transmit at 100-million packets/second.&lt;/p&gt; 
&lt;p&gt;Masscan has its own built-in TCP stack for grabbing banners from TCP connections. This means it can easily support 10 million concurrent TCP connections, assuming of course that the computer has enough memory.&lt;/p&gt; 
&lt;p&gt;Masscan has no &quot;mutex&quot;. Modern mutexes (aka. futexes) are mostly user-mode, but they have two problems. The first problem is that they cause cache-lines to bounce quickly back-and-forth between CPUs. The second is that when there is contention, they&#39;ll do a system call into the kernel, which kills performance. A mutex on the fast path of a program severely limits scalability. Instead, Masscan uses &quot;rings&quot; to synchronize things, such as when the user-mode TCP stack in the receive thread needs to transmit a packet without interfering with the transmit thread.&lt;/p&gt; 
&lt;h2&gt;Portability&lt;/h2&gt; 
&lt;p&gt;The code runs well on Linux, Windows, and Mac OS X. All the important bits are in standard C (C90). Therefore, it compiles on Visual Studio with Microsoft&#39;s compiler, the Clang/LLVM compiler on Mac OS X, and GCC on Linux.&lt;/p&gt; 
&lt;p&gt;Windows and Macs aren&#39;t tuned for packet transmit, and get only about 300,000 packets-per-second, whereas Linux can do 1,500,000 packets/second. That&#39;s probably faster than you want anyway.&lt;/p&gt; 
&lt;h2&gt;Safe code&lt;/h2&gt; 
&lt;p&gt;A bounty is offered for vulnerabilities, see the &lt;a href=&quot;http://VULNINFO.md&quot;&gt;VULNINFO.md&lt;/a&gt; file for more information.&lt;/p&gt; 
&lt;p&gt;This project uses safe functions like &lt;code&gt;safe_strcpy()&lt;/code&gt; instead of unsafe functions like &lt;code&gt;strcpy()&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;This project has automated unit regression tests (&lt;code&gt;make regress&lt;/code&gt;).&lt;/p&gt; 
&lt;h2&gt;Compatibility&lt;/h2&gt; 
&lt;p&gt;A lot of effort has gone into making the input/output look like &lt;code&gt;nmap&lt;/code&gt;, which everyone who does port scans is (or should be) familiar with.&lt;/p&gt; 
&lt;h2&gt;IPv6 and IPv4 coexistence&lt;/h2&gt; 
&lt;p&gt;Masscan supports IPv6, but there is no special mode, both are supported at the same time. (There is no &lt;code&gt;-6&lt;/code&gt; option -- it&#39;s always available).&lt;/p&gt; 
&lt;p&gt;In any example you see of masscan usage, simply put an IPv6 address where you see an IPv4 address. You can include IPv4 and IPv6 addresses simultaneously in the same scan. Output includes the appropriate address at the same location, with no special marking.&lt;/p&gt; 
&lt;p&gt;Just remember that IPv6 address space is really big. You probably don&#39;t want to scan for big ranges, except maybe the first 64k addresses of a subnet that were assigned via DHCPv6.&lt;/p&gt; 
&lt;p&gt;Instead, you&#39;ll probably want to scan large lists of addresses stored in a file (&lt;code&gt;--include-file filename.txt&lt;/code&gt;) that you got from other sources. Like everywhere else, this file can contain lists of both IPv4 and IPv6 addresses. The test file I use contains 8 million addresses. Files of that size need a couple extra seconds to be read on startup (masscan sorts the addresses and removes duplicates before scanning).&lt;/p&gt; 
&lt;p&gt;Remember that masscan contains its own network stack. Thus, the local machine you run masscan from does not need to be IPv6 enabled -- though the local network needs to be able to route IPv6 packets.&lt;/p&gt; 
&lt;h2&gt;PF_RING&lt;/h2&gt; 
&lt;p&gt;To get beyond 2 million packets/second, you need an Intel 10-gbps Ethernet adapter and a special driver known as &lt;a href=&quot;https://www.ntop.org/installation-guide-for-pf_ring/&quot;&gt;&quot;PF_RING ZC&quot; from ntop&lt;/a&gt;. Masscan doesn&#39;t need to be rebuilt in order to use PF_RING. To use PF_RING, you need to build the following components:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;libpfring.so&lt;/code&gt; (installed in /usr/lib/libpfring.so)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;pf_ring.ko&lt;/code&gt; (their kernel driver)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;ixgbe.ko&lt;/code&gt; (their version of the Intel 10-gbps Ethernet driver)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You don&#39;t need to build their version of &lt;code&gt;libpcap.so&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;When Masscan detects that an adapter is named something like &lt;code&gt;zc:enp1s0&lt;/code&gt; instead of something like &lt;code&gt;enp1s0&lt;/code&gt;, it&#39;ll automatically switch to PF_RING ZC mode.&lt;/p&gt; 
&lt;p&gt;A more detail discussion can be found in &lt;strong&gt;PoC||GTFO 0x15&lt;/strong&gt;.&lt;/p&gt; 
&lt;h2&gt;Regression testing&lt;/h2&gt; 
&lt;p&gt;The project contains a built-in unit test:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ make test
bin/masscan --selftest
selftest: success!
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This tests a lot of tricky bits of the code. You should do this after building.&lt;/p&gt; 
&lt;h2&gt;Performance testing&lt;/h2&gt; 
&lt;p&gt;To test performance, run something like the following to a throw-away address, to avoid overloading your local router:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The bogus &lt;code&gt;--router-mac&lt;/code&gt; keeps packets on the local network segments so that they won&#39;t go out to the Internet.&lt;/p&gt; 
&lt;p&gt;You can also test in &quot;offline&quot; mode, which is how fast the program runs without the transmit overhead:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --offline
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This second benchmark shows roughly how fast the program would run if it were using PF_RING, which has near zero overhead.&lt;/p&gt; 
&lt;p&gt;By the way, the randomization algorithm makes heavy use of &quot;integer arithmetic&quot;, a chronically slow operation on CPUs. Modern CPUs have doubled the speed at which they perform this calculation, making &lt;code&gt;masscan&lt;/code&gt; much faster.&lt;/p&gt; 
&lt;h1&gt;Authors&lt;/h1&gt; 
&lt;p&gt;This tool created by Robert Graham: email: &lt;a href=&quot;mailto:robert_david_graham@yahoo.com&quot;&gt;robert_david_graham@yahoo.com&lt;/a&gt; twitter: @ErrataRob&lt;/p&gt; 
&lt;h1&gt;License&lt;/h1&gt; 
&lt;p&gt;Copyright (c) 2013 Robert David Graham&lt;/p&gt; 
&lt;p&gt;This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License.&lt;/p&gt; 
&lt;p&gt;This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.&lt;/p&gt; 
&lt;p&gt;You should have received a copy of the GNU Affero General Public License along with this program. If not, see &lt;a href=&quot;https://www.gnu.org/licenses/&quot;&gt;https://www.gnu.org/licenses/&lt;/a&gt;.&lt;/p&gt;</description>
      
      <media:content url="https://opengraph.githubassets.com/65e932de6a7d683a63f49e6410e4e64ab981fe011dddc06197222cc33a1ed4bd/robertdavidgraham/masscan" medium="image" />
      
    </item>
    
  </channel>
</rss>
