<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>[hɐəmkɑ] - work</title><link href="https://haemka.de/" rel="alternate"/><link href="https://haemka.de/feeds/work.atom.xml" rel="self"/><id>https://haemka.de/</id><updated>2026-08-12T00:00:00+02:00</updated><entry><title>HowTo: The FHIR date Search Parameter – Understanding Prefixes, Intervals, and Combinations</title><link href="https://haemka.de/howto-fhir-date-parameter.html" rel="alternate"/><published>2026-08-12T00:00:00+02:00</published><updated>2026-08-12T00:00:00+02:00</updated><author><name>haemka</name></author><id>tag:haemka.de,2026-08-12:/howto-fhir-date-parameter.html</id><summary type="html">&lt;p&gt;Anyone building or querying a FHIR server sooner or later runs into the
&lt;code&gt;date&lt;/code&gt; search parameter. At first glance it looks simple:
&lt;code&gt;?date=2023-06-15&lt;/code&gt;. But as soon as prefixes like &lt;code&gt;ge&lt;/code&gt;, &lt;code&gt;sa&lt;/code&gt;, or &lt;code&gt;ap&lt;/code&gt; come
into play, and multiple &lt;code&gt;date&lt;/code&gt; parameters get combined, things get
confusing fast. This article brings …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Anyone building or querying a FHIR server sooner or later runs into the
&lt;code&gt;date&lt;/code&gt; search parameter. At first glance it looks simple:
&lt;code&gt;?date=2023-06-15&lt;/code&gt;. But as soon as prefixes like &lt;code&gt;ge&lt;/code&gt;, &lt;code&gt;sa&lt;/code&gt;, or &lt;code&gt;ap&lt;/code&gt; come
into play, and multiple &lt;code&gt;date&lt;/code&gt; parameters get combined, things get
confusing fast. This article brings order to the chaos: step by step, with
timeline graphics for every case, and a quick-reference table for fast
lookups.&lt;/p&gt;
&lt;h2 id="table-of-contents"&gt;Table of Contents&lt;a class="headerlink" href="#table-of-contents" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#table-of-contents"&gt;Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#quick-reference-all-prefixes-at-a-glance"&gt;Quick Reference: All Prefixes at a Glance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-core-principle-fhir-compares-intervals-not-points-in-time"&gt;The Core Principle: FHIR Compares Intervals, Not Points in Time&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#no-prefix-means-eq-but-precision-still-matters"&gt;No prefix means eq, but precision still matters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-nine-prefixes-at-a-glance"&gt;The Nine Prefixes at a Glance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#matching-against-period-and-range"&gt;Matching Against Period and Range&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#open-incomplete-periods"&gt;Open (Incomplete) Periods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#combining-multiple-date-parameters"&gt;Combining Multiple date Parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-full-33-matrix-of-range-combinations"&gt;The Full 3×3 Matrix of Range Combinations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#edge-cases-when-combinations-become-redundant-or-contradictory"&gt;Edge Cases: When Combinations Become Redundant or Contradictory&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#redundant-combinations"&gt;Redundant combinations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#combinations-with-a-guaranteed-empty-result"&gt;Combinations with a guaranteed empty result&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#unusual-but-valid-edge-cases"&gt;Unusual but valid edge cases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#practical-recommendations"&gt;Practical Recommendations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="quick-reference-all-prefixes-at-a-glance"&gt;Quick Reference: All Prefixes at a Glance&lt;a class="headerlink" href="#quick-reference-all-prefixes-at-a-glance" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For a fast glance in between. Details and graphics for every row follow in
the sections below.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Short rule&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;(none)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;implicit &lt;code&gt;eq&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Precision of the value determines the interval&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date=2023-06-15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eq&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;equal to&lt;/td&gt;
&lt;td&gt;Resource interval fully within the search interval&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date=eq2023-06-15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ne&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;not equal to&lt;/td&gt;
&lt;td&gt;Complement of &lt;code&gt;eq&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date=ne2023-06-15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;greater than&lt;/td&gt;
&lt;td&gt;Extends beyond the end (overlap is sufficient)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date=gt2023-06-15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;less than&lt;/td&gt;
&lt;td&gt;Begins before the start (overlap is sufficient)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date=lt2023-06-15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;greater or equal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gt&lt;/code&gt; or fully contained (&lt;code&gt;eq&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date=ge2023-06-15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;le&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;less or equal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lt&lt;/code&gt; or fully contained (&lt;code&gt;eq&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date=le2023-06-15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sa&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;starts after&lt;/td&gt;
&lt;td&gt;Entirely after, &lt;strong&gt;no&lt;/strong&gt; overlap&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date=sa2023-06-15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ends before&lt;/td&gt;
&lt;td&gt;Entirely before, &lt;strong&gt;no&lt;/strong&gt; overlap&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date=eb2023-06-15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;approximately&lt;/td&gt;
&lt;td&gt;Overlap + similar order of magnitude&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date=ap2023-06-15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Missing &lt;code&gt;start&lt;/code&gt;/&lt;code&gt;end&lt;/code&gt; on a &lt;code&gt;Period&lt;/code&gt;:&lt;/strong&gt; a missing &lt;code&gt;start&lt;/code&gt; means &lt;code&gt;-∞&lt;/code&gt;, a
missing &lt;code&gt;end&lt;/code&gt; means &lt;code&gt;+∞&lt;/code&gt;. That's why &lt;code&gt;sa&lt;/code&gt; can never match when &lt;code&gt;start&lt;/code&gt; is
missing, and &lt;code&gt;eb&lt;/code&gt; can never match when &lt;code&gt;end&lt;/code&gt; is missing (details in
&lt;a href="#4-open-incomplete-periods"&gt;Section 4&lt;/a&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-core-principle-fhir-compares-intervals-not-points-in-time"&gt;The Core Principle: FHIR Compares Intervals, Not Points in Time&lt;a class="headerlink" href="#the-core-principle-fhir-compares-intervals-not-points-in-time" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The most important mental reset first: FHIR never treats date values as an
exact point in time. It always treats them as an &lt;strong&gt;interval&lt;/strong&gt;. How wide
that interval is depends on the precision of the given value:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;2023&lt;/code&gt; → the entire year 2023&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2023-06&lt;/code&gt; → all of June 2023&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2023-06-15&lt;/code&gt; → all of June 15, 2023 (00:00–24:00)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2023-06-15T10:00:00&lt;/code&gt; → (almost) an exact point in time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every comparison operator then compares &lt;strong&gt;two intervals&lt;/strong&gt; with each other:
the search interval from your query parameter, and the resource interval
from the resource's field (e.g. &lt;code&gt;Patient.birthDate&lt;/code&gt; or
&lt;code&gt;Encounter.period&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id="no-prefix-means-eq-but-precision-still-matters"&gt;No prefix means &lt;code&gt;eq&lt;/code&gt;, but precision still matters&lt;a class="headerlink" href="#no-prefix-means-eq-but-precision-still-matters" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you don't specify a prefix, the server assumes &lt;code&gt;eq&lt;/code&gt;. The resource date
must then lie &lt;strong&gt;fully&lt;/strong&gt; within your search interval. The coarser the
precision, the wider the interval, and the more resource values fit
inside it:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Date without a prefix" src="https://haemka.de/images/fhir-date-no-prefix_en.svg"&gt;
&lt;em&gt;FHIR date search parameter WITHOUT a prefix&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;date=2023-06-15&lt;/code&gt; only matches this single day. &lt;code&gt;date=2023-06&lt;/code&gt;, on the
other hand, matches every day in June, including the 15th. That's the
most common trap for beginners: a "less precise" search query isn't
stricter, it's looser.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-nine-prefixes-at-a-glance"&gt;The Nine Prefixes at a Glance&lt;a class="headerlink" href="#the-nine-prefixes-at-a-glance" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;FHIR defines nine prefixes for &lt;code&gt;date&lt;/code&gt; in total. Each describes a different
relationship between the search interval (red dashed in the graphic) and
the matching range (colored/shaded):&lt;/p&gt;
&lt;p&gt;&lt;img alt="All prefixes at a glance" src="https://haemka.de/images/fhir-date-all-prefixes_en.svg"&gt;
&lt;em&gt;All prefixes at a glance&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eq&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;equal to&lt;/td&gt;
&lt;td&gt;Resource interval lies fully within the search interval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ne&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;not equal to&lt;/td&gt;
&lt;td&gt;Complement of &lt;code&gt;eq&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;greater than&lt;/td&gt;
&lt;td&gt;Resource interval &lt;strong&gt;extends beyond&lt;/strong&gt; the end of the search interval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;less than&lt;/td&gt;
&lt;td&gt;Resource interval &lt;strong&gt;begins before&lt;/strong&gt; the start of the search interval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;greater or equal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gt&lt;/code&gt; &lt;strong&gt;or&lt;/strong&gt; fully contained within the search interval (&lt;code&gt;eq&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;le&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;less or equal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lt&lt;/code&gt; &lt;strong&gt;or&lt;/strong&gt; fully contained within the search interval (&lt;code&gt;eq&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sa&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;starts after&lt;/td&gt;
&lt;td&gt;Begins entirely &lt;strong&gt;after&lt;/strong&gt; the end of the search interval, no overlap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ends before&lt;/td&gt;
&lt;td&gt;Ends entirely &lt;strong&gt;before&lt;/strong&gt; the start of the search interval, no overlap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;approximately&lt;/td&gt;
&lt;td&gt;Overlap, plus a similar order of magnitude between the intervals&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Important, containment vs. overlap:&lt;/strong&gt; Only &lt;code&gt;eq&lt;/code&gt; (and, implicitly,
&lt;code&gt;sa&lt;/code&gt;/&lt;code&gt;eb&lt;/code&gt;) require the resource interval to lie &lt;strong&gt;fully&lt;/strong&gt; within, or
&lt;strong&gt;fully separated&lt;/strong&gt; from, the search interval. For &lt;code&gt;gt&lt;/code&gt;, &lt;code&gt;lt&lt;/code&gt;, &lt;code&gt;ge&lt;/code&gt;, and
&lt;code&gt;le&lt;/code&gt;, an &lt;strong&gt;overlap&lt;/strong&gt; is enough: the resource interval doesn't have to lie
completely outside the search range, it just needs to extend past the
respective boundary. More on that in the next section.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="matching-against-period-and-range"&gt;Matching Against &lt;code&gt;Period&lt;/code&gt; and &lt;code&gt;Range&lt;/code&gt;&lt;a class="headerlink" href="#matching-against-period-and-range" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The graphics above show the resource date as a thin red marker. That
works for simple &lt;code&gt;date&lt;/code&gt;/&lt;code&gt;dateTime&lt;/code&gt; fields like &lt;code&gt;Patient.birthDate&lt;/code&gt;. As
soon as the target field is itself an &lt;strong&gt;interval&lt;/strong&gt; (a &lt;code&gt;Period&lt;/code&gt;, e.g.
&lt;code&gt;Encounter.period&lt;/code&gt;, &lt;code&gt;Condition.onsetPeriod&lt;/code&gt;, or a &lt;code&gt;Range&lt;/code&gt;), the
distinction between &lt;strong&gt;containment&lt;/strong&gt; (fully contained) and &lt;strong&gt;overlap&lt;/strong&gt;
(mere overlap) becomes crucial:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;eq&lt;/code&gt;&lt;/strong&gt; requires containment: the entire resource interval must lie
  within the search interval.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;gt&lt;/code&gt; / &lt;code&gt;lt&lt;/code&gt; / &lt;code&gt;ge&lt;/code&gt; / &lt;code&gt;le&lt;/code&gt;&lt;/strong&gt; only require overlap: it's enough for the
  resource interval to extend past the respective boundary, even if part
  of it lies on the "wrong" side.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sa&lt;/code&gt; / &lt;code&gt;eb&lt;/code&gt;&lt;/strong&gt; require the opposite of overlap: the resource interval
  must lie fully, and without any overlap, on the respective side.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a simple point-in-time field (no &lt;code&gt;Period&lt;/code&gt;), this distinction barely
shows, since the resource's start and end are (almost) identical. There,
&lt;code&gt;gt&lt;/code&gt; and &lt;code&gt;sa&lt;/code&gt; behave de facto the same. The difference only becomes
relevant for actual time spans. That's also why &lt;code&gt;sa&lt;/code&gt;/&lt;code&gt;eb&lt;/code&gt; are, per the
specification, primarily intended for &lt;code&gt;Period&lt;/code&gt;/&lt;code&gt;Range&lt;/code&gt; values.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; An encounter runs from June 10 to June 20. The search
&lt;code&gt;date=gt2023-06-15&lt;/code&gt; should find it, even though the encounter &lt;em&gt;started&lt;/em&gt;
before the 15th. What matters is only that it extends past the 15th
(overlap with the range "after the 15th"). With &lt;code&gt;date=sa2023-06-15&lt;/code&gt;, the
same encounter would &lt;strong&gt;not&lt;/strong&gt; match, because it doesn't lie entirely after
the 15th. That's exactly the practical difference between &lt;code&gt;gt&lt;/code&gt; and &lt;code&gt;sa&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The following graphic makes this visible for all four "one-sided" prefixes
(&lt;code&gt;gt&lt;/code&gt;, &lt;code&gt;sa&lt;/code&gt;, &lt;code&gt;lt&lt;/code&gt;, &lt;code&gt;eb&lt;/code&gt;) using the same three example periods: one
entirely before, one overlapping the boundary, and one entirely after:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Matching against Period/Range" src="https://haemka.de/images/fhir-date-period-range-matching_en.svg"&gt;
&lt;em&gt;Matching against Period/Range (containment vs. overlap)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You can clearly see: &lt;code&gt;gt&lt;/code&gt; and &lt;code&gt;lt&lt;/code&gt; (blue shaded area, solid boundary line)
let the overlapping Period B through as a match, while &lt;code&gt;sa&lt;/code&gt; and &lt;code&gt;eb&lt;/code&gt;
(dashed boundary line) reject it. Only a period lying entirely on the
correct side counts there.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Encounter timeframe&lt;/th&gt;
&lt;th&gt;&lt;code&gt;date=gt2023-06-15&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;date=sa2023-06-15&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;June 10–20 (overlaps the boundary)&lt;/td&gt;
&lt;td&gt;✅ Match (overlap)&lt;/td&gt;
&lt;td&gt;❌ No match (not entirely after)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 16–20 (entirely after)&lt;/td&gt;
&lt;td&gt;✅ Match&lt;/td&gt;
&lt;td&gt;✅ Match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 1–10 (entirely before)&lt;/td&gt;
&lt;td&gt;❌ No match&lt;/td&gt;
&lt;td&gt;❌ No match&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="open-incomplete-periods"&gt;Open (Incomplete) Periods&lt;a class="headerlink" href="#open-incomplete-periods" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In practice, periods are often &lt;strong&gt;not closed&lt;/strong&gt;, for example an ongoing
encounter without an &lt;code&gt;end&lt;/code&gt;, or an imported record with an unknown
&lt;code&gt;start&lt;/code&gt;. The FHIR standard handles this clearly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A missing lower bound (&lt;code&gt;start&lt;/code&gt;) is implicitly treated as &lt;strong&gt;less than any
real date&lt;/strong&gt; (i.e. &lt;code&gt;-∞&lt;/code&gt;). A missing upper bound (&lt;code&gt;end&lt;/code&gt;) is implicitly
treated as &lt;strong&gt;greater than any real date&lt;/strong&gt; (i.e. &lt;code&gt;+∞&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This has noticeable consequences, especially for &lt;code&gt;sa&lt;/code&gt; and &lt;code&gt;eb&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An ongoing encounter (&lt;code&gt;start&lt;/code&gt; set, &lt;code&gt;end&lt;/code&gt; missing, so &lt;code&gt;end = +∞&lt;/code&gt;) can
  &lt;strong&gt;never&lt;/strong&gt; match &lt;code&gt;eb&lt;/code&gt; (ends before). Its end never lies before any
  finite date. It will, however, match &lt;code&gt;gt&lt;/code&gt;, because its (infinite) end
  always extends beyond any search boundary.&lt;/li&gt;
&lt;li&gt;An encounter with an unknown start (&lt;code&gt;start&lt;/code&gt; missing, so &lt;code&gt;start = -∞&lt;/code&gt;)
  can &lt;strong&gt;never&lt;/strong&gt; match &lt;code&gt;sa&lt;/code&gt; (starts after). Its beginning never lies after
  any finite date. It will, however, match &lt;code&gt;lt&lt;/code&gt;, because its (infinite)
  beginning always reaches before any search boundary.&lt;/li&gt;
&lt;li&gt;A period with neither &lt;code&gt;start&lt;/code&gt; nor &lt;code&gt;end&lt;/code&gt; overlaps practically &lt;strong&gt;every&lt;/strong&gt;
  overlap-based filter (&lt;code&gt;gt&lt;/code&gt;, &lt;code&gt;lt&lt;/code&gt;, &lt;code&gt;ge&lt;/code&gt;, &lt;code&gt;le&lt;/code&gt;). By definition, it
  "extends" past every boundary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same four prefixes as in &lt;a href="#3-matching-against-period-and-range"&gt;Section 3&lt;/a&gt;,
now with open instead of closed periods:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Matching against open Period/Range" src="https://haemka.de/images/fhir-date-open-periods_en.svg"&gt;
&lt;em&gt;Matching against open (incomplete) Period/Range&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Practical consequence:&lt;/strong&gt; If you want to specifically exclude "ongoing"
resources (e.g. active encounters, open orders) from a date-range search,
&lt;code&gt;eb&lt;/code&gt;/&lt;code&gt;sa&lt;/code&gt; alone won't do it. You'll additionally need to filter by status,
or explicitly by &lt;code&gt;end:missing=true&lt;/code&gt;/&lt;code&gt;start:missing=true&lt;/code&gt;, depending on
what your server supports.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="combining-multiple-date-parameters"&gt;Combining Multiple &lt;code&gt;date&lt;/code&gt; Parameters&lt;a class="headerlink" href="#combining-multiple-date-parameters" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In practice, a single prefix is rarely enough. Usually you want to define
a &lt;strong&gt;range&lt;/strong&gt;. FHIR servers always combine multiple &lt;code&gt;date&lt;/code&gt; parameters in the
same query with &lt;strong&gt;AND&lt;/strong&gt;. Four typical patterns:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Combining multiple parameters" src="https://haemka.de/images/fhir-date-combinations_en.svg"&gt;
&lt;em&gt;Combining multiple parameters (AND logic)&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Combination&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ge&lt;/code&gt; + &lt;code&gt;le&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ge2023-01-01&amp;amp;le2023-12-31&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Closed interval (both bounds inclusive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gt&lt;/code&gt; + &lt;code&gt;lt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gt2023-01-01&amp;amp;lt2023-12-31&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open interval (both bounds exclusive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sa&lt;/code&gt; + &lt;code&gt;eb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sa2023-01-01&amp;amp;eb2023-12-31&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Strictly separated range, primarily for Period values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ge&lt;/code&gt; + &lt;code&gt;lt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ge2023-06-01&amp;amp;lt2023-07-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Half-open interval &lt;code&gt;[start, end)&lt;/code&gt;, the standard pattern for "exactly one month"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If you work with &lt;code&gt;[start, end)&lt;/code&gt; in timestamp-heavy ETL pipelines, &lt;code&gt;ge&lt;/code&gt; +
&lt;code&gt;lt&lt;/code&gt; will look familiar: it's exactly the same pattern used for classic
time-window queries in SQL.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-full-33-matrix-of-range-combinations"&gt;The Full 3×3 Matrix of Range Combinations&lt;a class="headerlink" href="#the-full-33-matrix-of-range-combinations" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The four patterns above are only the most common ones. In fact, &lt;strong&gt;any&lt;/strong&gt;
lower bound can be combined with &lt;strong&gt;any&lt;/strong&gt; upper bound:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lower bounds: &lt;code&gt;ge&lt;/code&gt;, &lt;code&gt;gt&lt;/code&gt;, &lt;code&gt;sa&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Upper bounds: &lt;code&gt;le&lt;/code&gt;, &lt;code&gt;lt&lt;/code&gt;, &lt;code&gt;eb&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That gives 3 × 3 = &lt;strong&gt;9 possible combinations&lt;/strong&gt;, all spec-compliant:&lt;/p&gt;
&lt;p&gt;&lt;img alt="3x3 matrix of range combinations" src="https://haemka.de/images/fhir-date-matrix-3x3_en.svg"&gt;
&lt;em&gt;3x3 matrix of range combinations (lower bound × upper bound)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;They differ only in whether the respective boundary is inclusive (solid
line) or exclusive (dashed line), and whether it's a simple value
comparison (&lt;code&gt;ge&lt;/code&gt;/&lt;code&gt;gt&lt;/code&gt;/&lt;code&gt;le&lt;/code&gt;/&lt;code&gt;lt&lt;/code&gt;) or a strict Period comparison
(&lt;code&gt;sa&lt;/code&gt;/&lt;code&gt;eb&lt;/code&gt;). There is &lt;strong&gt;no explicit exclusion rule&lt;/strong&gt; in the FHIR
standard. Every cell in this matrix is a valid, functioning query.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="edge-cases-when-combinations-become-redundant-or-contradictory"&gt;Edge Cases: When Combinations Become Redundant or Contradictory&lt;a class="headerlink" href="#edge-cases-when-combinations-become-redundant-or-contradictory" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Not every syntactically valid combination is practically meaningful. There
are three categories you should know about before one of them ends up in a
generated query by accident:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Edge cases in parameter combinations" src="https://haemka.de/images/fhir-date-edge-cases_en.svg"&gt;
&lt;em&gt;Edge cases in parameter combinations&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="redundant-combinations"&gt;Redundant combinations&lt;a class="headerlink" href="#redundant-combinations" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Don't change the result, but aren't technically an error either:
- &lt;code&gt;eq&lt;/code&gt; plus a boundary that's already satisfied by the &lt;code&gt;eq&lt;/code&gt; interval
  (&lt;code&gt;eq2023-06-15&amp;amp;ge2020-01-01&lt;/code&gt;): the extra condition is superfluous.
- Two conditions of the same directional type
  (&lt;code&gt;ge2020-01-01&amp;amp;ge2023-01-01&lt;/code&gt;): only the stricter (later) lower bound
  actually takes effect.&lt;/p&gt;
&lt;h3 id="combinations-with-a-guaranteed-empty-result"&gt;Combinations with a guaranteed empty result&lt;a class="headerlink" href="#combinations-with-a-guaranteed-empty-result" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Structurally impossible to satisfy:
- &lt;code&gt;eq&lt;/code&gt; + &lt;code&gt;ne&lt;/code&gt; on the same value (&lt;code&gt;eq2023-06-15&amp;amp;ne2023-06-15&lt;/code&gt;): mutually
  exclusive conditions.
- The lower bound lies after the upper bound in time
  (&lt;code&gt;ge2023-06-01&amp;amp;le2023-01-01&lt;/code&gt;): no date can satisfy both at once.&lt;/p&gt;
&lt;p&gt;The server will &lt;strong&gt;syntactically accept&lt;/strong&gt; such queries and simply return an
empty result set. Not an error, but not a helpful response either. It's
worth validating this client-side before sending the request.&lt;/p&gt;
&lt;h3 id="unusual-but-valid-edge-cases"&gt;Unusual but valid edge cases&lt;a class="headerlink" href="#unusual-but-valid-edge-cases" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Three or more &lt;code&gt;date&lt;/code&gt; parameters&lt;/strong&gt;, e.g. a year range with a single day
  excluded: &lt;code&gt;ge2023-01-01&amp;amp;le2023-12-31&amp;amp;ne2023-06-15&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ap&lt;/code&gt; combined with a boundary&lt;/strong&gt;, e.g.
  &lt;code&gt;ap2023-06-15&amp;amp;ge2023-01-01&lt;/code&gt;: rarely used, since &lt;code&gt;ap&lt;/code&gt; is already fuzzy
  by nature, and the tolerance calculation remains server-dependent.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="practical-recommendations"&gt;Practical Recommendations&lt;a class="headerlink" href="#practical-recommendations" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;For simple range filters, &lt;strong&gt;&lt;code&gt;ge&lt;/code&gt; + &lt;code&gt;lt&lt;/code&gt;&lt;/strong&gt; (half-open interval) is
  usually the most robust pattern. It avoids rounding issues at precision
  boundaries (no off-by-one when you mean "through December 31st
  inclusive").&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;&lt;code&gt;sa&lt;/code&gt;/&lt;code&gt;eb&lt;/code&gt;&lt;/strong&gt; deliberately when you need &lt;em&gt;complete&lt;/em&gt; separation on
  &lt;code&gt;Period&lt;/code&gt;/&lt;code&gt;Range&lt;/code&gt; fields (see &lt;a href="#3-matching-against-period-and-range"&gt;Section 3&lt;/a&gt;),
  e.g. "encounter entirely after discharge X". For a simple "from date X
  onward" filter, you usually mean &lt;code&gt;ge&lt;/code&gt;/&lt;code&gt;gt&lt;/code&gt;, not &lt;code&gt;sa&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For &lt;code&gt;Period&lt;/code&gt; fields with possible open ends (see
  &lt;a href="#4-open-incomplete-periods"&gt;Section 4&lt;/a&gt;), don't forget: &lt;code&gt;sa&lt;/code&gt;/&lt;code&gt;eb&lt;/code&gt;
  structurally never match there. Additionally filter by &lt;code&gt;:missing&lt;/code&gt; or
  status if needed.&lt;/li&gt;
&lt;li&gt;Before sending a multi-parameter query, it's worth a quick sanity check
  on the logical consistency between the lower and upper bound, to avoid
  empty results caused by configuration mistakes in your own pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With the quick reference above and the six graphics in mind, no prefix,
all nine prefixes individually, containment vs. overlap for Period/Range
(both open and closed), typical combinations, the full 3×3 matrix, and the
edge cases, your next &lt;code&gt;date&lt;/code&gt; query in FHIR should no longer be a mystery.&lt;/p&gt;</content><category term="work"/><category term="FHIR"/><category term="howto"/></entry><entry><title>Scientific workflow with BOOX Note Air 3 C</title><link href="https://haemka.de/boox-note-scientific-workflow.html" rel="alternate"/><published>2024-01-26T00:00:00+01:00</published><updated>2024-01-26T00:00:00+01:00</updated><author><name>haemka</name></author><id>tag:haemka.de,2024-01-26:/boox-note-scientific-workflow.html</id><summary type="html">&lt;p&gt;Recently I bought an &lt;a href="https://onyxboox.com/boox_noteair3c"&gt;ONYX BOOX Note Air 3 C&lt;/a&gt; to support my scientific workflow. In the end of last year I realized why I wasn't moving forward in my scientifc career. To be honest I was very well aware of one main reason, which was that I hadn't enough …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Recently I bought an &lt;a href="https://onyxboox.com/boox_noteair3c"&gt;ONYX BOOX Note Air 3 C&lt;/a&gt; to support my scientific workflow. In the end of last year I realized why I wasn't moving forward in my scientifc career. To be honest I was very well aware of one main reason, which was that I hadn't enough self-discipline to read the sources needed for my research, but I didn't know the reason for it until last year. It turned out that the main reason was that most of the sources were in digital form and I couldn't bring myself to read them on the computer monitor. A tablet or smartphone weren't viable alternatives either, as the displays simply tire me out too quickly.&lt;/p&gt;
&lt;p&gt;An e-book reader was a potential solution. But a colleague has been working with a Remarkable 2 for some time, which I also found very interesting. However, the reader experience with this device was not good. After some research, I decided on a Boox Note Air 3 C, which seemed the most promising in terms of reader &lt;em&gt;and&lt;/em&gt; note-taking functionality. Nevertheless, I wasn't quite sure whether I could establish a meaningful workflow for scientific work in my everyday working life with the device.&lt;/p&gt;
&lt;p&gt;After a few weeks of use, I can now say that the Note Air 3 C fully meets my expectations. My main usage scenarios so far have been reading textbooks, including annotating directly in the PDF and general note-taking. In the first few days of use, I naturally tried to get to grips with the device's on-board features. I tried to create a usable workflow with the help of the BOOX cloud and the BOOXDrop function. However, this turned out to be quite incomprehensible. Mainly because my primary operating system is a Linux system and the synchronization tools are only available for Windows and Mac OS.&lt;/p&gt;
&lt;p&gt;After a few weeks of use, I can now say that the Note Air 3 C fully meets my expectations. My main usage scenarios so far have been reading textbooks, including annotating directly in the PDF and general note-taking. In the first few days of use, I naturally tried to get to grips with the device's on-board features. I tried to create a usable workflow with the help of the BOOX cloud and the BOOXDrop function. However, this turned out to be quite incomprehensible. Mainly because my primary operating system is a Linux system and the synchronization tools are only available for Windows and Mac OS. I therefore had to carry out every synchronization process via the web browser.&lt;/p&gt;
&lt;p&gt;And even though there are tools like Marcin Juszkiewicz's &lt;a href="https://github.com/hrw/onyx-send2boox"&gt;onyx-send2boox&lt;/a&gt;, I didn't really like the idea of sending all my data through the manufacturer's cloud storage right from the start. I still have the cloud and the backup to it activated. However, my daily workflow no longer uses it.&lt;/p&gt;
&lt;p&gt;Instead, I have now established a workflow that relies mostly on self-hosted services and open source applications.&lt;/p&gt;
&lt;h1 id="web-browsing"&gt;Web browsing&lt;a class="headerlink" href="#web-browsing" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I have been using Firefox as my web browser on all my computers for ages. And I also had Firefox as the default browser on my Android smartphone. I recently switched to an iPhone, but there is also a mobile Firefox for iOS (unfortunately without add-on support).&lt;/p&gt;
&lt;p&gt;It was therefore obvious to install Firefox on the Note Air 3 C as well. Especially to be able to install add-ons. Above all uBlock Origin to block unnecessary and in the worst case (for the battery of an e-ink device) animated advertising on websites. Using Firefox on all devices allows me to &lt;a href="https://support.mozilla.org/en-US/kb/send-tab-firefox-desktop-other-devices"&gt;move tabs between devices&lt;/a&gt; at will (as long as the installation is linked to my Mozilla account). Of course, I also use a cloud service here, but the Mozilla cloud, which has been mature for years, seems far more trustworthy to me than the cloud of a Chinese hardware manufacturer. And the added convenience of synchronizing not only tabs, but also bookmarks and history is simply too great not to use it.&lt;/p&gt;
&lt;h1 id="bookmarking-read-it-later"&gt;Bookmarking (read-it-later)&lt;a class="headerlink" href="#bookmarking-read-it-later" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I have always used bookmarks in the classic sense, i.e. the bookmarks in the web browser, only as links to frequently visited websites. I have never managed short-term bookmarks in the browser bookmarks. For me, this has always been the task of read-it-later apps and services.&lt;/p&gt;
&lt;p&gt;Even though a read-it-later service has been integrated into Firefox for some time with Pocket, I have never used it. Instead, I have been running my own &lt;a href="https://www.wallabag.it/"&gt;Wallabag&lt;/a&gt; instance for some time now. I don't have much to say about this. It just works.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche"&gt;wallbag app&lt;/a&gt; runs smoothly on the Note Air 3 C and allows me to call up my read-it-later bookmarks on this device at any time. Adding entries to the app is done via the Android sharing function and therefore also allows bookmarks to be added directly from the web browser.&lt;/p&gt;
&lt;p&gt;&lt;img alt="wallabag app on BOOX Note Air 3 C" src="https://haemka.de/images/boox-note-air-3c-wallabag.jpg"&gt;
&lt;em&gt;wallabag app on BOOX Note Air 3 C&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="literature-management"&gt;Literature management&lt;a class="headerlink" href="#literature-management" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Since I personally and we in our scientific working group operate a shared library via Zotero, it was only natural that I should use it on the Note Air 3 C as well. Unfortunately, there is no Zotero app in the Play Store that works on the device. But that's only half the story.&lt;/p&gt;
&lt;p&gt;On the one hand, there is now an official &lt;a href="https://play.google.com/store/apps/details?id=org.zotero.android"&gt;Zotero app&lt;/a&gt; in the beta phase that works on the device and, on the other hand, the currently much better app &lt;a href="https://play.google.com/store/apps/details?id=com.mickstarify.zooforzotero"&gt;Zoo for Zotero&lt;/a&gt; also works. With the caveat that the latter cannot be installed from the Play Store. But a direct installation via APK (which can be obtained from relevant sources) is possible and has run without any problems for me so far. In addition, the last update of the app is from August 2021, so the lack of an automatic update by the Play Store is also a minor risk. Nevertheless, you should of course keep an eye on the development of direct APK installations and carry out a manual update if necessary.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Zoo for Zotero app on BOOX Note Air 3 C" src="https://haemka.de/images/boox-note-air-3c-zoo-for-zotero.jpg"&gt;
&lt;em&gt;Zoo for Zotero app on BOOX Note Air 3 C&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The Zotero libraries (both my personal and the group library) contain not only scientific publications relevant to the respective research, but also other specialized literature such as textbooks and links to relevant websites and blog posts.&lt;/p&gt;
&lt;p&gt;As a result, Zotero has now become the standard synchronization method for e-books for me. I simply create an entry in Zotero for a new e-book using the ISBN and then attach the file to the entry. On the Note Air 3 C, I can sync the e-book (or any academic paper) directly from the Zoo for Zotero app. PDFs and also EPUBs are opened directly in the BOOX Neo Reader app, so that annotations are possible out of the box.&lt;/p&gt;
&lt;p&gt;The only drawback is that the annotated files are of course not synchronized directly back into Zotero. On the other hand, with regard to the group library, this is perhaps not such a bad thing. After all, not all of my colleagues want to have my annotations in their library.&lt;/p&gt;
&lt;h1 id="clipboard-sharing"&gt;Clipboard sharing&lt;a class="headerlink" href="#clipboard-sharing" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Occasionally I also need a quick way to simply transfer the clipboard from my computer to the Note Air 3 C or vice versa. Since I run Linux desktop systems on all my computers, as mentioned above, the best option in my opinion is &lt;a href="https://apps.kde.org/de/kdeconnect/"&gt;KDE Connect&lt;/a&gt;. This not only offers clipboard sharing, but also functions such as sharing notifications or remote input.&lt;/p&gt;
&lt;p&gt;Even though it is called KDE Connect, it is also compatible with GNOME desktops thanks to the &lt;a href="https://extensions.gnome.org/extension/1319/gsconnect/"&gt;GSConnect extension&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="ai-assistance"&gt;AI assistance&lt;a class="headerlink" href="#ai-assistance" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Even if it doesn't look particularly good on the e-ink display due to the heavily animated live output, the &lt;a href="https://play.google.com/store/apps/details?id=com.openai.chatgpt"&gt;official ChatGPT app&lt;/a&gt; can be used. But I only use it when I really don't have any other device to hand, which is never the case as I always have at least one smartphone nearby. And despite the smaller display, the usability is far better here.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ChatGPT app on BOOX Note Air 3 C" src="https://haemka.de/images/boox-note-air-3c-chatgpt.jpg"&gt;
&lt;em&gt;ChatGPT app on BOOX Note Air 3 C&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="collaboration"&gt;Collaboration&lt;a class="headerlink" href="#collaboration" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Since we use Jira and Confluence as collaboration tools in our working group, I also use the official apps for &lt;a href="https://play.google.com/store/apps/details?id=com.atlassian.jira.server"&gt;Jira Data Center&lt;/a&gt; and &lt;a href="https://play.google.com/store/apps/details?id=com.atlassian.confluence.server"&gt;Confluence Data Center&lt;/a&gt;. But here, too, I have to say that I only use the apps when I don't have another device to hand. So I can only say that they work and are easy to use, but I haven't done any in-depth usage analysis.&lt;/p&gt;
&lt;h1 id="e-mail"&gt;E-mail&lt;a class="headerlink" href="#e-mail" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;As you may have guessed from the previous paragraphs, I don't really use the Note Air 3 C as a tablet in the classic sense. Nevertheless, I occasionally need to open an email on the tablet. I think that any standard email client should work on the device, but for the sake of completeness I'll also mention that Marcel Bokhost's brilliant open source email client &lt;a href="https://play.google.com/store/apps/details?id=eu.faircode.email"&gt;FairEmail&lt;/a&gt; works wonderfully on the device.&lt;/p&gt;
&lt;h1 id="calendar-and-contacts"&gt;Calendar (and contacts)&lt;a class="headerlink" href="#calendar-and-contacts" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Calendar access (and synchronization) is another functionality that I don't need all the time. But every now and then it is useful to be able to view my calendar on the Note Air 3 C. Since I synchronize my calendar (also on other devices) via CalDav (and my contacts via CardDav), I simply use &lt;a href="https://play.google.com/store/apps/details?id=at.bitfire.davdroid"&gt;DAVx⁵&lt;/a&gt; on the device to synchronize calendar and contacts.&lt;/p&gt;
&lt;p&gt;As the device does not come with a calendar or contacts app as standard, these have to be installed later. I've been a big fan of the &lt;a href="https://play.google.com/store/apps/details?id=com.simplemobiletools.calendar"&gt;Simple Calendar&lt;/a&gt; and &lt;a href="https://play.google.com/store/apps/details?id=com.simplemobiletools.contacts"&gt;Simple Contacts&lt;/a&gt; apps for years. However, I must mention that I always use the Pro versions. So it may be that the free version lacks features or has other disadvantages.&lt;/p&gt;
&lt;h1 id="public-libraries"&gt;Public libraries&lt;a class="headerlink" href="#public-libraries" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;As I live in Germany, I was particularly interested in whether and how well the &lt;a href="https://play.google.com/store/apps/details?id=de.etecture.ekz.onleihe"&gt;Onleihe app&lt;/a&gt; for german public libraries works on the BOOX Note Air 3 C. What can I say? What can I say, it works, but the app looks very restless on the E-Ink display due to the many color representations. Although you can also change the color scheme to a dark standard theme, the green areas (visible in the screenshot below) still look very uneven, as the black used then does not form a uniform color area. Therefore, it doesn't really invite you to browse, but it's enough to quickly borrow an e-book or an e-magazine.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Onleihe on BOOX Note Air 3 C" src="https://haemka.de/images/boox-note-air-3c-onleihe1.jpg"&gt;
&lt;em&gt;Onleihe on BOOX Note Air 3 C&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Also reading electronic newspaper via the Onleihe App works quite well. Of course, you need to zoom quite a lot to compensate for the number of columns in a daily newspaper.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Reading newspaper via Onleihe app on BOOX Note Air 3 C" src="https://haemka.de/images/boox-note-air-3c-onleihe2.jpg"&gt;
&lt;em&gt;Reading newspaper via Onleihe app on BOOX Note Air 3 C&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="alternative-app-store"&gt;Alternative app store&lt;a class="headerlink" href="#alternative-app-store" title="Permanent link"&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://f-droid.org"&gt;F-Droid&lt;/a&gt; can be installed on the Note Air 3 C not only to have an alternative to the Play Store, but also to be able to install open source apps that may not have been released for the device in the Play Store. This also allows the installation of free builds for some apps, which offer the full range of functions that would otherwise only be available via a Pro upgrade.&lt;/p&gt;</content><category term="work"/><category term="scientific workflow"/><category term="collaboration"/><category term="literature management"/></entry></feed>