<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Freedom To Play]]></title><description><![CDATA[Tinkering, hacking, & building]]></description><link>https://frdmtoplay.com/</link><image><url>https://frdmtoplay.com/favicon.png</url><title>Freedom To Play</title><link>https://frdmtoplay.com/</link></image><generator>Ghost 5.15</generator><lastBuildDate>Tue, 14 Apr 2026 08:23:55 GMT</lastBuildDate><atom:link href="https://frdmtoplay.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Writing a ledger-cli Language Server Protocol with claude]]></title><description><![CDATA[Thoughts on using claude code to write a ledger-cli Language Server Protocol in Rust]]></description><link>https://frdmtoplay.com/ledger-lsp/</link><guid isPermaLink="false">69879331f1be8f19373608cb</guid><category><![CDATA[ledger]]></category><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Sun, 08 Feb 2026 15:44:31 GMT</pubDate><content:encoded><![CDATA[<p><a href="https://github.com/ledger/ledger">ledger-cli</a> is a command line accounting tool for double entry accounting. The ledger format has a <a href="https://github.com/ledger/ledger/blob/master/doc/grammar.y">defined grammar</a>, <a href="https://github.com/ledger/vim-ledger">vim plugins</a>, <a href="https://marketplace.visualstudio.com/items?itemName=parsa2820.ledger-cli">VS code plugins</a>, etc. but no <a href="https://en.wikipedia.org/wiki/Language_Server_Protocol">Language Server Protocol</a> implementation.</p><p>Filling the gap in the plain text accounting world felt like an apt use case to kick the tires on claude code. A few sessions and 257155 opus-4.5 tokens later, claude had written a working <a href="https://github.com/bsilvereagle/ledger-lsp">ledger-cli LSP implementation</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2026/02/image-2.png" class="kg-image" alt loading="lazy" width="468" height="85"><figcaption>Total commodity price calculated by the LSP</figcaption></figure><p>Key observations:</p><ul><li>The hardest part of the entire process was halting development everytime I hit the session limit on the Claude Pro ($20/mo) plan</li><li>Claude developed this over a few days and it would have taken me weeks/months by hand (prohibitively expensive for the value I would get out of the LSP)</li><li>I don&apos;t know Rust. I did not learn Rust during this project and I can&apos;t evaluate the code quality. But it works and it&apos;s performant</li></ul><p>My prompts were straightforward - 1) come up with a plan 2) what features are we missing 3) review the code. This pattern was repeated across seven sessions (usually running up against the Pro session limit) until I reached enough features for my use case. </p><blockquote>Hey claude. You are an expert in rust and writing Language Server Protocol (LSP) servers. What we want to do is create a no code plan on how to implement a LSP for the &quot;ledger-cli&quot; domain specific language. The documentation for the ledger-cli language is given in ledger.html. Please come up with a plan on how we should extend the tower-lsp language server to support the ledger-cli syntax. Ask as many clarifying questions as necessary</blockquote><blockquote>Claude you are very familiar with ledger-cli and Rust. This directory contains a language service (LSP) for the ledger-cli language. Evalute the existing features and come up with some other features we should add or extend into this LSP that are specifically useful for double entry accounting. We do not want to make claims about account balances since the ledger software is quite complex. Instead we want to make sure the editing experience is good.</blockquote><blockquote>Claude you are an expert in rust and well versed in language servers. Please review this implementation of ledger-lsp, a ledger language server in rust.</blockquote><p>The initial design decision I made before prompting claude was that the LSP would be in rust since tower-lsp appeared fairly mature. During the implementation another key decision was to steer claude away from writing an error-prone regex based syntax parser to using <a href="https://tree-sitter.github.io/tree-sitter/">tree-sitter</a> - a surprisingly difficult ask. At every turn, claude wanted to revert to regex. Similarily, claude staunchly believed this LSP should be keeping track of balances across files, i.e. move all of of the ledger logic into the LSP. Nearly every session required steering the LLM towards supporting the editing experience and not trying to replace ledger. Despite the required steering, claude came up with some novel ideas I would not have thought of. For example, a warning if entries in a file were out of chronological order. </p><p>Overall, a few nights of coaching an LLM resulted in a useful tool in a language I&apos;m unfamiliar with and my workflow for editing ledger files has noticeably improved. Several months ago I would think very carefully about whether I <em>needed</em> a tool before investing my time in to developing it. Today, I can cut a check to Anthropic and spend a few hours guiding an LLM - <a href="https://xkcd.com/1319/">xkcd 1319</a> may no longer be relevant.</p>]]></content:encoded></item><item><title><![CDATA[Coercing Zigbee, Home Assistant, ZHA, and SmartIR together]]></title><description><![CDATA[<p><a href="https://www.home-assistant.io/">Home Assistant</a> is a great piece of software.</p><p><a href="https://www.home-assistant.io/integrations/zha/">Zigbee Home Automation</a> (ZHA) is a great piece of software.</p><p><a href="https://github.com/smartHomeHub/SmartIR">SmartIR</a> is a great piece of software.</p><p>So why is it so difficult to get them to control a Mitsubish Mini-Split HVAC system? Newish hardware, that&apos;s why.</p><p>Several Zigbee IR</p>]]></description><link>https://frdmtoplay.com/what-a-mess-zigbee-home-assistant-zha-smart-ir/</link><guid isPermaLink="false">664925565962df0499cef88a</guid><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Sat, 18 May 2024 22:51:46 GMT</pubDate><content:encoded><![CDATA[<p><a href="https://www.home-assistant.io/">Home Assistant</a> is a great piece of software.</p><p><a href="https://www.home-assistant.io/integrations/zha/">Zigbee Home Automation</a> (ZHA) is a great piece of software.</p><p><a href="https://github.com/smartHomeHub/SmartIR">SmartIR</a> is a great piece of software.</p><p>So why is it so difficult to get them to control a Mitsubish Mini-Split HVAC system? Newish hardware, that&apos;s why.</p><p>Several Zigbee IR blasters have entered the Home Automation scene in recent years. Some are <a href="https://amzn.to/4awWiFb">battery powered</a> (Moes UFO-R11), some are <a href="https://amzn.to/44LZ9Jm">powered via USB</a> (ZS06), but all of them use the Tuya TS1201 (Zigbee) platform under the hood. Until the Zigbee blasters appeared, <a href="https://amzn.to/454jIB3">Broadlink</a> was the main player in the automation space, but it only supports Wi-Fi networking. None of the upstream software packages have caught up with the proliferation of Zigbee IR blasters.</p><p><em>Note: </em>This post will hopefully not age gracefully as these patches get absorbed into upstream projects</p><hr><h3 id="zha">ZHA</h3><p>Getting Home Assistant (via ZHA) to recognize the TS1201 chipset requires installing a custom quirk.</p><pre><code># Make a directory for quirks if none exists
$ mkdir /config/quirks
# Inform Home Assistant about it
$ cat /config/configuration.yaml
...
zha:
  custom_quirks_path: quirks/
...
# Download the quirk
$ cd /config/quirks
$ wget https://raw.githubusercontent.com/ferehcarb/zha-device-handlers/dev/zhaquirks/tuya/ts1201.py
# Restart Home Assistant</code></pre><p>After performing the above steps, ZHA should recognize the device:</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2024/05/image-1.png" class="kg-image" alt loading="lazy" width="341" height="346"></figure><p>Click &quot;Zigbee Info&quot; in this panel and record the IEEE address for the device.</p><p>Verifying the device is functioning is performed by clicking the kebab menu and selecting &quot;Manage Device&quot;. From there, set the Zigbee Cluster to <code>ZosungIRControl</code> and the Command to <code>IRLearn</code>. </p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2024/05/image-2.png" class="kg-image" alt loading="lazy" width="563" height="634"></figure><p>Issue the command and record a signal from an IR emitter. Click Attributes and read the <code>last_learned_ir_code</code> attribute. Copy and paste this string back into the <code>IRSend</code> command and verify that the device is receiving and transmitting values. </p><p><strong>Note:</strong> On my system, I had to fully reboot the Home Assistant server and power cycle the Zigbee IR blaster to actually send IR data.</p><p>For simpler IR devices the ride ends here - record values and play them back via Home Assistant scriipts. For more complicated devices, like Mitsubishi HVAC units with a <a href="https://www.analysir.com/blog/2015/01/06/reverse-engineering-mitsubishi-ac-infrared-protocol/">complex payload</a>, <code>SmartIR</code> is the better path forward.</p><hr><h3 id="smartir">SmartIR</h3><p>Once the device is communicating with ZHA properly, install a forked version of SmartIR with ZHA support.</p><p>Clone <a href="https://github.com/davidrpfarinha">davidrpfarinha</a>&apos;s fork of SmartIR and extract the contents into the <code>custom_components</code> directory of the Home Assistant configuration.</p><pre><code>$ git clone https://github.com/davidrpfarinha/SmartIR
$ mkdir /config/custom_components
$ cp -r SmartIR/custom_components /config/custom_components</code></pre><p>Next, modify the Home Assistant <code>configuration.yaml</code> for this device:</p><pre><code>...
zha:
  custom_quirks_path: quriks/

smartir:

climate:
  - platform: smartir
    name: Office AC
    unique_id: office_ac
    device_code: &lt;YOUR_DEVICE_CODE&gt;
    controller_data: &lt;YO:UR:DE:VI:CE:MA:CA:DR&gt;
    temperature_sensor: sensor.office_ac_temperature
    humidity_sensor: sensor.office_ac_humidity
    power_sensor: binary_sensor.office_ac_power</code></pre><p>Set <code>controller_data</code> equial to the IEEE address reported in the ZHA Device Info panel above.</p><p>Find the &quot;device code&quot; number for the HVAC system you are trying to control in the <a href="https://github.com/davidrpfarinha/SmartIR/blob/master/docs/CLIMATE.md#available-codes-for-climate-devices">SmartIR database</a>.</p><p>Note that nearly all of the devices only have support for &quot;Broadlink&quot; blasters. This is problematic. Broadlink and the TS1201 both store data in a different format. Thankfully, the TS1201 protocol has been mostly <a href="https://gist.github.com/mildsunrise/1d576669b63a260d2cff35fda63ec0b5">reverse engineered</a> and <a href="https://gist.github.com/svyatogor/7839d00303998a9fa37eb48494dd680f">scripts</a> exist to convert from the Broadlink protocol to the TS1201 protocol.</p><pre><code>$ wget https://gist.githubusercontent.com/svyatogor/7839d00303998a9fa37eb48494dd680f/raw/66cba20e653f84aab0b9a31ea5b9ca497d038d8a/broadlink_to_tuya.py
$ python3 broadlink_to_tuya.py your_device_code.json &gt; /config/custom_components/smartir/codes/climate/your_device_code.json</code></pre><p>The device codes in the new JSON file should be different from those in the original file:</p><p>Broadlink: <code>&quot;31&quot;: &quot;JgBMAmw5DisOKg0PDg4NEA8pDg4ODw4qDioNDw0rDhANDg...&quot;</code></p><p>Tuya: <code>&quot;31&quot;: &quot;ENkMyAarAR4FqwEABYwByQGrIAECjAH...&quot;</code><br></p><p>There is still more work to do! These converted files are still marked as being for the Broadlink. Set the <code>supportedController</code> field in the file to <code>&quot;ZHA&quot;</code> and restart Home Assistant.</p><hr><p>With some luck the climate panel should have automatically loaded and allow control of the device.</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2024/05/image-6.png" class="kg-image" alt loading="lazy" width="339" height="435"></figure><hr><p>Did this save you hours of debugging? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>]]></content:encoded></item><item><title><![CDATA[Reverse Engineering Serial Devices on Windows]]></title><description><![CDATA[Using Wireshark, qemu, socat, and ghidra to reverse engineer serial protocols from Windows binaries.]]></description><link>https://frdmtoplay.com/reverse-engineering-serial-devices-on-windows/</link><guid isPermaLink="false">65b2d2385962df0499cef543</guid><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Wed, 21 Feb 2024 04:31:13 GMT</pubDate><content:encoded><![CDATA[<p>It&apos;s an all too common phenomena - there&apos;s a cool piece of hardware which requires vendor software but that proprietary software only runs on Windows. </p><p>Currently, this is an issue with <a href="https://www.amazon.com/Radioddity-10-Watt-Programming-Batteries-Earpiece/dp/B07Z95GLMP?crid=3S7PVE15I2L5J&amp;keywords=ga-510&amp;qid=1706218102&amp;sprefix=ga-51%2Caps%2C228&amp;sr=8-2-spons&amp;sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&amp;psc=1&amp;linkCode=ll1&amp;tag=frdmtoplay-20&amp;linkId=d6476157534ceacd60f2f4a9dde4355a&amp;language=en_US&amp;ref_=as_li_ss_tl">Radioddity&apos;s GA-510</a> 10W radio. Radioddity updated the device&apos;s chipset in mid-2023 without changing the product ID and the new chipset does not have support in <a href="https://chirp.danplanet.com/projects/chirp/wiki/Home">CHIRP</a>. Radioddity only provides a Windows executable for programming the radio.</p><p>On Linux there are a few options for intercepting serial data that will not work directly on Windows like <a href="https://sourceforge.net/projects/slsnif/">slsnif</a> and <a href="https://man.archlinux.org/man/socat.1.en">socat</a> in addition to the methods described below. None of the methods described here are dependent on Windows and should work on most platforms.</p><p>So how do we free the bits from a Windows binary blob? </p><h2 id="option-1-wireshark-usbpcap">Option 1: Wireshark + USBPcap</h2><p><a href="https://www.wireshark.org/">Wireshark</a> is primarily a network protocol analyzer but with <a href="https://desowin.org/usbpcap/">USBPcap</a> installed it also supports tracking and analyzing USB streams.</p><p>Once USBPcap is installed it will show up as a capture device in Wireshark. Clicking the gear icon allows selecting a specific USB device to capture. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2024/01/Wireshark_settings.png" class="kg-image" alt loading="lazy" width="952" height="484" srcset="https://frdmtoplay.com/content/images/size/w600/2024/01/Wireshark_settings.png 600w, https://frdmtoplay.com/content/images/2024/01/Wireshark_settings.png 952w" sizes="(min-width: 720px) 720px"><figcaption>USBPcap Settings in Wireshark</figcaption></figure><p>Once the capture has started the USB frames are displayed in the GUI.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2024/01/Wireshark-1.PNG" class="kg-image" alt loading="lazy" width="1095" height="766" srcset="https://frdmtoplay.com/content/images/size/w600/2024/01/Wireshark-1.PNG 600w, https://frdmtoplay.com/content/images/size/w1000/2024/01/Wireshark-1.PNG 1000w, https://frdmtoplay.com/content/images/2024/01/Wireshark-1.PNG 1095w" sizes="(min-width: 720px) 720px"><figcaption>Sniffed Serial Data</figcaption></figure><p>It is completely possible to click through line by line and copy the relevant data out of each packet. Fortunately, there are many tools to work with pcap files that can simplify the process. &#xA0;<a href="https://github.com/JohnDMcMaster/usbrply">usbrply</a> is a small utility to convert a USB capture into python or C code that replays the USB frames in the pcap file. But for reversing the GA-510 it is more useful to inspect the data than replay it. </p><p><a href="https://www.wireshark.org/docs/man-pages/tshark.html">tshark</a> is a command line based analyzer that is installed alongside Wireshark. <code>tshark</code> allows display filters to be applied to previously captured data, so the USB capture data can be stripped from the Wireshark pcap.</p><figure class="kg-card kg-code-card"><pre><code>&gt; tshark.exe -r capture.pcapng -Y usb.capdata -T fields -e usb.src -e usb.capdata
host    50534541524348
2.1.2   06444d5231373032
host    50415353535441
2.1.2   500000
host    535953494e464f
2.1.2   06
host    5600000a0d
2.1.2   560d0a0a0d6900000000000000</code></pre><figcaption>Serial data extracted from the pcap with tshark</figcaption></figure><p>From the output we can see that the host sends <code>\x50\x53\45\41\52\43\48</code> (<code>PSEARCH</code>) and the device replies back with <code>\x06\x44\x4d\x52\x31\x37\x30\x32</code> (&quot;\x06DMR1702&quot;). </p><h2 id="option-2-logic-analyzer">Option 2: Logic Analyzer</h2><p>If it is not possible to install Wireshark on the Windows machine an external logic analyzer (e.g. <a href="https://www.amazon.com/dp/B074TWM5WX?_encoding=UTF8&amp;th=1&amp;linkCode=ll1&amp;tag=frdmtoplay-20&amp;linkId=292bbdee9c9a078089e14176a7d238d7&amp;language=en_US&amp;ref_=as_li_ss_tl">Saleae Logic</a>, <a href="https://www.amazon.com/Analog-Discovery-Oscilloscope-Waveform-Generator/dp/B0C4L59R83?crid=228RQBKDF2VWU&amp;keywords=digilent+discovery&amp;qid=1706590898&amp;sprefix=digilent+discovery+kit%2Caps%2C142&amp;sr=8-1-spons&amp;ufe=app_do%3Aamzn1.fos.c3015c4a-46bb-44b9-81a4-dc28e6d374b3&amp;sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&amp;psc=1&amp;linkCode=ll1&amp;tag=frdmtoplay-20&amp;linkId=3d9f6a7a68077900a5ab04f5a4c1ac98&amp;language=en_US&amp;ref_=as_li_ss_tl">Digilent Analog Discovery</a>) may work for sniffing the serial bus. If GND/TX/RX can be accessed on the device via pads or test points then the logic analyzer can be attached directly to the PCB. If the device has a non-USB connector at the end of the programming cable (e.g. a <a href="https://www.amazon.com/Baofeng-Programming-BF-F8HP-Handheld-transceiver/dp/B07V4D6F5F?crid=1WQE424DT9KRZ&amp;keywords=baofeng+programming+cable&amp;qid=1706590790&amp;sprefix=baofeng+programm%2Caps%2C158&amp;sr=8-4&amp;linkCode=ll1&amp;tag=frdmtoplay-20&amp;linkId=a3687829544152cc08abce827c9066d4&amp;language=en_US&amp;ref_=as_li_ss_tl">Baofeng programming cable</a> uses a 2.5mm and 3.5mm jack) then an interception harness can be used to read the serial data directly off the wire. However, if the harness or device does not expose GND/TX/RX then a logic analyzer is not an option. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2024/02/image-1.png" class="kg-image" alt loading="lazy" width="794" height="270" srcset="https://frdmtoplay.com/content/images/size/w600/2024/02/image-1.png 600w, https://frdmtoplay.com/content/images/2024/02/image-1.png 794w" sizes="(min-width: 720px) 720px"><figcaption>Saleae Logic Analyzer Sniff of the Windows Program</figcaption></figure><p>Sniffing the serial bus with a logic analyzer is a time consuming option but provides definitive data on what is being sent to the device.</p><h2 id="option-3-windows-vm-qemu-socat">Option 3: Windows VM + qemu + socat</h2><p>Sometimes a Windows VM is available and a physical machine is not (or the physical machine is across the room). In that case, <a href="https://www.qemu.org/">qemu</a> can be used to virtualize Windows and <a href="http://www.dest-unreach.org/socat/">socat</a> can be used to MITM the serial device.</p><p>In the notional setup, the physical device is connected to a Linux host and enumerates as <code>/dev/ttyUSB0</code>. A Windows VM is running within <code>qemu</code> on the Linux host. A virtual Serial Device is attached to the VM (either via qemu XML or <a href="https://virt-manager.org/">virt-manager</a>) which enumerates as a COM device in Windows. On the Linux host the virtual Serial Device appears as a pts. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2024/01/qemu-1.png" class="kg-image" alt loading="lazy" width="1442" height="742" srcset="https://frdmtoplay.com/content/images/size/w600/2024/01/qemu-1.png 600w, https://frdmtoplay.com/content/images/size/w1000/2024/01/qemu-1.png 1000w, https://frdmtoplay.com/content/images/2024/01/qemu-1.png 1442w" sizes="(min-width: 720px) 720px"><figcaption>Notional Block Diagram</figcaption></figure><p><code>virt-manager</code> will generate a new source path for the serial device on every boot:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2024/02/image.png" class="kg-image" alt loading="lazy" width="575" height="489"><figcaption>Virt Manager Serial Settings</figcaption></figure><p><code>socat</code> can be used to link the physical <code>/dev/ttyUSB0</code> to the virtual pts device:</p><pre><code># socat -d -d -x 2&gt; log.txt /dev/ttyUSB0,b57600,raw,echo=0 /dev/pts/9,raw,echo=0</code></pre><p>Now, the <code>pts</code> in qemu is linking <code>/dev/ttyUSB0</code> to <code>COM1</code> in Windows. The data that is flowing is recorded in log.txt:</p><!--kg-card-begin: markdown--><pre><code>&lt; 2024/01/24 19:16:44.000948516  length=1 from=14 to=14
 50
&lt; 2024/01/24 19:16:44.000948586  length=2 from=15 to=16
 53 45
&lt; 2024/01/24 19:16:44.000948614  length=1 from=17 to=17
 41
&lt; 2024/01/24 19:16:44.000948645  length=1 from=18 to=18
 52
&lt; 2024/01/24 19:16:44.000948708  length=1 from=19 to=19
 43
&lt; 2024/01/24 19:16:44.000948805  length=1 from=20 to=20
 48
&gt; 2024/01/24 19:16:44.000954053  length=8 from=7 to=14
 06 44 4d 52 31 37 30 32
</code></pre>
<!--kg-card-end: markdown--><p>Once again, the hex bytes of &quot;PSEARCH&quot; are present in the logs, albeit in a painful format. A little python can convert this into a reasonable format:</p><!--kg-card-begin: markdown--><pre><code class="language-python3">def read_log(log):
    with open(log, &apos;r&apos;) as radio:
        transactions = []
        direction = &apos;&apos;
        transaction = &apos;&apos;
        for line in radio.readlines():
            if (line.startswith(&apos;&lt;&apos;) and direction != &apos;&lt;&apos;) or (line.startswith(&apos;&gt;&apos;) and direction != &apos;&gt;&apos;):
                # We&apos;ve changed direction
                #print(f&quot;Direction change!\n {direction}\t{transaction}&quot;)
                transactions.append(transaction)
                direction = line[0]
                transaction = direction
            elif line.startswith(&apos; &apos;):
                transaction += line.strip(&apos;\n&apos;)
                #print(transaction)
            else:
                pass
                #print(line)
    return transactions
for t in read_log(&apos;log.txt&apos;):
    print(t)
</code></pre>
<pre><code>&lt; 50 53 45 41 52 43 48
&gt; 06 44 4d 52 31 37 30 32
</code></pre>
<!--kg-card-end: markdown--><p><strong>Linux Bonus: </strong>If sniffing a serial device on Linux, <code>socat</code> can create the virtual device directly. In this case passing <code>/dev/pts/5</code> to a program using a serial device instead of <code>/dev/ttyUSB0</code> will allow the data to be streamed.</p><pre><code># socat -d -d -x /dev/ttyUSB0,b57600,raw,echo=0 pty,raw,echo=0
socat[22063] N opening character device &quot;/dev/ttyUSB0&quot; for reading and writing
socat[22063] N PTY is /dev/pts/5
socat[22063] N starting data transfer loop with FDs [5,5] and [6,6]
&gt; 2024/02/20 20:06:48.000165060  length=5 from=0 to=4
</code></pre><h2 id="option-4-reverse-engineering-the-binary">Option 4: Reverse Engineering the Binary</h2><p>Sniffing the serial bus, either physically or virtually, is by far the easiest path to understanding what is being sent to the device. The &quot;nuclear option&quot; is to reverse engineer the Windows executable to determine what it is writing to the device. Determining what the binary is doing is a tedious process but can be done; below is the &quot;PSEARCH&quot; string in the binary using <a href="https://ghidra-sre.org/">Ghidra</a>. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2024/01/image.png" class="kg-image" alt loading="lazy" width="779" height="397" srcset="https://frdmtoplay.com/content/images/size/w600/2024/01/image.png 600w, https://frdmtoplay.com/content/images/2024/01/image.png 779w" sizes="(min-width: 720px) 720px"><figcaption>PSEARCH in the Disassembly of the Windows Binary</figcaption></figure><p>Despite the challenges with reverse engineering, on occasion there are functions with hidden functionality that aren&apos;t exposed in the GUI or are behind a password. For example, the GA-510 program allows users to access a secret menu to set the font and boot logo if they enter <code>BAOFENGH5</code>:</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2024/02/secret_menu.PNG" class="kg-image" alt loading="lazy" width="713" height="325" srcset="https://frdmtoplay.com/content/images/size/w600/2024/02/secret_menu.PNG 600w, https://frdmtoplay.com/content/images/2024/02/secret_menu.PNG 713w"></figure><hr><p>Was this an interesting read? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>]]></content:encoded></item><item><title><![CDATA[James Beard Media Award Winners]]></title><description><![CDATA[James Beard Media Award Winners grouped by category from 2010 to 2022.]]></description><link>https://frdmtoplay.com/james-beard-cookbook-award-winners/</link><guid isPermaLink="false">6531a7d75962df0499ceeff8</guid><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Fri, 20 Oct 2023 00:51:34 GMT</pubDate><content:encoded><![CDATA[<p>It does not seem like the <a href="https://www.jamesbeard.org/awards">James Beard</a> Media Award winners and nominees are in one centralized place, let alone organized by year or category. LLMs have made this type of data collation more palatable so here they are.</p><!--kg-card-begin: markdown--><h3 id="table-of-contents">Table of Contents</h3>
<ol>
<li><a href="#cookbook">Cookbook of the Year</a></li>
<li><a href="#american">American Cooking / U.S. Foodways</a></li>
<li><a href="#baking">Baking and Dessert</a></li>
<li><a href="#beverage">Beverage</a></li>
<li><a href="#bread">Bread</a></li>
<li><a href="#restaurant">Restaurant / Professional</a></li>
<li><a href="#general">General Cooking</a></li>
<li><a href="#health">Health</a></li>
<li><a href="#issues">Food Issues and Advocacy</a></li>
<li><a href="#international">International</a></li>
<li><a href="#photography">Photography / Visuals</a></li>
<li><a href="#reference">Reference, History, and Scholarship</a></li>
<li><a href="#single">Single Subject</a></li>
<li><a href="#vegetable">Vegetable Focused and Vegetarian</a></li>
<li><a href="#writing">Writing and Literature</a></li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="cookbook-of-the-year-a-namecookbooka">Cookbook of the Year <a name="cookbook"></a></h3>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td>2010</td>
<td><a href="https://www.amazon.com/dp/081186670X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Country Cooking of Ireland</a></td>
<td>Colman Andrews</td>
</tr>
<tr>
<td>2011</td>
<td><a href="https://www.amazon.com/dp/0292722664?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Oaxaca al Gusto</a></td>
<td>Diana Kennedy</td>
</tr>
<tr>
<td>2012</td>
<td><a href="https://www.amazon.com/dp/0982761007?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Modernist Cuisine</a></td>
<td>Nathan Myhrvold</td>
</tr>
<tr>
<td>2013</td>
<td><a href="https://www.amazon.com/dp/0393050696?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Gran Cocina Latina: The Food of Latin America</a></td>
<td>Maricel E. Presilla</td>
</tr>
<tr>
<td>2014</td>
<td><a href="https://www.amazon.com/dp/140885757X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Historic Heston</a></td>
<td>Heston Blumenthal</td>
</tr>
<tr>
<td>2015</td>
<td><a href="https://www.amazon.com/dp/0292735812?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Yucat&#xE1;n</a></td>
<td>David Sterling</td>
</tr>
<tr>
<td>2016</td>
<td><a href="https://www.amazon.com/dp/0544373286?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Zahav: A World of Israeli Cooking</a></td>
<td>Michael Solomonov and Steven Cook</td>
</tr>
<tr>
<td>2017</td>
<td><a href="https://www.amazon.com/dp/080418674X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Victuals: An Appalachian Journey, with Recipes</a></td>
<td>Ronni Lundy</td>
</tr>
<tr>
<td>2018</td>
<td><a href="https://www.amazon.com/dp/B07B7LJSG1?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Cooking Gene</a></td>
<td>Michael W. Twitty</td>
</tr>
<tr>
<td>2019</td>
<td><a href="https://www.amazon.com/Cocktail-Codex-Fundamentals-Formulas-Evolutions/dp/160774970X?crid=20AK1OKASH4NY&amp;keywords=cocktail+codex&amp;qid=1697818880&amp;s=books&amp;sprefix=cocktail+code%2Cstripbooks%2C131&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=f0b3fa6223fd7a6990da7ba69a10d851&amp;language=en_US&amp;ref_=as_li_ss_tl">Cocktail Codex</a></td>
<td>Alex Day, Nick Fauchald, and David Kaplan, with Devon Tarby</td>
</tr>
<tr>
<td>2020</td>
<td><a href="https://www.amazon.com/dp/174379553X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Whole Fish Cookbook: New Ways to Cook, Eat and Think</a></td>
<td>Josh Niland</td>
</tr>
<tr>
<td>2022</td>
<td><a href="https://www.amazon.com/Zuni-Cafe-Cookbook-Compendium-Franciscos/dp/0393020436/">The Zuni Caf&#xE9; Cookbook: A Compendium of Recipes and Cooking Lessons from San Francisco&apos;s Beloved Restaurant</a></td>
<td>Judy Rogers</td>
</tr>
</tbody>
</table>
<h3 id="american-cooking-us-foodways-a-nameamericana">American Cooking / U.S. Foodways <a name="american"></a></h3>
<p><em>Books with recipes focused on the cooking or foodways of regions or communities in the United States.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0307395812?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Real Cajun</a></strong></td>
<td><strong>Donald Link with Paula Disbrowe</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0740784137?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">My New Orleans</a></td>
<td>John Besh</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0307453596?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Lee Bros. Simple Fresh Southern: Knockout Dishes with Down-Home Flavor</a></td>
<td>Matt Lee, Ted Lee</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/Pig-Southern-Table-James-Villas-ebook/dp/B00BKRON8M?crid=3T0286Y607KSN&amp;keywords=Pig%3A+King+of+the+Southern+Table&amp;qid=1697820618&amp;s=books&amp;sprefix=pig+king+of+the+southern+table%2Cstripbooks%2C133&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=2d6c62f37f5362a5633705a8df822e30&amp;language=en_US&amp;ref_=as_li_ss_tl">Pig: King of the Southern Table</a></strong></td>
<td><strong>James Villas</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B005343R9O?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Food, Folklore, and Art of Lowcountry Cooking</a></td>
<td>Joseph E. Dabney</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1579654150?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Frankies Spuntino Kitchen Companion &amp; Cooking Manual</a></td>
<td>Frank Castronovo, Frank Falcinelli, and Peter Meehan</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0307719553?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">A New Turn in the South: Southern Flavors Reinvented for Your Kitchen</a></strong></td>
<td><strong>Hugh Acheson</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0061963291?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">American Flavor</a></td>
<td>Andrew Carmellini and Gwen Hyman</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B0081Y5VHY?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Masala Farm: Stories and Recipes from an Uncommon Life in the Country</a></td>
<td>Suvir Saran with Raquel Pelzel and Charlie Burd</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1423653440?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Mastering the Art of Southern Cooking</a></strong></td>
<td><strong>Nathalie Dupree and Cynthia Graubart</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1449411436?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Fire in My Belly</a></td>
<td>Kevin Gillespie and David Joachim</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B007SGLWPQ?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Southern Comfort: A New Take on the Recipes We Grew Up With</a></td>
<td>Allison Vines-Rushing and Slade Rushing</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0307954870?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The New Midwestern Table: 200 Heartland Recipes</a></strong></td>
<td><strong>Amy Thielen</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607744406?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">I Love New York: Ingredients and Recipes</a></td>
<td>Daniel Humm and Will Guidara</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00CDKXH5U?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Pickles, Pigs &amp; Whiskey: Recipes from My Three Favorite Food Groups and Then Some</a></td>
<td>John Currence</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1579654630?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Heritage</a></strong></td>
<td><strong>Sean Brock</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B0157JH54M?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The New England Kitchen: Fresh Takes on Seasonal Recipes</a></td>
<td>Erin Byers Murray and Jeremy Sewall</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0292744099?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Texas on the Table: People, Places, and Recipes Celebrating the Flavors of the Lone Star State</a></td>
<td>Terry Thompson-Anderson</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0316404071?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Beetlebung Farm Cookbook</a></strong></td>
<td><strong>Chris Fischer with Catherine Young</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0544363779?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Heartlandia: Heritage Recipes from Portland&apos;s The Country Cat</a></td>
<td>Adam and Jackie Sappington with Ashley Gartland</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0062242415?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Southerner&apos;s Cookbook</a></td>
<td>David DiBenedetto with Phillip Rhodes and the Editors of Garden &amp; Gun</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/080418674X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Victuals: An Appalachian Journey, with Recipes</a></strong></td>
<td><strong>Ronni Lundy</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0316381101?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Deep Run Roots: Stories and Recipes from My Corner of the South</a></td>
<td>Vivian Howard</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B01IMZ5FUE?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">My Two Souths: Blending the Flavors of India into a Southern Kitchen</a></td>
<td>Asha Gomez and Martha Hall Foose</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0816699798?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Sioux Chef&apos;s Indigenous Kitchen</a></strong></td>
<td><strong>Sean Sherman with Beth Dooley</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07QDSLJ6M?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Homegrown: Cooking from My New England Roots</a></td>
<td>Matt Jennings</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0553448439?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Lost Kitchen</a></td>
<td>Erin French</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1250108713?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Between Harlem and Heaven: Afro-Asian-American Cooking for Big Nights, Weeknights, and Every Day</a></strong></td>
<td><strong>JJ Johnson and Alexander Smalls with Veronica Chambers</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07C9Y8DGM?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">A Common Table: 80 Recipes and Stories from My Shared Cultures</a></td>
<td>Cynthia Chen McTernan</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1588346404?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sweet Home Caf&#xE9; Cookbook: A Celebration of African American Cooking</a></td>
<td>Albert G. Lukas and Jessica B. Harris with Jerome Grant</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1524761737?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Jubilee: Recipes from Two Centuries of African American Cooking</a></strong></td>
<td><strong>Toni Tipton-Martin</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1524761265?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cook Like a Local: Flavors That Can Change How You Cook and See the World</a></td>
<td>Chris Shepherd and Kaitlyn Goalen</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1579657168?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">South: Essential Recipes and New Explorations</a></td>
<td>Sean Brock</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1579658474?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Mosquito Supper Club: Cajun Recipes from a Disappearing Bayou</a></strong></td>
<td><strong>Melissa M. Martin</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1984859722?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Black Food: Stories, Art, and Recipes from Across the African Diaspora</a></td>
<td>Bryant Terry</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0316480681?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Rise: Black Cooks and the Soul of American Food</a></td>
<td>Marcus Samuelsson with Osayi Endolyn</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/3tMButD">I Am From Here: Stories and Recipes from a Southern Chef</a></strong></td>
<td><strong>Vishwesh Bhatt</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/45zM1G5">Gullah Geechee Home Cooking: Recipes from the Matriarch of Edisto Island</a></td>
<td>Emily Meggett with Kayla Stewart and Trelani Michelle</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3QsvEqx">The Woks of Life: Recipes to Know and Love from a Chinese American Family: A Cookbook</a></td>
<td>Bill Leung, Kaitlin Leung, Judy Leung, and Sarah Leung</td>
</tr>
</tbody>
</table>
<h3 id="baking-and-dessert-a-namebakinga">Baking and Dessert <a name="baking"></a></h3>
<p><em>Books with recipes focused on the art and craft of baking pastries and desserts, both sweet and savory items, including ingredients, techniques, equipment, and traditions.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1580089917?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Baking</a></strong></td>
<td><strong>James Peterson</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Dam-Good-Sweet-Desserts-Satisfy/dp/1600851185?crid=2XIN9KBCAMH5X&amp;keywords=DamGoodSweet%3A+Desserts+to+Satisfy+Your+Sweet+Tooth%2C+New+Orleans+Style&amp;qid=1697819001&amp;s=books&amp;sprefix=damgoodsweet+desserts+to+satisfy+your+sweet+tooth%2C+new+orleans+style%2Cstripbooks%2C125&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=c706787bc91e000a04e21e8cb548c6ee&amp;language=en_US&amp;ref_=as_li_ss_tl">DamGoodSweet: Desserts to Satisfy Your Sweet Tooth, New Orleans Style</a></td>
<td>David Guas, Raquel Pelzel</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1580089984?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Peter Reinhart&apos;s Artisan Breads Every Day</a></td>
<td>Peter Reinhart</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B006A1L1AG?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Good to the Grain: Baking with Whole-Grain Flours</a></strong></td>
<td><strong>Kim Boyce</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1580089941?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">My Sweet Mexico: Recipes for Authentic Pastries, Breads, Candies, Beverages, and Frozen Treats</a></td>
<td>Fany Gerson</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0847834085?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sarabeth&#x2019;s Bakery: From My Hands to Yours</a></td>
<td>Sarabeth Levine</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1579654363?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Jeni&#x2019;s Splendid Ice Creams at Home</a></strong></td>
<td><strong>Jeni Britton Bauer</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0470437022?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Baking Style: Art, Craft, Recipes</a></td>
<td>Lisa Yockelson</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/208020081X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cooking with Chocolate: Essential Recipes and Techniques</a></td>
<td>Fr&#xE9;d&#xE9;ric Bau</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/dp/160774273X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Flour Water Salt Yeast: The Fundamentals of Artisan Bread and Pizza</a></strong></td>
<td><strong>Ken Forkish</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1579654355?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Bouchon Bakery</a></td>
<td>Thomas Keller and Sebastien Rouxel</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0062183745?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Dahlia Bakery Cookbook: Sweetness in Seattle</a></td>
<td>Tom Douglas and Shelley Lance</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/dp/030795935X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Art of French Pastry</a></strong></td>
<td><strong>Jacquy Pfeiffer with Martha Rose Shulman</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607749149?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sweet</a></td>
<td>Valerie Gordon</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00F8H0FKU?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Tartine Book No. 3: Modern Ancient Classic Whole</a></td>
<td>Chad Robertson</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1579655130?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Flavor Flours: A New Way to Bake with Teff, Buckwheat, Sorghum, Other Whole &amp; Ancient Grains, Nuts &amp; Non-Wheat Flours</a></strong></td>
<td><strong>Alice Medrich</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0547724241?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Baking Chez Moi: Recipes from My Paris Home to Your Home Anywhere</a></td>
<td>Dorie Greenspan</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1579655319?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Della Fattoria Bread: 63 Foolproof Recipes for Yeasted, Enriched &amp; Naturally Leavened Breads</a></td>
<td>Kathleen Weber</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1611802385?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sourdough: Recipes for Rustic Fermented Breads, Sweets, Savories, and More</a></strong></td>
<td><strong>Sarah Owens</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1621138100?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Everyday Baker: Recipes and Techniques for Foolproof Baking</a></td>
<td>Abigail Johnson Dodge</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607747464?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The New Sugar &amp; Spice: A Recipe for Bolder Baking</a></td>
<td>Samantha Seneviratne</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0547614845?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Dorie&#x2019;s Cookies</a></strong></td>
<td><strong>Dorie Greenspan</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1581573278?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Art of the Pie: A Practical Guide to Homemade Crusts, Fillings, and Life</a></td>
<td>Kate McDermott</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/157965682X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Breaking Breads: A New World of Israeli Baking</a></td>
<td>Uri Scheft and Raquel Pelzel</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0393239861?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">BraveTart: Iconic American Desserts</a></strong></td>
<td><strong>Stella Parks</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607749149?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sweet</a></td>
<td>Yotam Ottolenghi and Helen Goh</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B01N18WGAN?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Sweet Spot: Dialing Back Sugar and Amping Up Flavor</a></td>
<td>Bill Yosses and Peter Kaminsky</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1743794134?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">SUQAR: Desserts &amp; Sweets from the Modern Middle East</a></strong></td>
<td><strong>Greg Malouf and Lucy Malouf</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1624145124?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Black Girl Baking: Wholesome Recipes Inspired by a Soulful Upbringing</a></td>
<td>Jerrelle Guy</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1538729148?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Pie Squared: Irresistibly Easy Sweet &amp; Savory Slab Pies</a></td>
<td>Cathy Barrow</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><a href="https://www.amazon.com/dp/0735213836?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Living Bread: Tradition and Innovation in Artisan Bread Making</a></td>
<td>Daniel Leader and Lauren Chattman</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0735218013?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Dappled: Baking Recipes for Fruit Lovers</a></td>
<td>Nicole Rucker</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0544836480?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Pastry Love: A Baker&apos;s Journal of Favorite Recipes</a></td>
<td>Joanne Chang</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0785238999?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Mooncakes and Milk Bread: Sweet and Savory Recipes Inspired by Chinese Bakeries</a></strong></td>
<td><strong>Kristina Cho</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1579658415?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cheryl Day&apos;s Treasury of Southern Baking</a></td>
<td>Cheryl Day</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1324003561?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Mother Grains: Recipes for the Grain Revolution</a></td>
<td>Roxana Jullapat</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/3S5vQNu">Tava: Eastern European Baking and Desserts from Romania &amp; Beyond</a></strong></td>
<td><strong>Irina Georgescu</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3S2AMCR">New European Baking: 99 Recipes for Breads, Brioches and Pastries</a></td>
<td>Laurel Kratochvila</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3S4oEkD">What&apos;s for Dessert: Simple Recipes for Dessert People: A Baking Book</a></td>
<td>Claire Saffitz</td>
</tr>
</tbody>
</table>
<h3 id="beverage-a-namebeveragea">Beverage <a name="beverage"></a></h3>
<p><em>Combined with and without recipes</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0520272676?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Been Doon So Long: A Randall Grahm Vinthology</a></strong></td>
<td><strong>Randall Grahm</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B0028MVGX8?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The King of Vodka: The Story of Pyotr Smirnov and the Upheaval of an Empire</a></td>
<td>Linda Himelstein</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0756654432?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">World Whisky</a></td>
<td>Charles Maclean</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B0046H9KTK?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Secrets of the Sommeliers: How to Think and Drink Like the World&#x2019;s Top Wine Professionals</a></strong></td>
<td><strong>Jordan Mackay and Rajat Parr</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0756667518?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Opus Vino</a></td>
<td>DK Publishing</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Reading-between-Wines-New-Preface/dp/0520271491?crid=1QOWFIHKTP2MU&amp;keywords=Reading+Between+the+Wines+theise&amp;qid=1697820639&amp;s=books&amp;sprefix=reading+between+the+wines+theise%2Cstripbooks%2C130&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=f3bf544bfa0f61da4dc35f7195917b44&amp;language=en_US&amp;ref_=as_li_ss_tl">Reading Between the Wines</a></td>
<td>Terry Theise</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B07XZ2SY53?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Bitters: A Spirited History of a Classic Cure-All, with Cocktails, Recipes, &amp; Formulas</a></strong></td>
<td><strong>Brad Thomas Parsons</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0061704237?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">An Ideal Wine: One Generation&#x2019;s Pursuit of Perfection&#x2013;and Profit&#x2013;in California</a></td>
<td>David Darlington</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00D8256QU?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Oxford Companion to Beer</a></td>
<td>Garrett Oliver</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B00ENGZMWS?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Wine Grapes: A Complete Guide to 1,368 Vine Varieties, Including Their Origins and Flavours</a></strong></td>
<td><strong>Julia Harding, Jancis Robinson, and Jos&#xE9; Vouillamoz</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B007HBLPH2?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">How to Love Wine: A Memoir and Manifesto</a></td>
<td>Eric Asimov</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0393064522?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Inventing Wine: A New History of One of the World&#x2019;s Most Ancient Pleasures</a></td>
<td>Paul Lukacs</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607745674?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Cocktail Lab: Unraveling the Mysteries of Flavor and Aroma in Drink, with Recipes</a></strong></td>
<td><strong>Tony Conigliaro</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00BQKIDVQ?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Drunken Botanist: The Plants That Create the World&#x2019;s Great Drinks</a></td>
<td>Amy Stewart</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607743000?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The New California Wine: A Guide to the Producers and Wines Behind a Revolution in Taste</a></td>
<td>Jon Bonne</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0393089037?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Liquid Intelligence: The Art and Science of the Perfect Cocktail</a></strong></td>
<td><strong>Dave Arnold</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00JNQMZ32?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Death &amp; Co: Modern Classic Cocktails</a></td>
<td>Alex Day, Nick Fauchald, and David Kaplan</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/160774581X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sherry: A Modern Guide to the Wine World&apos;s Best-Kept Secret, with Cocktails and Recipes</a></td>
<td>Talia Baiocchi</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0198871317?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Oxford Companion to Wine</a></strong></td>
<td><strong>Jancis Robinson and Julia Harding</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/American-Wine-Coming-Age-Story/dp/1569761671?_encoding=UTF8&amp;qid=1697818656&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=3fd4a1f74ce180d20b4a37c7d406a676&amp;language=en_US&amp;ref_=as_li_ss_tl">American Wine: A Coming-of-Age Story</a></td>
<td>Tom Acitelli</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1581572654?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Lost Recipes of Prohibition: Notes from a Bootlegger&#x2019;s Manual</a></td>
<td>Matthew Rowley</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607747324?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Smuggler&#x2019;s Cove: Exotic Cocktails, Rum, and the Cult of Tiki</a></strong></td>
<td><strong>Martin Cate with Rebecca Cate</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607748851?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Spritz: Italy&apos;s Most Iconic Aperitivo Cocktail, with Recipes</a></td>
<td>Talia Baiocchi and Leslie Pariseau</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0143124803?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Waldorf Astoria Bar Book</a></td>
<td>Frank Caiafa</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607748622?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Meehan&apos;s Bartender Manual</a></strong></td>
<td><strong>Jim Meehan</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0399578544?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">3-Ingredient Cocktails</a></td>
<td>Robert Simonson</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B071G9X64Q?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Mezcal: The History, Craft &amp; Cocktails of the World&#x2019;s Ultimate Artisanal Spirit</a></td>
<td>Emma Janzen</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0525533893?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Wine Folly: Magnum Edition</a></strong></td>
<td><strong>Madeline Puckette and Justin Hammack</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1524761753?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Ap&#xE9;ritif: Cocktail Hour the French Way</a></td>
<td>Rebekah Peppler</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Aviary-Cocktail-Book-Grant-Achatz/dp/0692898379?crid=33PPCD085QA5Y&amp;keywords=the+aviary+cocktail+book&amp;qid=1697819733&amp;s=books&amp;sprefix=the+aviary+cocktail+boo%2Cstripbooks%2C132&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=f049d940b70e82b4e0fed4479c6adceb&amp;language=en_US&amp;ref_=as_li_ss_tl">The Aviary Cocktail Book</a></td>
<td>Grant Achatz, Nick Kokonas, Micah Melton, Allen Hemberger, and Sarah Hemberger</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Cocktail-Codex-Fundamentals-Formulas-Evolutions/dp/160774970X?crid=20AK1OKASH4NY&amp;keywords=cocktail+codex&amp;qid=1697818880&amp;s=books&amp;sprefix=cocktail+code%2Cstripbooks%2C131&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=f0b3fa6223fd7a6990da7ba69a10d851&amp;language=en_US&amp;ref_=as_li_ss_tl">Cocktail Codex</a></td>
<td>Alex Day, Nick Fauchald, and David Kaplan, with Devon Tarby</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/dp/039958269X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The NoMad Cocktail Book</a></strong></td>
<td><strong>Leo Robitschek</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0399582762?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Last Call: Bartenders on Their Final Drink and the Wisdom and Rituals of Closing Time</a></td>
<td>Brad Thomas Parsons</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0399581219?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Martini Cocktail: A Meditation on the World&apos;s Greatest Drink, with Recipes</a></td>
<td>Robert Simonson</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1784726184?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">World Atlas of Wine 8th Edition</a></strong></td>
<td><strong>Hugh Johnson and Jancis Robinson</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/4805314958?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Complete Guide to Japanese Drinks: Sake, Shochu, Japanese Whisky, Beer, Wine, Cocktails and Other Beverages</a></td>
<td>Stephen Lyman and Chris Bunting</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/140871017X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Red &amp; White: An Unquenchable Thirst for Wine</a></td>
<td>Oz Clarke</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/Way-Cocktail-Japanese-Traditions-Techniques/dp/0593135377?crid=2TWTH7L6OF868&amp;keywords=The+Way+of+the+Cocktail%3A+Japanese+Traditions%2C+Techniques%2C+and+Recipes&amp;qid=1697820844&amp;s=books&amp;sprefix=the+way+of+the+cocktail+japanese+traditions%2C+techniques%2C+and+recipes%2Cstripbooks%2C137&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=ba418d906fc9e3da5674d26f3e723843&amp;language=en_US&amp;ref_=as_li_ss_tl">The Way of the Cocktail: Japanese Traditions, Techniques, and Recipes</a></strong></td>
<td><strong>Julia Momos&#xE9; with Emma Janzen</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1984858416?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Death &amp; Co Welcome Home: A Cocktail Recipe Book</a></td>
<td>Alex Day, Nick Fauchald, and David Kaplan with Devon Tarby and Tyson Buhler</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0358362024?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Japanese Art of the Cocktail</a></td>
<td>Masahiro Urushido and Michael Anstendig</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1335282408?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Girly Drinks: A World History of Women and Alcohol</a></strong></td>
<td><strong>Mallory O&apos;Meara</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1623719011?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Foot Trodden: Portugal and the Wines that Time Forgot</a></td>
<td>Simon J. Woolf and Ryan Opaz</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1787132714?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Noble Rot Book: Wine from Another Galaxy</a></td>
<td>Dan Keeling and Mark Andrew</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/47gXuf1">The Bartender&apos;s Manifesto: How to Think, Drink, and Create Cocktails Like a Pro</a></strong></td>
<td><strong>Toby Maloney and Emma Janzen</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3tDxtYx">Cure: New Orleans Drinks and How to Mix &apos;Em from the Award-Winning Bar</a></td>
<td>Neal Bodenheimer and Emily Timberlake</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/491KlIc">Wild Brews: The Craft of Home Brewing, from Sour and Fruit Beers to Farmhouse Ales</a></td>
<td>Jaega Wise</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/3Q2T7Nn">Exploring the World of Japanese Craft Sake: Rice, Water, Earth</a></strong></td>
<td><strong>Nancy Matsumoto and Michael Tremblay</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3FrOszE">Drinking with the Valkyries: Writings on Wine</a></td>
<td>Andrew Jefford</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3s1GmL8">To Fall in Love, Drink This: A Wine Writer&#x2019;s Memoir</a></td>
<td>Alice Feiring</td>
</tr>
</tbody>
</table>
<h3 id="bread-a-namebreada">Bread <a name="bread"></a></h3>
<p><em>Books with recipes focused on the art and craft of making bread, including ingredients, techniques, equipment, and traditions.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/493AEJu">The Perfect Loaf: The Craft and Science of Sourdough Breads, Sweets, and More: A Baking Book</a></strong></td>
<td><strong>Maurizio Leo</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/408CbcX">Breadsong: How Baking Changed Our Lives</a></td>
<td>Kitty Tait and Al Tait</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/45EFHwQ">The Miller&apos;s Daughter: Unusual Flours &amp; Heritage Grains: Stories and Recipes from Hayden Flour Mills</a></td>
<td>Emma Zimmerman</td>
</tr>
</tbody>
</table>
<h3 id="restaurant-professional-a-namerestauranta">Restaurant / Professional <a name="restaurant"></a></h3>
<p><em>Books written by a culinary professional or restaurant chef with recipes that may include advanced cooking techniques, or the use of specialty ingredients and professional equipment, including culinary arts textbooks.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/dp/155365367X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Araxi: Seasonal Recipes from the Celebrated Whistler Restaurant</a></strong></td>
<td><strong>James Walt</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/030745195X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Momofuku</a></td>
<td>David Chang, Peter Meehan</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1584798033?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Fundamental Techniques of Classic Pastry Arts</a></td>
<td>The French Culinary Institute with Judith Choate</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0714859036?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Noma: Time and Place in Nordic Cuisine</a></strong></td>
<td><strong>Ren&#xE9; Redzepi</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0811875393?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Michael Chiarello&#x2019;s Bottega</a></td>
<td>Michael Chiarello</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/047037134X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Modern Caf&#xE9;</a></td>
<td>Francisco J. Migoya and The Culinary Institute of America</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0982761007?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Modernist Cuisine</a></strong></td>
<td><strong>Nathan Myhrvold with Chris Young and Maxime Bilet</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607740141?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Art of Living According to Joe Beef: A Cookbook of Sorts</a></td>
<td>Meredith Erickson, David McMillan, and Fr&#xE9;d&#xE9;ric Morin</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0316098515?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Eleven Madison Park: The Cookbook</a></td>
<td>Daniel Humm and Will Guidara</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/Torque-Creators-Gastronomy-Normand-2012-01-01/dp/B01K314QXM?crid=12O9ATSCGW8CX&amp;keywords=Toqu%C3%A9%21+normand+laprise&amp;qid=1697820942&amp;s=books&amp;sprefix=toqu%C3%A9+normand+lapris%2Cstripbooks%2C132&amp;sr=1-1-fkmr0&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=77a2da3aa67359b885b9d014713c7ac0&amp;language=en_US&amp;ref_=as_li_ss_tl">Toqu&#xE9;! Creators of a New Quebec Gastronomy</a></strong></td>
<td><strong>Normand Laprise</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00B3M3X26?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Come In, We&#x2019;re Closed: An Invitation to Staff Meals at the World&#x2019;s Best Restaurants</a></td>
<td>Christine Carroll and Jody Eddy</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1584799900?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Fundamental Techniques of Classic Italian Cuisine</a></td>
<td>The International Culinary Center, Cesare Casella, and Stephanie Lyness</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/dp/140885757X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Historic Heston</a></strong></td>
<td><strong>Heston Blumenthal</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607743973?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Manresa: An Edible Reflection</a></td>
<td>David Kinch with Christine Muhlke</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0714877549?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Ren&#xE9; Redzepi: A Work in Progress</a></td>
<td>Ren&#xE9; Redzepi</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B00JVZ42OK?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Bar Tartine: Techniques &amp; Recipes</a></strong></td>
<td><strong>Nicolaus Balla and Cortney Burns</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0714867144?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Never Trust a Skinny Italian Chef</a></td>
<td>Massimo Bottura</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607746492?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Rel&#xE6;: A Book of Ideas</a></td>
<td>Christian F. Puglisi</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/160774418X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">NOPI: The Cookbook</a></strong></td>
<td><strong>Yotam Ottolenghi and Ramael Scully</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/145212809X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Gjelina: Cooking from Venice, California</a></td>
<td>Travis Lett</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607747286?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">This Is Camino</a></td>
<td>Russell Moore and Allison Hopelain</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1910254533?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Classic Koffmann</a></strong></td>
<td><strong>Pierre Koffmann</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0714872806?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Central</a></td>
<td>Virgilio Mart&#xED;nez with Nicholas Gill</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0692797718?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Lickerland: Asian-Accented Desserts by Jason Licker</a></td>
<td>Jason Licker</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0982761058?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Modernist Bread</a></strong></td>
<td><strong>Nathan Myhrvold and Francisco Migoya</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/071487390X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">On Vegetables: Modern Recipes for the Home Kitchen</a></td>
<td>Jeremy Fox and Noah Galuten</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B01N257VPO?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">State Bird Provisions</a></td>
<td>Stuart Brioza and Nicole Krasinski, with JJ Goode</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0714876453?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Chicken and Charcoal: Yakitori, Yardbird, Hong Kong</a></strong></td>
<td><strong>Matt Abergel</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Earth-Worlds-Almost-Forgotten-Vegetables/dp/1743793480?crid=37EDI6GD1FPK4&amp;keywords=From+the+Earth%3A+World%E2%80%99s+Great%2C+Rare+and+Almost+Forgotten+Vegetables&amp;qid=1697819277&amp;sprefix=from+the+earth+world+s+great%2C+rare+and+almost+forgotten+vegetables%2Caps%2C144&amp;sr=8-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=d5d6668424b4dfb2dd2167ee55014192&amp;language=en_US&amp;ref_=as_li_ss_tl">From the Earth: World&#x2019;s Great, Rare and Almost Forgotten Vegetables</a></td>
<td>Peter Gilmore</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07F4YPXWX?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Rich Table</a></td>
<td>Evan Rich and Sarah Rich</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/dp/174379553X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Whole Fish Cookbook: New Ways to Cook, Eat and Think</a></strong></td>
<td><strong>Josh Niland</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1408890674?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Dishoom: From Bombay with Love</a></td>
<td>Shamil Thakrar, Kavi Thakrar, and Naved Nasir</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0399580654?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Eleven Madison Park: The Next Chapter, Revised and Unlimited Edition</a></td>
<td>Daniel Humm</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1984856502?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Mister Jiu&apos;s in Chinatown: Recipes and Stories from the Birthplace of Chinese American Food</a></strong></td>
<td><strong>Brandon Jew and Tienlon Ho</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1734386126?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Modernist Pizza</a></td>
<td>Nathan Myhrvold and Francisco Migoya</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1984857002?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Pasta: The Spirit and Craft of Italy&apos;s Greatest Food, with Recipes</a></td>
<td>Missy Robbins and Talia Baiocchi</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/3QpjFtv">Bludso&apos;s BBQ Cookbook: A Family Affair in Smoke and Soul</a></strong></td>
<td><strong>Kevin Bludso with Noah Galuten</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/46VoSig">Please Wait To Be Tasted: The Lil&apos; Deb&apos;s Oasis Cookbook</a></td>
<td>Halo Perez-Gallardo, Hannah Black, and Wheeler with Meshell Ndegeocello</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3tHWUbD">Turkey and the Wolf: Flavor Trippin&apos; in New Orleans</a></td>
<td>Mason Hereford and JJ Goode</td>
</tr>
</tbody>
</table>
<h3 id="food-issues-and-advocacy-a-nameissuesa">Food Issues and Advocacy <a name="issues"></a></h3>
<p><em>Books that include investigative journalism, food policy, deep dives, and critical analysis of the changing social landscape.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/3M9bSh6">Eating While Black: Food Shaming and Race in America</a></strong></td>
<td><strong>Psyche A. Williams-Forson</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3M8cEuN">Gastronativism: Food, Identity, Politics</a></td>
<td>Fabio Parasecoli</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/46EE7fV"> Retail Inequality: Reframing the Food Desert Debate</a></td>
<td>Kenneth H. Kolb</td>
</tr>
</tbody>
</table>
<h3 id="general-cooking-a-namegenerala">General Cooking <a name="general"></a></h3>
<p><em>Books with recipes that address a broad scope of cooking, not just a single topic, technique, or region.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1579653774?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Ad Hoc at Home</a></strong></td>
<td><strong>Thomas Keller</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00DB8EHSY?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Salt to Taste: The Keys to Confident, Delicious Cooking</a></td>
<td>Marco Canora with Catherine Young</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0307270726?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Pleasures of Cooking for One</a></td>
<td>Judith Jones</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0393061035?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Essential New York Times Cook Book: Classic Recipes for a New Century</a></strong></td>
<td><strong>Amanda Hesser</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/157965407X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Heart of the Artichoke and Other Kitchen Journeys</a></td>
<td>David Tanis</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1605294705?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Radically Simple: Brilliant Flavors with Breathtaking Ease</a></td>
<td>Rozanne Gold</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0811876438?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Ruhlman&#x2019;s Twenty</a></strong></td>
<td><strong>Michael Ruhlman</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1449407870?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">My Family Table: A Passionate Plea for Home Cooking</a></td>
<td>John Besh</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0307590550?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Splendid Table&#x2019;s How to Eat Weekends</a></td>
<td>Lynne Rossetto Kasper and Sally Swift</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1449421474?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Canal House Cooks Every Day</a></strong></td>
<td><strong>Melissa Hamilton and Christopher Hirsheimer</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0982761015?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Modernist Cuisine at Home</a></td>
<td>Nathan Myhrvold and Maxime Bilet</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0670026182?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">What Katie Ate: Recipes and Other Bits &amp; Pieces</a></td>
<td>Katie Quinn Davies</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/Smoke-Firewood-Cooking-Flavor-Kitchen/dp/0847839796?crid=UJPPFNVZFYLA&amp;keywords=Smoke%3A+New+Firewood+Cooking+byres&amp;qid=1697820717&amp;s=books&amp;sprefix=smoke+new+firewood+cooking+byre%2Cstripbooks%2C131&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=57076e06583c449535f75e3bef2f9225&amp;language=en_US&amp;ref_=as_li_ss_tl">Smoke: New Firewood Cooking</a></strong></td>
<td><strong>Tim Byres</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1579654673?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">One Good Dish</a></td>
<td>David Tanis</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B009JU6UPQ?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Try This at Home: Recipes from My Head to Your Plate</a></td>
<td>Richard Blais</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0770434436?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Kitchn Cookbook: Recipes, Kitchens &amp; Tips to Inspire Your Cooking</a></strong></td>
<td><strong>Faith Durand and Sara Kate Gillingham</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00HK3EUH4?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Marcus Off Duty: The Recipes I Cook at Home</a></td>
<td>Marcus Samuelsson with Roy Finamore</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00T8NCLWA?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Saveur: The New Classics Cookbook</a></td>
<td>The Editors of Saveur</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0393081087?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Food Lab: Better Home Cooking Through Science</a></strong></td>
<td><strong>J. Kenji L&#xF3;pez-Alt</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0804188017?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Mark Bittman&#x2019;s Kitchen Matrix</a></td>
<td>Mark Bittman</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0804186235?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Slow Fires: Mastering New Ways to Braise</a></td>
<td>Jusin Smillie</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/Eat-My-Kitchen-Cook-Treat/dp/3791382004?crid=2B1I8GMV6CJ5P&amp;keywords=meike+peters+eat+in+my+kitchen&amp;qid=1697819119&amp;sprefix=meike+peters%2Caps%2C146&amp;sr=8-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=ec4fe05e9fd76312d16fe2b8c65a38e8&amp;language=en_US&amp;ref_=as_li_ss_tl">Eat in My Kitchen: To Cook, to Bake, to Eat, and to Treat</a></strong></td>
<td><strong>Meike Peters</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/030746489X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cooking for Jeffrey: A Barefoot Contessa Cookbook</a></td>
<td>Ina Garten</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B01D7CEGPW?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cook&#x2019;s Science: How to Unlock Flavor in 50 of Our Favorite Ingredients</a></td>
<td>The Editors at Cook&#x2019;s Illustrated</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1476753830?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Salt, Fat, Acid, Heat</a></strong></td>
<td><strong>Samin Nosrat</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/031643728X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Christopher Kimball&apos;s Milk Street: The New Home Cooking</a></td>
<td>Christopher Kimball</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0553448234?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Dinner: Changing the Game</a></td>
<td>Melissa Clark</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0316705993?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Milk Street: Tuesday Nights</a></strong></td>
<td><strong>Christopher Kimball</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0544826981?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Everyday Dorie</a></td>
<td>Dorie Greenspan</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607749165?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Ottolenghi Simple</a></td>
<td>Yotam Ottolenghi</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0525573348?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Where Cooking Begins: Uncomplicated Recipes to Make You a Great Cook</a></strong></td>
<td><strong>Carla Lalli Music</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0393246272?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">All About Dinner: Simple Meals, Expert Advice</a></td>
<td>Molly Stevens</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B083Q6NN7X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Milk Street: The New Rules: Recipes That Will Change the Way You Cook</a></td>
<td>Christopher Kimball</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0062984519?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Everyone&apos;s Table: Global Recipes for Modern Health</a></strong></td>
<td><strong>Gregory Gourdet with JJ Goode</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B08DNV3D11?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cook, Eat, Repeat: Ingredients, Recipes, and Stories</a></td>
<td>Nigella Lawson</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1524759244?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cooking at Home: Or, How I Learned to Stop Worrying About Recipes (And Love My Microwave)</a></td>
<td>David Chang and Priya Krishna</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/404jlUi"> The Cook You Want to Be: Everyday Recipes to Impress</a></strong></td>
<td><strong>Andy Baraghani</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3QlMuHn">I Dream of Dinner (so you don&apos;t have to): Low-Effort, High-Reward Recipes: A Cookbook</a></td>
<td>Ali Slagle</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3QrvFe0">Sunday Best: Cooking Up the Weekend Spirit Every Day: A Cookbook</a></td>
<td>Adrienne Cheatham with Sarah Zorn</td>
</tr>
</tbody>
</table>
<h3 id="health-a-namehealtha">Health <a name="health"></a></h3>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0393332578?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Love Soup: 160 All-New Vegetarian Recipes from the Author of The Vegetarian Epicure</a></strong></td>
<td><strong>Anna Thomas</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Eatingwell-Comfort-Foods-Made-Healthy/dp/088150887X?crid=XILCULG7W92A&amp;keywords=EatingWell+Comfort+Foods+Made+Healthy+jesse+price&amp;qid=1697819085&amp;sprefix=eatingwell+comfort+foods+made+healthy+jesse+pri%2Caps%2C142&amp;sr=8-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=1a5ed7583c8e9683499854d45f52691d&amp;language=en_US&amp;ref_=as_li_ss_tl">EatingWell Comfort Foods Made Healthy</a></td>
<td>Jesse Price, the Editors of EatingWell</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Golden-Door-Cooks-Home-Celebrated/dp/0307450791?crid=CO5JCA1GX87K&amp;keywords=golden+door+cooks+at+home&amp;qid=1697820499&amp;s=books&amp;sprefix=golden+door+cooks+at+hom%2Cstripbooks%2C128&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=06e81e9e49c089c76e1d702e49e4ff1f&amp;language=en_US&amp;ref_=as_li_ss_tl">Golden Door Cooks at Home: Favorite Recipes from the Celebrated Spa</a></td>
<td>Dean Rucker with Marah Stets</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1581572190?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Simple Art of EatingWell Cookbook</a></strong></td>
<td><strong>Jessie Price &amp; the EatingWell Test Kitchen</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B0751FRGCB?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Clean Start: Inspiring You to Eat Clean and Live Well</a></td>
<td>Terry Walters</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00433T3VM?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Very Best Recipes for Health: 250 Recipes and More from the Popular Feature on NYTimes.com</a></td>
<td>Martha Rose Shulman</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B01LP2SFSU?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Super Natural Every Day: Well-Loved Recipes from My Natural Foods Kitchen</a></strong></td>
<td><strong>Heidi Swanson</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00BS03TD6?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Comfort Food Fix: Feel-Good Favorites Made Healthy</a></td>
<td>Ellie Krieger</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1579653944?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Intolerant Gourmet: Glorious Food without Gluten &amp; Lactose</a></td>
<td>Barbara Kafka</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/Scott-Mowbray-Flavors-Todays-Cooking/dp/B00HTK4IY8?&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=043343bfc99f6519af8baffd65eda6db&amp;language=en_US&amp;ref_=as_li_ss_tl">Cooking Light The New Way to Cook Light: Fresh Food &amp; Bold Flavors for Today&#x2019;s Home Cook</a></strong></td>
<td><strong>Scott Mowbray and Ann Taylor Pittman</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607741148?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Sprouted Kitchen: A Tastier Take on Whole Foods</a></td>
<td>Sara Forte</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0316129410?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">True Food: Seasonal, Sustainable, Simple, Pure</a></td>
<td>Sam Fox and Andrew Weil with Michael Stebner</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/Gluten-Free-Every-Shauna-James-Ahern/dp/111811521X?crid=ZOVNAYHTEI7F&amp;keywords=shauna+james+gluten+free&amp;qid=1697819359&amp;sprefix=shauna+james+gluten+fre%2Caps%2C134&amp;sr=8-2&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=6063507a868e9993afaf2a4976df39de&amp;language=en_US&amp;ref_=as_li_ss_tl">Gluten-Free Girl Every Day</a></strong></td>
<td><strong>Shauna James Ahern with Daniel Ahern</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0385344740?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">VB6: Eat Vegan Before 6:00 to Lose Weight and Restore Your Health . . . for Good</a></td>
<td>Mark Bittman</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00E78IF0S?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Weeknight Wonders: Delicious, Healthy Dinners in 30 Minutes or Less</a></td>
<td>Ellie Krieger</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0848704282?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cooking Light Mad Delicious: The Science of Making Healthy Food Taste Amazing</a></strong></td>
<td><strong>Keith Schroeder</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B01M8PD3UI?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">A Change of Appetite: Where Healthy Meets Delicious</a></td>
<td>Diana Henry</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1449450334?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Nom Nom Paleo: Food for Humans</a></td>
<td>Henry Fong and Michelle Tam</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607745739?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Lighten Up, Y&apos;all: Classic Southern Recipes Made Healthy and Wholesome</a></strong></td>
<td><strong>Virginia Willis</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1950099148?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cook for Your Life: Delicious, Nourishing Recipes for Before, During, and After Cancer Treatment</a></td>
<td>Anne Ogden Gaffney</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0062305646?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Everyday Super Food</a></td>
<td>Jamie Oliver</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0544579305?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">You Have It Made: Delicious, Healthy, Do-Ahead Meals</a></strong></td>
<td><strong>Ellie Krieger</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B01HC9S2TM?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Pure Delicious: More Than 150 Delectable Allergen-Free Recipes Without Gluten, Dairy, Eggs, Soy, Peanuts, Tree Nuts, Shellfish, or Cane Sugar</a></td>
<td>Heather Christo</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0553459600?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Skinnytaste Fast and Slow: Knockout Quick-Fix and Slow Cooker Recipes</a></td>
<td>Gina Homolka</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1510718982?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Deepa&#x2019;s Secrets</a></strong></td>
<td><strong>Deepa Thomas</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1743793049?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Beauty Chef</a></td>
<td>Carla Oates</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1909487627?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Eat Right</a></td>
<td>Nick Barnard</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0451494946?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Eat a Little Better</a></strong></td>
<td><strong>Sam Kass</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1945256583?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Complete Diabetes Cookbook</a></td>
<td>Editors at America&#x2019;s Test Kitchen</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1611804701?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">More with Less</a></td>
<td>Jodi Moreno</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/Gluten-Free-Baking-Home-Foolproof-Delicious/dp/0399582797?crid=3R8VUHN4KQDOV&amp;keywords=Gluten-Free+Baking+at+Home%3A+102+Foolproof+Recipes+for+Delicious+Breads%2C+Cakes%2C+Cookies%2C+and+More&amp;qid=1697819331&amp;sprefix=gluten-free+baking+at+home+102+foolproof+recipes+for+delicious+breads%2C+cakes%2C+cookies%2C+and+more%2Caps%2C136&amp;sr=8-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=371c7c635b398d267b60a1b6cb3d4263&amp;language=en_US&amp;ref_=as_li_ss_tl">Gluten-Free Baking at Home: 102 Foolproof Recipes for Delicious Breads, Cakes, Cookies, and More</a></strong></td>
<td><strong>Jeffrey Larsen</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1743795009?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Beauty Chef Gut Guide: With 90+ Delicious Recipes and Weekly Meal Plans</a></td>
<td>Carla Oates</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1632172003?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cannelle et Vanille: Nourishing, Gluten-Free Recipes for Every Meal and Mood</a></td>
<td>Aran Goyoaga</td>
</tr>
</tbody>
</table>
<h3 id="international-a-nameinternationala">International <a name="international"></a></h3>
<p><em>Books with recipes focused on food or cooking traditions of countries, regions, or communities outside of the United States.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/dp/081186670X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Country Cooking of Ireland</a></strong></td>
<td><strong>Colman Andrews</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0307267512?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Lidia Cooks from the Heart of Italy</a></td>
<td>Lidia Matticchio Bastianich, Tanya Bastianich Manuali</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B0086I2BCS?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Mastering the Art of Chinese Cooking</a></td>
<td>Eileen Yin-Fei Lo</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1416580573?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Stir-Frying to the Sky&#x2019;s Edge: The Ultimate Guide to Mastery, with Authentic Recipes and Stories</a></strong></td>
<td><strong>Grace Young</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0857838571?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cook Italy</a></td>
<td>Katie Caldesi</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0292722664?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Oaxaca al Gusto: An Infinite Gastronomy</a></td>
<td>Diana Kennedy</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0061957550?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Food of Morocco</a></strong></td>
<td><strong>Paula Wolfert</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00AOFD0Q2?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Country Cooking of Italy</a></td>
<td>Colman Andrews</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0061969621?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Food of Spain</a></td>
<td>Claudia Roden</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607743949?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Jerusalem: A Cookbook</a></strong></td>
<td><strong>Yotam Ottolenghi &amp; Sami Tamimi</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1579654134?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Burma: Rivers of Flavor</a></td>
<td>Naomi Duguid</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0393050696?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Gran Cocina Latina: The Food of Latin America</a></td>
<td>Maricel E. Presilla</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0393089045?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Every Grain of Rice: Simple Chinese Home Cooking</a></strong></td>
<td><strong>Fuchsia Dunlop</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1891105531?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Return to the Rivers: Recipes and Memories of the Himalayan River Valleys</a></td>
<td>Vikas Khanna with Andrew Blackmore-Dobbyn</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Sauces-Shapes-Pasta-Italian-Way/dp/0393082431?crid=LLHIHTHGXOGM&amp;keywords=Sauces+%26+Shapes%3A+Pasta+the+Italian+Way&amp;qid=1697820697&amp;s=books&amp;sprefix=sauces+%26+shapes+pasta+the+italian+way%2Cstripbooks%2C140&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=f1dbd147793384c41a48841e86cc9526&amp;language=en_US&amp;ref_=as_li_ss_tl">Sauces &amp; Shapes: Pasta the Italian Way</a></td>
<td>Oretta Zanini DeVita and Maureen B. Fant</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0292735812?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Yucat&#xE1;n: Recipes from a Culinary Expedition</a></strong></td>
<td><strong>David Sterling</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1250036089?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Cuban Table: A Celebration of Food, Flavors, and History</a></td>
<td>Ana Sof&#xED;a Pel&#xE1;ez and Ellen Silverman</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607742675?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">My Paris Kitchen: Recipes and Stories</a></td>
<td>David Lebovitz</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0544373286?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Zahav: A World of Israeli Cooking</a></strong></td>
<td><strong>Michael Solomonov and Steven Cook</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1449450881?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Preserving the Japanese Way</a></td>
<td>Nancy Singleton Hachisu</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1891105558?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Senegal: Modern Senegalese Recipes from the Source to the Bowl</a></td>
<td>Pierre Thiam with Jennifer Sit</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B01BEGV624?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Taste of Persia: A Cook&apos;s Travels Through Armenia, Azerbaijan, Georgia, Iran, and Kurdistan</a></strong></td>
<td><strong>Naomi Duguid</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607749823?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">All Under Heaven: Recipes from the 35 Cuisines of China</a></td>
<td>Carolyn Phillips</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0393254380?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Land of Fish and Rice: Recipes from the Culinary Heart of China</a></td>
<td>Fuchsia Dunlop</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0399578285?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Nopalito</a></strong></td>
<td><strong>Gonzalo Guzman and Stacy Adimando</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B074QCD83W?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Paladares</a></td>
<td>Anya von Bremzen and Megan Fawn Schlow</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0714874965?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Palestinian Table</a></td>
<td>Reem Kassis</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0062363034?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Feast: Food of the Islamic World</a></strong></td>
<td><strong>Anissa Helou</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/045149749X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Food of Northern Thailand</a></td>
<td>Austin Bush</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1579657672?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">I Am a Filipino</a></td>
<td>Nicole Ponseca and Miguel Trinidad</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/Ethiopia-Recipes-Traditions-Horn-Africa/dp/1623719631?crid=2R1MV1ZJ0CQGN&amp;keywords=Ethiopia%3A+Recipes+and+Traditions+from+the+Horn+of+Afric&amp;qid=1697819198&amp;sprefix=ethiopia+recipes+and+traditions+from+the+horn+of+africa%2Caps%2C131&amp;sr=8-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=c169fe37ca234192576f48df774b09b5&amp;language=en_US&amp;ref_=as_li_ss_tl">Ethiopia: Recipes and Traditions from the Horn of Africa</a></strong></td>
<td><strong>Yohanis Gebreyesus with Jeff Koehler</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07QXSLH9P?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Black Sea: Dispatches and Recipes &#x2013; Through Darkness and Light</a></td>
<td>Caroline Eden</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1324004835?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Food of Sichuan</a></td>
<td>Fuchsia Dunlop</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1984856731?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">In Bibi&apos;s Kitchen: The Recipes and Stories of Grandmothers from the Eight African Countries that Touch the Indian Ocean</a></strong></td>
<td><strong>Hawa Hassan with Julia Turshen</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0399581731?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Falastin: A Cookbook</a></td>
<td>Sami Tamimi and Tara Wigley</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/132400665X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Ripe Figs: Recipes and Stories from Turkey, Greece, and Cyprus</a></td>
<td>Yasmin Khan</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/3M9r5i1"> Mi Cocina: Recipes and Rapture from My Kitchen in Mexico: A Cookbook</a></strong></td>
<td><strong>Rick Mart&#xED;nez</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3MbK6QZ"> Masala: Recipes from India, the Land of Spices</a></td>
<td>Anita Jaisinghani</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3tMAZQh"> Mezcla: Recipes to Excite</a></td>
<td>Ixta Belfrage</td>
</tr>
</tbody>
</table>
<h3 id="photography-visuals-a-namephotographya">Photography / Visuals <a name="photography"></a></h3>
<p><em>Books on food or beverage with exceptional graphic design, art, or photography.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1579653545?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Seven Fires: Grilling the Argentine Way</a></strong></td>
<td><strong>Santiago Solo Monllor</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Eat-Ate-Guy-Mirabella/dp/0811871118?crid=32QAXXF2617YL&amp;keywords=Eat+Ate+Guy+Mirabella&amp;qid=1697819061&amp;sprefix=eat+ate+guy+mirabella%2Caps%2C425&amp;sr=8-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=40689c10028273925b7deb6759cc45ba&amp;language=en_US&amp;ref_=as_li_ss_tl">Eat Ate</a></td>
<td>Earl Carter</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/047028188X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">New American Table</a></td>
<td>Paul Brissman</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0714859036?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Noma: Time and Place in Nordic Cuisine</a></strong></td>
<td><strong>Photographer: Ditte Isager</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1449487637?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Blue Chair Jam Cookbook</a></td>
<td>Photographer: Sara Remington</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0811870413?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Tartine Bread</a></td>
<td>Photographer: Eric Wolfinger</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/Notes-Kitchen-Culinary-Obsession-Slipcase/dp/0983615918?crid=1A3OJWRAQY3OD&amp;keywords=Notes+from+a+Kitchen%3A+A+Journey+Inside+Culinary+Obsession&amp;qid=1697820570&amp;s=books&amp;sprefix=notes+from+a+kitchen+a+journey+inside+culinary+obsession+%2Cstripbooks%2C120&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=b994ad110ec1ca6be0ee7eb443c2d8a1&amp;language=en_US&amp;ref_=as_li_ss_tl">Notes from a Kitchen: A Journey Inside Culinary Obsession (Artist/Photographer: Jeff Scott)</a></strong></td>
<td><strong>Jeff Scott</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B006J4KSD0?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Cheesemonger&#x2019;s Kitchen (Photographer: Joseph De Leo)</a></td>
<td>Joseph De Leo</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.goodreads.com/en/book/show/12841290-rustica">Rustica: A Return to Spanish Home Cooking (Photographer: Alan Benson)</a></td>
<td>Alan Benson</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0670026182?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">What Katie Ate: Recipes and Other Bits &amp; Pieces</a></strong></td>
<td><strong>Katie Quinn Davies</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1579654355?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Bouchon Bakery</a></td>
<td>Deborah Jones</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Torque-Creators-Gastronomy-Normand-2012-01-01/dp/B01K314QXM?crid=12O9ATSCGW8CX&amp;keywords=Toqu%C3%A9%21+normand+laprise&amp;qid=1697820942&amp;s=books&amp;sprefix=toqu%C3%A9+normand+lapris%2Cstripbooks%2C132&amp;sr=1-1-fkmr0&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=77a2da3aa67359b885b9d014713c7ac0&amp;language=en_US&amp;ref_=as_li_ss_tl">Toqu&#xE9;! Creators of a New Quebec Gastronomy</a></td>
<td>Dominique Malaterre</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/dp/140885757X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Historic Heston</a></strong></td>
<td><strong>Romas Foord</strong></td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0714877549?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Ren&#xE9; Redzepi: A Work in Progress</a></strong></td>
<td><strong>Ali Kurshat Altinsoy, Ditte Isager, Ren&#xE9; Redzepi, Lars Williams, and the Noma Team</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Mast-Brothers-Chocolate-Family-Cookbook/dp/0316234842?crid=23V86NIPLIFIF&amp;keywords=Mast+Brothers+Chocolate+%28Photographer%3A+Tuukka+Koski%29&amp;qid=1697820538&amp;s=books&amp;sprefix=mast+brothers+chocolate+photographer+tuukka+koski+%2Cstripbooks%2C132&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=aa45b053e23dbe2cdc97bae644916259&amp;language=en_US&amp;ref_=as_li_ss_tl">Mast Brothers Chocolate (Photographer: Tuukka Koski)</a></td>
<td>Tuukka Koski</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0804185557?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">In Her Kitchen: Stories and Recipes from Grandmas Around the World</a></strong></td>
<td><strong>Gabriele Galimberti</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/New-Napa-Cuisine-Christopher-Kostow/dp/1607745941?_encoding=UTF8&amp;qid=&amp;sr=&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=2a8397cc0a884b1f88c77189560060ed&amp;language=en_US&amp;ref_=as_li_ss_tl">A New Napa Cuisine</a></td>
<td>Photographer: Jen Munkvold and Taylor Peden</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/160774581X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sherry: A Modern Guide to the Wine World&apos;s Best-Kept Secret, with Cocktails and Recipes</a></td>
<td>Photographer: Ed Anderson</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607745496?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Near &amp; Far: Recipes Inspired by Home and Travel</a></strong></td>
<td><strong>Heidi Swanson, Photographer: Heidi Swanson</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Fire-Ice-Classic-Nordic-Cooking/dp/1607746107?crid=1EFS8JU3B7Z34&amp;keywords=Fire+and+Ice%3A+Classic+Nordic+Cooking&amp;qid=1697819247&amp;sprefix=fire+and+ice+classic+nordic+cooking%2Caps%2C129&amp;sr=8-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=3dd23b04941f7d2a0342479ccd846a8a&amp;language=en_US&amp;ref_=as_li_ss_tl">Fire and Ice: Classic Nordic Cooking</a></td>
<td>Darra Goldstein, Photographer: Stefan Wettainen</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07RRK2HR1?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Root to Leaf: A Southern Chef Cooks Through the Seasons</a></td>
<td>Steven Satterfield, Photographer: John Kernick</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607748991?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Taste &amp; Technique: Recipes to Elevate Your Home Cooking</a></strong></td>
<td><strong>Chris Court</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/New-Napa-Cuisine-Christopher-Kostow/dp/1607745941?_encoding=UTF8&amp;qid=&amp;sr=&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=2a8397cc0a884b1f88c77189560060ed&amp;language=en_US&amp;ref_=as_li_ss_tl">Appetites</a></td>
<td>Bobby Fisher</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Everything-Want-Eat-California-Cooking/dp/141972231X?crid=2FN5GZ97VXYPB&amp;keywords=Everything+I+Want+To+Eat%3A+Sqirl+and+the+New+California+Cooking&amp;qid=1697819221&amp;sprefix=everything+i+want+to+eat+sqirl+and+the+new+california+cooking%2Caps%2C127&amp;sr=8-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=ae34e6878877f9a884bd81f23a07de70&amp;language=en_US&amp;ref_=as_li_ss_tl">Everything I Want To Eat: Sqirl and the New California Cooking</a></td>
<td>Claire Cottrell, Jaime Beechum, and Nacho Alegre</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B07RRK2HR1?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cook Beautiful</a></strong></td>
<td><strong>Johnny Miller</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1419724142?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Simple Fare: Spring and Summer</a></td>
<td>Karen Mordechai</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607749149?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sweet</a></td>
<td>Peden + Munk</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0399579125?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Tokyo New Wave</a></strong></td>
<td><strong>Andrea Fazzari</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1452163995?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Season: Big Flavors, Beautiful Food</a></td>
<td>Nik Sharma</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/3791384937?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Wild: Adventure Cookbook</a></td>
<td>Luisa Brimble</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/American-Sfoglino-Master-Class-Handmade/dp/1452173311?crid=2NRYPB2B1UCWE&amp;keywords=American+Sfoglino%3A+A+Master+Class+in+Handmade+Pasta+%28Photographer%3A+Eric+Wolfinger%29&amp;qid=1697818624&amp;s=books&amp;sprefix=american+sfoglino+a+master+class+in+handmade+pasta+photographer+eric+wolfinger+%2Cstripbooks%2C129&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=ed159a66c504753a12b4b8995f083da6&amp;language=en_US&amp;ref_=as_li_ss_tl">American Sfoglino: A Master Class in Handmade Pasta (Photographer: Eric Wolfinger)</a></strong></td>
<td><strong>Eric Wolfinger</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Corbuffet-Edible-Art-Design-Classics/dp/3791384724?crid=2Q4MXYSUR4M9M&amp;keywords=Le+Corbuffet%3A+Edible+Art+and+Design+Classics+%28Photographer%3A+Esther+Choi%29&amp;qid=1697820520&amp;s=books&amp;sprefix=le+corbuffet+edible+art+and+design+classics+photographer+esther+choi+%2Cstripbooks%2C135&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=6f2ded1912290f4010c77dabaf13756f&amp;language=en_US&amp;ref_=as_li_ss_tl">Le Corbuffet: Edible Art and Design Classics (Photographer: Esther Choi)</a></td>
<td>Esther Choi</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Oaxaca-Home-Cooking-Heart-Mexico/dp/141973542X?crid=2TNF3EG3TE9W7&amp;keywords=Oaxaca%3A+Home+Cooking+from+the+Heart+of+Mexico+%28Photographer%3A+Quentin+Bacon%29&amp;qid=1697820599&amp;s=books&amp;sprefix=oaxaca+home+cooking+from+the+heart+of+mexico+photographer+quentin+bacon+%2Cstripbooks%2C122&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=bd35afe2e1484b3c5838806c429f5529&amp;language=en_US&amp;ref_=as_li_ss_tl">Oaxaca: Home Cooking from the Heart of Mexico (Photographer: Quentin Bacon)</a></td>
<td>Quentin Bacon</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1743796633?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Take One Fish: The New School of Scale-to-Tail Cooking and Eating</a></strong></td>
<td><strong>Rob Palmer and Daniel New</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1838662545?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">monk: Light and Shadow on the Philosopher&apos;s Path</a></td>
<td>Yuka Yanazume and Julia Hasting</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1614289395?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sushi Shokunin: Japan&apos;s Culinary Masters</a></td>
<td>Andrea Fazzari</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/3rPNXMU">Chinese-ish: Home Cooking Not Quite Authentic, 100% Delicious</a></strong></td>
<td><strong>Joanna Hu and Armelle Habib</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3rPNXMU">Homage: Recipes and Stories from an Amish Soul Food Kitchen</a></td>
<td>Brittany Conerly</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/45KXpPb">The Sofrito Manifesto</a></td>
<td>Bernardo Medina, Rafael Montalvo, and &#xC1;ngelo &#xC1;lvarez</td>
</tr>
</tbody>
</table>
<h3 id="reference-history-and-scholarship-a-namereferencea">Reference, History, and Scholarship <a name="reference"></a></h3>
<p><em>Includes manuals, guides, encyclopedias, and books that present research related to food or foodways.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/Encyclopedia-Pasta-California-Studies-Culture/dp/0520255224?crid=SE3EKQFSY6YY&amp;keywords=Encyclopedia+of+Pasta+Oretta+Zanini+de+Vita%2C+Translated+by%3A+Maureen+B.+Fant&amp;qid=1697819169&amp;sprefix=encyclopedia+of+pasta+oretta+zanini+de+vita%2C+translated+by+maureen+b.+fant%2Caps%2C128&amp;sr=8-2&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=2ff5c43b035a23e23dc9630977c1dd04&amp;language=en_US&amp;ref_=as_li_ss_tl">Encyclopedia of Pasta</a></strong></td>
<td><strong>Oretta Zanini de Vita, Translated by: Maureen B. Fant</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0195331079?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Chop Suey: A Cultural History of Chinese Food in the United States</a></td>
<td>Andrew Coe</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0307464911?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Larousse Gastronomique: The World&apos;s Greatest Culinary Encyclopedia, Completely Revised and Updated</a></td>
<td>Librarie Larousse</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1580082629?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Salted: A Manifesto on the World&#x2019;s Most Essential Mineral, with Recipes</a></strong></td>
<td><strong>Mark Bitterman</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0470391308?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Encyclopedia of Jewish Food</a></td>
<td>Gil Marks</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0984074406?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">What I Eat: Around the World in 80 Diets</a></td>
<td>Faith D&#x2019;Aluisio and Peter Menzel</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0807834742?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Turning the Tables: Restaurants and the Rise of the American Middle Class, 1880&#x2013;1920</a></strong></td>
<td><strong>Andrew P. Haley</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1118029577?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Art of Beef Cutting: A Meat Professional&#x2019;s Guide to Butchering and Merchandising</a></td>
<td>Kari Underly</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0316045136?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Food Lover&#x2019;s Guide to Wine</a></td>
<td>Karen Page and Andrew Dornenburg</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B07JJBK5KH?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Art of Fermentation: An In-Depth Exploration of Essential Concepts and Processes from Around the World</a></strong></td>
<td><strong>Sandor Ellix Katz</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1933494190?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">101 Classic Cookbooks: 501 Classic Recipes</a></td>
<td>Marvin J. Taylor and Clark Wolf</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0520244001?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Cookbook Library: Four Centuries of the Cooks, Writers, and Recipes That Made the Modern Cookbook</a></td>
<td>Anne Willan with Mark Cherniavsky and Kyri Claflin</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/dp/146963242X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Soul Food: The Surprising Story of an American Cuisine One Plate at a Time</a></strong></td>
<td><strong>Adrian Miller</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0316229970?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">A History of Food in 100 Recipes</a></td>
<td>William Sitwell</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00LPMJFLM?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Modern Food, Moral Food: Self-Control, Science, and the Rise of Modern American Eating in the Early Twentieth Century</a></td>
<td>Helen Zoe Veit</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1612121829?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Butchering Poultry, Rabbit, Lamb, Goat, and Pork: The Comprehensive Photographic Guide to Humane Slaughtering and Butchering</a></strong></td>
<td><strong>Adam Danforth</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0520283457?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Inventing Baby Food: Taste, Health, and the Industrialization of the American Diet</a></td>
<td>Amy Bentley</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Spice-Herb-Bible-Ian-Hemphill/dp/0778804933?crid=2AD6UX1XVAF2A&amp;keywords=The+Spice+%26+Herb+Bible+%28Third+Edition%29&amp;qid=1697820825&amp;s=books&amp;sprefix=the+spice+%26+herb+bible+third+edition+%2Cstripbooks%2C130&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=be6cbf98bd4ba4e3225d5893f2c55d78&amp;language=en_US&amp;ref_=as_li_ss_tl">The Spice &amp; Herb Bible (Third Edition)</a></td>
<td>Ian and Kate Hemphill</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0292745486?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Jemima Code: Two Centuries of African American Cookbooks</a></strong></td>
<td><strong>Toni Tipton-Martin</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0199313393?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Oxford Companion to Sugar and Sweets</a></td>
<td>Darra Goldstein</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00VQOAKGI?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">To Live and Dine in Dixie: The Evolution of Urban Food Culture in the Jim Crow South</a></td>
<td>Angela Jill Cooley</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0199330883?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Oxford Companion to Cheese</a></strong></td>
<td><strong>Catherine Donnelly</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0520285239?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">French Wine: A History</a></td>
<td>Rod Phillips</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0520292243?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">I Taste Red: The Science of Tasting Wine</a></td>
<td>Jamie Goode</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607748428?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Champagne</a></strong></td>
<td><strong>Peter Liem</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/022640689X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Culinarians: Lives and Careers from the First Age of American Fine Dining</a></td>
<td>David S. Shields</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0399578927?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Peppers of the Americas</a></td>
<td>Maricel E. Presilla</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0520290682?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Canned: The Rise and Fall of Consumer Confidence in the American Food Industry</a></strong></td>
<td><strong>Anna Zeide</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0820353590?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Catfish Dream: Ed Scott&#x2019;s Fight for His Family Farm and Racial Justice in the Mississippi Delta</a></td>
<td>Julian Rankin</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0820353558?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Creole Italian: Sicilian Immigrants and the Shaping of New Orleans Food Culture</a></td>
<td>Justin Nystrom</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/Whole-Okra-Seed-Stem-Celebration/dp/1603588078?crid=2EGZH57HTXW0G&amp;keywords=The+Whole+Okra%3A+A+Seed+to+Stem+Celebration&amp;qid=1697820864&amp;s=books&amp;sprefix=the+whole+okra+a+seed+to+stem+celebration%2Cstripbooks%2C125&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=82d4d5bb2ff62dd8e4814230ddd3a6b2&amp;language=en_US&amp;ref_=as_li_ss_tl">The Whole Okra: A Seed to Stem Celebration</a></strong></td>
<td><strong>Chris Smith</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0295744960?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Gandhi&#x2019;s Search for the Perfect Diet: Eating with the World in Mind</a></td>
<td>Nico Slate</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1469653478?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">A South You Never Ate: Savoring Flavors and Stories from the Eastern Shore of Virginia</a></td>
<td>Bernard L. Herman</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1469662809?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Black Smoke: African Americans and the United States of Barbecue</a></strong></td>
<td><strong>Adrian Miller</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1452182698?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Flavor Equation: The Science of Great Cooking Explained + More Than 100 Essential Recipes</a></td>
<td>Nik Sharma</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/160358868X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Koji Alchemy: Rediscovering the Magic of Mold-Based Fermentation</a></td>
<td>Rich Shih and Jeremy Umansky</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/49fGTKn">Slaves for Peanuts: A Story of Conquest, Liberation, and a Crop That Changed History</a></strong></td>
<td><strong>Jori Lewis</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3M9zIcs">A Place at the Nayarit: How a Mexican Restaurant Nourished a Community</a></td>
<td>Natalia Molina</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/46AAKqn">What a Mushroom Lives For: Matsutake and the Worlds They Make</a></td>
<td>Michael J. Hathaway</td>
</tr>
</tbody>
</table>
<h3 id="single-subject-a-namesinglea">Single Subject <a name="single"></a></h3>
<p><em>Books with recipes focused on a single ingredient, dish, or method of cooking.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0470371331?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Pasta Sfoglia</a></strong></td>
<td><strong>Ron Suhanosky, Colleen Suhanosky</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0376020598?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Weber&#x2019;s Way to Grill</a></td>
<td>Jamie Purviance</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Well-Preserved-Recipes-Techniques-Putting-Seasonal/dp/0307405249?crid=83D6YWQPVJJ8&amp;keywords=Well-Preserved%3A+Recipes+and+Techniques+for+Putting+Up+Small+Batches+of+Seasonal+Foods&amp;qid=1697820982&amp;s=books&amp;sprefix=well-preserved+recipes+and+techniques+for+putting+up+small+batches+of+seasonal+foods%2Cstripbooks%2C149&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=6f2c2e2baf1b439fbb5e39ad611c2a8b&amp;language=en_US&amp;ref_=as_li_ss_tl">Well-Preserved: Recipes and Techniques for Putting Up Small Batches of Seasonal Foods</a></td>
<td>Eugenia Bone</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1580089925?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Meat: A Kitchen Education</a></strong></td>
<td><strong>James Peterson</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1584798637?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Good Meat: The Complete Guide to Sourcing and Cooking Sustainable Meat</a></td>
<td>Deborah Krasner</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Ham-Obsession-Hindquarter-Mark-Scarbrough/dp/1584798327?crid=1OEVB9W3Y80QI&amp;keywords=ham+an+obsession&amp;qid=1697820468&amp;s=books&amp;sprefix=ham+an+obsessi%2Cstripbooks%2C137&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=ab78cde5cda23fb19c69f7393e4cb51a&amp;language=en_US&amp;ref_=as_li_ss_tl">Ham: An Obsession with the Hindquarter</a></td>
<td>Mark Scarborough and Bruce Weinstein</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/dp/039306526X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">All About Roasting</a></strong></td>
<td><strong>Molly Stevens</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/158008334X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Odd Bits: How to Cook the Rest of the Animal</a></td>
<td>Jennifer McLagan</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07VQG3JGM?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Plenty: Vibrant Vegetable Recipes from London&#x2019;s Ottolenghi</a></td>
<td>Yotam Ottolenghi</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607740370?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Ripe: A Cook in the Orchard</a></strong></td>
<td><strong>Nigel Slater</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00HTKAEZ0?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Afield: A Chef&#x2019;s Guide to Preparing and Cooking Wild Game and Fish</a></td>
<td>Jesse Griffiths</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B009SM6LE0?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Modern Sauces: More than 150 Recipes for Every Cook, Every Day</a></td>
<td>Martha Holmberg</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/Culinary-Birds-Ultimate-Poultry-Cookbook/dp/0762444843?crid=3EI5G5M8U6D5O&amp;keywords=Culinary+Birds%3A+The+Ultimate+Poultry+Cookbook&amp;qid=1697818976&amp;s=books&amp;sprefix=culinary+birds+the+ultimate+poultry+cookbook%2Cstripbooks%2C126&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=154a4239f967660e640f4e74c59ccebb&amp;language=en_US&amp;ref_=as_li_ss_tl">Culinary Birds: The Ultimate Poultry Cookbook</a></strong></td>
<td><strong>John Ash with James O. Fraioli</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1452109486?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Fish: 54 Seafood Feasts</a></td>
<td>Cree LeFavour</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00C0AO18U?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">In the Charcuterie: The Fatted Calf&apos;s Guide to Making Sausage, Salumi, P&#xE2;t&#xE9;s, Roasts, Confits, and Other Meaty Goods</a></td>
<td>Taylor Boetticher and Toponia Miller</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/160774516X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Bitter: A Taste of the World&apos;s Most Dangerous Flavor, with Recipes</a></strong></td>
<td><strong>Jennifer McLagan</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1572842997?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Charcuter&#xED;a: The Soul of Spain</a></td>
<td>Jeffrey Weiss</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0316254061?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Egg: A Culinary Exploration of the World&apos;s Most Versatile Ingredient</a></td>
<td>Michael Ruhlman</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/178472002X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">A Bird in the Hand: Chicken Recipes for Every Day and Every Mood</a></strong></td>
<td><strong>Diana Henry</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607746077?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Mastering Pasta: The Art and Practice of Handmade Pasta, Gnocchi, and Risotto</a></td>
<td>Marc Vetri with David Joachim</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0553447297?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Tacos: Recipes and Provocations</a></td>
<td>Alex Stupak and Jordana Rothman</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1743791356?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Milk. Made.: A Book About Cheese. How to Choose It, Serve It and Eat It</a></strong></td>
<td><strong>Nick Haddow</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607747367?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Big Bad Breakfast: The Most Important Book of the Day</a></td>
<td>John Currence</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/160774838X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Elements of Pizza: Unlocking the Secrets to World-Class Pies at Home</a></td>
<td>Ken Forkish</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607749580?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Pho Cookbook</a></strong></td>
<td><strong>Andrea Nguyen</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1603586563?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Mastering Stocks and Broths</a></td>
<td>Rachael S. Mamane</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0770435122?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Offal Good</a></td>
<td>Chris Cosentino with Michael Harlan Turkell</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1787131181?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Goat: Cooking and Eating</a></strong></td>
<td><strong>James Whetlor</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1787131734?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Bread &amp; Butter: History, Culture, Recipes</a></td>
<td>Richard Snapes, Grant Harrington, and Eve Hemingway</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0399580786?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Korean BBQ: Master Your Grill in Seven Sauces</a></td>
<td>Bill Kim with Chandra Ram</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B07TZHRN55?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Pasta Grannies: The Official Cookbook: The Secrets of Italy&apos;s Best Home Cooks</a></strong></td>
<td><strong>Vicky Bennison</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07YS6D3SN?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">From the Oven to the Table: Simple Dishes That Look After Themselves</a></td>
<td>Diana Henry</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07VBNGLP5?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sour: The Magical Element That Will Transform Your Cooking</a></td>
<td>Mark Diacono</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://thehogbook.com/store/p/the-hog-book">The Hog Book: A Chef&apos;s Guide to Hunting, Butchering and Cooking Wild Pigs</a></strong></td>
<td><strong>Jesse Griffiths</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0399581480?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Cool Beans: The Ultimate Guide to Cooking with the World&apos;s Most Versatile Plant-Based Protein, with 125 Recipes</a></td>
<td>Joe Yonan</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/157965956X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Grains for Every Season: Rethinking Our Way with Grains</a></td>
<td>Joshua McFadden with Martha Holmberg</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/3rZbWcm">The Wok: Recipes and Techniques</a></strong></td>
<td><strong>J. Kenji L&#xF3;pez-Alt</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3M6dUi3">Masa: Techniques, Recipes, and Reflections on a Timeless Staple</a></td>
<td>Jorge Gaviria</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/494QCCU">The Miracle of Salt: Recipes and Techniques to Preserve, Ferment, and Transform Your Food</a></td>
<td>Naomi Duguid</td>
</tr>
</tbody>
</table>
<h3 id="vegetable-focused-and-vegetarian-a-namevegetablea">Vegetable Focused and Vegetarian <a name="vegetable"></a></h3>
<p><em>Books on vegetable cookery with recipes that are meatless, vegetarian, or vegan.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0811878376?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Roots: The Definitive Compendium with More Than 225 Recipes</a></strong></td>
<td><strong>Diane Morgan</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/030795661X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Foraged Flavor: Finding Fabulous Ingredients in Your Backyard or Farmer&#x2019;s Market</a></td>
<td>Tama Matsuoka Wong with Eddy Leroux</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1558327452?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Herbivoracious: A Flavor Revolution, with 150 Vibrant and Original Vegetarian Recipes</a></td>
<td>Michael Natkin</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1607741911?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Vegetable Literacy</a></strong></td>
<td><strong>Deborah Madison</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1452109737?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Feast: Generous Vegetarian Meals for Any Eater and Every Appetite</a></td>
<td>Sarah Copeland</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607744724?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">River Cottage Veg</a></td>
<td>Hugh Fearnley-Whittingstall</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1611800854?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">At Home in the Whole Food Kitchen: Celebrating the Art of Eating Well</a></strong></td>
<td><strong>Amy Chaplin</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607746212?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Plenty More: Vibrant Vegetable Cooking from London&apos;s Ottolenghi</a></td>
<td>Yotam Ottolenghi</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1609615018?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Vegetarian Dinner Parties: 150 Meatless Meals Good Enough to Serve to Company</a></td>
<td>Mark Scarbrough and Bruce Weinstein</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/Vegetables-Inspired-Techniques-Artichokes-Zucchini/dp/0316373354?crid=3S4WJHLVB0U15&amp;keywords=V+Is+for+Vegetables%3A+Inspired+Recipes+%26+Techniques+for+Home+Cooks&amp;qid=1697820962&amp;s=books&amp;sprefix=v+is+for+vegetables+inspired+recipes+%26+techniques+for+home+cooks%2Cstripbooks%2C145&amp;sr=1-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=450ffe9ac0488af9c94f955b88e6ac57&amp;language=en_US&amp;ref_=as_li_ss_tl">V Is for Vegetables: Inspired Recipes &amp; Techniques for Home Cooks</a></strong></td>
<td><strong>Michael Anthony</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1607748037?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">A Modern Way to Eat: 200+ Satisfying Vegetarian Recipes (That Will Make You Feel Amazing)</a></td>
<td>Anna Jones</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1101874864?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Vegetarian India: A Journey Through the Best of Indian Home Cooking</a></td>
<td>Madhur Jaffrey</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0714871303?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Middle Eastern Vegetarian Cookbook</a></strong></td>
<td><strong>Salma Hage</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1611802873?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Dandelion and Quince: Exploring the Wide World of Unusual Vegetables, Fruits, and Herbs</a></td>
<td>Michelle McKenzie</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0761180524?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Vegetable Butcher: How to Select, Prep, Slice, Dice, and Masterfully Cook Vegetables from Artichokes to Zucchini</a></td>
<td>Cara Mangini</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1579656315?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Six Seasons: A New Way with Vegetables</a></strong></td>
<td><strong>Joshua McFadden with Martha Holmberg</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/160774984X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Book of Greens</a></td>
<td>Jenn Louis with Kathleen Squires</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0399578889?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">In My Kitchen</a></td>
<td>Deborah Madison</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B074GF2HXC?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Saladish</a></strong></td>
<td><strong>Ilene Rosen</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0062747436?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Almonds, Anchovies, and Pancetta: A Vegetarian Cookbook, Kind Of</a></td>
<td>Cal Peternell</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0393249336?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Vegetarian Viet Nam</a></td>
<td>Cameron Stauch</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1579658024?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Whole Food Cooking Every Day: Transform the Way You Eat with 250 Vegetarian Recipes Free of Gluten, Dairy, and Refined Sugar</a></strong></td>
<td><strong>Amy Chaplin</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07QH5T4Y7?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Ruffage: A Practical Guide to Vegetables</a></td>
<td>Abra Berens</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07GMSKMDQ?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Vegetables Illustrated: An Inspiring Guide with 700+ Kitchen-Tested Recipes</a></td>
<td>Editors at America&apos;s Test Kitchen</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0593084276?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Korean Vegan Cookbook: Reflections and Recipes from Omma&apos;s Kitchen</a></strong></td>
<td><strong>Joanne Lee Molinaro</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/3791386832?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">To Asia, With Love: Everyday Asian Recipes and Stories from the Heart</a></td>
<td>Hetty McKinnon</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0399581049?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Vegetable Kingdom: The Abundant World of Vegan Recipes</a></td>
<td>Bryant Terry</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/3Q3qWxN">The Vegan Chinese Kitchen: Recipes and Modern Stories from a Thousand-Year-Old Tradition: A Cookbook</a></strong></td>
<td><strong>Hannah Che</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3tHO2mp">Plant-Based India: Nourishing Recipes Rooted in Tradition</a></td>
<td>Dr. Sheil Shukla</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3Q6HepB">In Praise of Veg: The Ultimate Cookbook for Vegetable Lovers</a></td>
<td>Alice Zaslavsky</td>
</tr>
</tbody>
</table>
<h3 id="writing-and-literature-a-namewritinga">Writing and Literature <a name="writing"></a></h3>
<p><em>Narrative nonfiction books, including memoirs, culinary tourism, investigative journalism, food advocacy, and critical analysis of food and foodways for a general audience. Includes memoir, biography, personal essays, culinary travel, and culture.</em></p>
<table>
<thead>
<tr>
<th>Year</th>
<th>Book Title</th>
<th>Author</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2010</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0547386443?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Save the Deli</a></strong></td>
<td><strong>David Sax</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B003P9XC30?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Seasons on Henry&#x2019;s Farm: A Year of Food and Life on a Sustainable Farm</a></td>
<td>Terra Brockman</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0393068366?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Waste: Uncovering the Global Food Scandal</a></td>
<td>Tristram Stuart</td>
</tr>
<tr>
<td><strong>2011</strong></td>
<td><strong><a href="https://www.amazon.com/dp/014311946X?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Four Fish: The Future of the Last Wild Food</a></strong></td>
<td><strong>Paul Greenberg</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Empires-Food-Feast-Famine-Civilizations/dp/1582437939?crid=UWHXDY1ATPUX&amp;keywords=Empires+of+Food%3A+Feast%2C+Famine%2C+and+the+Rise+and+Fall+of+Civilizations&amp;qid=1697819146&amp;sprefix=empires+of+food+feast%2C+famine%2C+and+the+rise+and+fall+of+civilizations%2Caps%2C135&amp;sr=8-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=697fa75b985191f8f72be547094e3417&amp;language=en_US&amp;ref_=as_li_ss_tl">Empires of Food: Feast, Famine, and the Rise and Fall of Civilizations</a></td>
<td>Evan D. G. Fraser and Andrew Rimas</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1439166501?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Peace Meals: Candy-Wrapped Kalashnikovs and Other War Stories</a></td>
<td>Anna Badkhen</td>
</tr>
<tr>
<td><strong>2012</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0812980883?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Blood, Bones &amp; Butter: The Inadvertent Education of a Reluctant Chef</a></strong></td>
<td><strong>Gabrielle Hamilton</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1416583947?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Day of Honey: A Memoir of Food, Love, and War</a></td>
<td>Annia Ciezadlo</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0393343618?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Extra Virginity</a></td>
<td>Tom Mueller</td>
</tr>
<tr>
<td><strong>2013</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0385342616?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Yes, Chef: A Memoir</a></strong></td>
<td><strong>Marcus Samuelsson</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1439171963?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The American Way of Eating: Undercover at Walmart, Applebee&apos;s, Farm Fields and the Dinner Table</a></td>
<td>Tracie McMillan</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1451698445?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Man Who Changed the Way We Eat: Craig Claiborne and the American Food Renaissance</a></td>
<td>Thomas McNamee</td>
</tr>
<tr>
<td><strong>2014</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0812982193?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Salt Sugar Fat: How the Food Giants Hooked Us</a></strong></td>
<td><strong>Michael Moss</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Fork-Road-Pleasure-Discovery-Literature/dp/1743218443?_encoding=UTF8&amp;qid=&amp;sr=&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=2e4bbbe9f81f20abc1d88b2585e096f2&amp;language=en_US&amp;ref_=as_li_ss_tl">A Fork in the Road: Tales of Food, Pleasure and Discovery on the Road (Edited by James Oseland)</a></td>
<td>James Oseland</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00Q4FYM90?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Provence, 1970: M. F. K. Fisher, Julia Child, James Beard, and the Reinvention of American Taste</a></td>
<td>Luke Barr</td>
</tr>
<tr>
<td><strong>2015</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B07X3SYCHS?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Third Plate: Field Notes on the Future of Food</a></strong></td>
<td><strong>Dan Barber</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00HYMBNVM?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Chain: Farm, Factory, and the Fate of Our Food</a></td>
<td>Ted Genoways</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B00J8R3H3I?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Language of Food: A Linguist Reads the Menu</a></td>
<td>Dan Jurafsky</td>
</tr>
<tr>
<td><strong>2016</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0190263431?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Soda Politics: Taking on Big Soda (and Winning)</a></strong></td>
<td><strong>Marion Nestle</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1603587039?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Pawpaw: In Search of America&#x2019;s Forgotten Fruit</a></td>
<td>Andrew Moore</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0393352935?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Pig Tales: An Omnivore&#x2019;s Quest for Sustainable Meat</a></td>
<td>Barry Estabrook</td>
</tr>
<tr>
<td><strong>2017</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0062216422?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">A Square Meal: A Culinary History of the Great Depression</a></strong></td>
<td><strong>Jane Ziegelman and Andrew Coe</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0393076393?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Food City: Four Centuries of Food-Making in New York</a></td>
<td>Joy Santlofer</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0553459422?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Something to Food About: Exploring Creativity with Innovative Chefs</a></td>
<td>Questlove with Ben Greenman</td>
</tr>
<tr>
<td><strong>2018</strong></td>
<td><strong><a href="https://www.amazon.com/dp/B07B7LJSG1?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Cooking Gene</a></strong></td>
<td><strong>Michael W. Twitty</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B01N9ZKQTR?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Taste of Empire: How Britain&apos;s Quest for Food Shaped the Modern World</a></td>
<td>Lizzie Collingham</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/1538729881?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Unforgettable: The Bold Flavors of Paula Wolfert&#x2019;s Renegade Life</a></td>
<td>Emily Kaiser Thelin</td>
</tr>
<tr>
<td><strong>2019</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1579659004?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Buttermilk Graffiti: A Chef&#x2019;s Journey to Discover America&#x2019;s New Melting-Pot Cuisine</a></strong></td>
<td><strong>Edward Lee</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B0773TKDBX?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Hippie Food: How Back-to-the-Landers, Longhairs, and Revolutionaries Changed the Way We Eat</a></td>
<td>Jonathan Kauffman</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0062655094?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Pasta, Pane, Vino: Deep Travels Through Italy&#x2019;s Food Culture</a></td>
<td>Matt Goulding</td>
</tr>
<tr>
<td><strong>2020</strong></td>
<td><strong><a href="https://www.amazon.com/dp/0451494547?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Eat Like a Fish: My Adventures as a Fisherman Turned Restorative Ocean Farmer</a></strong></td>
<td><strong>Bren Smith</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0525433910?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Notes from a Young Black Chef: A Memoir</a></td>
<td>Kwame Onwuachi with Joshua David Stein</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/B07NY2LV9H?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Women on Food: Charlotte Druckman and 115 Writers, Chefs, Critics, Television Stars, and Eaters</a></td>
<td>Charlotte Druckman</td>
</tr>
<tr>
<td><strong>2022</strong></td>
<td><strong><a href="https://www.amazon.com/dp/1631498703?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Franchise: The Golden Arches in Black America</a></strong></td>
<td><strong>Marcia Chatelain</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/Getting-Something-Eat-Jackson-American/dp/0691203946?crid=19KFJMQGN3AMV&amp;keywords=Getting+Something+to+Eat+in+Jackson%3A+Race%2C+Class%2C+and+Food+in+the+American+South&amp;qid=1697819309&amp;sprefix=getting+something+to+eat+in+jackson+race%2C+class%2C+and+food+in+the+american+south%2Caps%2C145&amp;sr=8-1&amp;linkCode=ll1&amp;tag=amzn0e9-20&amp;linkId=ff93d19b9756345fd6e8d3b40b42b1dd&amp;language=en_US&amp;ref_=as_li_ss_tl">Getting Something to Eat in Jackson: Race, Class, and Food in the American South</a></td>
<td>Joseph C. Ewoodzie Jr.</td>
</tr>
<tr>
<td></td>
<td><a href="https://www.amazon.com/dp/0393635716?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">The Man Who Ate Too Much: The Life of James Beard</a></td>
<td>John Birdsall</td>
</tr>
<tr>
<td><strong>2023</strong></td>
<td><strong><a href="https://amzn.to/406gkml">Savor: A Chef&apos;s Hunger for More</a></strong></td>
<td><strong>Fatima Ali with Tarajia Morrell</strong></td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/45FU5Vu">California Soul: An American Epic of Cooking and Survival</a></td>
<td>Keith Corbin with Kevin Alexander</td>
</tr>
<tr>
<td></td>
<td><a href="https://amzn.to/3tGGWOW">To Boldly Grow: Finding Joy, Adventure, and Dinner in Your Own Backyard</a></td>
<td>Tamar Haspel</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><hr><p>&#x200C;Was this an interesting read? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>]]></content:encoded></item><item><title><![CDATA[Liberating glucose data from the Freestyle Libre 3]]></title><description><![CDATA[The Abbott Freestyle Libre 3 v3.4.2 iOS and Android apps do not provide a way to export blood glucose data without syncing to a cloud account. Frida is used to hook the Android APK and unwrap the key to decrypt the RealmDB.]]></description><link>https://frdmtoplay.com/freeing-glucose-data-from-the-freestyle-libre-3/</link><guid isPermaLink="false">6490e6b85962df0499ceecca</guid><category><![CDATA[security]]></category><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Tue, 20 Jun 2023 17:12:54 GMT</pubDate><content:encoded><![CDATA[<p>The Abbott Freestyle Libre 3 v3.4.2 iOS and Android apps do not provide a way to export blood glucose data without syncing to a cloud account. The data is stored on device in an encrypted RealmDB with a wrapped encryption key also stored on the device. Frida is used to hook the Android APK and unwrap the key to decrypt the RealmDB.</p><hr><h2 id="background">Background</h2><p>The <a href="https://www.freestyle.abbott/us-en/products/freestyle-libre-3.html">Freestyle Libre 3</a> is a Continuous Glucose Monitor (CGM) produced by Abbott. The sensor records glucose readings every minute from interstitial fluid for 14-days before being replaced with a new one.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2023/11/image.png" class="kg-image" alt loading="lazy" width="2000" height="892" srcset="https://frdmtoplay.com/content/images/size/w600/2023/11/image.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/11/image.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2023/11/image.png 1600w, https://frdmtoplay.com/content/images/2023/11/image.png 2131w" sizes="(min-width: 720px) 720px"><figcaption>Conceptual view of how a modern Continuous Glucose Monitor (CGM) works</figcaption></figure><p>The actual sensor is a small channel filled with glucose oxidase which releases electrons when it interacts with glucose. The probe of the sensor has a few small wells to collect interstitial fluid which is then routed over the glucose oxidase pad.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2023/11/image-1.png" class="kg-image" alt loading="lazy" width="2000" height="959" srcset="https://frdmtoplay.com/content/images/size/w600/2023/11/image-1.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/11/image-1.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2023/11/image-1.png 1600w, https://frdmtoplay.com/content/images/2023/11/image-1.png 2103w" sizes="(min-width: 720px) 720px"><figcaption>Sensor probe showing wells and glucose oxidase pad (gold region)</figcaption></figure><p>The first iteration of the sensor had a small community of enthusiasts who<a href="https://github.com/captainbeeheart/openfreestyle"> thoroughly reversed engineered</a> the device to use it as a wireless ADC after the 14-day period. Unfortunately, the 3rd generation of the sensor doesn&apos;t seem to have a teardown outside of the blurry images in the <a href="https://fccid.io/QXS-LIB03S/Internal-Photos/Int-5514479">FCC filing</a>.</p><p>An encryption key is generated and shared with the Libre 3 via NFC to &quot;initialize&quot; the sensor. From then on, glucose readings are communicated via BLE to Android and iOS apps. The glucose readings are stored in an encrypted RealmDB which is then synced to the cloud. The apps display the glucose readings on a graph. &#xA0;A CSV of glucose data <a href="https://support.glooko.com/hc/en-us/articles/4531230605843-How-to-import-your-blood-glucose-data-from-an-Abbott-FreeStyle-Libre-1-FreeStyle-Libre-2-or-FreeStyle-Libre-3">can be downloaded</a> from the LibreView web interface by agreeing to the Terms &amp; Conditions of a LibreView account and living in a geo-fenced region.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2023/11/image-2.png" class="kg-image" alt loading="lazy" width="2000" height="877" srcset="https://frdmtoplay.com/content/images/size/w600/2023/11/image-2.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/11/image-2.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2023/11/image-2.png 1600w, https://frdmtoplay.com/content/images/2023/11/image-2.png 2155w" sizes="(min-width: 720px) 720px"><figcaption>Data flow Sketch</figcaption></figure><p><strong>However</strong>, the graph is <strong>not zoomable</strong> and the timeseries data <strong>cannot be exported </strong>without using the cloud sync. The motivation behind these terrible product decisions is unknown. It is extremely useful to compare blood glucose readings across various confounding variables (heart rate, temperature, food intake, etc.).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2023/06/app.jpg" class="kg-image" alt loading="lazy" width="185" height="400"><figcaption>Freestyle Libre 3 Screenshot</figcaption></figure><p></p><p><em>Let&apos;s get those blood glucose readings out of this horrendous UI!</em></p><h2 id="prior-work">Prior Work</h2><p><a href="https://github.com/NightscoutFoundation/xDrip">xDrip+</a> is an Android app to collect health data from a variety of sources but does not interface directly with the Libre 3. A v<a href="https://github.com/maheini/FreeStyle-Libre-3-patch/tree/main">ariety of methods</a> exist to migrate data between the Libre 3 app and xDrip but many of them require a rooted device or an active internet connection. <a href="https://www.juggluco.nl/Juggluco/libre3/">Juggulco</a> is an &quot;offline&quot; non-root method but requires a LibreView account to be associated with the sensors. The majority of the methods do not disclose the actual mechanism behind the data bridge and some require sideloading apks of unknown origin.</p><p>The BLE data is encrypted but the <a href="https://github.com/gui-dos/DiaBLE/blob/main/DiaBLE/Libre3.swift">DiaBLE</a> and <a href="https://github.dev/j-kaltes/Juggluco/blob/primary/Common/src/libre3/java/tk/glucodata/Libre3GattCallback.java">Juggluco</a> projects seems to have made<a href="https://github.com/gui-dos/DiaBLE/issues/21"> some progress</a> on decrypting the readings. However, Abbott will <a href="https://github.com/NightscoutFoundation/xDrip/issues/1474#issuecomment-1041327847">swing the DMCA hammer</a> if too much is published despite the reverse engineering being done to &quot;achieve interoperability&quot; of the CGM user&apos;s <em>own glucose data.</em></p><p>To date, there is nothing published for accessing the data for iOS users.</p><h2 id="ios">iOS</h2><p>Since a feature of the app is to see non-interactive plots of historical glucose data, it seemed reasonable that there must be a local database of glucose readings stored on the device filesystem. The <code>idevicebackup2</code> utility from <a href="https://libimobiledevice.org/">libimobiledevice</a> is a straightforward way to access the iOS filesystem on a non-jailbroken device, albeit a space consuming one since the entire phone is backed up.</p><pre><code>$ mkdir iPhone-backup 
$ idevicebackup2 backup iPhone-backup</code></pre><p>The iOS device backup is a collection of files that are enumerated in the SQLite <code>Manifest.db</code> &#xA0;located inside <code>iPhone-backup</code>.</p><pre><code>$ sqlitebrowser Manifest.db</code></pre><p>As expected, there is a database associated with the Libre 3 app on the filesystem! <a href="https://realm.io/">Realm</a> is a &quot;fast, scalable alternative to SQLite with mobile to cloud data sync that makes building real-time, reactive mobile apps easy.&quot; Additionally there are &quot;elog&quot; files (which are likely &quot;encrypted&quot; logs).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2023/06/image.png" class="kg-image" alt loading="lazy" width="914" height="322" srcset="https://frdmtoplay.com/content/images/size/w600/2023/06/image.png 600w, https://frdmtoplay.com/content/images/2023/06/image.png 914w" sizes="(min-width: 720px) 720px"><figcaption>trident.realm database inside the iOS backup</figcaption></figure><p>Unfortunately, trying to open <code>trident.realm</code> with <a href="https://www.mongodb.com/docs/realm/studio/">Realm Studio</a> results in a very disappointing message: &quot;The Realm might be encrypted&quot;.</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/06/image-1.png" class="kg-image" alt loading="lazy" width="517" height="259"></figure><p>However, another interesting file exists in the backup: <code>com.abbott.libre3.us.plist</code>. It is by default a binary plist but can be converted to XML quickly:</p><pre><code>plistutil -i com.abbott.libre3.us.plist &gt; libre.xml.plist</code></pre><p>The file contains some interesting but not terribly useful information like the current sensor UUID, the last time the sensor was read, etc. But right at the end of the file there is a juicy field!</p><pre><code>        &lt;key&gt;RealmEncryptionKey&lt;/key&gt;
        &lt;array&gt;
                &lt;integer&gt;96&lt;/integer&gt;
                &lt;integer&gt;10&lt;/integer&gt;
				...
                &lt;integer&gt;157&lt;/integer&gt;
        &lt;/array&gt;</code></pre><p>Could this actually be the RealmEncryptionKey? It turns out this array is 92-bytes while a real Realm key is 64-bytes (or 128-characters when hex encoded). The first and last 64 byte windows of the key did not unlock the Realm, so the odds were good the key was <a href="https://en.wikipedia.org/wiki/Key_wrap">wrapped</a>. In theory the wrap/unwrap functions should be obvious from disassembling and decompiling the iOS app. </p><p>Searching for the <code>RealmEncryptionKey</code> in ghidra after loading the <a href="https://decrypt.day/app/id1524572429">Libre 3 ipa</a> confirmed that it was indeed a key used for decrypting the Realm database. The key is generated via a call to <code>SecRandomCopyBytes</code> and is unique for each installation. But, the candidate function for unwrapping the key (arguments were the 92-byte <code>RealmEncryptionKey</code> data and <code>0x5c</code> (92 in decimal)) was full of obtuse references due to Swift/Objective-C calling conventions. Additionally, Ghidra did not fully disassemble the entire function. <a href="https://www.hopperapp.com/">Hopper</a> teased apart many of the Objective-C and Swift calling conventions but also did not successfully disassemble the function - there is a decent chance obfuscation methods were used for this section of code.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2023/06/image-3.png" class="kg-image" alt loading="lazy" width="776" height="589" srcset="https://frdmtoplay.com/content/images/size/w600/2023/06/image-3.png 600w, https://frdmtoplay.com/content/images/2023/06/image-3.png 776w" sizes="(min-width: 720px) 720px"><figcaption>Likely candidate function for unwrapping the 92-byte key</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2023/06/image-6.png" class="kg-image" alt loading="lazy" width="1107" height="900" srcset="https://frdmtoplay.com/content/images/size/w600/2023/06/image-6.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/06/image-6.png 1000w, https://frdmtoplay.com/content/images/2023/06/image-6.png 1107w" sizes="(min-width: 720px) 720px"><figcaption>Partial disassembly</figcaption></figure><p>Without a jailbroken iOS device, performing dynamic analysis to understand this function was out of the question. </p><p>But, with some luck, the Android app may behave in the same way as the iOS app.</p><h2 id="android">Android</h2><h3 id="static-jadx">Static / jadx</h3><p>Acquiring the Android <a href="https://www.apkmirror.com/apk/abbott-diabetes-care-inc/freestyle-libre-3-us/freestyle-libre-3-us-3-4-2-release/freestyle-libre-3-us-3-4-2-android-apk-download/">apk</a> is straightforward from the usual apk mirrors and decompiling it with <a href="https://github.com/skylot/jadx">jadx</a> is just as easy.</p><p>After searching for &quot;Realm&quot; in the jadx decompilation it looks like the Android app behaves in a very similar manner - &#xA0;<code>AppDetailsForRealmDatabase</code> is loaded from the App&apos;s Shared Preferences. </p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/06/image-7.png" class="kg-image" alt loading="lazy" width="1129" height="279" srcset="https://frdmtoplay.com/content/images/size/w600/2023/06/image-7.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/06/image-7.png 1000w, https://frdmtoplay.com/content/images/2023/06/image-7.png 1129w" sizes="(min-width: 720px) 720px"></figure><p>Chasing down the <code>unWrapDBEncryptionKey</code> turns up an interesting development: the Libre 3 developers hid the interesting functionality of the <code>libreSKBCryptoLib</code> class behind a JNI/NDK interface. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2023/06/image-8.png" class="kg-image" alt loading="lazy" width="849" height="828" srcset="https://frdmtoplay.com/content/images/size/w600/2023/06/image-8.png 600w, https://frdmtoplay.com/content/images/2023/06/image-8.png 849w" sizes="(min-width: 720px) 720px"><figcaption>Libre3SKBCryptoLib.class</figcaption></figure><p>At first this seemed pretty promising - the apk contains a <code>liblibre3extension.so</code> for four different CPU architectures. However, ghidra failed to disassemble the <code>unwrap</code> functions for each of the architectures.</p><p>With a failed static analysis across two platforms (and five architectures) it was time to look into dynamic analysis of the key wrapping.</p><h3 id="dynamic-frida">Dynamic / Frida</h3><p>Getting a rooted Android device running on Linux is very straightforward with <a href="https://waydro.id/">waydroid</a> (it <a href="https://github.com/Aman9das/Waydroid_Setup_Guide#i-want-to-stay-on-x11-right-now">also runs</a> on X11).</p><pre><code># waydroid init -f
# waydroid container start
$ waydroid show-full-ui
$ adb devices
List of devices attached
192.168.17.132:5555    device</code></pre><p>After acquiring an <a href="https://www.apkmirror.com/apk/abbott-diabetes-care-inc/freestyle-libre-3-us/freestyle-libre-3-us-3-4-2-release/freestyle-libre-3-us-3-4-2-android-apk-download/">apk</a>, it can be installed into the waydroid session and launched via adb:</p><pre><code>$ adb install libre3.apk
$ adb shell am start -n com.freestylelibre3.app.us/com.adc.trident.app.startup.SplashActivity</code></pre><p>Everything looks good until the app refuses to move past the Splash Screen with &quot;Please install this App from Google Play.&quot; Somehow the app is detecting the sideload and refusing to run. Fortunately, it loads enough!</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/06/image-2.png" class="kg-image" alt loading="lazy" width="1095" height="447" srcset="https://frdmtoplay.com/content/images/size/w600/2023/06/image-2.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/06/image-2.png 1000w, https://frdmtoplay.com/content/images/2023/06/image-2.png 1095w" sizes="(min-width: 720px) 720px"></figure><p>Also, since the app has been launched once, the <code>trident.realm</code> has been created within waydroid:</p><pre><code>$ adb shell ls /data/user/0/com.freestylelibre3.app.us/files
... trident.realm ...</code></pre><p>And lo-and-behold a key for the database stored in XML!. The Android app stores the wrapped key as base64 encoded text while the iOS app does not; the base64 encoding is clear from the jadx decompilation. Note: this key is different than the key used to encrypt the iOS realm database - the keys are unique per installation.</p><pre><code>$ adb shell cat /data/user/0/com.freestylelibre3.app.us/shared_prefs/AppDetailsForRealmDatabase.xml
&lt;?xml version=&apos;1.0&apos; encoding=&apos;utf-8&apos; standalone=&apos;yes&apos; ?&gt;
&lt;map&gt;
    &lt;string name=&quot;DBIdentifier&quot;&gt;CoPojFQfHHI+Ls5nwRChIkqZ+bq0aYUL5S7RPSt3jLWfu0e8yCTaqFT7HY+JdE6Qoy+5bWgutGtk&amp;#10;dyqZJFsGtJyhqxVJAqw8jvLQC5xEgltQ75iN+5vRObBLykc=&amp;#10;    &lt;/string&gt;
&lt;/map&gt;</code></pre><p>Using <a href="https://frida.re/">Frida</a> it is possible to call the native library functions with our own arguments. Installation is <a href="https://frida.re/docs/android/">well-documented</a>.</p><p>With the Libre 3 app launched and in the &quot;Please install this App from Google Play.&quot; state, we can launch the <code>frida-server</code> running inside waydroid and connect to it:</p><pre><code>$ adb root
$ adb shell &quot;/data/local/tmp/frida-server &amp;&quot;
$ frida -U &quot;Libre 3&quot;</code></pre><p>Once <code>frida</code> has &quot;hooked&quot; into the Libre 3 app it is possible to call the native functions hidden in <code>liblibre3extension.so</code>. </p><pre><code class="language-Java">Frida-&gt; Java.perform(function(){}); // Seems necessary to use Java.use
Frida-&gt; var crypto_lib_def = Java.use(&quot;com.adc.trident.app.frameworks.mobileservices.libre3.security.Libre3SKBCryptoLib&quot;);
Frida-&gt; var crypto_lib = crypto_lib_def.$new()
Frida-&gt; unwrapped = crypto_lib.unWrapDBEncryptionKey([96, 10, ..., -99])
[
    93,
    -81,
    ...
    -122,
    26
]
Frida -&gt; unwrapped.length
64</code></pre><p>Success! A 64-byte Realm encryption key. But first, some information on massaging the data from the plist for the call to succeed.</p><p>The <code>unWrapDBEncryptionKey</code> function requires an array of Int8 while the iOS plist has an array of UInt8. The following snippet of python converts a UInt8 iOS wrapped key stored as one array entry per-line in <code>realm.key</code> to Int8 with numpy:</p><pre><code class="language-python3">with open(&apos;realm.key&apos;, &apos;r&apos;) as f:
	data = f.readlines()
u = np.array(data, dtype=np.uint8)
i = u.astype(np.int8)
for b in i:
	print(str(b)+&apos;, &apos;, end=&apos;&apos;)

[96, 10, ..., -99]</code></pre><p>The printed array can then be copy/pasted into the Frida call to <code>unWrapDBEncryptionKey</code>. </p><p>Similarly, we can use python to convert the Int8 results of <code>unWrapDBEncryptionKey</code> into the 128-character key required by Realm.</p><pre><code>import struct
with open (&apos;unwrapped.txt&apos;, &apos;r&apos;) as f:
	data = f.readlines()
key = &apos;&apos;.join([struct.pack(&apos;b&apos;, int(i)).hex() for i in data])
print(key)
5daf8d031405bfeafffc64659bcffb692f186164e3d1899d628ed16de32eaaccb0c66662360d772a92749eeda7eb53fe29096fc4cb34fa2b04eb14f3a7af861a</code></pre><p><strong>Note: </strong>Since it is 2023, it is worth noting all Python code in this post was generated directly via <a href="https://www.perplexity.ai/">perplexity.ai</a> from human-language prompts.</p><p>And finally, after jumping through many hoops, the Realm database from the iOS installation is revealed!</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/06/image-9.png" class="kg-image" alt loading="lazy" width="892" height="597" srcset="https://frdmtoplay.com/content/images/size/w600/2023/06/image-9.png 600w, https://frdmtoplay.com/content/images/2023/06/image-9.png 892w" sizes="(min-width: 720px) 720px"></figure><p>Several pieces of the puzzle aren&apos;t solved despite having the glucose readings:</p><ul><li>What do <code>unWrapDB</code> and <code>wrapDB</code> actually do? Are they <a href="https://datatracker.ietf.org/doc/html/rfc3394">RFC 3394</a>? </li><li>How are the <code>*.elog</code> files encrypted and what do they contain?</li></ul><p>Both answers lie somewhere in (the likely obfuscated) <code>liblibre3extension.so</code>.</p><h2 id="summary">Summary</h2><p>At a high level, the steps to reproduce this are:</p><ol><li>Backup iOS device and isolate <code>trident.realm</code> and <code>com.abbott.libre3.us.plist</code> files</li><li>Extract the <code>RealmEncryptionKey</code> from the plist file and convert it to a Int8 array</li><li>Install waydroid, sideload Libre 3 apk, and install frida server</li><li>Launch Libre 3 app and hook Frida</li><li>Use Frida to unwrap the Int8 array from Step 2</li><li>Use the unwrapped key to unlock <code>trident.realm</code> using Realm Studio</li></ol><p>It is important to note that the iOS backup and <code>trident.realm</code> isolation steps need to be performed every time a copy of the data is desired. </p><hr><p><strong>Bonus</strong>: The <a href="https://www.accessdata.fda.gov/cdrh_docs/pdf21/K212132.pdf">FDA 510(k)</a> for the Libre 3 contains a snippet on Cybersecurity: </p><blockquote> ADC has provided cybersecurity risk management documentation for the System that includes analysis of confidentiality, integrity, and availability for data, information and software related to the System accordance with FDA Draft Guidance &#x201C;Content of Premarket Submissions for Management of Cybersecurity in Medical Devices.&#x201D; For each identified threat and vulnerability risk event scenario, risk assessment of impact to confidentiality integrity, and availability was performed and documented within the cybersecurity risk management documentation. Appropriate risk mitigation controls have been implemented and tested.</blockquote><p>It&apos;s a shame that the risk assessment was not published. It does not seem like &quot;The RealmDB gets decrypted&quot; was in the assessment considering it contains API keys to third party services.</p><hr><p>Was this an interesting read? Send your thanks to Sundar Pichai for <a href="https://www.wired.com/story/alphabet-layoffs-hit-trash-sorting-robots/">refocusing Everyday Robots</a> and enabling a summer sabbatical! If you&apos;re interested in discussing employment opportunities reach out to &lt;author&gt;@gmail.com.</p>]]></content:encoded></item><item><title><![CDATA[Modern Arduino Development]]></title><description><![CDATA[<p>The Arduino ecosystem (devkit+IDE) is a fantastic prototyping platform. However, once projects get more serious the Arduino IDE begins to lose its luster. Where do the source files actually live? Why isn&apos;t the IDE auto-completing my custom classes? Where&apos;s the linter? Where&apos;s the</p>]]></description><link>https://frdmtoplay.com/modern-arduino-development/</link><guid isPermaLink="false">64765f379c00d93c1da429c8</guid><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Mon, 12 Jun 2023 22:02:24 GMT</pubDate><content:encoded><![CDATA[<p>The Arduino ecosystem (devkit+IDE) is a fantastic prototyping platform. However, once projects get more serious the Arduino IDE begins to lose its luster. Where do the source files actually live? Why isn&apos;t the IDE auto-completing my custom classes? Where&apos;s the linter? Where&apos;s the LLM integration?</p><p>The <a href="https://docs.arduino.cc/software/ide-v2">Arduino 2.x IDE</a> is a step in the right direction compared to the 1.x IDE, but is still too simplistic for intermediate and advanced projects. The editor is developed on <a href="https://en.wikipedia.org/wiki/Eclipse_Theia">Eclipse Theia</a>, which is based on Visual Studio Code, but does not directly support VS Code plugins.</p><p>The new IDE &#xA0;is in many ways a frontend to the new <a href="https://arduino.github.io/arduino-cli/0.33/getting-started/">arduino-cli</a> which is itself a front-end to the arduino <a href="https://arduino.github.io/arduino-cli/0.33/commands/arduino-cli_daemon/">daemon</a>. The arduino daemon makes one connection to the microcontroller and brokers serial data read/write to &quot;<a href="https://arduino.github.io/arduino-cli/0.32/pluggable-monitor-specification/">pluggable monitors</a>&quot;. The two monitors included out of the box are the <a href="https://docs.arduino.cc/software/ide-v2/tutorials/getting-started-ide-v2#serial-plotter">serial plotter</a> and <a href="https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-serial-monitor">serial monitor</a> which receive serial data as JSON over websockets. Once again, these two tools are nice for introductory work but do not cut it for advanced use cases. Unfortunately, the pluggable monitor specification is not documented enough to create an arbitrary monitor from scratch. Another neat feature of the arduino-cli is the ability to <a href="https://arduino.github.io/arduino-cli/0.33/commands/arduino-cli_compile/">compile</a> and <a href="https://arduino.github.io/arduino-cli/0.33/commands/arduino-cli_upload/">flash</a> sketches directly from the command line. This is a very nice solution for using alternative editors if the Arduino Sketch directory format and dependency resolution is suitable. </p><p>However, sometimes a project needs an alternative directory layout and demanding plotting needs. This post outlines using a Makefile to compile and flash firmware to Arduino development kits as well as using a serial&lt;-&gt;UDP bridge to allow using <a href="https://plotjuggler.io/">PlotJuggler</a> as a serial visualizer. </p><h2 id="system-configuration">System Configuration</h2><p>A non-root user cannot access the Arduino microcontroller by default on most Linux installations. A <a href="https://wiki.archlinux.org/title/Udev">udev</a> rule can be used to grant permission.</p><p>A sample udev rule for an Arduino Nano saved as <code>/etc/udev/rules.d/99-arduino.rules</code>:</p><!--kg-card-begin: markdown--><pre><code>SUBSYSTEMS==&quot;usb&quot;,ATTRS{idVendor}==&quot;1a86&quot;,ATTRS{idProduct}==&quot;7523&quot;,GROUP=&quot;plugdev&quot;,MODE=&quot;0666&quot;
</code></pre>
<!--kg-card-end: markdown--><p>This rule adds the device with VID:PID <code>1a86:7523</code> to the <code>plugdev</code> group. The VID:PID for a device can be determined with <code>lsusb</code>.</p><!--kg-card-begin: markdown--><pre><code class="language-bash">$ lsusb
...
Bus 001 Device 010: ID 1a86:7523 QinHeng Electronics CH340 serial converter
...
</code></pre>
<!--kg-card-end: markdown--><p>The current user must be in the <code>plugdev</code> group to access the Arduino. </p><pre><code># usermod -a -G plugdev &lt;username&gt;
$ groups
... plugdev ...</code></pre><p>If the user is in the <code>plugdev</code> group and the udev rules has the proper VID:PID, then loading and triggering the new udev rule should result in rootless access to the Arduino interface:</p><pre><code># udevadm control --reload
# udevadm trigger</code></pre><h2 id="toolchain">Toolchain</h2><p>The easiest method to get avr-gcc (the compiler) and avrdude (firmware uploader/downloader) is to install either the Arudino 2.x IDE or the<a href="https://arduino.github.io/arduino-cli/0.19/getting-started/"> Arduino CLI</a>. The installers should populate a <code>$HOME/.arduinoXX</code> directory with the necessary binaries. The Arduino CLI may require installing the avr core via the CLI.</p><p><a href="https://github.com/sudar/Arduino-Makefile">sudar/Arduino-Makefile</a> is a great starting point for using a Makefile to compile Arduino sketches. Create a directory <code>third_party</code> and either <code>git clone</code> or <code>git submodule</code> the Arduino-Makefile repository.</p><pre><code>my_project
&#x251C;&#x2500;&#x2500; src
&#x2514;&#x2500;&#x2500; third_party
    &#x2514;&#x2500;&#x2500; Arduino-Makefile</code></pre><p>The Arduino Makefile project takes care of many aspects of compiling and uploading Arduino code once configured properly. To do so, create a <code>Makefile</code> in <code>src</code> with the paths for the installed version of avr-gcc, avrdude, and the Arduino MCU. </p><pre><code>ARDMK_VENDOR = .
ARDUINO_VERSION = 186

# Set paths to avr-gcc and avrdude
ARDUINO_DIR = ${HOME}/.arduino15/packages/arduino
AVR_TOOLS_DIR = ${ARDUINO_DIR}/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7
AVRDUDE_DIR = ${ARDUINO_DIR}/tools/avrdude/6.3.0-arduino17
AVRDUDE = ${AVRDUDE_DIR}/bin/avrdude
AVRDUDE_CONF = ${AVRDUDE_DIR}/etc/avrdude.conf</code></pre><p>Similar to the Arduino IDE, the Arduino board needs specified:</p><pre><code># Arduino Board Configurations
AVRDUDE_ARD_BAUDRATE = 115200
AVRDUDE_ARD_PROGRAMMER = arduino
MCU = atmega328
AVRDUDE_MCU = m328p

ARCHITECTURE	= avr/1.8.6
BOARD_TAG	= nano</code></pre><p>Unlike the Arduino IDE, the libraries that are being used must be specified. The below lines say that user-added libraries are in <code>third_party</code> , of which we expect to use the <code>Adafruit_NeoPixel</code> library. Additionally, the system libraries <code>Wire</code> and <code>EEPROM</code> are used. Any additional libraries are required to be added to <code>ARDUINO_LIBS</code></p><pre><code>USER_LIB_PATH += $(realpath ../third_party)

ARDUINO_LIBS += Wire EEPROM 
ARDUINO_LIBS += Adafruit_NeoPixel</code></pre><p>Finally, the build output directory and Arduino Makefile locations are specified:</p><pre><code>OBJDIR = $(realpath ../build-$(BOARD_TAG))

include $(realpath ../third_party/Arduino-Makefile/Arduino.mk)</code></pre><p>A directory layout for the above Makefile, including the Arduino-Makefile project and Adafruit NeoPixel library looks like:</p><pre><code>my_project
&#x251C;&#x2500;&#x2500; src
&#x2502;   &#x251C;&#x2500;&#x2500; main.ino
&#x2502;   &#x2514;&#x2500;&#x2500; Makefile
&#x2514;&#x2500;&#x2500; third_party
    &#x251C;&#x2500;&#x2500; Adafruit_NeoPixel
    &#x2502;   &#x251C;&#x2500;&#x2500; Adafruit_NeoPixel.cpp
    &#x2502;   &#x2514;&#x2500;&#x2500; Adafruit_NeoPixel.h
    &#x2514;&#x2500;&#x2500; Arduino-Makefile
 </code></pre><p>Running <code>make</code> will compile <code>main.ino</code> and <code>make upload</code> will flash <code>main.ino</code> to the Arduino.</p><h2 id="autocomplete-lint-formatting-etc">Autocomplete, Lint, Formatting, etc</h2><p>Any IDE can be used with the Makefile based toolchain outlined above. Despite the overkill that is using Electron for an IDE, <a href="https://github.com/VSCodium/vscodium">codium</a> (a Microsoft-free build of VS Code) provides a simple way to use <a href="https://clangd.llvm.org/">clangd</a> as a <a href="https://en.wikipedia.org/wiki/Language_Server_Protocol">Language Server</a>.</p><p>The <code>clangd</code> extension can be installed from the Extensions sidebar. In order to use code completion and other features, <code>clang</code> needs a <code>compile_commands.json</code> file to explain the build process. <a href="https://github.com/rizsotto/Bear">bear</a> provides an easy way to generate the compilation database:</p><pre><code>$ make clean
$ apt install bear
$ bear -- make</code></pre><p>Next, configure <code>clangd</code> to use <a href="https://clang.llvm.org/extra/clang-tidy/">clang-tidy</a> by modifying the clangd extension settings to launch clangd with the <code>--clang-tidy</code> argument.</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/05/image.png" class="kg-image" alt loading="lazy" width="580" height="253"></figure><p><code>clang-tidy</code> is configured by a <code>.clang-format</code> file, a good example being:</p><pre><code>BasedOnStyle: Google
SeparateDefinitionBlocks: Always
EmptyLineBeforeAccessModifier: LogicalBlock
ColumnLimit: 100
</code></pre><p>The <code>compile_commands.json</code> and <code>.clang-format</code> files should be placed at the root of the project directory:</p><pre><code>my_project
&#x251C;&#x2500;&#x2500; .clang_format
&#x251C;&#x2500;&#x2500; compile_commands.json
&#x251C;&#x2500;&#x2500; src
&#x2502;   &#x251C;&#x2500;&#x2500; main.ino
&#x2502;   &#x2514;&#x2500;&#x2500; Makefile
&#x2514;&#x2500;&#x2500; third_party
    &#x251C;&#x2500;&#x2500; Adafruit_NeoPixel
    &#x2502;   &#x251C;&#x2500;&#x2500; Adafruit_NeoPixel.cpp
    &#x2502;   &#x2514;&#x2500;&#x2500; Adafruit_NeoPixel.h
    &#x2514;&#x2500;&#x2500; Arduino-Makefile</code></pre><p>Adding a <code>.gitignore</code> to the project root prevents git from slurping up some of the one-off parts of the configuration. Depending on user preferences it may also be advisable to add <code>third_party/</code> to <code>.gitignore</code>.</p><pre><code>build-*/
compile_commands.json
.cache</code></pre><h2 id="plotting">Plotting</h2><p>The Arduino 2.x IDE includes a Serial Plotter that plots data in a <a href="https://github.com/arduino/Arduino/blob/master/build/shared/ArduinoSerialPlotterProtocol.md">CSV-like format</a> of <code>key1:value1, key2:value2</code>. For example, <code>voltage:3.1,current:6.28\n</code> results in two separate traces for voltage and current data. There are many usability flaws with the built-in Serial Plotter - axis limits cannot be set, X-Y plots are missing, only ten traces can be viewed at a time, the time window is fixed, etc. Fortunately there are many other plotting solutions that can be used. </p><p>Ideally, any plotting solution is backwards compatible with the built-in serial plotter. <a href="https://kst-plot.kde.org/">Kst</a> is a great plotting tool but does not offer support for the <code>key:value</code> CSV-like format. <a href="https://github.com/hyOzd/serialplot">serialplot</a> <a href="https://github.com/hyOzd/serialplot/commit/9c952c2524c42efe97546748911bd8491a4a862b">supports</a> the <code>key:value</code> format, interfaces directly with serial devices, and includes the ability to write data to the serial port, but lacks multiple plots. <a href="https://github.com/facontidavide/PlotJuggler">PlotJuggler</a> offers a nice interactive user-interface but does not communicate directly with serial ports and does not provide a method for writing serial data; however, PlotJuggler&apos;s UX makes it worthwhile to overcome these limitations.</p><p>Despite what a <a href="https://www.perplexity.ai/search/39a5c2fc-bfa0-4bd3-9732-3d8f0f0142a8?s=u">LLM may say</a> it is not this simple to get serial data into PlotJuggler:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2023/05/image-1.png" class="kg-image" alt loading="lazy" width="777" height="292" srcset="https://frdmtoplay.com/content/images/size/w600/2023/05/image-1.png 600w, https://frdmtoplay.com/content/images/2023/05/image-1.png 777w" sizes="(min-width: 720px) 720px"><figcaption>perplexity.ai on using PlotJuggler with an Arduino</figcaption></figure><p>However, PlotJuggler does provide a method to plot JSON packets sent over UDP and this one-liner pipes serial <code>key:value</code> data directly to PlotJuggler:</p><pre><code>socat stdio /dev/ttyUSB0,raw,b115200 | sed -un &apos;s/^\$//p&apos; | jq -R --unbuffered &apos;split(&quot;,&quot;) | map(split(&quot;:&quot;)) | map({(.[0]): .[1] | tonumber}) | add&apos; 2&gt; /dev/null | socat - udp-datagram:127.0.0.1:9870</code></pre><p>This one-liner uses <a href="https://www.redhat.com/sysadmin/getting-started-socat">socat</a> to stream serial data to sed which filters for only lines that start with <code>$</code>, which are then passed to <a href="https://jqlang.github.io/jq/">jq</a> to convert the <code>key:value</code> pairs into valid JSON, which is then passed back to socat to stream the JSON as UDP packets to the PlotJuggler UDP server. Using the <code>$</code> sigil at the start of a line allows other libraries to print debug information to the serial terminal without being plotted. PlotJuggler will use the &quot;/&quot; delimiter to group signals in the Timeseries list, in the following example both <code>pitch</code> and <code>pitch_dot</code> are grouped under <code>r</code> because they were printed as <code>...r/pitch:34.31,r/pitch_dot:0...</code> .</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/05/image-2.png" class="kg-image" alt loading="lazy" width="1277" height="795" srcset="https://frdmtoplay.com/content/images/size/w600/2023/05/image-2.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/05/image-2.png 1000w, https://frdmtoplay.com/content/images/2023/05/image-2.png 1277w" sizes="(min-width: 720px) 720px"></figure><p>While the above solution allows quick plotting of serial data, it does not allow for writing data to the serial port, or viewing the lines that do not start with <code>$</code>. Additionally, it is not very Windows friendly.</p><p>Fortunately, Python has nice libraries for interacting with both serial ports and UDP packets. A simple program that replicates the bash one-liner above is:</p><pre><code class="language-python3">import json
import serial
import socket
import sys

arduino = serial.Serial(port=&quot;/dev/ttyUSB0&quot;, baudrate=115200)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


def line_to_dict(line):
    &quot;&quot;&quot;
    Convert a key:value CSV line in the Arduino Serial Plotter
    format to a dict.

    For example, &quot;time:10,b:2,c:3&quot; becomes {&quot;time&quot;:10, &quot;b&quot;:2.0, &quot;c&quot;:3.0}
    &quot;&quot;&quot;

    tree = {}
    for pair in line.strip().split(&apos;,&apos;):
        t = tree
        key, value = pair.split(&apos;:&apos;)
        parts = key.split(&apos;/&apos;)
        for part in parts[:-1]:
            t = t.setdefault(part, {})
        if parts[-1] == &quot;time&quot;:
            t[parts[-1]] = int(value)
        else:
            t[parts[-1]] = float(value)
    return tree


while True:
    if arduino.in_waiting &gt; 0:
        data = arduino.readline().decode()
        if data.startswith(&apos;$&apos;):
            json_data = json.dumps(line_to_dict(data))
            sock.sendto(json_data.encode(), (&apos;127.0.0.1&apos;, 9870))</code></pre><p>A full-featured script to handle forwarding CSV-like serial data to UDP, MQTT, or websocket servers and writing serial data is available at <a href="https://github.com/bsilvereagle/serial_forward">bsilvereagle/serial_forward</a>.</p><h2 id="live-reset">Live Reset</h2><p>One of the nicest features of the Arduino IDE is the orchestration of stopping the serial plotter and serial monitor to upload new programs. Normally, a serial monitor like <code>screen</code> or <code>minicom</code> would retain full control of the hardware interface to the serial port, preventing <code>avrdude</code> from flashing new firmware. The Arduino IDE uses a daemon to broadcast the serial data to the serial monitor and plotter via websockets. When &quot;upload&quot; is clicked the daemon release control of the serial device and reclaims it once <code>avrdude</code> finishes uploading.</p><p>This behavior can be replicated with a little bit of signal handling. The Arduino Makefile has a <code>RESET_CMD</code> argument that can be overridden to send a HUP signal to any process using the Arduino device. </p><pre><code># HUP for Live Reset
RESET_CMD = fuser -k -HUP $(DEVICE_PATH) || /bin/true</code></pre><p>The python program can handle the SIGHUP using the <a href="https://docs.python.org/3/library/signal.html">signal</a> library.</p><pre><code>import functools
import signal
...

def sighup_handler(signum, frame, aios):
    logger.info(&quot;Received HUP signal&quot;)
    aios.close()
    logger.info(&quot;Serial closed&quot;)
    time.sleep(10)
    logger.info(&quot;Reopening serial&quot;)
    aios.open()
    logger.info(&quot;Serial Opened&quot;)
    
handler = functools.partial(sighup_handler, aios=aios)
signal.signal(signal.SIGHUP, handler) </code></pre><hr><p>Was this an interesting read? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>]]></content:encoded></item><item><title><![CDATA[Statistically Squashing Bugs]]></title><description><![CDATA[An exponential distribution is used to determine how long to test a bug fix before determining with statistical confidence that it has been fixed.]]></description><link>https://frdmtoplay.com/statistically-squashing-bugs/</link><guid isPermaLink="false">643609eb9c00d93c1da4283a</guid><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Thu, 13 Apr 2023 20:06:59 GMT</pubDate><content:encoded><![CDATA[<p>Ah, the dreaded intermittent bug. For no apparent reason something is misbehaving. The logs offer nothing but dead ends. &quot;There&apos;s no such thing as an intermittent bug, only unknown &#xA0;boundary conditions&quot; doesn&apos;t seem to apply to the situation. The only fix seems to be changing pieces one-by-one until something new happens. But then something even worse happens - changing something causes the bug to &quot;disappear&quot; but there seems to be no link between the change and any mechanism that could impact the bug. <em>If the &apos;fix&apos; doesn&apos;t seem connected to any root cause for the bug, how do we know the bug is really gone?</em> </p><p>I found myself in this situation as part of an ongoing project to write custom firmware for the <a href="https://amzn.to/3GxaK4c">Elegoo Tumbller</a> self-balancing robot.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2023/04/image.png" class="kg-image" alt loading="lazy" width="1500" height="1245" srcset="https://frdmtoplay.com/content/images/size/w600/2023/04/image.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/04/image.png 1000w, https://frdmtoplay.com/content/images/2023/04/image.png 1500w" sizes="(min-width: 720px) 720px"><figcaption><a href="https://amzn.to/3GxaK4c">Elegoo Tumbller</a></figcaption></figure><p>The Tumbller uses an <a href="https://amzn.to/3GFSyoT">Arduino Nano clone</a> with a <a href="https://invensense.tdk.com/products/motion-tracking/6-axis/mpu-6050/">MPU6050</a> IMU. The MPU6050 features a neat on-board <a href="https://invensense.tdk.com/smartmotion/">Digital Motion Processor (DMP)</a> which takes care of fusing the gyroscope and accelerometer readings into a usable pose. However, the Elegoo developers opted to hand-tune a Kalman filter with raw gyroscope and accelerometer readings; I wanted to use the DMP.</p><p>Fortunately, there exists an easy-to-use <a href="https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050">open-source driver</a> to read from the DMP. &#xA0;</p><p>Unfortunately, there were periodic spikes in the DMP output which threw a wrench in tuning a controller. The following figure shows pitch (derived from the DMP quaternion output) for a stationary robot:</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/04/newplot-4-.png" class="kg-image" alt loading="lazy" width="1794" height="1218" srcset="https://frdmtoplay.com/content/images/size/w600/2023/04/newplot-4-.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/04/newplot-4-.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2023/04/newplot-4-.png 1600w, https://frdmtoplay.com/content/images/2023/04/newplot-4-.png 1794w" sizes="(min-width: 720px) 720px"></figure><p>Every so often the DMP output would erroneously jump before settling back to steady-state within a few hundred milliseconds:</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/04/newplot-3-.png" class="kg-image" alt loading="lazy" width="1794" height="1218" srcset="https://frdmtoplay.com/content/images/size/w600/2023/04/newplot-3-.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/04/newplot-3-.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2023/04/newplot-3-.png 1600w, https://frdmtoplay.com/content/images/2023/04/newplot-3-.png 1794w" sizes="(min-width: 720px) 720px"></figure><p>So what to do? Swapping for a new MPU6050 (twice) and a new Arduino did nothing for eliminating the spikes, hinting that there was a bug lurking in the custom firmware.</p><p>To get a handle on the issue, I collected 500 samples of the DMP spikes and measured the time between consecutive occurrences. The hypothesis was that the time deltas between events would be a rough <a href="https://en.wikipedia.org/wiki/Exponential_distribution">Exponential distribution</a>, which models the time between events in a Poisson process. A histogram of the time delta measurements is below:</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/04/newplot-5-.png" class="kg-image" alt loading="lazy" width="1794" height="1218" srcset="https://frdmtoplay.com/content/images/size/w600/2023/04/newplot-5-.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/04/newplot-5-.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2023/04/newplot-5-.png 1600w, https://frdmtoplay.com/content/images/2023/04/newplot-5-.png 1794w" sizes="(min-width: 720px) 720px"></figure><p>The histogram looks remarkably similar to an Exponential distribution! Fitting a curve was straightforward with <code>scipy.stats.expon.fit</code>.</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/04/newplot-7-.png" class="kg-image" alt loading="lazy" width="1794" height="1218" srcset="https://frdmtoplay.com/content/images/size/w600/2023/04/newplot-7-.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/04/newplot-7-.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2023/04/newplot-7-.png 1600w, https://frdmtoplay.com/content/images/2023/04/newplot-7-.png 1794w" sizes="(min-width: 720px) 720px"></figure><p>With an Exponential distribution model in hand, it is possible to determine how long we need to sample <em>without observing</em> the DMP output drift to say with confidence that the bug is fixed. The Exponential distribution models how much time elapses in between events but we need to know how long to wait for an event to occur. The Poisson distribution models how many events occur in a given time window. Fortunately, there is a <a href="https://neurophysics.ucsd.edu/courses/physics_171/exponential.pdf">simple relationship</a> between the two distributions that allows calculating the probability that an event will occur within a certain time period.</p><!--kg-card-begin: markdown--><p>$$P(T &gt; t) = \exp^{-\lambda t}$$ gives the probability for no occurences to happen in time \(t\) milliseconds. In this case, the \(\lambda\) parameter for the Exponential distribution is \(4.65\text{e-}5\) (1/scale from <code>scipy.stats.expon.fit</code>). For example, after starting the system the probability of observing a DMP spike within 15 seconds (15000 ms) is ~50%. Running for 64 seconds gives a probability of ~95%, and coincidentially running for 99 seconds gives a probability of ~99%.</p>
<!--kg-card-end: markdown--><p>In other words, if a fix is made to the firmware and the system runs for ~99 seconds <em>without</em> observing the DMP spike there is a 99% chance that it is fixed.</p><p>Armed with the knowledge of how long to test a change, it is possible to begin shotgun debugging. Fortunately, 50% of the time a change only needs to run for ~15 seconds to determine that it doesn&apos;t fix the issue so the debug-iteration loop is at an okay rate.</p><p>In this case, the issue was caused by resetting the FIFO buffer, waiting for a packet, then reading from the reset FIFO buffer.</p><!--kg-card-begin: markdown--><pre><code class="language-c">  ...
  mpu.resetFIFO();
  if(!mpu.dmpPacketAvailable()){
    return -1;
  }

  mpu.getFIFOBytes(fifoBuffer, 42);
  mpu.dmpGetQuaternion(&amp;orientation, fifoBuffer);
  ...
</code></pre>
<!--kg-card-end: markdown--><p>Invensense&apos;s documentation is very sparse, so it is difficult to piece together why clearing the DMP&apos;s FIFO buffer causes intermittent output drift, but removing the FIFO reset eliminated the spikes:</p><!--kg-card-begin: markdown--><pre><code class="language-c">  ...
  //mpu.resetFIFO();
  if(!mpu.dmpPacketAvailable()){
    return -1;
  }

  mpu.getFIFOBytes(fifoBuffer, 42);
  mpu.dmpGetQuaternion(&amp;orientation, fifoBuffer);
  ...
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2023/04/newplot-8-.png" class="kg-image" alt loading="lazy" width="1794" height="1218" srcset="https://frdmtoplay.com/content/images/size/w600/2023/04/newplot-8-.png 600w, https://frdmtoplay.com/content/images/size/w1000/2023/04/newplot-8-.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2023/04/newplot-8-.png 1600w, https://frdmtoplay.com/content/images/2023/04/newplot-8-.png 1794w" sizes="(min-width: 720px) 720px"></figure><p>With no apparent link between the fix and the bug symptoms, the &quot;proof&quot; of the bug resolving is in the statistics.</p><!--kg-card-begin: markdown--><hr>
<p>Was this an interesting read? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Running Qucs in Debian 11 via podman]]></title><description><![CDATA[Using podman to support Qucs, an application requiring Qt4, within Debian 11.]]></description><link>https://frdmtoplay.com/running-qucs-in-debian-11/</link><guid isPermaLink="false">6254df347b4660656bd58fce</guid><category><![CDATA[linux]]></category><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Tue, 12 Apr 2022 02:32:41 GMT</pubDate><content:encoded><![CDATA[<p><a href="http://qucs.sourceforge.net/screenshots.html">Qucs</a> is a nice &quot;Quite Universal Circuit Simulator&quot; along the lines of <a href="https://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html">LTspice</a> but it runs on Linux!</p><p>Unfortunately, Qucs requires Qt4, which has been <a href="https://lists.debian.org/debian-devel-announce/2015/05/msg00001.html">deprecated</a>. Debian <a href="https://wiki.debian.org/Qt4Removal">completely removed</a> Qt4 support from Debian 11 (&quot;bullseye&quot;).</p><p>Fortunately, podman can be used to run a containerized version of qucs without issue. The Dockerfile below starts from a Debian 10 base image, installs the necessary dependencies for Qucs, downloads the version 0.0.20 source code, and compiles it.</p><figure class="kg-card kg-code-card"><pre><code>FROM debian:buster
RUN apt update &amp;&amp; apt install -y build-essential libqt4-dev libqt4-qt3support automake libtool gperf flex bison texlive-font-utils wget pkg-config libxml-libxml-perl &amp;&amp; mkdir -p /opt/qucs &amp;&amp; cd /opt/qucs
RUN wget -c https://github.com/Qucs/ADMS/releases/download/release-2.3.7/adms-2.3.7.tar.gz -O - | tar -xz &amp;&amp; cd adms-2.3.7 &amp;&amp; ./configure --prefix=/usr &amp;&amp; make install
RUN wget -c https://sourceforge.net/projects/qucs/files/qucs/0.0.20/qucs-0.0.20-rc2.tar.gz/download -O - | tar -xz
RUN cd qucs-0.0.20 &amp;&amp; ./bootstrap &amp;&amp; ./configure --disable-doc &amp;&amp; make -j 8 &amp;&amp; make install</code></pre><figcaption>Dockerfile for running Qucs on Debian 11</figcaption></figure><p>The container can be ran from the command line:</p><pre><code>podman run -it \\
           -v .:/data \\
           -e DISPLAY=:0 \\
           -v /tmp/.X11-unix:/tmp/.X11-unix \\
           -v /home/user/.Xauthority:/tmp/.XAuthority \\
           --env=QT_X11_NO_MITSHM=1 \\
           6fa55ff299d \\
           qucs
</code></pre><p>The launch command is fairly straightforward with some nuances for using an X11 application in the container.</p><p><code>-e DISPLAY=:0</code> sets the current X11 server within the docker container. The volume mounts of <code>.X11-unix</code> and <code>.Xauthority</code> map the X11 server sockets and authentication into the container. <code>--env=QT_X11_NO_MITSHM=1</code> prevents Qt from using <a href="https://en.wikipedia.org/wiki/MIT-SHM">MIT-SHM</a> extensions which require access to <code>/dev/shm</code>.</p><p>This method should extend to any program that requires Qt4, at least as long as Debian continues to provide apt support for buster.</p><!--kg-card-begin: markdown--><hr>
<p>Was this an interesting read? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Generating Gmail addresses with steganography]]></title><description><![CDATA[Generating finite numbers of Gmail addresses by strategically inserting periods]]></description><link>https://frdmtoplay.com/finite-gmail-accounts/</link><guid isPermaLink="false">62435d667b4660656bd58eae</guid><category><![CDATA[python]]></category><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Tue, 29 Mar 2022 22:33:46 GMT</pubDate><content:encoded><![CDATA[<p>Alternate title: Oh the things you have time for on sabbatical</p><p>Many, many, forms that accept e-mail addresses do not comply with the <a href="https://www.rfc-editor.org/rfc/rfc3696.txt">RFC 3696</a> specification for e-mail addresses:</p><!--kg-card-begin: markdown--><blockquote>
<p>Without quotes, local-parts may consist of any combination of alphabetic characters, digits, or any of the special characters</p>
<pre><code> ! # $ % &amp; &apos; * + - / = ?  ^ _ ` . { | } ~
</code></pre>
<p>period (&quot;.&quot;) may also appear, but may not be used to start or end the local part, nor may two or more consecutive periods appear.  Stated differently, any ASCII graphic (printing) character other than the at-sign (&quot;@&quot;), backslash, double quote, comma, or square brackets may appear without quoting</p>
</blockquote>
<!--kg-card-end: markdown--><p>This commonly manifests itself when trying to take advantage of <a href="https://support.google.com/a/users/answer/9308648?hl=en">Gmail&apos;s task specific e-mail addresses</a> using the &apos;+&apos; sign; the example below show&apos;s <a href="https://www.bayareafastrak.org/">bayareafastrak.org</a>&apos;s non-compliance. &#xA0;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2022/03/image.png" class="kg-image" alt loading="lazy" width="471" height="89"><figcaption>A perfectly valid e-mail address rejected by bayareafastrak.org</figcaption></figure><p>Using &apos;+&apos; unlocks virtually unlimited Gmail addresses so each service can have an individual address to track down leaks, etc. Fortunately, Gmail offers another way to create a <em>finite</em> set of e-mail addresses - <a href="https://support.google.com/mail/answer/7436150?hl=en">dots don&apos;t matter in Gmail addresses</a>.</p><!--kg-card-begin: markdown--><p>Note the RFC verbiage on using dots/periods - the address cannot start, end, or contain repeated dots. So, a single period can go between any two characters meaning that if the &quot;local&quot; (username) part of a Gmail address has 12 characters, there are 2<sup>11</sup> or 2048 unique e-mail addresses that can be created by leveraging how Gmail handles periods.</p>
<!--kg-card-end: markdown--><p>The issue becomes handling these finite e-mail addresses. How do we make sure every e-mail address is unique? One option is to start sticking periods in the first available slot and checking a password manager to make sure that the addresses are unique. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2022/03/dots.png" class="kg-image" alt loading="lazy" width="373" height="638"><figcaption>Using Bitwarden to prevent e-mail address collisions</figcaption></figure><p>Manually inserting periods works just fine, but requires a password manager to map from a given e-mail address to a service. The &apos;+&apos; method makes the mapping very easy - <code>bsilvereagle+fastrak</code> is clearly used for Fastrak but <code>b.silve.ereagle</code> has no human readable element. Fortunately, using some <a href="https://en.wikipedia.org/wiki/Steganography">steganography</a> we can embed human understandable elements into the e-mail.</p><!--kg-card-begin: markdown--><p>The plan is to limit the information to lowercase letters and attempt to embed meaningful 2-3 character representations into the e-mail address. For example, &quot;Hacker News&quot; may be &quot;hn&quot;, &quot;Reddit&quot; may be &quot;r&quot;, etc.</p>
<p>It takes 5 bits to represent the 26 lowercase letters (log<sub>2</sub>(26) &#x2248; 4.7) which can be done by mapping them to their respective digits on a 0-index basis, i.e. &apos;a&apos; is &apos;0&apos;, &apos;b&apos; is &apos;1&apos;, etc.</p>
<p>Next, we can convert the digits to a binary representation and then stuff them into the e-mail address. &quot;hn&quot; becomes &quot;00111 01101&quot; which can be represented in period form with &quot;--...-..-.&quot;.</p>
<p>After that, the period/binary string can be slotted into the e-mail address, as shown below:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2022/03/example.png" class="kg-image" alt loading="lazy" width="2000" height="644" srcset="https://frdmtoplay.com/content/images/size/w600/2022/03/example.png 600w, https://frdmtoplay.com/content/images/size/w1000/2022/03/example.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2022/03/example.png 1600w, https://frdmtoplay.com/content/images/2022/03/example.png 2000w" sizes="(min-width: 720px) 720px"></figure><p></p><!--kg-card-begin: markdown--><p>Note that the amount of encodable information is limited by the length of the original e-mail address. &quot;bsilvereagle&quot; can only fit 11 bits of period-encoded information and is limited to two characters, or 26<sup>2</sup> (276) unique combinations. Many of those combinations will not be meaningful (&quot;zj&quot;, &quot;xq&quot;, &quot;xv&quot;, etc) so the useful combination range is significantly lower. An e-mail address that has 15 slots (at least 16 characters) opens up to 26<sup>3</sup> (17576) combinations.</p>
<!--kg-card-end: markdown--><p>Fortunately, the script at the end of this post can automate the encoding and decoding of the period e-mails.</p><p>This steganographic method does not really improve the usability of a password manager handling the mapping of e-mails to services and is largely impractical.</p><!--kg-card-begin: markdown--><hr>
<p>Was this an interesting read? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><hr>
<pre><code>from itertools import chain, zip_longest


def alternate(list1, list2):
    # Merges two lists in an alternate fashion
    # [&apos;A&apos;,&apos;B&apos;,&apos;C&apos;], [&apos;a&apos;,&apos;b&apos;] -&gt; [&apos;A&apos;,&apos;a&apos;,&apos;B&apos;,&apos;b&apos;,&apos;C&apos;]
    return [x for x in chain.from_iterable(zip_longest(list1, list2)) if x]


def int2binlist(integer):
    # Converts an integer 5 into a list of binary representation padded to 5 spaces [0, 0, 1, 0, 1]
    if (integer &gt;= 31) or (integer &lt; 0):
        return [1, 1, 1, 1, 1]

    binary = [int(x) for x in list(&apos;{0:0b}&apos;.format(integer))]
    return [0]*(5 - len(binary)) + binary


def encode(email, identifier, width=5):
    payload = &quot;abcdefghijklmnopqrstuvwxyz&quot;
    local, domain = email.split(&apos;@&apos;)
    # Determine the number of identfiers that can be encoded using one character per 5 available &quot;slots&quot;
    identifier_count = (len(local) - 1) // width
    # Look up identifier in payload, get binary representation, then convert to &quot;.&quot; binary encoding
    encoding = [&apos;.&apos; if x else &apos;&apos; for x in chain(*map(int2binlist, map(payload.index, identifier[:identifier_count])))]
    return &apos;&apos;.join(alternate(local, encoding)) + &apos;@&apos; + domain


def decode(email, width=5):
    payload = &quot;abcdefghijklmnopqrstuvwxyz&quot;
    local, domain = email.split(&apos;@&apos;)
    encoded = []
    local_iter = iter(local[1:-1])  # Skip first and last character
    for c in local_iter:
        if c == &apos;.&apos;:
            encoded.append(1)
            next(local_iter)  # We&apos;ve recorded something for this slot, move to the next one
        else:
            encoded.append(0)
    identifier_count = len(encoded) // width
    result = &apos;&apos;
    for i in range(identifier_count):
        result += payload[int(&apos;&apos;.join([str(i) for i in encoded[i*width:(i+1)*width]]), 2)]

    return result
</code></pre>
<pre><code>print(encode(&quot;aaaaaaaaaaa@gmail.com&quot;, &quot;secretkey&quot;))
a.aaa.aaaa.aaa@gmail.com
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Solving the Nintendo Switch Ground Loop]]></title><description><![CDATA[Solving ground loop issues when connecting the Nintendo Switch to a computer and analyzing some ground loop isolators along the way]]></description><link>https://frdmtoplay.com/solving-the-nintendo-switch-ground-loop/</link><guid isPermaLink="false">623525707b4660656bd58be2</guid><category><![CDATA[linux]]></category><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Tue, 22 Mar 2022 21:54:31 GMT</pubDate><media:content url="https://frdmtoplay.com/content/images/2022/03/noisy_spectrogram-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://frdmtoplay.com/content/images/2022/03/noisy_spectrogram-1.png" alt="Solving the Nintendo Switch Ground Loop"><p>Some Nintendo Switch games have stronger game play mechanics than soundtracks and it would be nice to listen to other music will still being able to hear critical sound effects. Having an ear bud playing sounds from the Nintendo Switch inside of an over-ear headphone playing music does work, but can be painful after a few hours. In theory, it should be possible to run the Nintendo Switch&apos;s audio through a computer and into a single set of headphones.</p><h2 id="first-attempt">First Attempt</h2><p>The Nintendo Switch has a TRRS (Tip-Ring-Ring-Sheath) 3.5mm port which carries the left and right audio channels, a ground line, and the microphone channel. Most 3.5mm devices use a TRS (Tip-Ring-Sheath) connector which only carries left/right and ground. TRRS and TRS ports and cables can be used interchangeably for carrying left and right audio channels, but a TRRS cable must be used in a TRRS port to carry the microphone signal. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2022/03/IMG_3609.jpg" class="kg-image" alt="Solving the Nintendo Switch Ground Loop" loading="lazy" width="1258" height="1422" srcset="https://frdmtoplay.com/content/images/size/w600/2022/03/IMG_3609.jpg 600w, https://frdmtoplay.com/content/images/size/w1000/2022/03/IMG_3609.jpg 1000w, https://frdmtoplay.com/content/images/2022/03/IMG_3609.jpg 1258w" sizes="(min-width: 720px) 720px"><figcaption>Comparison of TRRS (left) and TRS (right)</figcaption></figure><p>In theory, it should be possible to take the left and right audio channels from the Nintendo Switch and pipe those to a LINE IN line on a computer. The LINE IN could then be mirrored onto a headphone jack that is already playing some other music. Similarly, piping a microphone from the computer to the LINE OUT and wiring that to the Nintendo Switch microphone input should also preserve microphone functionality. A TRRS to 2xTRS splitter can be used to pipe the left and right audio channels to the LINE IN port and the microphone to the LINE OUT port on the motherboard. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2022/03/notional-2.png" class="kg-image" alt="Solving the Nintendo Switch Ground Loop" loading="lazy" width="1707" height="1197" srcset="https://frdmtoplay.com/content/images/size/w600/2022/03/notional-2.png 600w, https://frdmtoplay.com/content/images/size/w1000/2022/03/notional-2.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2022/03/notional-2.png 1600w, https://frdmtoplay.com/content/images/2022/03/notional-2.png 1707w" sizes="(min-width: 720px) 720px"><figcaption>Notional Architecture</figcaption></figure><p>However, doing this in practice results in some nasty noise from a ground loop. The spectrogram below shows the unpleasant broadband noise that drowns out the real audio signal.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2022/03/noisy_spectrogram.png" class="kg-image" alt="Solving the Nintendo Switch Ground Loop" loading="lazy" width="865" height="444" srcset="https://frdmtoplay.com/content/images/size/w600/2022/03/noisy_spectrogram.png 600w, https://frdmtoplay.com/content/images/2022/03/noisy_spectrogram.png 865w" sizes="(min-width: 720px) 720px"><figcaption>Audio from the Switch with Ground Loop Interference</figcaption></figure><h2 id="ground-loop-isolators">Ground Loop Isolators</h2><p>Ground loop isolators are commonly used to remove noise from improperly installed 3rd party car stereos and can easily be found online. Most isolators work by using transformers to transfer the audio signal with a new ground. However, it is not always apparent from the product listing how the isolator actually performs. Since two isolators are needed (one for the mic, one for the stereo) three were purchased and characterized side-by-side.</p><ul><li><a href="https://amzn.to/3u62T6w">PAC SNI-1/3.5 Ground Loop Isolator</a>. The ground loop isolator of choice at Crutchfield and claims to have a +1.3dB response.</li><li><a href="https://amzn.to/3uwMIj1">Zetsage Ground Loop Noise Isolator</a>. This product was the cheapest of a slew of seemingly identical MPOW clones on Amazon. The product images suggest that the isolator is not using transformers for isolation.</li><li><a href="https://amzn.to/3KXQHLL">Kript Hifi Ground Loop Isolator</a>. The Kript product images showed real isolation transformers.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2022/03/IMG_3604.jpg" class="kg-image" alt="Solving the Nintendo Switch Ground Loop" loading="lazy" width="561" height="224"><figcaption>Kript Hifi Internals</figcaption></figure><p>The Kript HiFi was the only isolator that was trivial to crack open and is shown above. The PAC has end caps clipped into the PCB but it possible to remove grommets holding the 3.5mm wire and verify that there are transformer coils inside. The Zetsage seems glued together and did not want to reveal its secrets. </p><p>The three isolators were characterized using a <a href="https://digilent.com/shop/analog-discovery-2-100ms-s-usb-oscilloscope-logic-analyzer-and-variable-power-supply/">Digilent Analog Discovery 2</a> as a <a href="https://hackaday.com/2018/06/20/analog-discovery-2-as-a-vector-network-analyzer/">vector network analyzer</a> with a 2V signal swept from 20Hz-20,000Hz (audible range). Digilent&apos;s Waveforms software shows the full <a href="https://en.wikipedia.org/wiki/Bode_plot">bode plot</a> of the response, as shown in the run against the Zetsage, below. The generated waveform is Channel 1 (yellow trace) and the response through the ground loop isolator is Channel 2 (blue trace). </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2022/03/zetsage_proper_grounding_proper_direction.png" class="kg-image" alt="Solving the Nintendo Switch Ground Loop" loading="lazy" width="2000" height="1050" srcset="https://frdmtoplay.com/content/images/size/w600/2022/03/zetsage_proper_grounding_proper_direction.png 600w, https://frdmtoplay.com/content/images/size/w1000/2022/03/zetsage_proper_grounding_proper_direction.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2022/03/zetsage_proper_grounding_proper_direction.png 1600w, https://frdmtoplay.com/content/images/size/w2400/2022/03/zetsage_proper_grounding_proper_direction.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption>Discovery 2 VNA for the Zetsage</figcaption></figure><p>Interestingly, the Zetsage was the only device to reproduce the waveform with a 180&#xB0; phase offset which inverted at 3kHz! Both the PAC and Kript devices reproduced the waveform with 0&#xB0; offset after ~100Hz.</p><p>The amplitude response of the three devices is shown below.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://frdmtoplay.com/content/images/2022/03/newplot-3.png" class="kg-image" alt="Solving the Nintendo Switch Ground Loop" loading="lazy" width="1000" height="600" srcset="https://frdmtoplay.com/content/images/size/w600/2022/03/newplot-3.png 600w, https://frdmtoplay.com/content/images/2022/03/newplot-3.png 1000w"></figure><p>The PAC SNI-1/3.5 lived up to the advertised +1.3dB gain (+16%) across the majority of the frequency range. Running the device in reverse inverts the gain to -1.3dB.</p><p>The Kript and Zetsage both target a 0dB gain with -0.08dB being achieved by the Kript at 39Hz and 80Hz for the Zetsage. Multiple Amazon reviews for the Zetsage (and other no-name ground loop isolators) complained about weaker bass which aligns with the frequency response results.</p><p>Putting the Kript and the PAC ground loop isolators in line with the audio signals from the Switch results in a much cleaner spectrogram without broadband noise.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2022/03/clean_spectrogram.png" class="kg-image" alt="Solving the Nintendo Switch Ground Loop" loading="lazy" width="866" height="445" srcset="https://frdmtoplay.com/content/images/size/w600/2022/03/clean_spectrogram.png 600w, https://frdmtoplay.com/content/images/2022/03/clean_spectrogram.png 866w" sizes="(min-width: 720px) 720px"><figcaption>Audio from the Switch without Ground Loop Interference</figcaption></figure><h2 id="pulseaudio">Pulseaudio</h2><p>With the ground loop resolved it is finally possible to set up the loopback devices allowing the Nintendo Switch speaker output and microphone input to be proxied to other devices.</p><p>The first step is to use <code><a href="https://linux.die.net/man/1/pactl">pactl</a></code> to determine which source (&quot;input&quot; in pulseaudio parlance) is wired to the Nintendo Switch left/right audio channels. </p><!--kg-card-begin: markdown--><pre><code>$ pactl list sources | grep -e Source -e Name -e Port
Source #14
	Name: alsa_output.pci-0000_0e_00.3.HiFi__hw_Generic_4__sink.monitor
Source #15
	Name: alsa_output.pci-0000_0e_00.3.HiFi__hw_Generic__sink.monitor
Source #16
	Name: alsa_input.pci-0000_0e_00.3.HiFi__hw_Generic_4__source
	Ports:
	Active Port: [In] Mic1
Source #17
	Name: alsa_input.pci-0000_0e_00.3.HiFi__hw_Generic__source
	Ports:
	Active Port: [In] Mic2
</code></pre>
<!--kg-card-end: markdown--><p>In this case the microphone port being used is the shared Rear Mic/Line In port which is Source <strong>#17</strong>. Source #16 is also a microphone line but is the microphone that will be piped to the Switch.<strong> </strong></p><p><code>pactl</code> can also be used to find the sink (&quot;output&quot;) to redirect the input to. In this setup the proper sink are the headphones at index <strong>#8</strong>. <strong>Note:</strong> Bluetooth headsets in an A2DP configuration will have noticeable lag in online games.</p><!--kg-card-begin: markdown--><pre><code>pactl list sinks | grep -e Sink -e Name -e Port              
Sink #8
	Name: alsa_output.pci-0000_0e_00.3.HiFi__hw_Generic_4__sink
	Ports:
	Active Port: [Out] Headphones
Sink #9
	Name: alsa_output.pci-0000_0e_00.3.HiFi__hw_Generic__sink
	Ports:
	Active Port: [Out] Line1
</code></pre>
<!--kg-card-end: markdown--><p>With the sink and source numbers known the <a href="https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/#module-loopback">loopback</a> module can be loaded. The <code>latency_msec</code> parameter is a target for latency and defaults to 200ms to preserve CPU cycles. In the case of gaming, 200ms is too high and should be lowered in exchange for higher CPU load on the host PC.</p><!--kg-card-begin: markdown--><pre><code>pactl load-module module-loopback sink=8 source=17 latency_msec=5
</code></pre>
<!--kg-card-end: markdown--><p>With the loopback module loaded audio from the Nintendo Switch is played over the headphones! The loopback connection shows up in the &quot;Recording&quot; tab of <code>pavucontrol</code>. Note that it is possible to change the sink target from <code>pavucontrol</code> but not the source.</p><p>The exact same procedure is used to pipe a microphone to LINE OUT which is wired to the microphone input of the Nintendo Switch:</p><!--kg-card-begin: markdown--><pre><code>pactl load-module module-loopback sink=9 source=16
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2022/03/pavucontrol.png" class="kg-image" alt="Solving the Nintendo Switch Ground Loop" loading="lazy" width="1281" height="251" srcset="https://frdmtoplay.com/content/images/size/w600/2022/03/pavucontrol.png 600w, https://frdmtoplay.com/content/images/size/w1000/2022/03/pavucontrol.png 1000w, https://frdmtoplay.com/content/images/2022/03/pavucontrol.png 1281w" sizes="(min-width: 720px) 720px"><figcaption>pavucontrol with both loopback modules loaded</figcaption></figure><p>The modules can be loaded at boot by adding equivalent lines to <code>~/.config/pulse/default.pa</code>. The sink and source numbers can change every time pulseaudio is launched, so it can be convenient to swap the index numbers out for the actual device names.</p><!--kg-card-begin: markdown--><pre><code>...
load-module module-loopback sink=alsa_output.pci-0000_0e_00.3.HiFi__hw_Generic_4__sink source=alsa_input.pci-0000_0e_00.3.HiFi__hw_Generic__source latency_msec=5

load-module module-loopback sink=alsa_output.pci-0000_0e_00.3.HiFi__hw_Generic__sink source=alsa_input.pci-0000_0e_00.3.HiFi__hw_Generic_4__source
...
</code></pre>
<!--kg-card-end: markdown--><h2 id="microphone-circuit">Microphone Circuit</h2><p>While the pulseaudio switcheroo above is sufficient to listen to audio <em>from</em> the Nintendo Switch, it is not sufficient to pipe the external microphone <em>into</em> games.</p><p>Nearly all devices using TRRS connectors for microphone input put a bias voltage on the line to power the microphone. The fluctuations in voltage caused by the microphone are then treated as an audio input. Most devices detect the presence of a microphone as the lack of a short between the Sleeve and Ring; the ground isolation transformer is essentially a short in this case. To remedy this, a resistor needs placed between the microphone input and ground. Google recommends <a href="https://source.android.com/devices/accessories/headset/plug-headset-spec">1k Ohm or higher</a> for microphones connecting to an Android device. A 1.6k Ohm resistor was readily available and works just fine.</p><p>The DC bias voltage is problematic - it is not needed since the audio signal is coming from the Line Out of the computer. To prevent the DC bias voltage from interferring with the ground loop isolator, a capacitor can be used in series with the signal. </p><p>Additionally, &quot;mic level&quot; is generally recognized as -40 dB while consumer grade line levesl are generally -10 dB. A voltage divider could be built in hardware to reduce the voltage levels, but <code>pavucontrol</code> provides a handy limiter for the output strength of the Line Out signal.</p><p><a href="https://amzn.to/3KrP9Kh">TRRS to Screw Terminal breakouts</a> make it easy to build the circuit below.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2022/04/export.png" class="kg-image" alt="Solving the Nintendo Switch Ground Loop" loading="lazy" width="420" height="201"><figcaption>Circuit Required for Microphone Input</figcaption></figure><h2 id="bill-of-materials">Bill Of Materials</h2><p>The total cost to re-implement seems a bit higher than it should! This cost could probably be reduced from hacking together homemade isolation transformers or salvaging TRRS cables.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Component</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://amzn.to/3IxH4lo">3.5mm TRRS Male-to-Male Cable</a></td>
<td>$8.79</td>
</tr>
<tr>
<td><a href="https://amzn.to/3iva6aE">3.5mm TRRS to 2x TRS Adapter</a></td>
<td>$5.99</td>
</tr>
<tr>
<td><a href="https://amzn.to/3inWy0K">Kript Hifi Ground Loop Isolator</a></td>
<td>$14.99</td>
</tr>
<tr>
<td><a href="https://amzn.to/3ujs0To">PAC SNI-1/3.5 Ground Loop Isolator</a></td>
<td>$9.94</td>
</tr>
<tr>
<td><a href="https://amzn.to/3KrP9Kh">TRRS Breakout Adaptors</a></td>
<td>$12.62</td>
</tr>
<tr>
<td><strong>Total</strong></td>
<td><strong>$52.33</strong></td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><hr><p>Was this an interesting read? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>]]></content:encoded></item><item><title><![CDATA[Unmasking Scooby-Doo]]></title><description><![CDATA[A list of all of the home media released episodes of Scooby-Doo television series episodes produced by Hanna-Barbera]]></description><link>https://frdmtoplay.com/unmasking-scooby-doo/</link><guid isPermaLink="false">6163971b7b4660656bd58a17</guid><category><![CDATA[cartoons]]></category><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Sat, 30 Oct 2021 02:46:35 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: html--><style>
    table {
    /* Remove spacing between table cells (from Normalize.css) */
    border-collapse: collapse;
    margin: 25px 0;
    font-size: 0.9em;
    font-family: sans-serif;
    box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
    display:block;
    max-height: 650px;
    overflow-y: scroll;
	margin-left: auto;
    margin-right: auto;
   }

table caption {
    color: #000;
    font: italic 85%/1 arial, sans-serif;
    padding: 1em 0;
    text-align: center;
}

table td,
table th {
    border-left: 1px solid #cbcbcb;/*  inner column border */
    border-width: 0 0 0 1px;
    font-size: inherit;
    margin: 0;
    overflow: visible; /*to make ths where the title is really long work*/
    padding: 0.5em 1em; /* cell padding */
}

table thead tr{
    background-color: #268bd2;
    color: #ffffff;
    text-align: left;
    font-weight: bold;
}

table tbody tr {
    border-bottom: 1px solid #dddddd;
}

table tbody tr:nth-of-type(even) {
    background-color: #f3f3f3;
}

table tbody tr:last-of-type {
    border-bottom: 2px solid #009879;
}

</style><!--kg-card-end: html--><p>Numerous requests have flooded in requesting an enumeration of the home media releases of <a href="https://en.wikipedia.org/wiki/Scooby-Doo">Scooby-Doo</a> in a similar fashion to the breakdown of <a href="https://frdmtoplay.com/maximizing-bugs-bunny/">Bugs Bunny</a>, so in Halloween Spirit, here it is.</p><p>The following lists are only for Scooby-Doo works produced before Hanna-Barbera was bought by TBS in 1991 and then folded into Cartoon Network and Warner Bros. Episodes where Scooby-Doo was included in a large cast of Hanna-Barbera properties are also excluded.</p><p>Many, many, Scooby-Doo compendiums have been released that are samplings of episodes from different seasons. These are best avoided. Fortunately, Hanna-Barbera has made a concerted effort to also release complete seasons despite being a subsidiary of Warner Bros. </p><h2 id="complete-television-series-releases">Complete Television Series Releases</h2><p>The following six series are available in their entirety, providing 137 episodes of Scooby and the Gang:</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Show Name</th>
<th>Air Date</th>
<th>Network</th>
<th>Number of Seasons</th>
<th>Number of Episodes</th>
<th>Media Release</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://en.wikipedia.org/wiki/Scooby-Doo,_Where_Are_You!">Scooby-Doo, Where Are You!</a></td>
<td>1969-1970, 1978</td>
<td>CBS, ABC</td>
<td>3</td>
<td>41</td>
<td><a href="https://amzn.to/3asgkUM">Complete Series</a></td>
</tr>
<tr>
<td><a href="https://en.wikipedia.org/wiki/The_New_Scooby-Doo_Movies">The New Scooby-Doo Movies</a></td>
<td>1972-1973</td>
<td>CBS</td>
<td>2</td>
<td>24</td>
<td><a href="https://amzn.to/3BHonJi">The Almost Complete Series</a>*</td>
</tr>
<tr>
<td><a href="https://en.wikipedia.org/wiki/The_Scooby-Doo/Dynomutt_Hour">The Scooyby-Doo/Dynomutt Hour</a></td>
<td>1976</td>
<td>ABC</td>
<td>1</td>
<td>16</td>
<td><a href="https://amzn.to/3FAeejZ">Complete Series</a></td>
</tr>
<tr>
<td><a href="https://en.wikipedia.org/wiki/Scooby-Doo_and_Scrappy-Doo_(1979_TV_series)">Scooby-Doo and Scrappy-Doo</a></td>
<td>1979-1980</td>
<td>ABC</td>
<td>1</td>
<td>16</td>
<td><a href="https://amzn.to/3lrj37p">Complete Series</a></td>
</tr>
<tr>
<td><a href="https://en.wikipedia.org/wiki/The_13_Ghosts_of_Scooby-Doo">The 13 Ghosts of Scooby-Doo</a></td>
<td>1985</td>
<td>ABC</td>
<td>1</td>
<td>13</td>
<td><a href="https://amzn.to/2YHTjuL">Complete Series</a></td>
</tr>
<tr>
<td><a href="https://en.wikipedia.org/wiki/A_Pup_Named_Scooby-Doo">A Pup Named Scooby-Doo</a></td>
<td>1988-1991</td>
<td>ABC</td>
<td>4</td>
<td>27</td>
<td><a href="https://amzn.to/3FtAM6d">Season 1</a> <a href="https://amzn.to/3iO4WaD">Season 2-4</a></td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="partial-television-series-releases">Partial Television Series Releases</h2>
<p><a href="https://en.wikipedia.org/wiki/The_Richie_Rich/Scooby-Doo_Show">The Richie Rich/Scooby-Do Show</a> and <a href="https://en.wikipedia.org/wiki/Laff-A-Lympics">Laff-A-Lympics</a> have both been partially released. The first seven episodes of <a href="https://en.wikipedia.org/wiki/The_Richie_Rich/Scooby-Doo_Show">The Richie Rich/Scooby-Do Show</a> have been released. The second season of <a href="https://en.wikipedia.org/wiki/Laff-A-Lympics">Laff-A-Lympics</a> has not been released, but the whole first season has over two separate disks.</p>
<table>
<thead>
<tr>
<th>Show Name</th>
<th>Air Date</th>
<th>Network</th>
<th>Number of Seasons</th>
<th>Number of Episodes</th>
<th>Media Release</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://en.wikipedia.org/wiki/The_Richie_Rich/Scooby-Doo_Show">The Richie Rich/Scooby-Doo Show</a></td>
<td>1980-1981</td>
<td>ABC</td>
<td>2</td>
<td>21</td>
<td><a href="https://amzn.to/3lrjBdt">First 7 Episodes of Season 1</a></td>
</tr>
<tr>
<td><a href="https://en.wikipedia.org/wiki/Laff-A-Lympics">Laff-A-Lympics</a></td>
<td>1977-1978</td>
<td>ABC</td>
<td>2</td>
<td>24</td>
<td><a href="https://amzn.to/3BqQ7ls">Season 1 1-8</a> <a href="https://amzn.to/3ltChcr">Season 1 9-16</a></td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><h2 id="separated-television-series">Separated Television Series</h2><p><em>The New Scooby and Scrappy-Doo Show</em> aired two seasons in 1983 and 1984. The second season was renamed <em>New Scooby Doo Mysteries</em>. Neither season has been released to disk in their entirety, but both are viewable on Amazon Prime. The first season is streamed as Season 5 of the <a href="https://amzn.to/3w68PNy">&quot;Scooby-Doo and Scrappy Doo Show&quot;</a>. The second season is artificially split into two more seasons and watchable as <a href="https://amzn.to/3q5kQBZ">&quot;New Scooby Doo Mysteries&quot;</a>.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Show Name</th>
<th>Air Date</th>
<th>Network</th>
<th>Number of Seasons</th>
<th>Number of Episodes</th>
<th>Media Release</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://en.wikipedia.org/wiki/The_New_Scooby_and_Scrappy-Doo_Show#US_releases">The New Scooby and Scrappy-Doo Show</a></td>
<td>1983-1984</td>
<td>ABC</td>
<td>2</td>
<td>26</td>
<td>Unreleased on Disk</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>17 of 44 individual episodes from this show have been trickled across various Scooby-Doo compilation disks.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Season</th>
<th>Episode No.</th>
<th>Title</th>
<th>Media Release</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>3b</td>
<td>The Dinosaur Deception</td>
<td><a href="https://amzn.to/3jPSE1K">Scooby Doo! 13 Spooky Tales Ruh-Roh Robot</a></td>
</tr>
<tr>
<td>1</td>
<td>8b</td>
<td>The Crazy Carnival Caper</td>
<td><a href="https://amzn.to/3jOP3kL">Scooby-Doo and the Creep Carnival</a></td>
</tr>
<tr>
<td>1</td>
<td>9a</td>
<td>Scooby and the Minotaur</td>
<td><a href="https://amzn.to/3pOtQLk">Scooby-Doo! 13 Spooky Tales: Field of Screams</a></td>
</tr>
<tr>
<td>1</td>
<td>9b</td>
<td>Scooby Pinch Hits</td>
<td><a href="https://amzn.to/3pOtQLk">Scooby-Doo! 13 Spooky Tales: Field of Screams</a></td>
</tr>
<tr>
<td>1</td>
<td>10b</td>
<td>The Scooby Coupe</td>
<td><a href="https://amzn.to/3GsZOCO">Scooby Doo: Mask of the Blue Falcon</a></td>
</tr>
<tr>
<td>1</td>
<td>11a</td>
<td>Who&apos;s Minding the Monster</td>
<td><a href="https://amzn.to/2ZAI4Fe">Scooby-Doo! and the Skeletons</a></td>
</tr>
<tr>
<td>1</td>
<td>11b</td>
<td>Scooby a la Mode</td>
<td><a href="https://amzn.to/2ZAI4Fe">Scooby-Doo! and the Skeletons</a></td>
</tr>
<tr>
<td>2</td>
<td>1</td>
<td>Happy Birthday, Scooby-Doo!</td>
<td><a href="https://amzn.to/3Cp6csm">Happy Spook-day, Scooby Doo!</a></td>
</tr>
<tr>
<td>2</td>
<td>2b</td>
<td>The Hand of Horror</td>
<td><a href="https://amzn.to/3jPSE1K">Scooby Doo! 13 Spooky Tales Ruh-Roh Robot</a></td>
</tr>
<tr>
<td>2</td>
<td>3a</td>
<td>Soo-Be or Not Scoo-Be</td>
<td><a href="https://amzn.to/3EJS8dZ">Scooby Doo: Favorite Frights</a></td>
</tr>
<tr>
<td>2</td>
<td>3b</td>
<td>The Stoney Glare Stare</td>
<td><a href="https://amzn.to/3bmlp1l">Scooby Doo! 13 Spooky Tales Run For Your &apos;Rife</a></td>
</tr>
<tr>
<td>2</td>
<td>4b</td>
<td>The Bee Team</td>
<td><a href="https://amzn.to/3jPSE1K">Scooby Doo! 13 Spooky Tales Ruh-Roh Robot</a></td>
</tr>
<tr>
<td>2</td>
<td>5a</td>
<td>Doom Service</td>
<td><a href="https://amzn.to/3jPSE1K">Scooby Doo! 13 Spooky Tales Ruh-Roh Robot</a></td>
</tr>
<tr>
<td>2</td>
<td>5b</td>
<td>A Code in the Nose</td>
<td><a href="https://amzn.to/3jPSE1K">Scooby Doo! 13 Spooky Tales Ruh-Roh Robot</a></td>
</tr>
<tr>
<td>2</td>
<td>6</td>
<td>Ghosts of the Ancient Astronauts</td>
<td><a href="https://amzn.to/3mu0z6w">Scooby-Doo! 13 Spooky Tales: Around the World</a></td>
</tr>
<tr>
<td>2</td>
<td>9</td>
<td>A Night Louse in the White House</td>
<td><a href="https://amzn.to/3jPSE1K">Scooby Doo! 13 Spooky Tales Ruh-Roh Robot</a></td>
</tr>
<tr>
<td>2</td>
<td>13</td>
<td>The Nutcracker Scoob</td>
<td><a href="https://amzn.to/3BnqAcd">Scooby-Doo! 13 Spooky Tales: Holiday Chills and Thrills</a></td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><hr>
<p>Did this post help you enjoy Scooby-Doo? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Sizing Air Purifiers Using CADR]]></title><description><![CDATA[An overview of air purifier metrics and a comparison of various air purifiers in the EnergyStar air purifier dataset. ]]></description><link>https://frdmtoplay.com/nagivating-air-purification/</link><guid isPermaLink="false">60b2c4717b4660656bd58520</guid><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Mon, 21 Jun 2021 00:50:09 GMT</pubDate><media:content url="https://frdmtoplay.com/content/images/2022/03/bitmap.png" medium="image"/><content:encoded><![CDATA[<img src="https://frdmtoplay.com/content/images/2022/03/bitmap.png" alt="Sizing Air Purifiers Using CADR"><p>The air purifier marketplace is an apt metaphor for how a particle must feel while being trapped in a filter - at every turn there&apos;s a new acronym or regulatory agency or purifier type. It&apos;s enough to make someone buy the first air purifier that looks decent and is in budget! This post outlines an exploration through the labyrinth of air purifiers in order to make sense of air flow, efficiency, MERV, ozone, HEPA, electrostatic, and CADR &#xA0;to find the air purifier which offer the cleanest air at the best price.</p><p><strong>Note</strong>: To simplify matters, electrostatic and ozone generating air purifiers have been dropped from this analysis.</p><!--kg-card-begin: html--><script type="text/x-mathjax-config">
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
</script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<script type="text/javascript">
    window.PlotlyConfig = {MathJaxConfig: 'local'}
</script>
<script type="text/javascript" src="https://cdn.plot.ly/plotly-1.54.7.min.js">
</script><!--kg-card-end: html--><!--kg-card-begin: html--><style>
    table {
    /* Remove spacing between table cells (from Normalize.css) */
    border-collapse: collapse;
    margin: 25px 0;
    font-size: 0.9em;
    font-family: sans-serif;
    box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
    display:block;
    max-height: 650px;
    overflow-y: scroll;
	margin-left: auto;
    margin-right: auto;
   }

table caption {
    color: #000;
    font: italic 85%/1 arial, sans-serif;
    padding: 1em 0;
    text-align: center;
}

table td,
table th {
    border-left: 1px solid #cbcbcb;/*  inner column border */
    border-width: 0 0 0 1px;
    font-size: inherit;
    margin: 0;
    overflow: visible; /*to make ths where the title is really long work*/
    padding: 0.5em 1em; /* cell padding */
}

table thead tr{
    background-color: #268bd2;
    color: #ffffff;
    text-align: left;
    font-weight: bold;
}

table tbody tr {
    border-bottom: 1px solid #dddddd;
}

table tbody tr:nth-of-type(even) {
    background-color: #f3f3f3;
}

table tbody tr:last-of-type {
    border-bottom: 2px solid #009879;
}

</style><!--kg-card-end: html--><!--kg-card-begin: markdown--><h3 id="important-players">Important Players</h3>
<p>There are many cooks in the air purifier kitchen. Federal agencies, state agencies, trade associations, and professional organizations all have input on the air purification process. The relevant entities are summarized below.</p>
<h5 id="federal-agencies-programs">Federal Agencies &amp; Programs</h5>
<ol>
<li>
<p><a href="https://www.epa.gov/indoor-air-quality-iaq">US Environmental Protection Agency</a> (EPA) has an <a href="https://www.epa.gov/aboutepa/about-office-air-and-radiation-oar">Office of Air and Radiation</a> dedicated to indoor air quality. This office maintains a <a href="https://www.epa.gov/sites/production/files/2018-07/documents/guide_to_air_cleaners_in_the_home_2nd_edition.pdf">Guide to Air Cleaners in the Home</a> and a <a href="https://www.epa.gov/sites/production/files/2018-07/documents/residential_air_cleaners_-_a_technical_summary_3rd_edition.pdf">Technial Summary of Residential Air Cleaners</a> but does not maintain federal standards on air cleaners. Additionally, the EPA established the <a href="https://www.airnow.gov/aqi/aqi-basics/">Air Quality Index</a> to measure indoor and outdooor air quality.</p>
</li>
<li>
<p><a href="https://www.energy.gov/">US Department of Energy</a> (DOE) developed the HEPA standard <a href="https://www.standards.doe.gov/standards-documents/3000/3020-astd-2015/@@images/file">DOE-STD-3020-2015</a> for air filters.</p>
</li>
<li>
<p><a href="https://www.energystar.gov/">EnergyStar</a> is a program ran by the EPA and DOE to provide consumers with information about the energy efficiency of appliances. Fortunately, EnergyStar also provides a <a href="https://www.energystar.gov/productfinder/product/certified-room-air-cleaners/results">database</a> of air purifiers sold in the United States.</p>
</li>
</ol>
<h5 id="state-agencies">State Agencies</h5>
<ol start="4">
<li><a href="https://ww2.arb.ca.gov/">California Air Resources Board</a> (CARB) is a California government entity with the mission to protect Californians from the harmful effects of air pollution. As part of CA Bill 2276, CARB established a <a href="https://ww2.arb.ca.gov/resources/documents/indoor-air-cleaning-devices-regulation">regulation</a> to prevent the sale of air purifiers in California that have an ozone emissions greater than 0.05 ppm. CARB maintains a frequently updated list of <a href="https://ww2.arb.ca.gov/list-carb-certified-air-cleaning-devices">Certified Air Cleaning Devices</a> as well as a list of <a href="https://ww2.arb.ca.gov/our-work/programs/air-cleaners-ozone-products/potentially-hazardous-ozone-generators-sold-air">failed ozone emitters</a> which are not permitted to be sold in California. CARB maintains a good summary page of air purification on its <a href="https://ww2.arb.ca.gov/resources/fact-sheets/air-cleaning-devices-home/printable/print">website</a>.</li>
</ol>
<h5 id="professional-organizations-trade-associations">Professional Organizations &amp; Trade Associations</h5>
<ol start="5">
<li>
<p><a href="https://www.aham.org/AHAM">Association of Home Appliance Manufacturers</a> (AHAM) is a trade association representing appliance manufacturers and has established a <a href="https://ahamverifide.org/wp-content/uploads/2019/07/Scope-of-Air-Cleaner-Certification.pdf">rating</a> to quantify the effectiveness of an air purifier, known as Clean Air Delivery Rate (CADR), which has been accepted as <a href="https://www.aham.org/itemdetail?iproductcode=30002&amp;category=padstd">ANSI AC-1</a>. AHAM also maintains a <a href="https://www.ahamdir.com/room-air-cleaners/">database</a>  of rated air cleaners.</p>
</li>
<li>
<p><a href="https://www.nafahq.org/about-nafa/">National Air Filtration Association</a> (NAFA) is a trade association composed of filter manufacturers and service companies. NAFA runs a <a href="https://www.nafahq.org/certification/nafa-certified-technician-level-1/">certification program</a> for air filter technicians and also publishes <a href="https://www.nafahq.org/publications/air-media-magazine/">Air Media Magazine</a>.</p>
</li>
<li>
<p><a href="https://www.ashrae.org/">American Society of Heating, Refrigerating and Air-Conditioners</a> (ASHRAE) is a professional organization that releases building codes and standards about residential &amp; commerical air ventilation systems. ASHRAE developed the MERV standard for HVAC air filters.</p>
</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="contanimants">Contanimants</h3>
<p>Three classes of contanimants (&quot;particulate matter&quot;) are considered for air purifiers. Particles are measured in micrometers (10^-6 m), also referred to as microns or &#x3BC;m. The smoke/dust/pollen classification is illustrative of small/medium/large particles rather than a definitively guideline on the real particle size of each individual pollutant. For context, the human hair is around 50-70 &#x3BC;m.</p>
<table>
<thead>
<tr>
<th>Particulate</th>
<th>Size (&#x3BC;m)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Smoke</td>
<td>0.09 - 1</td>
</tr>
<tr>
<td>Dust</td>
<td>0.5 - 3</td>
</tr>
<tr>
<td>Pollen</td>
<td>5 - 11</td>
</tr>
</tbody>
</table>
<p>While air purifiers are rated on their ability to purify smoke, dust, and pollen, the <a href="https://gispub.epa.gov/airnow/?mlayer=ozonepm&amp;clayer=none&amp;panel=0">Air Quality Index</a> is calculated on a PM2.5 and PM10 basis. PM2.5 accounts for particles that are smaller than 2.5&#x3BC;m and PM10 accounts for particles that are smaller than 10&#x3BC;m.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="filters">Filters</h3>
<p>Neglecting ozone and electrostatic air purifiers, the primary difference between two individual air purifiers is the type of filters in use.</p>
<p>Most rated air filters are given a MERV or a HEPA rating. MERV (Minimum Efficiency Reporting Value) was established by ASHRAE in 1987 to rate air filters used in HVAC systems. The modern HEPA (High-Efficiency Particulate Air) filter was born out of World War II filters used to capture radioactive particles in the Manhattan Project. The Department of Energy currently maintains the <a href="https://www.standards.doe.gov/standards-documents/3000/3020-astd-2015/@@images/file">modern HEPA standard</a>.</p>
<p>The diagram below depicts MERV and HEPA filter removal efficiencies. The shaded purple area represents nominal virus particulate size, blue is nominal smoke particulate size, green is nominal dust particulate size, and yellow is nominal pollen particulate size. So, a MERV10 filter will nominally remove between 30-85% of viral particles, 25-35% of smoke, 35-80% of dust, and 80-95% of pollen particles.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/06/bitmap.png" class="kg-image" alt="Sizing Air Purifiers Using CADR" loading="lazy" width="1599" height="1166" srcset="https://frdmtoplay.com/content/images/size/w600/2021/06/bitmap.png 600w, https://frdmtoplay.com/content/images/size/w1000/2021/06/bitmap.png 1000w, https://frdmtoplay.com/content/images/2021/06/bitmap.png 1599w" sizes="(min-width: 720px) 720px"><figcaption>Portable Air Cleaners, Furnace, and HVAC Filters. 3ed. EPA 402-F-09-002</figcaption></figure><!--kg-card-begin: markdown--><p>Along with MERV and HEPA rated filters, there are non-rated filters.</p>
<ol>
<li><strong>Carbon Pre-Filter</strong> - Activated carbon is a common pre-filter and serves two purposes: prevent larger particles from entering downstream filters and to remove odors.</li>
<li><strong>HEPA-Type</strong> - Some filters are designated &quot;HEPA-type&quot; which is an unprotected term manufacturers can use with impunity. Without manufacturers providing a filtration curve (see below) of the filter, it is not possible to determine the filtration effectiveness of the filter across all particles sizes. Some manufacturers use &quot;HEPA-type&quot; to describe the geometry and others use it to describe the manufacturing process. Regardless, &quot;HEPA-type&quot; does not immediately imply HEPA efficiency.</li>
</ol>
<!--kg-card-end: markdown--><p></p><!--kg-card-begin: markdown--><h3 id="cadr">CADR</h3>
<p>Air purifiers are rated with <a href="https://en.wikipedia.org/wiki/Clean_air_delivery_rate">CADR</a>: Clean Air Delivery Rate. Notionally, CADR is a combination of how quickly an air purifier can clean air and how clean the air becomes. ASHRAE simplifies this to:</p>
<p>$$\text{CADR} \approx \text{airflow rate} \times \text{removal efficiency}$$</p>
<p>The real formula used by AHAM:</p>
<p>$$\text{CADR} = \dfrac{\eta}{1 - \eta}Ah\left(\frac{\text{ACH}}{60} + k_{dep}\right)$$</p>
<p>The AHAM CADR calculation assumes the following default values:</p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Variable</th>
<th>AHAM Default</th>
</tr>
</thead>
<tbody>
<tr>
<td>\(\eta\)</td>
<td>Cleaner Efficiency (%)</td>
<td>80%</td>
</tr>
<tr>
<td>A</td>
<td>Room Area (sq. ft.)</td>
<td>-</td>
</tr>
<tr>
<td>h</td>
<td>Room Height (ft.)</td>
<td>8 ft.</td>
</tr>
<tr>
<td>ACH</td>
<td>Air Changes Per Hour</td>
<td>1</td>
</tr>
<tr>
<td>\(k_{dep}\)</td>
<td>Deposition Rate (\(\text{min}^{-1}\))</td>
<td>0.0034</td>
</tr>
</tbody>
</table>
<p>\(\eta\) is the ratio of pollutants being removed from the air at steady state. So an efficiency of 80% means 80% of pollutants being generated are being removed. ACH, or Air Changes per Hour, is how often the air in a room is replaced with fresh air. This can occur from a home HVAC unit pulling in outdoor air, doors opening, leaks around windows, windows being left open, etc. \(k_{dep}\) is the deposition rate (how quickly the particle falls out of the air and settles on a surface) of the particle (smoke, dust, or pollen) being evaluated.</p>
<p><strong>Note</strong>: CADR&apos;s 95% uncertainty is \(\pm 10\) for dust and smoke and \(\pm 25\) for pollen.</p>
<p>Using AHAM&apos;s default values, we can link CADR and room size:</p>
<p>$$\text{CADR} = \dfrac{0.8}{1 - 0.8}(8)\left(\frac{1}{60} + 0.0034\right)A = 0.6421A$$</p>
<p>With AHAM&apos;s assumptions, it becomes clear where the <a href="https://ahamverifide.org/ahams-air-filtration-standards/">&quot;2/3&quot; rule</a> comes from for linking CADR and square footage; \(0.6421 \simeq 0.66\).</p>
<p><em>However</em>, the AHAM assumptions don&apos;t match every home. For example, some have 9&apos; ceilings. Some users may want a higher efficiency than 80%. Additionally, assuming 1 ACH doesn&apos;t match numerous studies on American homes. ASHRAE establishes that at a minimum, homes should have a 0.35 ACH. In practice, <a href="https://www.osti.gov/servlets/purl/816784">50% of homes have less than 0.5 ACH</a> (Fig. 20). Newer homes are more likely to have a <a href="https://www.osti.gov/servlets/purl/816784">lower ACH</a> (Fig. 9) as part of home energy conservation designs. CARB determined that the median ACH for single-family detached homes in California was <a href="https://ww3.arb.ca.gov/research/single-project.php?row_id=64697">0.26 ACH</a>.</p>
<p>If a home has lots of gaps around window &amp; door jambs, or if windows are frequently left open, the home&apos;s ACH will be higher (&gt;0.5). If the home has high efficiency windows and does not use regularly exchange air with the outdoors then the ACH will be lower (&lt;0.5).</p>
<p>Picking an ACH value that matches the natural ventilation of the home works well when the outside air is being viewed as cleaner than indoor air. Indoor air can become polluted from cooking, 3D printing, etc. CARB <a href="https://ww2.arb.ca.gov/resources/fact-sheets/air-cleaning-devices-home/printable/print">recommends 3 ACH</a> for rooms with significant sources of indoor pollution.  However, sometimes, like during wildfires, the outside air is actually the dirty air. In thise case, the natural ventilation needs to be overcome. A good method for calculating this is using the ASHRAE 0.35 ACH as a baseline. Say a home has a natural ACH of 0.6 with the outside smoky air, CADR should be calculated with 0.95 ACH. If the occupant would prefer that the entire indoor air be cleaned once per hour then an ACH of 1.6 should be used for the CADR calculation to compensate for the 0.6 ACH with the contaiminated air.</p>
<p>A table of constants at various cleaning efficiencies (\(\eta\)) and Air Changes per Hours for 8&apos; and 9&apos; ceilings are presented below. For a room with 0.6 ACH and 8&apos; ceilings and a desired cleaning efficiency of 90%, the multiplier is 0.965:</p>
<p>$$\text{CADR} = 0.965A$$</p>
<h6 id="8-ceilings">8&apos; ceilings</h6>
<p>$$\begin{array}{c|cccccccc}<br>
\eta\overset{\LARGE\setminus}{\phantom{.}}\overset{\Large \text{ACH}}{\phantom{l}}&amp; 0.2 &amp; 0.4 &amp; 0.6 &amp; 0.8 &amp; 1.0 &amp; 1.2 &amp; 1.4 &amp; 1.6\\<br>
\hline<br>
0.80 &amp; 0.215 &amp; 0.322 &amp; 0.429 &amp; 0.535 &amp; 0.642 &amp; 0.749 &amp; 0.855 &amp; 0.962 \\<br>
0.85 &amp; 0.305 &amp; 0.456 &amp; 0.607 &amp; 0.759 &amp; 0.910 &amp; 1.061 &amp; 1.212 &amp; 1.363 \\<br>
0.90 &amp; 0.485 &amp; 0.725 &amp; 0.965 &amp; 1.205 &amp; 1.445 &amp; 1.685 &amp; 1.925 &amp; 2.165 \\<br>
0.95 &amp; 1.023 &amp; 1.530 &amp; 2.037 &amp; 2.543 &amp; 3.050 &amp; 3.557 &amp; 4.063 &amp; 4.570 \\<br>
0.99 &amp; 5.333 &amp; 7.973 &amp; 10.613 &amp; 13.253 &amp; 15.893 &amp; 18.533 &amp; 21.173 &amp; 23.813 \\<br>
\end{array}$$</p>
<h6 id="9-ceilings">9&apos; ceilings</h6>
<p>$$\begin{array}{c|ccccccccc}<br>
\eta\overset{\LARGE\setminus}{\phantom{.}}\overset{\Large \text{ACH}}{\phantom{l}}&amp; 0.2 &amp; 0.4 &amp; 0.6 &amp; 0.8 &amp; 1.0 &amp; 1.2 &amp; 1.4 &amp; 1.6\\<br>
\hline<br>
0.80 &amp; 0.242 &amp; 0.362 &amp; 0.482 &amp; 0.602 &amp; 0.722 &amp; 0.842 &amp; 0.962 &amp; 1.082 \\<br>
0.85 &amp; 0.343 &amp; 0.513 &amp; 0.683 &amp; 0.853 &amp; 1.023 &amp; 1.193 &amp; 1.363 &amp; 1.533 \\<br>
0.90 &amp; 0.545 &amp; 0.815 &amp; 1.085 &amp; 1.355 &amp; 1.625 &amp; 1.895 &amp; 2.165 &amp; 2.435 \\<br>
0.95 &amp; 1.151 &amp; 1.721 &amp; 2.291 &amp; 2.861 &amp; 3.431 &amp; 4.001 &amp; 4.571 &amp; 5.141 \\<br>
0.99 &amp; 5.999 &amp; 8.969 &amp; 11.939 &amp; 14.909 &amp; 17.879 &amp; 20.849 &amp; 23.819 &amp; 26.789<br>
\\<br>
\end{array}$$</p>
<p>With the formula written another way, AHAM&apos;s default values can be used to calculate the rated area of an air purifier from CADR:</p>
<p>$$A = 1.557\text{CADR}$$</p>
<p>Once again, tables for the constant at various efficiencies and ACH are presented for 8&apos; and 9&apos; ceilings below:</p>
<p>8&apos; ceilings<br>
$$\begin{array}{c|cccccccc}<br>
\eta\overset{\LARGE\setminus}{\phantom{.}}\overset{\Large \text{ACH}}{\phantom{l}}&amp; 0.2 &amp; 0.4 &amp; 0.6 &amp; 0.8 &amp; 1.0 &amp; 1.2 &amp; 1.4 &amp; 1.6\\<br>
\hline<br>
0.80 &amp; 4.641 &amp; 3.104 &amp; 2.332 &amp; 1.868 &amp; 1.557 &amp; 1.335 &amp; 1.169 &amp; 1.039 \\<br>
0.85 &amp; 3.276 &amp; 2.191 &amp; 1.646 &amp; 1.318 &amp; 1.099 &amp; 0.943 &amp; 0.825 &amp; 0.734 \\<br>
0.90 &amp; 2.063 &amp; 1.380 &amp; 1.036 &amp; 0.830 &amp; 0.692 &amp; 0.594 &amp; 0.520 &amp; 0.462 \\<br>
0.95 &amp; 0.977 &amp; 0.654 &amp; 0.491 &amp; 0.393 &amp; 0.328 &amp; 0.281 &amp; 0.246 &amp; 0.219 \\<br>
0.99 &amp; 0.188 &amp; 0.125 &amp; 0.094 &amp; 0.075 &amp; 0.063 &amp; 0.054 &amp; 0.047 &amp; 0.042 \\<br>
\end{array}$$</p>
<p>9&apos; ceilings<br>
$$\begin{array}{c|cccccccc}<br>
\eta\overset{\LARGE\setminus}{\phantom{.}}\overset{\Large \text{ACH}}{\phantom{l}}&amp; 0.2 &amp; 0.4 &amp; 0.6 &amp; 0.8 &amp; 1.0 &amp; 1.2 &amp; 1.4 &amp; 1.6\\<br>
\hline<br>
0.80 &amp; 4.125 &amp; 2.759 &amp; 2.073 &amp; 1.660 &amp; 1.384 &amp; 1.187 &amp; 1.039 &amp; 0.924 \\<br>
0.85 &amp; 2.912 &amp; 1.948 &amp; 1.463 &amp; 1.172 &amp; 0.977 &amp; 0.838 &amp; 0.733 &amp; 0.652 \\<br>
0.90 &amp; 1.834 &amp; 1.226 &amp; 0.921 &amp; 0.738 &amp; 0.615 &amp; 0.528 &amp; 0.462 &amp; 0.411 \\<br>
0.95 &amp; 0.869 &amp; 0.581 &amp; 0.436 &amp; 0.349 &amp; 0.291 &amp; 0.250 &amp; 0.219 &amp; 0.194 \\<br>
0.99 &amp; 0.167 &amp; 0.111 &amp; 0.084 &amp; 0.067 &amp; 0.056 &amp; 0.048 &amp; 0.042 &amp; 0.037 \\<br>
\end{array}$$</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="selecting-an-air-purifier">Selecting an Air Purifier</h3>
<p>With an understanding of filter types &amp; CADR it&apos;s time to downselect and find a filter that meets those requirements!</p>
<ol>
<li>Determine whether HEPA or a MERV rated filter is desirable</li>
<li>Determine the CADR needed</li>
<li>Compare features (Bluetooth, remote control, AQI indicator, etc.)</li>
<li>Compare air purifier &amp; replacement filter prices and buy!</li>
</ol>
<p>For example, a room with 200 sq ft and 9&apos; ceilings, with a desired efficiency of 90% and 1.2 ACH would require a CADR of 337.</p>
<p>$$ \text{CADR} = 1.685 \times 200 = 337$$</p>
<p>The plot below shows Dust-Free CADR vs Price for the air filters in the EnergyStar database. Interestingly, there isn&apos;t a significant difference in price between HEPA and HEPA-type filters at various CADR levels. For the ~337 CADR value there are a variety of air purifiers between $200-$400 dollars and several &gt;$600.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><div id="Plot1" style="max-width: 1000px"></div>
  <script>
    gd = (function() {
  var WIDTH_IN_PERCENT_OF_PARENT = 100;
  var HEIGHT_IN_PERCENT_OF_PARENT = 100;
  var gd = Plotly.d3.select('#Plot1')
    .append('div').attr("id", "de3eb72d-a852-49a7-948c-a13392e96c39")
    .style({
      width: WIDTH_IN_PERCENT_OF_PARENT + '%',
      'margin-left': (100 - WIDTH_IN_PERCENT_OF_PARENT) / 2 + '%',
      height: HEIGHT_IN_PERCENT_OF_PARENT + '%',
      'margin-top': (100 - HEIGHT_IN_PERCENT_OF_PARENT) / 2 + 'vh'
    })
    .node();
  var plot_json = {"layout":{"xaxis":{"showline":true,"titlefont":{"size":15},"tickfont":{"size":15},"zeroline":false,"title":"Price ($)"},"hovermode":"closest","margin":{"l":50,"b":50,"r":50,"t":60},"yaxis":{"showline":true,"titlefont":{"size":15},"tickfont":{"size":15},"zeroline":false,"title":"Dust-Free CADR (cfm)"}},"frames":[],"data":[{"mode":"markers","y":[75.0,75.0,80.0,110.0,110.0,110.0,207.9,335.3,208.3,208.8,144.9,329.0,86.0,152.0,266.8,400.0,400.0,156.1,140.8,93.0,180.5,211.4,215.1,76.0,107.0,106.0,112.0,118.0,106.0,131.7,239.0,263.0,199.0,102.4,216.0,105.0,135.0,166.0,61.0,106.0,136.2,147.3,148.6,238.6,234.0,247.7,247.4,67.1,168.5,120.0,190.0,190.0,320.0,138.0,242.0,339.0,240.0,339.0,184.0,320.0,81.0,200.0,332.0,176.4,312.0,101.0,195.0,171.0,185.0,209.6,400.0,151.7,154.0,240.0,230.0],"type":"scatter","name":"HEPA","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[76.98,59.99,49.94,124.98,79.88,105.0,498.0,770.18,550.0,338.96,228.94,299.99,99.99,139.99,651.59,799.99,829.99,125.09,127.27,111.11,133.35,216.52,209.25,79.99,99.99,119.99,83.99,84.99,85.04,100.3,194.44,399.0,199.99,165.88,309.99,123.81,74.74,255.0,68.0,99.99,151.99,139.99,649.0,186.0,999.0,199.0,308.78,90.51,199.99,169.99,199.0,249.99,243.77,149.0,165.0,269.0,289.99,349.99,599.99,345.08,66.51,699.0,899.0,549.95,297.0,134.99,249.99,202.99,397.0,412.93,669.0,282.3,99.99,269.99,149.0]},{"mode":"markers","y":[105.0,336.0,109.0,141.0,108.0,274.0,326.0,102.0,108.0,239.8,107.0,250.0,275.0,400.0,220.0,145.0,145.0,145.0,145.0,200.0,124.0,125.0,400.0,151.2,155.1,400.0,261.2,90.5,89.8,92.0,327.0,97.0,134.8,149.0,351.0,337.0,238.0,262.2,148.1,165.0,202.0,180.5,205.0,334.0,66.0,290.0,243.0,240.0,243.0,312.0,200.0],"type":"scatter","name":"HEPA-Type","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[274.98,354.0,79.99,99.99,189.99,199.99,269.99,179.99,99.99,399.99,139.99,249.99,639.99,839.99,214.0,79.99,135.31,125.67,69.99,209.99,134.99,179.99,599.99,128.99,120.0,549.0,297.58,448.0,549.99,949.99,203.09,119.0,160.0,349.0,599.99,599.0,399.0,749.95,369.95,399.95,599.95,619.95,699.99,597.0,69.99,259.99,199.99,194.38,199.99,219.0,224.99]},{"mode":"markers","y":[120.0,87.7],"type":"scatter","name":"Pre-Filter","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[114.93,175.99]},{"mode":"markers","y":[285.0,400.0],"type":"scatter","name":"Particle","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[660.63,349.99]},{"mode":"markers","y":[100.0,100.0,95.0,150.0,160.0,160.0],"type":"scatter","name":"Permanent Washable","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[159.99,184.98,129.0,139.99,207.24,209.99]}]};
  Plotly.newPlot(gd, plot_json);
  window.onresize = function() {
    Plotly.Plots.resize(gd);
  };
  return gd;
})();

</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>The EnergyStar database also provides the expected annual energy use for each purifier. Looking in the 300-350 CADR block it looks like there are two HEPA air purifiers that draw significantly less power, the <a href="https://amzn.to/3vKR8RY">Alen Breathesmart 45i</a> and the <a href="https://www.amazon.com/gp/product/B07HR7YVN2/ref=as_li_qf_asin_il_tl?ie=UTF8&amp;tag=frdmtoplay-20&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B07HR7YVN2&amp;linkId=0701da8c98148866ad74b390f2d09025">Powermatic PM1250</a>. However, looking at the comparison to price, these purifiers are also higher priced than the less efficient purifiers. Again, HEPA and non-HEPA filters are fairly interspersed on the plot.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><div id="Plot2" style="max-width: 1000px"></div>
  <script>
    gd = (function() {
  var WIDTH_IN_PERCENT_OF_PARENT = 100;
  var HEIGHT_IN_PERCENT_OF_PARENT = 100;
  var gd = Plotly.d3.select('#Plot2')
    .append('div').attr("id", "21c146de-95af-49b3-a0a6-5b8e664ec954")
    .style({
      width: WIDTH_IN_PERCENT_OF_PARENT + '%',
      'margin-left': (100 - WIDTH_IN_PERCENT_OF_PARENT) / 2 + '%',
      height: HEIGHT_IN_PERCENT_OF_PARENT + '%',
      'margin-top': (100 - HEIGHT_IN_PERCENT_OF_PARENT) / 2 + 'vh'
    })
    .node();
  var plot_json = {"layout":{"xaxis":{"showline":true,"titlefont":{"size":15},"tickfont":{"size":15},"zeroline":false,"title":"Annual Energy Use (kWh/year)"},"hovermode":"closest","margin":{"l":50,"b":50,"r":50,"t":60},"yaxis":{"showline":true,"titlefont":{"size":15},"tickfont":{"size":15},"zeroline":false,"title":"Dust-Free CADR (cfm)"}},"frames":[],"data":[{"mode":"markers","y":[75.0,75.0,80.0,110.0,110.0,110.0,207.9,335.3,208.3,208.8,144.9,329.0,86.0,152.0,266.8,400.0,400.0,156.1,140.8,93.0,180.5,211.4,215.1,76.0,107.0,106.0,112.0,118.0,106.0,131.7,239.0,263.0,199.0,102.4,216.0,105.0,135.0,166.0,61.0,106.0,136.2,147.3,148.6,238.6,234.0,247.7,247.4,67.1,168.5,120.0,190.0,190.0,320.0,138.0,242.0,339.0,240.0,339.0,184.0,320.0,81.0,200.0,332.0,176.4,312.0,101.0,195.0,171.0,185.0,209.6,400.0,151.7,154.0,240.0,230.0],"type":"scatter","name":"HEPA","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[186.6941818182,186.6357818182,189.5427619048,249.6815826087,260.5250545455,249.6815826087,220.9766153846,250.0129873418,366.1596571429,239.6636595745,313.8775384615,605.8026666667,193.5797081545,245.3658823529,513.5338064516,599.9007272727,599.6087272727,308.6215384615,322.368,185.6702857143,350.0106666667,349.2872432432,333.7185641026,153.3224615385,306.6307368421,188.8266666667,240.9,304.2947368421,283.24,285.0212,394.8882857143,270.976,171.0005090909,295.7560421053,301.8028571429,257.7829090909,304.2947368421,241.3059512195,123.3382608696,233.8044,311.126,317.0244,232.9983030303,300.9824761905,444.8133333333,462.3464864865,427.9038787879,194.9392,316.4185,207.5178064516,376.9785935484,378.2341935484,584.2336,301.928,479.8667586207,644.8678709677,455.7012413793,629.3573333333,257.836,605.5979310345,214.62,328.2404444444,303.3032258065,273.8765333333,552.026,269.808,311.7701176471,244.696,275.8058378378,305.7094,769.8799,247.8934,282.0983741935,352.5525641026,360.4202105263]},{"mode":"markers","y":[105.0,336.0,109.0,141.0,108.0,274.0,326.0,102.0,108.0,239.8,107.0,250.0,275.0,400.0,220.0,145.0,145.0,145.0,145.0,200.0,124.0,125.0,400.0,151.2,155.1,400.0,261.2,90.5,89.8,92.0,327.0,97.0,134.8,149.0,351.0,337.0,238.0,262.2,148.1,165.0,202.0,180.5,205.0,334.0,66.0,290.0,243.0,240.0,243.0,312.0,200.0],"type":"scatter","name":"HEPA-Type","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[263.0946545455,662.889337931,222.8386769231,264.0339354839,184.6274285714,293.168,290.5765,209.6931636364,184.6274285714,420.0517333333,52.694573913,193.0396631579,292.0,444.5246896552,251.2201142857,334.486,334.486,334.486,334.486,335.5538857143,233.892,246.1309714286,180.1955675676,308.5064774194,321.6964,598.8203272727,338.6072744186,195.8444,201.8304,201.6454666667,404.408573913,180.1909538462,189.3036,182.0142181818,695.0573333333,449.3481818182,291.5458468085,351.8260465116,162.7274285714,219.519902439,361.5933333333,350.4486666667,183.4883076923,413.8503304348,82.1018536585,332.7676923077,296.5831304348,333.6349268293,304.5884444444,477.2970526316,307.4318054054]},{"mode":"markers","y":[120.0,87.7],"type":"scatter","name":"Pre-Filter","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[59.0170566038,55.0062796117]},{"mode":"markers","y":[285.0,400.0],"type":"scatter","name":"Particle","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[521.7205714286,354.5233939394]},{"mode":"markers","y":[100.0,100.0,95.0,150.0,160.0,160.0],"type":"scatter","name":"Permanent Washable","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[166.4699487179,151.1473488372,80.152,214.62,224.4506666667,224.4506666667]}]};
  Plotly.newPlot(gd, plot_json);
  window.onresize = function() {
    Plotly.Plots.resize(gd);
  };
  return gd;
})();

</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>When comparing the CADR per Watt to Price, the Alen and Powermatic are still outliers. However, this metric does being to show a slight trend of HEPA filters to have a better CADR per Watt for the price than non-HEPA filters.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><div id="Plot3" style="max-width: 1000px"></div>
  <script>
    gd = (function() {
  var WIDTH_IN_PERCENT_OF_PARENT = 100;
  var HEIGHT_IN_PERCENT_OF_PARENT = 100;
  var gd = Plotly.d3.select('#Plot3')
    .append('div').attr("id", "3b8e91ac-e50a-4fd0-ac63-53166e77cb2e")
    .style({
      width: WIDTH_IN_PERCENT_OF_PARENT + '%',
      'margin-left': (100 - WIDTH_IN_PERCENT_OF_PARENT) / 2 + '%',
      height: HEIGHT_IN_PERCENT_OF_PARENT + '%',
      'margin-top': (100 - HEIGHT_IN_PERCENT_OF_PARENT) / 2 + 'vh'
    })
    .node();
  var plot_json = {"layout":{"xaxis":{"showline":true,"titlefont":{"size":15},"tickfont":{"size":15},"zeroline":false,"title":"Price ($)"},"hovermode":"closest","margin":{"l":50,"b":50,"r":50,"t":60},"yaxis":{"showline":true,"titlefont":{"size":15},"tickfont":{"size":15},"zeroline":false,"title":"Dust-Free CADR per Watt"}},"frames":[],"data":[{"mode":"markers","y":[2.38,2.37,2.48,2.54,2.52,2.54,5.51,7.95,3.33,5.22,2.68,3.16,2.6,3.57,3.01,3.89,3.91,2.91,2.59,2.89,3.02,3.68,3.75,2.9,2.05,3.26,2.68,2.21,2.03,2.7,3.59,5.66,6.86,2.07,4.14,2.38,2.58,4.06,1.05,2.66,2.58,2.69,3.78,4.63,3.08,3.14,3.33,1.99,3.16,2.8,2.91,2.94,3.22,2.66,3.06,3.09,3.04,3.11,4.18,3.09,2.21,3.61,6.26,3.78,3.32,2.2,3.67,4.11,4.02,4.09,3.05,3.57,3.25,4.03,3.87],"type":"scatter","name":"HEPA","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[76.98,59.99,49.94,124.98,79.88,105.0,498.0,770.18,550.0,338.96,228.94,299.99,99.99,139.99,651.59,799.99,829.99,125.09,127.27,111.11,133.35,216.52,209.25,79.99,99.99,119.99,83.99,84.99,85.04,100.3,194.44,399.0,199.99,165.88,309.99,123.81,74.74,255.0,68.0,99.99,151.99,139.99,649.0,186.0,999.0,199.0,308.78,90.51,199.99,169.99,199.0,249.99,243.77,149.0,165.0,269.0,289.99,349.99,599.99,345.08,66.51,699.0,899.0,549.95,297.0,134.99,249.99,202.99,397.0,412.93,669.0,282.3,99.99,269.99,149.0]},{"mode":"markers","y":[2.33,2.94,2.88,3.09,3.48,5.59,6.61,2.91,3.48,3.26,12.02,7.65,5.48,5.27,5.03,2.59,2.59,2.59,2.59,3.42,3.03,3.0,13.16,2.87,2.83,3.97,4.64,2.75,2.69,2.71,4.85,3.22,4.17,4.75,3.02,4.46,4.83,4.38,5.42,4.4,3.27,3.03,6.77,4.88,4.82,5.09,4.86,4.02,4.72,3.8,3.86],"type":"scatter","name":"HEPA-Type","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[274.98,354.0,79.99,99.99,189.99,199.99,269.99,179.99,99.99,399.99,139.99,249.99,639.99,839.99,214.0,79.99,135.31,125.67,69.99,209.99,134.99,179.99,599.99,128.99,120.0,549.0,297.58,448.0,549.99,949.99,203.09,119.0,160.0,349.0,599.99,599.0,399.0,749.95,369.95,399.95,599.95,619.95,699.99,597.0,69.99,259.99,199.99,194.38,199.99,219.0,224.99]},{"mode":"markers","y":[12.5,9.64],"type":"scatter","name":"Pre-Filter","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[114.93,175.99]},{"mode":"markers","y":[3.27,6.67],"type":"scatter","name":"Particle","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[660.63,349.99]},{"mode":"markers","y":[2.87,2.92,7.09,4.08,4.22,4.18],"type":"scatter","name":"Permanent Washable","text":["Filtrete FAP-C01-A\nHEPA","Filtrete FAP-C01BA-G1\nHEPA","Filtrete FAP-C01-F1\nHEPA","Filtrete FAP-C02-A2\nHEPA","Filtrete FAP-C02-F2\nHEPA","Filtrete FAP-C02WA-G2\nHEPA","Filtrete FAP-SC02L\nHEPA-Type","Alen Breathesmart 45i\nHEPA","Alen Breathesmart 75i\nHEPA","Alen BreatheSmart FIT50\nHEPA","Alen Flex\nHEPA","Alen T500\nHEPA","Whirlpool WP500*\nHEPA","Whirlpool WPPRO2000*\nHEPA-Type","Whirlpool WPT60*\nHEPA","Whirlpool WPT80*\nHEPA","LEVOIT Core 200S\nHEPA-Type","LEVOIT Core 300\nHEPA-Type","LEVOIT LV-H131S-RXW\nHEPA-Type","LEVOIT LV-H133\nHEPA-Type","LEVOIT LV-H134\nHEPA-Type","LEVOIT LV-PUR131\nHEPA-Type","VESYNC LV-H131S-RXW\nHEPA-Type","HATHASPACE HSP002\nHEPA-Type","Blueair Pure 411\nPre-Filter","Blueair Auto 411\nHEPA-Type","Blueair Auto 311\nHEPA-Type","Blueair 405\nHEPA","Blueair 505\nHEPA","Blueair 605\nHEPA","Blueair 7411371000\nHEPA-Type","Blueair 7711371000\nHEPA-Type","Blueair Pro M\nParticle","Blueair Pure 121\nParticle","Blueair Pure Fan Auto\nHEPA-Type","Boneco AP200\nHEPA","Boneco TPP440\nHEPA","HOMEDICS AP-T20\nHEPA","HOMEDICS AP-T30\nHEPA","HOMEDICS AP-T40\nHEPA","HOMEDICS AP-T45-WT\nHEPA","Eureka NEA120\nHEPA-Type","NOSTALGIA HCAPTPBC31FUVBK\nHEPA-Type","Perfect aire 1PAPUV27\nHEPA-Type","Senville SENAP-W36US\nHEPA-Type","TOSOT KJ350G\nHEPA-Type","GermGuardian AC4200******\nHEPA","GermGuardian AC4300******\nHEPA","GermGuardian AC4700******\nHEPA","GermGuardian AC 4820\nHEPA","GermGuardian AC4825*******\nHEPA","GermGuardian AC4900******\nHEPA","GermGuardian AC5000E\nHEPA","GermGuardian AC5300******\nHEPA-Type","GermGuardian AC5900******\nHEPA","GermGuardian AC9400***\nHEPA","GermGuardian AP5800******\nHEPA","GermGuardian CDAP4500******\nHEPA","GermGuardian CDAP5500******\nHEPA-Type","germguardian;pureguardian AC9200******\nHEPA","GermGuradian AC5600******\nHEPA","pureguardian AP2200CA******\nHEPA","Powermatic PM1250\nHEPA-Type","Honeywell HFD-120-Q\nPermanent Washable","Honeywell HFD230B\nPermanent Washable","Honeywell HFD280B\nPermanent Washable","Honeywell HFD300\nPermanent Washable","Honeywell HFD310\nPermanent Washable","Honeywell HFD320\nPermanent Washable","Honeywell HFD360B\nHEPA","Honeywell HPA060\nHEPA","Honeywell HPA100\nHEPA","Boneco TPP540\nHEPA","Envion,Ionic Elite TA750\nPre-Filter","Therapure TPP230H\nHEPA-Type","Therapure TPP240\nHEPA-Type","Therapure TPP630\nHEPA","CleanForce MEGA1000\nHEPA-Type","Coway AP-1013A\nHEPA","Coway AP-1216L\nHEPA","Coway AP-1511FHE\nHEPA","Coway AP-1512HH\nHEPA","Coway Airmega Airmega 250\nHEPA-Type","Coway,Coway Airmega AP-1518R\nHEPA","Dyson DP04\nHEPA-Type","Dyson TP04\nHEPA-Type","Dyson TP06\nHEPA-Type","HOMEDICS AP-DT10**\nHEPA","HOMEDICS AP-PET35-WT\nHEPA","Honeywell HPA160\nHEPA","Honeywell HPA200 Series\nHEPA","Honeywell HPA250B Series\nHEPA","Honeywell HPA300 Seiries\nHEPA","Honeywell HPA3100B\nHEPA","Honeywell HPA3200B\nHEPA","Honeywell HPA3300B\nHEPA","Honeywell HPA5220*******\nHEPA","Honeywell HPA5300*******\nHEPA","Honeywell HPA600B\nHEPA","Honeywell HPA8350B Series\nHEPA","Kenmore K*PA3D0AMW\nHEPA-Type","Lasko LP200\nHEPA","LG AS330DWR0\nHEPA","MEDIFY AIR MA-15\nHEPA-Type","MEDIFY AIR MA-25\nHEPA-Type","MEDIFY AIR MA-WM35-WIFI\nHEPA-Type","Oxypure 47001\nHEPA-Type","ORANSI EJ120\nHEPA","ORANSI MD01\nHEPA-Type","ORANSI MJR01\nHEPA-Type","Rabbit Air SPA-1000N\nHEPA-Type","Rabbit Air SPA-550A\nHEPA-Type","Rabbit Air SPA-625A\nHEPA-Type","Rabbit Air SPA-700A\nHEPA","Rabbit Air SPA-780A\nHEPA-Type","Rabbit Air SPA-780N\nHEPA-Type","Samsung AX300*9080*\nHEPA-Type","Sharp FP-A80U\nHEPA","Sharp FP-F30U*\nHEPA","Sharp FP-F60U-W\nHEPA","Sharp FP-K50U-W\nHEPA","Sharp FX-J80U-W\nHEPA-Type","Sharp KC-850\nHEPA","Stadler Roger\nHEPA","Stadler Form Roger Big\nHEPA","Stadler Form Roger Little\nHEPA","BLACK+DECKER BAPT01\nHEPA-Type","AIRTHEREAL AGH550\nHEPA-Type","Winix 5300-2\nHEPA-Type","Winix A231\nHEPA","Winix AM80\nHEPA-Type","Winix AM90\nHEPA","Winix C545\nHEPA-Type","Winix D360\nHEPA","Winix D480\nHEPA-Type","Winix HR900\nHEPA-Type"],"x":[159.99,184.98,129.0,139.99,207.24,209.99]}]};
  Plotly.newPlot(gd, plot_json);
  window.onresize = function() {
    Plotly.Plots.resize(gd);
  };
  return gd;
})();

</script><!--kg-card-end: html--><!--kg-card-begin: html--><!--<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
</script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
--><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>The filters from the EnergyStar dataset have been clustered into 100 CADR ranges and then sorted by price in the tables below. Pricing information is accurate as of Jun 2021.</p>
<p>For the example problem above, the <a href="https://amzn.to/3b0xvNY">Honeywell HPA300 </a> is the most compelling purifier from a price perspective.</p>
<p>It is interesting to note that the Dyson air purifiers have some of the lowest CADR values in the database yet carry the highest prices.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="hepa-filters">HEPA Filters</h2>
<h4 id="300-400-cadr">300-400 CADR</h4>
<table>
<thead>
<tr>
<th>Model</th>
<th>Purifier Price ($)</th>
<th>Dust-Free CADR (cfm)</th>
<th>Dust-Free CADR per Watt</th>
<th>Annual Energy Use (kWh/year)</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://amzn.to/3b0xvNY">Honeywell HPA300 Series</a></td>
<td>$243.77</td>
<td>320.0</td>
<td>3.22</td>
<td>584.0</td>
</tr>
<tr>
<td><a href="https://www.homedepot.com/p/Honeywell-PowerPlus-True-HEPA-530-sq-ft-Allergen-Remover-Air-Purifier-HPA3300BV1/312232605">Honeywell HPA3300B</a></td>
<td>$269.0</td>
<td>339.0</td>
<td>3.09</td>
<td>645.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3etqx6o">Sharp FP-A80U</a></td>
<td>$297.0</td>
<td>312.0</td>
<td>3.32</td>
<td>552.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3nOsM79">Whirlpool WP500*</a></td>
<td>$299.99</td>
<td>329.0</td>
<td>3.16</td>
<td>606.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/33coKw6">Honeywell HPA8350B Series</a></td>
<td>$345.08</td>
<td>320.0</td>
<td>3.09</td>
<td>606.0</td>
</tr>
<tr>
<td><a href="https://www.honeywellstore.com/store/products/honeywell-insight-hepa-air-purifier-hpa5300b.htm">Honeywell HPA5300*******</a></td>
<td>$349.99</td>
<td>339.0</td>
<td>3.11</td>
<td>629.0</td>
</tr>
<tr>
<td><a href="https://www.stadlerform.com/en-ch/products/air-purifier/roger-big/information/">Stadler Form Roger Big</a></td>
<td>$669.0</td>
<td>400.0</td>
<td>3.05</td>
<td>770.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3ujhytS">Alen Breathesmart 75i</a></td>
<td>$770.18</td>
<td>335.3</td>
<td>7.95</td>
<td>250.0</td>
</tr>
<tr>
<td><a href="https://www.costco.com/blueair-classic-580i-air-purifier-with-hepasilent-technology.product.100461421.html">Blueair 505</a></td>
<td>$799.99</td>
<td>400.0</td>
<td>3.89</td>
<td>600.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B01L9UT1YU?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Blueair 605</a></td>
<td>$829.99</td>
<td>400.0</td>
<td>3.91</td>
<td>600.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B00V609RPW?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">ORANSI EJ120</a></td>
<td>$899.0</td>
<td>332.0</td>
<td>6.26</td>
<td>303.0</td>
</tr>
</tbody>
</table>
<h4 id="200-300-cadr">200-300 CADR</h4>
<table>
<thead>
<tr>
<th>Model</th>
<th>Purifier Price ($)</th>
<th>Dust-Free CADR (cfm)</th>
<th>Dust-Free CADR per Watt</th>
<th>Annual Energy Use (kWh/year)</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.homedepot.com/p/Winix-D360-True-HEPA-360-sq-ft-3-Stage-Air-Purifier-1022-0222-00/312996328">Winix D360</a></td>
<td>$149.0</td>
<td>230.0</td>
<td>3.87</td>
<td>360.0</td>
</tr>
<tr>
<td><a href="https://www.homedepot.com/p/Honeywell-True-HEPA-310-sq-ft-Air-Purifier-Allergen-Remover-HPA200/303575608">Honeywell HPA3200B</a></td>
<td>$165.0</td>
<td>242.0</td>
<td>3.06</td>
<td>480.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B01KGR2EUU?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Coway AP-1216L</a></td>
<td>$186.0</td>
<td>238.6</td>
<td>4.63</td>
<td>301.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3ewP8XU">GermGuardian AC5900******</a></td>
<td>$194.44</td>
<td>239.0</td>
<td>3.59</td>
<td>395.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B01728NLRG?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Coway AP-1512HH</a></td>
<td>$199.0</td>
<td>247.7</td>
<td>3.14</td>
<td>462.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B08K2FMDSS?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">HOMEDICS AP-T45-WT</a></td>
<td>$209.25</td>
<td>215.1</td>
<td>3.75</td>
<td>334.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3tp0YaD">HOMEDICS AP-T40</a></td>
<td>$216.52</td>
<td>211.4</td>
<td>3.68</td>
<td>349.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/33du5TV">Winix AM90</a></td>
<td>$269.99</td>
<td>240.0</td>
<td>4.03</td>
<td>353.0</td>
</tr>
<tr>
<td><a href="https://www.honeywellstore.com/store/products/honeywell-insight-hepa-air-purifier-hpa5200b.htm">Honeywell HPA5220*******</a></td>
<td>$289.99</td>
<td>240.0</td>
<td>3.04</td>
<td>456.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3o3bpQq">Coway,Coway Airmega AP-1518R</a></td>
<td>$308.78</td>
<td>247.4</td>
<td>3.33</td>
<td>428.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3xSfUln">germguardian;pureguardian AC9200******</a></td>
<td>$309.99</td>
<td>216.0</td>
<td>4.14</td>
<td>302.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3toCjmx">Alen Flex</a></td>
<td>$338.96</td>
<td>208.8</td>
<td>5.22</td>
<td>240.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3nWGVPW">GermGuardian AC9400***</a></td>
<td>$399.0</td>
<td>263.0</td>
<td>5.66</td>
<td>271.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/2SFRwTX">Stadler Roger</a></td>
<td>$412.93</td>
<td>209.6</td>
<td>4.09</td>
<td>306.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3vKR8RY">Alen Breathesmart 45i</a></td>
<td>$498.0</td>
<td>207.9</td>
<td>5.51</td>
<td>221.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3ekS1ei">Alen BreatheSmart FIT50</a></td>
<td>$550.0</td>
<td>208.3</td>
<td>3.33</td>
<td>366.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3twQpCo">Blueair 405</a></td>
<td>$651.59</td>
<td>266.8</td>
<td>3.01</td>
<td>514.0</td>
</tr>
<tr>
<td><a href="https://www.naturemaxx.com/product/ap-1511fhe-flizzinger-system-air-purifier/">Coway AP-1511FHE</a></td>
<td>$999.0</td>
<td>234.0</td>
<td>3.08</td>
<td>445.0</td>
</tr>
</tbody>
</table>
<h4 id="100-200-cadr">100-200 CADR</h4>
<table>
<thead>
<tr>
<th>Model</th>
<th>Purifier Price ($)</th>
<th>Dust-Free CADR (cfm)</th>
<th>Dust-Free CADR per Watt</th>
<th>Annual Energy Use (kWh/year)</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.amazon.com/dp/B01GOFN7X6?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">pureguardian AP2200CA******</a></td>
<td>$74.74</td>
<td>135.0</td>
<td>2.58</td>
<td>304.0</td>
</tr>
<tr>
<td><a href="https://www.walmart.com/ip/Filtrete-Room-Air-Purifier-System-Medium-Room-FAP-C02-F2-150-sqft/566528531">Filtrete FAP-C02-F2</a></td>
<td>$79.88</td>
<td>110.0</td>
<td>2.52</td>
<td>261.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3xZxCmI">GermGuardian AC 4820</a></td>
<td>$83.99</td>
<td>112.0</td>
<td>2.68</td>
<td>241.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3f4r11N">GermGuardian AC4825*******</a></td>
<td>$84.99</td>
<td>118.0</td>
<td>2.21</td>
<td>304.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3twzGPU">GermGuardian AC4900******</a></td>
<td>$85.04</td>
<td>106.0</td>
<td>2.03</td>
<td>283.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3xYZ2JG">GermGuardian AC4300******</a></td>
<td>$99.99</td>
<td>107.0</td>
<td>2.05</td>
<td>307.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B00BWYO2FW?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Honeywell HPA100</a></td>
<td>$99.99</td>
<td>106.0</td>
<td>2.66</td>
<td>234.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3ukyZKt">Winix A231</a></td>
<td>$99.99</td>
<td>154.0</td>
<td>3.25</td>
<td>282.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B002KMILVG?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">GermGuardian AC5000E</a></td>
<td>$100.3</td>
<td>131.7</td>
<td>2.7</td>
<td>285.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3tnV1uG">Filtrete FAP-C02WA-G2</a></td>
<td>$105.0</td>
<td>110.0</td>
<td>2.54</td>
<td>250.0</td>
</tr>
<tr>
<td><a href="https://www.guardiantechnologies.com/products/ac4700bdlx-4-in-1-air-cleaning-system-with-hepa-uv-c-sanitizer-by-germguardian">GermGuardian AC4700******</a></td>
<td>$119.99</td>
<td>106.0</td>
<td>3.26</td>
<td>189.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3ev1AYn">GermGuradian AC5600******</a></td>
<td>$123.81</td>
<td>105.0</td>
<td>2.38</td>
<td>258.0</td>
</tr>
<tr>
<td><a href="https://www.lowes.com/pd/Filtrete-Filtrete-Room-Air-Purifiers-3-Speed-170-sq-ft-True-HEPA-Air-Purifier-ENERGY-STAR/1000770804">Filtrete FAP-C02-A2</a></td>
<td>$124.98</td>
<td>110.0</td>
<td>2.54</td>
<td>250.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3eYdUza">Boneco AP200</a></td>
<td>$125.09</td>
<td>156.1</td>
<td>2.91</td>
<td>309.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/2RrObqN">Boneco TPP440</a></td>
<td>$127.27</td>
<td>140.8</td>
<td>2.59</td>
<td>322.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B07YYWMYLV?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">HOMEDICS AP-T30</a></td>
<td>$133.35</td>
<td>180.5</td>
<td>3.02</td>
<td>350.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3hcRz3K">Sharp FP-F30U*</a></td>
<td>$134.99</td>
<td>101.0</td>
<td>2.2</td>
<td>270.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3h2xQni">Whirlpool WPT80*</a></td>
<td>$139.99</td>
<td>152.0</td>
<td>3.57</td>
<td>245.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B0846CJGN4?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Therapure TPP630</a></td>
<td>$139.99</td>
<td>147.3</td>
<td>2.69</td>
<td>317.0</td>
</tr>
<tr>
<td><a href="https://www.homedepot.com/p/Honeywell-PowerPlus-True-HEPA-200-sq-ft-Allergen-Remover-Air-Purifier-HPA3100BV1/312232574">Honeywell HPA3100B</a></td>
<td>$149.0</td>
<td>138.0</td>
<td>2.66</td>
<td>302.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3tsX0xP">Boneco TPP540</a></td>
<td>$151.99</td>
<td>136.2</td>
<td>2.58</td>
<td>311.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/33ufe7v">GermGuardian CDAP4500******</a></td>
<td>$165.88</td>
<td>102.4</td>
<td>2.07</td>
<td>296.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/2SsGtNJ">Honeywell HPA160</a></td>
<td>$169.99</td>
<td>120.0</td>
<td>2.8</td>
<td>208.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3f9fajh">Honeywell HPA200 Series</a></td>
<td>$199.0</td>
<td>190.0</td>
<td>2.91</td>
<td>377.0</td>
</tr>
<tr>
<td><a href="https://www.bestbuy.com/site/germguardian-ap5800w-19-hi-performance-air-purifier-tower-console-with-hepa-filter-air-quality-sensor-white/6425329.p?skuId=6425329">GermGuardian AP5800******</a></td>
<td>$199.99</td>
<td>199.0</td>
<td>6.86</td>
<td>171.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B08HVXH3FB?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">HOMEDICS AP-PET35-WT</a></td>
<td>$199.99</td>
<td>168.5</td>
<td>3.16</td>
<td>316.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3vVbWpZ">Sharp FP-K50U-W</a></td>
<td>$202.99</td>
<td>171.0</td>
<td>4.11</td>
<td>245.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3h0Ys84">Alen T500</a></td>
<td>$228.94</td>
<td>144.9</td>
<td>2.68</td>
<td>314.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3nLESOD">Honeywell HPA250B Series</a></td>
<td>$249.99</td>
<td>190.0</td>
<td>2.94</td>
<td>378.0</td>
</tr>
<tr>
<td><a href="https://shop.sharpusa.com/sharp-true-hepa-air-purifier-with-plasmacluster-ion-technology-for-medium-rooms-fpf60uw/">Sharp FP-F60U-W</a></td>
<td>$249.99</td>
<td>195.0</td>
<td>3.67</td>
<td>312.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B077Y62H5P?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Honeywell HFD360B</a></td>
<td>$255.0</td>
<td>166.0</td>
<td>4.06</td>
<td>241.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3bfJdnY">Stadler Form Roger Little</a></td>
<td>$282.3</td>
<td>151.7</td>
<td>3.57</td>
<td>248.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B003BF665Y?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Sharp KC-850</a></td>
<td>$397.0</td>
<td>185.0</td>
<td>4.02</td>
<td>276.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B000R52Z24?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Rabbit Air SPA-700A</a></td>
<td>$549.95</td>
<td>176.4</td>
<td>3.78</td>
<td>274.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3bkxWDd">Honeywell HPA600B</a></td>
<td>$599.99</td>
<td>184.0</td>
<td>4.18</td>
<td>258.0</td>
</tr>
<tr>
<td><a href="https://www.naturemaxx.com/product/ap-1013a-compact-air-purifier/">Coway AP-1013A</a></td>
<td>$649.0</td>
<td>148.6</td>
<td>3.78</td>
<td>233.0</td>
</tr>
</tbody>
</table>
<h4 id="100-cadr">&lt;100 CADR</h4>
<table>
<thead>
<tr>
<th>Model</th>
<th>Purifier Price ($)</th>
<th>Dust-Free CADR (cfm)</th>
<th>Dust-Free CADR per Watt</th>
<th>Annual Energy Use (kWh/year)</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.walmart.com/ip/Filtrete-Room-Air-Purifier-System-Small-Room-FAP-C01-F1-110-sqft/938091483">Filtrete FAP-C01-F1</a></td>
<td>$49.94</td>
<td>80.0</td>
<td>2.48</td>
<td>190.0</td>
</tr>
<tr>
<td><a href="https://www.fleetfarm.com/detail/filtrete-black-small-room-air-purifier/0000000329885">Filtrete FAP-C01BA-G1</a></td>
<td>$59.99</td>
<td>75.0</td>
<td>2.37</td>
<td>187.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B08CHN999P?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Lasko LP200</a></td>
<td>$66.51</td>
<td>81.0</td>
<td>2.21</td>
<td>215.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B00BWYO1HG?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Honeywell HPA060</a></td>
<td>$68.0</td>
<td>61.0</td>
<td>1.05</td>
<td>123.0</td>
</tr>
<tr>
<td><a href="https://www.lowes.com/pd/Filtrete-Filtrete-Room-Air-Purifiers-3-Speed-110-sq-ft-True-HEPA-Air-Purifier-ENERGY-STAR/1000770794">Filtrete FAP-C01-A</a></td>
<td>$76.98</td>
<td>75.0</td>
<td>2.38</td>
<td>187.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3nY9hJH">GermGuardian AC4200******</a></td>
<td>$79.99</td>
<td>76.0</td>
<td>2.9</td>
<td>153.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B07YYWKVZM?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">HOMEDICS AP-DT10**</a></td>
<td>$90.51</td>
<td>67.1</td>
<td>1.99</td>
<td>195.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3eYs43v">Whirlpool WPT60*</a></td>
<td>$99.99</td>
<td>86.0</td>
<td>2.6</td>
<td>194.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B07YYWYDB8?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">HOMEDICS AP-T20</a></td>
<td>$111.11</td>
<td>93.0</td>
<td>2.89</td>
<td>186.0</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="non-hepa-filters">Non-HEPA Filters</h2>
<h4 id="300-400-cadr">300-400 CADR</h4>
<table>
<thead>
<tr>
<th>Model</th>
<th>Purifier Price ($)</th>
<th>Dust-Free CADR (cfm)</th>
<th>Dust-Free CADR per Watt</th>
<th>Annual Energy Use (kWh/year)</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://amzn.to/3eYV2jJ">Kenmore K*PA3D0AMW</a></td>
<td>$203.09</td>
<td>327.0</td>
<td>4.85</td>
<td>404.0</td>
</tr>
<tr>
<td><a href="https://www.homedepot.com/p/Winix-D480-3-Stage-True-HEPA-Air-Purifier-1022-0221-00/311694148">Winix D480</a></td>
<td>$219.0</td>
<td>312.0</td>
<td>3.8</td>
<td>477.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3eXrYZR">LEVOIT LV-H134</a></td>
<td>$269.99</td>
<td>326.0</td>
<td>6.61</td>
<td>291.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/33i3jtn">Whirlpool WPPRO2000*</a></td>
<td>$354.0</td>
<td>336.0</td>
<td>2.94</td>
<td>663.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/33FBBHv">CleanForce MEGA1000</a></td>
<td>$549.0</td>
<td>400.0</td>
<td>3.97</td>
<td>599.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3vWKrwx">Sharp FX-J80U-W</a></td>
<td>$597.0</td>
<td>334.0</td>
<td>4.88</td>
<td>414.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B08KPN4W9K?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">ORANSI MD01</a></td>
<td>$599.0</td>
<td>337.0</td>
<td>4.46</td>
<td>449.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/gp/product/B07HR7YVN2/ref=as_li_qf_asin_il_tl?ie=UTF8&amp;tag=frdmtoplay-20&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B07HR7YVN2&amp;linkId=0701da8c98148866ad74b390f2d09025">Powermatic PM1250</a></td>
<td>$599.99</td>
<td>400.0</td>
<td>13.16</td>
<td>180.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3epIsuE">Oxypure 47001</a></td>
<td>$599.99</td>
<td>351.0</td>
<td>3.02</td>
<td>695.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3bcEZ0l">Blueair 7711371000</a></td>
<td>$839.99</td>
<td>400.0</td>
<td>5.27</td>
<td>445.0</td>
</tr>
</tbody>
</table>
<h4 id="200-300-cadr">200-300 CADR</h4>
<table>
<thead>
<tr>
<th>Model</th>
<th>Purifier Price ($)</th>
<th>Dust-Free CADR (cfm)</th>
<th>Dust-Free CADR per Watt</th>
<th>Annual Energy Use (kWh/year)</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://amzn.to/3eZUTwu">Winix AM80</a></td>
<td>$194.38</td>
<td>240.0</td>
<td>4.02</td>
<td>334.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3xXrLi2">LEVOIT LV-H133</a></td>
<td>$199.99</td>
<td>274.0</td>
<td>5.59</td>
<td>293.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3h815Fn">Winix 5300-2</a></td>
<td>$199.99</td>
<td>243.0</td>
<td>4.86</td>
<td>297.0</td>
</tr>
<tr>
<td><a href="https://www.walmart.com/ip/Winix-C545-4-Stage-Air-Purifier-with-WiFi-With-PlasmaWave-Technology/466603114?athcpid=466603114&amp;athpgid=athenaItemPage&amp;athcgid=null&amp;athznid=PWVUB&amp;athieid=v0&amp;athstid=CS004&amp;athguid=505a4baa-007-1793a97721a814&amp;athancid=null&amp;athena=true">Winix C545</a></td>
<td>$199.99</td>
<td>243.0</td>
<td>4.72</td>
<td>305.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3o03GSV">Blueair P431101000</a></td>
<td>$214.0</td>
<td>220.0</td>
<td>5.03</td>
<td>251.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3xLlgi4">Blueair Auto 311</a></td>
<td>$249.99</td>
<td>250.0</td>
<td>7.65</td>
<td>193.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B07VPSL5KP?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">AIRTHEREAL AGH550</a></td>
<td>$259.99</td>
<td>290.0</td>
<td>5.09</td>
<td>333.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B08H4DZ5MD?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Coway Airmega Airmega 250</a></td>
<td>$297.58</td>
<td>261.2</td>
<td>4.64</td>
<td>339.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3es0NqW">ORANSI MJR01</a></td>
<td>$399.0</td>
<td>238.0</td>
<td>4.83</td>
<td>292.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3eTrAeS">HATHASPACE HSP002</a></td>
<td>$399.99</td>
<td>239.8</td>
<td>3.26</td>
<td>420.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B003Y5L7KA?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Rabbit Air SPA-780A</a></td>
<td>$599.95</td>
<td>202.0</td>
<td>3.27</td>
<td>362.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/2Rzj6By">Blueair 7411371000</a></td>
<td>$639.99</td>
<td>275.0</td>
<td>5.48</td>
<td>292.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/2QZLTzi">Samsung AX300<em>9080</em></a></td>
<td>$699.99</td>
<td>205.0</td>
<td>6.77</td>
<td>183.0</td>
</tr>
<tr>
<td><a href="https://www.rabbitair.com/products/a3-air-purifier">Rabbit Air SPA-1000N</a></td>
<td>$749.95</td>
<td>262.2</td>
<td>4.38</td>
<td>352.0</td>
</tr>
</tbody>
</table>
<h4 id="100-200-cadr">100-200 CADR</h4>
<table>
<thead>
<tr>
<th>Model</th>
<th>Purifier Price ($)</th>
<th>Dust-Free CADR (cfm)</th>
<th>Dust-Free CADR per Watt</th>
<th>Annual Energy Use (kWh/year)</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.amazon.com/dp/B08G8XFLYP?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Senville SENAP-W36US</a></td>
<td>$69.99</td>
<td>145.0</td>
<td>2.59</td>
<td>334.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B08FJ678YK?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">LEVOIT Core 200S</a></td>
<td>$79.99</td>
<td>109.0</td>
<td>2.88</td>
<td>223.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B07HMMM8LH?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Eureka NEA120</a></td>
<td>$79.99</td>
<td>145.0</td>
<td>2.59</td>
<td>334.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/2QXZBm9">LEVOIT Core 300</a></td>
<td>$99.99</td>
<td>141.0</td>
<td>3.09</td>
<td>264.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B07VVK39F7?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">VESYNC LV-H131S-RXW</a></td>
<td>$99.99</td>
<td>108.0</td>
<td>3.48</td>
<td>185.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3bfhzHX">Therapure TPP240</a></td>
<td>$120.0</td>
<td>155.1</td>
<td>2.83</td>
<td>322.0</td>
</tr>
<tr>
<td><a href="https://www.sears.com/perfect-aire-perfect-aire-1papuv27-perfect-aire-3/p-A098745553">Perfect aire 1PAPUV27</a></td>
<td>$125.67</td>
<td>145.0</td>
<td>2.59</td>
<td>334.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B0086092HS?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Therapure TPP230H</a></td>
<td>$128.99</td>
<td>151.2</td>
<td>2.87</td>
<td>309.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3xUOsDj">GermGuardian AC5300******</a></td>
<td>$134.99</td>
<td>124.0</td>
<td>3.03</td>
<td>234.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B08GD1CVY1?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">NOSTALGIA HCAPTPBC31FUVBK</a></td>
<td>$135.31</td>
<td>145.0</td>
<td>2.59</td>
<td>334.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3vIsVMc">Blueair Auto 411</a></td>
<td>$139.99</td>
<td>107.0</td>
<td>12.02</td>
<td>53.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B081NWVMCH?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">MEDIFY AIR MA-25</a></td>
<td>$160.0</td>
<td>134.8</td>
<td>4.17</td>
<td>189.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/2QSoXSo">LEVOIT LV-PUR131</a></td>
<td>$179.99</td>
<td>102.0</td>
<td>2.91</td>
<td>210.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3ttNcn9">GermGuardian CDAP5500******</a></td>
<td>$179.99</td>
<td>125.0</td>
<td>3.0</td>
<td>246.0</td>
</tr>
<tr>
<td><a href="https://www.walmart.com/ip/Levoit-LV-H131S-RXW-Smart-WiFi-True-Hepa-Air-Purifier/995923987">LEVOIT LV-H131S-RXW</a></td>
<td>$189.99</td>
<td>108.0</td>
<td>3.48</td>
<td>185.0</td>
</tr>
<tr>
<td><a href="https://www.lowes.com/pd/Filtrete-Filtrete-8482-Smart-Room-Air-Purifier-FAP-SC02L-Medium-Room-150-Sq-Ft/5000214241">Filtrete FAP-SC02L</a></td>
<td>$274.98</td>
<td>105.0</td>
<td>2.33</td>
<td>263.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3nYTcTX">MEDIFY AIR MA-WM35-WIFI</a></td>
<td>$349.0</td>
<td>149.0</td>
<td>4.75</td>
<td>182.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B00GH19UU2?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Rabbit Air SPA-550A</a></td>
<td>$369.95</td>
<td>148.1</td>
<td>5.42</td>
<td>163.0</td>
</tr>
<tr>
<td><a href="https://amzn.to/3erTpvW">Rabbit Air SPA-625A</a></td>
<td>$399.95</td>
<td>165.0</td>
<td>4.4</td>
<td>220.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B079K7RM29?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Rabbit Air SPA-780N</a></td>
<td>$619.95</td>
<td>180.5</td>
<td>3.03</td>
<td>350.0</td>
</tr>
</tbody>
</table>
<h4 id="100-cadr">&lt;100 CADR</h4>
<table>
<thead>
<tr>
<th>Model</th>
<th>Purifier Price ($)</th>
<th>Dust-Free CADR (cfm)</th>
<th>Dust-Free CADR per Watt</th>
<th>Annual Energy Use (kWh/year)</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.amazon.com/dp/B081QP8K5K?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">BLACK+DECKER BAPT01</a></td>
<td>$69.99</td>
<td>66.0</td>
<td>4.82</td>
<td>82.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B089CBRBVX?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">MEDIFY AIR MA-15</a></td>
<td>$119.0</td>
<td>97.0</td>
<td>3.22</td>
<td>180.0</td>
</tr>
<tr>
<td><a href="https://www.amazon.com/dp/B07BJDSKS8?tag=frdmtoplay-20&amp;linkCode=osi&amp;th=1&amp;psc=1">Dyson DP04</a></td>
<td>$448.0</td>
<td>90.5</td>
<td>2.75</td>
<td>196.0</td>
</tr>
<tr>
<td><a href="https://www.bestbuy.com/site/dyson-tp04-pure-cool-tower-800-sq-ft-air-purifier-white-silver/6192408.p?skuId=6192408">Dyson TP04</a></td>
<td>$549.99</td>
<td>89.8</td>
<td>2.69</td>
<td>202.0</td>
</tr>
<tr>
<td><a href="https://www.walmart.com/ip/Dyson-Pure-Cool-Cryptomic-Tp06-Gunmetal-Bronze-Sealed/639051499">Dyson TP06</a></td>
<td>$949.99</td>
<td>92.0</td>
<td>2.71</td>
<td>202.0</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><!--### References

1. [CARB study for ACH](https://ww3.arb.ca.gov/research/single-project.php?row_id=64697)
2. [link to CARB paper](http://www.iee-sf.com/pdf/SummerFieldResults.pdf)
3. [CARB sizing formula](https://ww2.arb.ca.gov/resources/fact-sheets/air-cleaning-devices-home/printable/print)
4. [ANSI/AHAM AC-1](https://ahamverifide.org/wp-content/uploads/2019/07/Scope-of-Air-Cleaner-Certification.pdf)
5. [ASHRAE Guidance for Residential Air Cleaners](https://www.epa.gov/sites/production/files/2019-09/documents/harriman_stephens_brennan_-_new_guidance_for_residential_air_cleaners_-_ashrae_journal_sept-2019._web_version.pdf)
6. [AC-1 Test Procedure](https://nanopdf.com/download/epa-room-air-cleaner-energy-star-program_pdf)
7. [Residential Air Leakage](https://www.osti.gov/servlets/purl/816784)
8. [ASHRAE Ventilation](https://www.ashrae.org/File%20Library/Technical%20Resources/Standards%20and%20Guidelines/Standards%20Addenda/62_1_2013_p_20150707.pdf)
9. [Indoor Particles](https://www.tandfonline.com/doi/pdf/10.1080/10473289.1996.10467451)
10. [Building Codes and Indoor Air Quality](https://www.epa.gov/sites/production/files/2014-08/documents/building_codes_and_iaq.pdf)
11. [Technical Assistance Document for the Reporting of Daily Air Quality – the Air Quality Index (AQI)](https://www.airnow.gov/sites/default/files/2020-05/aqi-technical-assistance-document-sept2018.pdf)
12. [Kowalski Air Filter Models](https://web.archive.org/web/20040225151756/http://www.engr.psu.edu/ae/wjk/fom.html)
13. [MERV Filter Models](https://www.researchgate.net/publication/237558312_MERV_Filter_Models_for_Aerobiological_Applications)--><!--kg-card-end: markdown--><!--kg-card-begin: markdown--><hr>
<p>Did this clarify the air purification market and set you on the path to fresh air? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Removing "Subscribe" from Ghost 4.0]]></title><description><![CDATA[Settings to change to remove the subscribe button and subscribe footer from Ghost 4.0]]></description><link>https://frdmtoplay.com/removing-subscribe-from-ghost-4-0/</link><guid isPermaLink="false">60b2cd7d7b4660656bd58586</guid><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Sat, 29 May 2021 23:35:25 GMT</pubDate><content:encoded><![CDATA[<p>Ghost recently released <a href="https://ghost.org/changelog/4/">Ghost 4.0</a> and with it came a &quot;Subscribe&quot; button and a &quot;Subscribe&quot; footer on every blog post. This does not match the &quot;Just some information on the internet&quot; blogging model of f<a href="https://frdmtoplay.com/">rdmtoplay.com</a>.</p><p>It is not obvious how to turn these features off, and even when you do, some features are left behind cluttering up the HTML. </p><p>In the Settings -&gt; Membership, change Subscription access to &quot;Nobody&quot;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/05/No_Subscriptions-1.png" class="kg-image" alt loading="lazy" width="1256" height="995" srcset="https://frdmtoplay.com/content/images/size/w600/2021/05/No_Subscriptions-1.png 600w, https://frdmtoplay.com/content/images/size/w1000/2021/05/No_Subscriptions-1.png 1000w, https://frdmtoplay.com/content/images/2021/05/No_Subscriptions-1.png 1256w" sizes="(min-width: 720px) 720px"><figcaption>Set &quot;Subscription access&quot; to &quot;Nobody&quot;</figcaption></figure><p>Despite not allowing subscriptions, pesky &quot;Subscribe&quot; buttons and forms are left behind in the default Casper theme. These can be hidden by going to &quot;Settings&quot; -&gt; &quot;Code injection&quot; and applying the following CSS in the Site Header:</p><!--kg-card-begin: markdown--><pre><code>&lt;style type=&apos;text/css&apos;&gt;
    /* Hide the Membership aka Subscribe actions etc. */
    #ghost-portal-root,
    a[href^=&quot;https://ghost.org&quot;],
    a[href^=&quot;#/portal/signup&quot;],
    .footer-cta { display: none; }
&lt;/style&gt;
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/05/Code_Injection.png" class="kg-image" alt loading="lazy" width="1259" height="599" srcset="https://frdmtoplay.com/content/images/size/w600/2021/05/Code_Injection.png 600w, https://frdmtoplay.com/content/images/size/w1000/2021/05/Code_Injection.png 1000w, https://frdmtoplay.com/content/images/2021/05/Code_Injection.png 1259w" sizes="(min-width: 720px) 720px"><figcaption>Inject CSS into every web page</figcaption></figure><!--kg-card-begin: markdown--><hr>
<p>Did this make your blog look cleaner? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Patching in Fahrenheit]]></title><description><![CDATA[A walkthrough for dumping the firmware from a no-name air quality monitor and patching the firmware to display temperature in Fahrenheit instead of Celsius]]></description><link>https://frdmtoplay.com/patching-in-fahrenheit/</link><guid isPermaLink="false">600f7d1b350dad112ff3e472</guid><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Fri, 12 Feb 2021 03:08:44 GMT</pubDate><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2021/02/celsius.png" class="kg-image" alt loading="lazy" width="800" height="622" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/celsius.png 600w, https://frdmtoplay.com/content/images/2021/02/celsius.png 800w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: markdown--><p>An interesting <a href="https://www.amazon.com/gp/product/B07KR631YY?pf_rd_r=2TKXWBYPX66FFAE7DDNG&amp;pf_rd_p=5ae2c7f8-e0c6-4f35-9071-dc3240e894a8&amp;pd_rd_r=39390ae4-22b1-43b8-a859-e14d614f229e&amp;pd_rd_w=qWoNW&amp;pd_rd_wg=lWlf2&amp;linkCode=ll1&amp;tag=frdmtoplay-20&amp;linkId=09da421c82eb44928eb1659c7af8292a&amp;language=en_US&amp;ref_=as_li_ss_tl">no-brand air quality monitor</a> showed up in an Amazon search recently. The sensor is two bare PCBs with an <a href="https://store.siqma.com/am2120.html">Asair AM2120</a> temperature &amp; humidity sensor, a <a href="https://senseair.com/products/size-counts/s8-residential/">SenseAir S8</a> CO2 sensor, a <a href="http://www.plantower.com/en/content/?108.html">Plantower PMS5003</a> PM2.5 sensor, and a 2.8&quot; LED display all sandwiched between two pieces of acrylic via plastic standoffs.</p>
<table>
<thead>
<tr>
<th>Component</th>
<th>Price ($)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Plantower PMS 5003</td>
<td>39.95</td>
</tr>
<tr>
<td>SenseAir S8</td>
<td>44.22</td>
</tr>
<tr>
<td>Asair AM2120</td>
<td>1.20</td>
</tr>
<tr>
<td>Z280IT010 2.8&quot; 240x320 Display</td>
<td>6.80</td>
</tr>
<tr>
<td><strong>Estimated BOM Cost</strong></td>
<td><strong>92.17</strong></td>
</tr>
<tr>
<td>Price on <a href="https://www.amazon.com/gp/product/B07KR631YY?pf_rd_r=2TKXWBYPX66FFAE7DDNG&amp;pf_rd_p=5ae2c7f8-e0c6-4f35-9071-dc3240e894a8&amp;pd_rd_r=39390ae4-22b1-43b8-a859-e14d614f229e&amp;pd_rd_w=qWoNW&amp;pd_rd_wg=lWlf2&amp;linkCode=ll1&amp;tag=frdmtoplay-20&amp;linkId=09da421c82eb44928eb1659c7af8292a&amp;language=en_US&amp;ref_=as_li_ss_tl">Amazon</a></td>
<td>117.79</td>
</tr>
<tr>
<td>Price on <a href="https://usa.banggood.com/CO2-Carbon-Dioxide-+-PM2_5-Detector-Module-Air-Quality-Gas-Sensor-Tester-Detector-with-2_8Inch-TFT-Display-Monitoring-Home-Office-Car-Tools-p-1615633.html?cur_warehouse=CN&amp;rmmds=search">banggood</a></td>
<td>101.99</td>
</tr>
</tbody>
</table>
<p>The monitor is only ~$25 more than the qty 1 price of the sensors, which seems like a reasonable markup to not have to write any code. An identical monitor can also be found on <a href="https://usa.banggood.com/CO2-Carbon-Dioxide-+-PM2_5-Detector-Module-Air-Quality-Gas-Sensor-Tester-Detector-with-2_8Inch-TFT-Display-Monitoring-Home-Office-Car-Tools-p-1615633.html?cur_warehouse=CN&amp;rmmds=search">banggood</a> that is priced much closer to BOM. Since the sensors are not soldered to the PCBs, if the monitor dies they can be easily removed and moved to another project.</p>
<p>The main downside to the monitor only applies to Fahrenheit users - the temperature display is only in Celsius!</p>
<p><img src="https://frdmtoplay.com/content/images/2021/02/amazon_review.png" alt="amazon_review" loading="lazy"></p>
<p><em>Let&apos;s patch this thing &amp; prove the seller wrong!</em></p>
<h2 id="findingthedebugheader">Finding the Debug Header</h2>
<p>There are several unpopulated 0.1&quot; headers around the PCB. From images on banggood, other variants of the monitor have additional sensors populating them. In order to dump the firmware and patch it, one of the headers needs to carry either JTAG or SWD signals.</p>
<!--kg-card-end: markdown--><p>Finding the debug header was fairly straightforward, using a very similar method to the one demonstrated by <a href="https://hackaday.com/2020/12/01/remoticon-video-how-to-reverse-engineer-a-pcb">Eric Schlaepfer</a>. &#xA0;The monitor was disassembled and well-lit pictures of both sides of the PCB were overlaid with reduced opacity so traces on the top and bottom layers could be seen together.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/02/PCB_overlay_med-1.png" class="kg-image" alt loading="lazy" width="930" height="1204" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/PCB_overlay_med-1.png 600w, https://frdmtoplay.com/content/images/2021/02/PCB_overlay_med-1.png 930w" sizes="(min-width: 720px) 720px"><figcaption>Both sides of PCB mirrored, overlaid, and made transparent</figcaption></figure><p><strong>Note:</strong> Mirroring the side of the PCB containing the MCU makes it very difficult to match pins to the datasheet!</p><p>The <a href="https://www.st.com/en/microcontrollers-microprocessors/stm32f103c8.html">STM32F103C8</a> was given away by the silkscreen and the datasheet highlighted the likely SWD pins.</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Pin Name</th>
<th>Main Function</th>
</tr>
</thead>
<tbody>
<tr>
<td>PA13</td>
<td>JTMS/SWDIO</td>
</tr>
<tr>
<td>PA14</td>
<td>JTCK/SWCLK</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Fortunately, PA13 &amp; PA14 traced out to the same header with NRST - the SWD debug header was found! The remaining two pins in the header were continuity checked against the 3.3V and GND from the AM2120 to determine polarity.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/02/PCB_markup_med-1.png" class="kg-image" alt loading="lazy" width="930" height="627" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/PCB_markup_med-1.png 600w, https://frdmtoplay.com/content/images/2021/02/PCB_markup_med-1.png 930w" sizes="(min-width: 720px) 720px"><figcaption>Debug Header Traces</figcaption></figure><h2 id="dumping-the-firmware">Dumping the Firmware</h2><p>With the debug header discovered and mapped, it is straightforward to wire up a JTAG programmer (<a href="https://www.amazon.com/ST-LINK-V2-circuit-debugger-programmer/dp/B00SDTEM1I/ref=as_li_ss_tl?dchild=1&amp;keywords=stlink&amp;qid=1611632754&amp;sr=8-2&amp;linkCode=ll1&amp;tag=frdmtoplay-20&amp;linkId=f7c8f76226961338fb6c7ef9dc5e413c&amp;language=en_US">STLink</a>, <a href="https://www.amazon.com/SEGGER-8-08-90-J-LINK-JTAG-EMULATOR/dp/B00GU4CBXO/ref=as_li_ss_tl?dchild=1&amp;keywords=jlink+edu&amp;qid=1611632798&amp;sr=8-3&amp;linkCode=ll1&amp;tag=frdmtoplay-20&amp;linkId=170080a237910322d5e0ca910a8f8200&amp;language=en_US">J-Link EDU</a>, etc).</p><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>Pin Name</th>
<th>SWD Connector Pin</th>
<th>PCB Header Pin</th>
</tr>
</thead>
<tbody>
<tr>
<td>VTref</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>GND</td>
<td>4</td>
<td>2</td>
</tr>
<tr>
<td>SWCLK</td>
<td>9</td>
<td>3</td>
</tr>
<tr>
<td>SWDIO</td>
<td>7</td>
<td>4</td>
</tr>
<tr>
<td>RESET</td>
<td>15</td>
<td>5</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Dumping the firmware can be accomplished with <code>openocd</code>, a sample config file for this target with a J-Link is:</p><figure class="kg-card kg-code-card"><pre><code>source [find interface/jlink.cfg]

transport select swd

source [find target/stm32f1x.cfg]</code></pre><figcaption><code>openocd.cfg</code></figcaption></figure><p>Fortunately, the flash is not read-protected and can be extracted with <code>flash read_bank 0 bank0.bin 0x0 0x1FFF</code> via the <code>telnet</code> interface to <code>openocd</code>.</p><!--kg-card-begin: html--><pre>
<b>$ openocd -f openocd.cfg</b>
Open On-Chip Debugger 0.10.0 
Licensed under GNU GPL v2 
For bug reports, read 
	http://openocd.org/doc/doxygen/bugs.html
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
none separate
cortex_m reset_config sysresetreq
Info : No device selected, using first device.
Info : J-Link V10 compiled Mar  7 2019 15:19:19
Info : Hardware version: 10.10
Info : VTarget = 3.328 V
Info : clock speed 1000 kHz
Info : SWD DPIDR 0x1ba01477
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
</pre><!--kg-card-end: html--><!--kg-card-begin: html--><pre>
<b>$ telnet 0 4444</b> 
Trying 0.0.0.0...
Connected to 0.
Escape character is &apos;^]&apos;.
Open On-Chip Debugger 
<b>&gt; flash list</b>
{name stm32f1x base 134217728 size 0 bus_width 0 chip_width 0}
<b>&gt; flash read_bank 0 bank0.bin 0x0 0x1FFFF</b>
device id = 0x20036410
flash size = 64kbytes
wrote 131071 bytes to file bank0.bin from flash bank 0 at offset 0x00000000 in 1.897898s (67.443 KiB/s)
</pre><!--kg-card-end: html--><h2 id="finding-the-temperature-drawing-function">Finding the Temperature Drawing Function</h2><p>With the firmware stored in <code>bank0.bin</code> it&apos;s time to fire up <a href="https://ghidra-sre.org/">ghidra</a> and determine where the temperature is being displayed.</p><p><code>PM DETECTOR</code> appears on the monitor&apos;s display which makes it a good candidate to find the screen drawing function(s). Fortunately, <code>PM DETECTOR</code> appears as a &quot;Defined String&quot; in the binary. The function defined at <code>00003bbc</code> uses the string.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/02/pm_detector-1.png" class="kg-image" alt loading="lazy" width="2000" height="1292" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/pm_detector-1.png 600w, https://frdmtoplay.com/content/images/size/w1000/2021/02/pm_detector-1.png 1000w, https://frdmtoplay.com/content/images/size/w1600/2021/02/pm_detector-1.png 1600w, https://frdmtoplay.com/content/images/2021/02/pm_detector-1.png 2057w" sizes="(min-width: 720px) 720px"><figcaption>&quot;PM DETECTOR&quot; in Defined Strings, Disassembly, and Decompiled Code</figcaption></figure><p>&#x200C; Taking a deeper look at this function reveals that there are 10 calls to a function with 4 arguments; coincidentally there are 10 lines on the display. The arguments to this function also appear to be in an x1,y1,x2,y2 format. Additionally, <code>_DAT_0003fb8</code> is set to <code>0x9bdd</code> - a shade of blue in the <a href="https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#16-bit_RGB">RGB565</a> space. So, it seems that <code>FUN_00003bbc</code> is responsible for drawing the main screen of the monitor. </p><p> <code>FUN_000012d2</code> appears to be drawing strings to the screen, and the call on L30 has the address for the &quot;Temp&quot; string. Ghidra does not detect strings less than 5 characters, so &quot;Temp&quot; was not formatted in a similar fashion to &quot;PM DETECTOR&quot;.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/02/FUN_00003bbc-1.png" class="kg-image" alt loading="lazy" width="983" height="683" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/FUN_00003bbc-1.png 600w, https://frdmtoplay.com/content/images/2021/02/FUN_00003bbc-1.png 983w" sizes="(min-width: 720px) 720px"><figcaption><code>FUN_00003bbc</code> Static Screen 1 Draw Function</figcaption></figure><p>&#x200C;The &quot;Function Call Tree&quot; feature of ghidra highlights which functions call a particular function. Renaming <code>FUN_00003bbc</code>to <code>Screen1Static()</code> makes it clearer what is going on in the parent function, <code>FUN_000047a6</code>. </p><p><code>FUN_000047a6</code> calls <code>Screen1Static()</code> once before a infinite loop, and then again in the infinite loop which has different behavior depending on the value of <code>iVar4</code>. Taking a look inside of <code>FUN_00003142</code>, it is clear it is returning the state of a digital input; when the side button of the monitor is pressed, the display will cycle through three screens, suggesting <code>iVar4</code> maps to the side button and <code>bVar1</code>/ <code>pbVar2</code> maps to the number of times the button has been pressed.</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2021/02/Main-1.png" class="kg-image" alt loading="lazy" width="864" height="507" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/Main-1.png 600w, https://frdmtoplay.com/content/images/2021/02/Main-1.png 864w" sizes="(min-width: 720px) 720px"></figure><p>A similar state change based on <code>iVar4</code> /<code>bVar1</code> occurs later on in <code>FUN_000047a6</code> (presumably the &quot;main&quot; function), suggesting that <code>FUN_00004634</code> may be the function performing the dynamic update of the sensor readings.</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2021/02/state_change-3.png" class="kg-image" alt loading="lazy" width="881" height="356" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/state_change-3.png 600w, https://frdmtoplay.com/content/images/2021/02/state_change-3.png 881w" sizes="(min-width: 720px) 720px"></figure><p><code>FUN_00004634</code> is a wrapper function that only calls four other functions, the second being <code>FUN_000042f4</code>. <code>FUN_000042f4</code> contains two function calls which divide an argument by 10; the AM2120 datasheet specifies that humidity and temperature readings are 10 times larger than the actual value. It looks very promising that this is the function displaying the temperature and humidity to the screen.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/02/divide_by_10-1.png" class="kg-image" alt loading="lazy" width="998" height="791" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/divide_by_10-1.png 600w, https://frdmtoplay.com/content/images/2021/02/divide_by_10-1.png 998w" sizes="(min-width: 720px) 720px"><figcaption>Function displaying two values divided by 10</figcaption></figure><p>Furthermore, L31 - L33 print a number divided by 10, a decimal point, and then the modulus of the number with respect to 10. In other words, these three lines print &quot;716&quot; as &quot;71.6&quot;. The only value printed to the monitor&apos;s screen which has a decimal is the temperature reading - <em>the temperature drawing function has been found!</em></p><h2 id="patching-in-fahrenheit">Patching in Fahrenheit</h2><p>Because the temperature value returned by the AM2120 is 10x the actual temperature in Celsius, the usual Fahrenheit to Celsius formula needs adjusted:</p><!--kg-card-begin: markdown--><p>$$F = \frac{9}{5}C + 32$$<br>
$$F^* = 10F$$<br>
$$C^* = 10C$$<br>
$$\frac{F^* }{10} = \frac{9 C^* }{50} + 32$$<br>
$$F^* = \frac{9 C^* }{5} + 320 = \frac{9 C^* + 1600}{5}$$</p>
<!--kg-card-end: markdown--><p>Transcribing the formula to ARM assembly is fairly straightforward. Unfortunately, many ARM assembly simulators do not support <code>sdiv</code> so the first time the code was tested was live on the processor!</p><figure class="kg-card kg-code-card"><pre><code>ldr        r0,[Temperature]		# Load the temperature address
ldrh       r0,[r0,#0x0]			# Load the temperature value
mov        r1,#0x9			# Move 9 into r1
mul        r0,r0,r1			# Multiply temperature by 9
mov.w      r1,#0x640			# Move 1600 to r1
add        r0,r0,r1			# Add 9*C to 1600
mov        r1,#0x5			# Move 5 to r1
sdiv       r0,r0,r1			# Divide 9*C+1600 by 5
ldr        r1,[Temperature]		# Load temperature address
strh       r0,[r1,#0x0]			# Store the temperature</code></pre><figcaption>Fahrenheit to Celsius assembly function</figcaption></figure><p>With the assembly in hand, the next step was to find an appropriate place to insert the ten instructions. Right above the call to <code>FUN_0000114C</code> (draw a number to the screen) the color for the number draw is selected. </p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2021/02/colors-1.png" class="kg-image" alt loading="lazy" width="998" height="791" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/colors-1.png 600w, https://frdmtoplay.com/content/images/2021/02/colors-1.png 998w" sizes="(min-width: 720px) 720px"></figure><p>The color &#xA0;(<code>DAT_00004474</code>) is based on the value of the temperature reading (10x the temperature in &#x2103;). The color scheme is <a href="https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#16-bit_RGB">RGB565</a> which fits in 2 bytes instead of the three bytes required for RGB888. The values can be trivially converted to RGB888 color space using the snippet of Python below.</p><figure class="kg-card kg-code-card"><pre><code class="language-Python">def rgb565_to_rgb888(rgb565):
    red = (rgb565 &amp; 0xf800) &gt;&gt; 8
    green = (rgb565 &amp; 0x7e0) &gt;&gt; 3
    blue = (rgb565 &amp; 0x1f) &lt;&lt; 3
    return red, green, blue
    
rgb565_to_rgb888(0x1c9f)
(24, 144, 248)</code></pre><figcaption>RGB565 to RGB888</figcaption></figure><!--kg-card-begin: markdown--><table>
<thead>
<tr>
<th>RGB565</th>
<th>RGB888</th>
<th>Color</th>
<th>Temperature Range</th>
</tr>
</thead>
<tbody>
<tr>
<td>0x1f</td>
<td>(0, 0, 248)</td>
<td>Blue</td>
<td>&gt; 50&#x2103;</td>
</tr>
<tr>
<td>0xf800</td>
<td>(248, 0, 0)</td>
<td>Red</td>
<td>30&#x2103; - 50&#x2103;</td>
</tr>
<tr>
<td>0xffe0</td>
<td>(248, 252, 0)</td>
<td>Yellow</td>
<td>20&#x2103; - 30&#x2103;</td>
</tr>
<tr>
<td>0x7e0</td>
<td>(0, 252, 0)</td>
<td>Green</td>
<td>10&#x2103; - 20&#x2103;</td>
</tr>
<tr>
<td>0x1c9f</td>
<td>(24, 144, 248)</td>
<td>Light Blue</td>
<td>&lt; 10&#x2103;</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown--><p>Displaying a different color for values above 50&#x2103; does not necessarily provide a lot of value, so that functionality is a prime candidate for replacing with the Fahrenheit conversion function.</p><p>The block of assembly at &#xA0;<code>00004376</code> sets the Color to <code>0x1f</code> (Blue) and all of the jumps to that label occur in the block <code>00004358</code>, right above it, so it looks like overriding this functionality will work cleanly.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/02/draw_temperature-1.png" class="kg-image" alt loading="lazy" width="949" height="959" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/draw_temperature-1.png 600w, https://frdmtoplay.com/content/images/2021/02/draw_temperature-1.png 949w" sizes="(min-width: 720px) 720px"><figcaption>Temperature Drawing Disassembly</figcaption></figure><p>Starting at <code>0000437a</code> and working up, the 10 Fahrenheit instructions fit in neatly with one dangling instruction at <code>00004360</code> which can be converted to either a <code>nop</code> or a direct jump to <code>00004362</code>. Since all branches of the color selection tree should calculate Fahrenheit, all of the jumps to <code>0000437c</code> (the &#x2103; read) need updated to &#xA0;<code>00004362</code> (the &#x2109; read). Note that at first blush it looks like the instructions at <code>00004378:437a</code> are redundant since the Temperature value is stored and then immediately read. Storing the Temperature is necessary for the tenth of a degree draw call after the decimal point is drawn. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/02/patched.png" class="kg-image" alt loading="lazy" width="1205" height="973" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/patched.png 600w, https://frdmtoplay.com/content/images/size/w1000/2021/02/patched.png 1000w, https://frdmtoplay.com/content/images/2021/02/patched.png 1205w" sizes="(min-width: 720px) 720px"><figcaption>Fahrenheit calculation patched in</figcaption></figure><p>In theory, the temperature reading should be converted to Fahrenheit and printed to the screen!</p><h2 id="fixing-the-glyph">Fixing the &#x2103; Glyph</h2><p>Calculating the temperature in Fahrenheit is only half the battle - the display has a &#xA0;&#x2103; glyph which needs to be updated to &#x2109;. In the screen setup function there are two similar calls right after the &quot;Temp&quot; and &quot;RH&quot; (Relative Humidity) strings are drawn to the screen. Both the &quot;Temp&quot; and &quot;RH&quot; cells in the also have static units drawn in them,&#x2103; and %, respectively. </p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2021/02/index_function2-1.png" class="kg-image" alt loading="lazy" width="538" height="318"></figure><p>Diving into the suspicious function, it appears to have three nested loops, the outer running 16 times, the middle running 8 times, and the inner running 2 times for a total of 256 (or 16x16) iterations. The &#x2103; and the % glyphs on the display both look like 16x16 bitmaps, further suggesting that this function is indeed blitting a 16x16 image to the display. Both the &#x2103; and % appear to be in the same x column on the display, suggesting that the first argument to <code>FUN_00000dac</code> is the x-coordinate, the second argument being the y-coordinate, &#xA0;with the third paramter potentially being an index into a sprite array.</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2021/02/bitmap_blit.png" class="kg-image" alt loading="lazy" width="702" height="661" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/bitmap_blit.png 600w, https://frdmtoplay.com/content/images/2021/02/bitmap_blit.png 702w"></figure><p>Assuming that third parameter is indeed a sprite index, it is possible to calculate the memory address for each glyph by multiplying the index by 256 and adding that to the address located at <code>DAT_000000e50</code> (Line 15 in the disassembly). However, for reasons that will become apparent, this binary data did not seem to match the expected pattern for the &#x2103; glyph. </p><p>Fortunately, with a bit of <code>imagemagick</code> black magic we can visually hunt for these glyphs! The following snippet reads in the binary file as a 16x16384 image (one long column), breaks that column into 16x16 sections, and then stitches them back together, effectively y-axis overflow wrapping the 16x16384 column. </p><pre><code>montage &lt;(convert -depth 1 -size 16x16384 gray:bank0.bin -crop 16x16 miff:-) -tile 1x32 -geometry 16x16+0+0 miff:- | montage - -geometry +0+0 -tile x1 binary.png
</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/02/binary.png" class="kg-image" alt loading="lazy" width="593" height="512"><figcaption>Visualization of the binary dump</figcaption></figure><p>With a little bit of &#xA0;searching it&apos;s possible to find the &#x2103; which just so happens to be at the exact memory location it was supposed to be ( <code>0x47c6</code> + <code>0x18</code>*256)! However, the image is rotated and has an 8 bit offset.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/02/degC-1.png" class="kg-image" alt loading="lazy" width="128" height="376"><figcaption>&#x2103;glyph as a 1-bit bitmap</figcaption></figure><p>With the format known, it was trivial to create a similar &#x2109; glyph and patch the binary with the hex representation. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://frdmtoplay.com/content/images/2021/02/degF.png" class="kg-image" alt loading="lazy" width="128" height="128"><figcaption>Formatted &#x2109; glyph</figcaption></figure><h2 id="flashing-the-modified-firmware">Flashing the modified firmware</h2><p>Diffing the two firmware images shows the three distinct regions that were patched; a fixed typo at <code>00004060</code>, the Fahrenheit formula at <code>00004320</code>, and the &#xB0;F glyph update at <code>00004ac0</code>:</p><p><code>diff -u &lt;(xxd bank0.bin) &lt;(xxd bank0.bin.mod)</code></p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2021/02/diff-1.png" class="kg-image" alt loading="lazy" width="617" height="752" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/diff-1.png 600w, https://frdmtoplay.com/content/images/2021/02/diff-1.png 617w"></figure><p>Reflashing the modified binary to the monitor is straightforward using &#xA0;openocd: </p><pre><code>halt
stm32f1x unlock 0
reset halt
stm32f1x mass_erase 0
flash write_bank 0 bank0.bin.mod 0x0</code></pre><p>And now the temperature displays in Fahrenheit with a proper unit designation!</p><figure class="kg-card kg-image-card"><img src="https://frdmtoplay.com/content/images/2021/02/fahrenheit.png" class="kg-image" alt loading="lazy" width="1496" height="1203" srcset="https://frdmtoplay.com/content/images/size/w600/2021/02/fahrenheit.png 600w, https://frdmtoplay.com/content/images/size/w1000/2021/02/fahrenheit.png 1000w, https://frdmtoplay.com/content/images/2021/02/fahrenheit.png 1496w" sizes="(min-width: 720px) 720px"></figure><!--kg-card-begin: markdown--><p><em>Edit</em>: Many thanks to <a href="http://dmitry.gr/">dmitrygr</a> for playing code golf on the core of the asm function!</p>
<pre><code>movw r1, #0xe677
muls r1, r0
lsrs r1, #15
add r1, #320
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><hr>
<p>Did this inspire you to go out and hack something? Say thanks and help keep this site ad &amp; analytic free by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a>. I&apos;ll receive a small portion of any purchases made within 24 hours.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><script type="text/x-mathjax-config">
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
</script>
<script type="text/javascript" async src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML">
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Self-Hosting Bitwarden without SMTP]]></title><description><![CDATA[Modify the bitwarden mssql table directly to avoid having to verify user e-mails with SMTP]]></description><link>https://frdmtoplay.com/self-hosting-bitwarden-without-smtp/</link><guid isPermaLink="false">5fd6ba82350dad112ff3e427</guid><category><![CDATA[linux]]></category><dc:creator><![CDATA[bsilvereagle]]></dc:creator><pubDate>Mon, 14 Dec 2020 01:25:44 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://bitwarden.com/">Bitwarden</a> provides docker images to self-host an open-source version of the Bitwarden server. After recent updates to the Bitwarden client which broke compatiblity with <a href="https://github.com/jcs/rubywarden/issues/122">rubywarden</a> the official image is a viable option despite requiring mssql.</p>
<p>However, to unlock Premium features the self-hosted version must have a &quot;verified&quot; e-mail address. Unfortunately, this requires setting up an SMTP relay or taking the self-hosted server onto the internet.</p>
<p>Fortunately, the &quot;verification&quot; is just a bit in the MSSQL tables, which can be trivially set without the need to click a verification e-mail link!</p>
<ol>
<li>Find the unique password for the bitwarden mssql server</li>
</ol>
<pre><code>$ cat bwdata/env/mssql.override.env 
</code></pre>
<ol start="2">
<li>Launch a shell in the mssql server docker container</li>
</ol>
<pre><code>sudo docker exec -it bitwarden-mssql /bin/bash
</code></pre>
<ol start="3">
<li>Launch the mssql client</li>
</ol>
<pre><code>root@5223f3f519cc:/opt/mssql-tools/bin# ./sqlcmd -S 127.0.0.1 -U sa -P &lt;key&gt;
</code></pre>
<ol start="4">
<li>Find the user who needs verified</li>
</ol>
<pre><code>USE master
GO
SELECT Name, Email, EmailVerified FROM [User]
GO
</code></pre>
<ol start="5">
<li>Update the <code>EmailVerified</code> field</li>
</ol>
<pre><code>UPDATE [User] SET EmailVerified = 1 WHERE [User].Name=&quot;&lt;Name&gt;&quot;
</code></pre>
<ol start="6">
<li>Wait a few minutes and then refresh the web interface</li>
</ol>
<hr>
<p>Did your security posture improve because of this post? Consider saying thanks by using my <a href="https://www.amazon.com//ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=frdmtoplay-20&amp;linkId=e105dadbd0d0a4e4941ead9973adc362">Amazon Affilliate URL</a> and help to keep this site ad &amp; analytics free.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>