<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="https://blog.reciperadar.com/xml/base.min.xml" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Operations on RecipeRadar Blog</title>
    <link>https://blog.reciperadar.com/tags/operations/</link>
    <description>Recent content in Operations on RecipeRadar Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Wed, 01 Jul 2026 00:00:00 +0000</lastBuildDate>
    <atom:link rel="self" href="https://blog.reciperadar.com/tags/operations/feed.xml" type="application/rss+xml" />
    <item>
      <title>Maintenance: upcoming RecipeRadar server migration</title>
      <link>https://blog.reciperadar.com/posts/server-migration/</link>
      <pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/server-migration/</guid>
      <description>&lt;p&gt;The RecipeRadar website and recipe search APIs are currently hosted on a single home computer system, previously used a general-purpose desktop workstation and gaming computer.&lt;/p&gt;
&lt;p&gt;That computer will soon need to be powered-down, potentially for a duration of weeks.&lt;/p&gt;
&lt;p&gt;So the question arises: how can we keep the RecipeRadar application running during that time window?&lt;/p&gt;
&lt;p&gt;The answer is that we are renting some temporary Virtual Private Server hosting from &lt;a href=&#34;https://www.123-reg.co.uk&#34;&gt;123-reg.co.uk&lt;/a&gt;, the same company that manages the DNS records for RecipeRadar.&lt;/p&gt;
&lt;p&gt;As a user of RecipeRadar: you should not notice any functional changes in the RecipeRadar application during or after this migration.&lt;/p&gt;
&lt;p&gt;Because the server we are renting will have different computing resources (CPU speed, memory, network) and will be located elsewhere, you may, however, notice some differences in speed/performance of RecipeRadar.&lt;/p&gt;
&lt;p&gt;In addition, the IP address and TLS (aka SSL, HTTPS) certificate for RecipeRadar will change.&lt;/p&gt;
&lt;p&gt;The updated IP address for RecipeRadar will be: &lt;code&gt;37.148.205.122&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The DNS &lt;strong&gt;B&lt;/strong&gt; record &amp;ndash; the &lt;a href=&#34;https://blog.reciperadar.com/posts/dns-webintegrity/&#34;&gt;&lt;em&gt;webintegrity&lt;/em&gt; record&lt;/a&gt; for the RecipeRadar application that runs on your device when you use RecipeRadar &amp;ndash; will &lt;strong&gt;not&lt;/strong&gt; change during the migration, although it may be updated again when future application updates are applied.&lt;/p&gt;
&lt;p&gt;For more details and to follow progress on the tasks that take place during the server migration, visit: &lt;a href=&#34;https://codeberg.org/openculinary/infrastructure/issues/69&#34;&gt;https://codeberg.org/openculinary/infrastructure/issues/69&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>WebIntegrity: a prototype for DNS-based website integrity</title>
      <link>https://blog.reciperadar.com/posts/dns-webintegrity/</link>
      <pubDate>Sat, 17 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/dns-webintegrity/</guid>
      <description>&lt;p&gt;RecipeRadar attempts to provide a transparent, reliable and trustworthy recipe search experience.  On this blog, we&amp;rsquo;ve previously written about a key aspect of that: our principle of using Open Source software whenever possible.&lt;/p&gt;
&lt;p&gt;However, declaring that we use open source software does not, in itself, provide assurance of service integrity.  In particular: transparent and reassuring documentation about a named network communication service is a necessary prerequisite for trust, but users should also confirm that that they are indeed connected to that same named service &amp;ndash; and not some other intermediatry.&lt;/p&gt;
&lt;p&gt;In information security, a classic disruptive pattern that aims to subvert even the most honest of communications is the &lt;a href=&#34;https://cwe.mitre.org/documents/glossary/index.html#Adversary-in-the-Middle&#34;&gt;Adversary-in-the-Middle attack&lt;/a&gt;.  When we send a letter to a friend, we would like to assume that they (and only they) receive it.  However, were someone else be able to intercept that message, then, in the absence of other protective measures, that intermediate person could create a subtly-adjusted forgery, and &lt;a href=&#34;https://www.newscientist.com/article/mg21228440-700-dot-dash-diss-the-gentleman-hackers-1903-lulz/&#34;&gt;perhaps&lt;/a&gt; send that on to the intended recipient.&lt;/p&gt;
&lt;p&gt;There are various ways to guard against this kind of disruption.  Two powerful techniques include: agreement of pre-shared authentication measures &amp;ndash; ways for each partner to confirm that their messages are genuinely from each other, and that an adversary is unlikely to be aware of &amp;ndash; and the use of multiple channels of communication, so that an adversary would find it more difficult to intercept all of the relevant communications, something that they might need to do to keep their fabricated story believable.&lt;/p&gt;
&lt;p&gt;RecipeRadar provides service as part of the World Wide Web, one of the most (if not the most) open and democratic network environments that we are aware of.  On the web, service provision typically involves two key technologies: the &lt;a href=&#34;https://www.ietf.org/rfc/rfc1035.txt&#34;&gt;Domain Name Service&lt;/a&gt; (DNS) protocol &amp;ndash; operated by Internet infrastructure providers &amp;ndash; and the &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc7231&#34;&gt;HyperText Transfer Protocol&lt;/a&gt; (HTTP) &amp;ndash; operated by individual website owners.&lt;/p&gt;
&lt;p&gt;Commonly-received wisdom on the web states that using Transport Layer Security (TLS) - sometimes anachronistically referred to as Secure Sockets Layer (SSL) - can provide integrity.  In brief: TLS is the feature that distinguishes plain-text HTTP communication from encrypted HTTPS communication: on the public web, TLS is implemented using public-key cryptography in combination with strict governance of the Certificate Authorities (CAs) who are able to mint trusted certificates.&lt;/p&gt;
&lt;p&gt;It is true that TLS does provide integrity: if you are connected to a web service that uses TLS, then the messages sent to-and-fro can leverage the cryptographic properties of the communication channel to confirm, to a very high degree of probability, that messages have not been tampered with.  However, typically only the pair of communicating peers are able to observe those communications, and as a result, the recourse available to a client communicating with an individual server that has obtained a valid certificate through dubious means is limited.&lt;/p&gt;
&lt;p&gt;Is there a way that we could achieve integrity for web users without relying upon secrecy?  We believe that there is - and we bootstrap our approach using an existing W3C standard called &lt;a href=&#34;https://www.w3.org/TR/SRI/&#34;&gt;SubResource Integrity&lt;/a&gt; (SRI).&lt;/p&gt;
&lt;p&gt;SubResource Integrity allows a web browser &amp;ndash; an HTTP client &amp;ndash; to check whether the files (resources) mentioned on a webpage have the expected content if the browser chooses to download them.  To do this, the webpage must mention not only the filename, but it must also provide an &lt;code&gt;integrity&lt;/code&gt; attribute that contains a checksum &amp;ndash; or multiple checksums &amp;ndash; corresponding to the expected content.&lt;/p&gt;
&lt;p&gt;So, when your browser downloads the &lt;code&gt;index.html&lt;/code&gt; page for RecipeRadar, we include the &lt;code&gt;integrity&lt;/code&gt; HTML attribute on various subresources referenced in the page.  So far, so good; but how can you trust that you have received the intended &lt;code&gt;index.html&lt;/code&gt; page?&lt;/p&gt;
&lt;p&gt;Our solution is naive and limited, but is backwards and sideways compatible: we re-use the checksum format specified by W3C SRI, and place it into a DNS &lt;code&gt;B&lt;/code&gt; TXT record.  At the time of writing, RecipeRadar returns the following responses from a DNS TXT query:&lt;/p&gt;

  

&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ dig -t TXT reciperadar.com

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.20.0-Debian &amp;lt;&amp;lt;&amp;gt;&amp;gt; -t TXT reciperadar.com
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 29630
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;reciperadar.com.               IN      TXT

;; ANSWER SECTION:
reciperadar.com.        3600    IN      TXT     &amp;#34;v=spf1 include:_spf.google.com ~all&amp;#34;
reciperadar.com.        3600    IN      TXT     &amp;#34;B=sha512-zq+vAQPEmB9RpcNiexq0+GLJqGsWim5jZskS1OtdnohK15D+UbQxGmKEeHQgEDiX1bK4c3CdygHdRlOlLEsGEQ== sha512-eRMiiXuO5gHP0byDCCxlc3KqA29H7SE+6y20/73cYEIiv7/m9ottwYm5GSbrjL6hhH9+JBPbD6s7a0rk3ZmSHA==&amp;#34;

;; AUTHORITY SECTION:
reciperadar.com.        3600    IN      NS      ns29.domaincontrol.com.
reciperadar.com.        3600    IN      NS      ns30.domaincontrol.com.

;; Query time: 36 msec
;; SERVER: 192.168.0.1#53(192.168.0.1) (UDP)
;; WHEN: Fri Aug 16 23:05:36 BST 2024
;; MSG SIZE  rcvd: 350&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This communicates that an &lt;code&gt;HTTP GET /&lt;/code&gt; &amp;ndash; a web request to the root path of an HTTP server &amp;ndash; to the &lt;code&gt;reciperadar.com&lt;/code&gt; domain &amp;ndash; is expected to return content that matches one of the two SHA512 hash values included in the &lt;code&gt;B&lt;/code&gt; record.  Any other response content should be considered problematic by the HTTP client.&lt;/p&gt;
&lt;p&gt;Publishing more than one active checksum means that we can deploy an updated version of our static web application while simultaneously allowing for the existing/stale version to remain valid.  When we become confident that clients reading current DNS results should receive fresh HTTP content, we can remove the outdated checksum.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Niche Software Libraries: Volume I</title>
      <link>https://blog.reciperadar.com/posts/niche-software-libraries-vol-i/</link>
      <pubDate>Tue, 19 Sep 2023 12:53:54 +0100</pubDate>
      <guid>https://blog.reciperadar.com/posts/niche-software-libraries-vol-i/</guid>
      <description>&lt;p&gt;When it&amp;rsquo;s going well, software development can be as enjoyable and straightforward as building a model from &lt;a href=&#34;https://www.lego.com&#34;&gt;LEGO bricks&lt;/a&gt;: you have an idea or a goal in mind, and you begin to scour through the available components to put together the intended result.  If you&amp;rsquo;re lucky, you find detailed instructions &amp;ndash; requirements and &lt;a href=&#34;https://about.readthedocs.com/&#34;&gt;documentation&lt;/a&gt; &amp;ndash; to help you along your way.&lt;/p&gt;
&lt;p&gt;Meanwhile, one of the reasons that open source software has become so successful over the past few decades is that different software developers are frequently looking for components that match similar requirements when they&amp;rsquo;re building systems.  Regardless of the size of a software project or the industry that it relates to, common challenges appear again and again during development: parsing text, storing structured data, monitoring system uptime.. the list is endless.  And thanks to the Internet, once a previously-unsolved problem has been addressed, it&amp;rsquo;s straightforward to share and distribute the code that filled the gap.&lt;/p&gt;
&lt;p&gt;Over time, this creates a form of self-improving software community workshop where developers can demonstrate that their components are the most useful, highest quality, best tested, well maintained and easiest to use &amp;ndash; and then selectively retrofit and improve their own workflows and projects based on each other&amp;rsquo;s contributions.  The rewards for participating are numerous: there&amp;rsquo;s a feelgood factor when authors learn that they&amp;rsquo;ve enabled someone else to achieve something, there&amp;rsquo;s a name recognition factor, there&amp;rsquo;s the possibility to discover career opportunities, there&amp;rsquo;s social interaction, and there&amp;rsquo;s the chance to share the development workload.. not to mention the satisfaction gained from using the software as it improves, or the potential to obtain funding to develop it.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;The workshop of a ship&amp;rsquo;s carpenter at the Altonaer Museum in Hamburg, Germany&#34; src=&#34;https://blog.reciperadar.com/images/schiffszimmerers-werkstatt.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;The resulting software commons - which has no single authority or geography - has produced widely publicised projects such as the &lt;a href=&#34;https://www.kernel.org&#34;&gt;Linux kernel&lt;/a&gt;, &lt;a href=&#34;https://www.gnu.org/software/coreutils/coreutils.html&#34;&gt;GNU Coreutils&lt;/a&gt;, and &lt;a href=&#34;https://www.postgresql.org&#34;&gt;PostgreSQL database&lt;/a&gt; that have undoubtedly altered the course of computing history - and in doing so, have made software easier, cheaper and less time-consuming to access, deploy, learn, and improve upon.&lt;/p&gt;
&lt;p&gt;This post is about some of the smaller, lesser-known libraries that RecipeRadar has investigated and selected for specific functionality so far.  As a reminder: our objective is to provide completely free recipe search and meal planning to the general public, and to build that functionality in the open, using &lt;a href=&#34;https://en.wikipedia.org/wiki/Free_and_open-source_software&#34;&gt;free and open source software&lt;/a&gt; (FOSS).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;peer-base and yjs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Today, RecipeRadar exists as a &lt;em&gt;single-user&lt;/em&gt; application: you open it on your computer, tablet or smartphone, and although your device communicates with the &lt;a href=&#34;https://github.com/openculinary/api/&#34;&gt;RecipeRadar API&lt;/a&gt;, your copy of the app does not communicate with anyone else&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;In the past we&amp;rsquo;ve experimented with introducing &lt;a href=&#34;https://en.wikipedia.org/wiki/Peer-to-peer&#34;&gt;peer-to-peer networking&lt;/a&gt; to enable scalable and fault-tolerant &lt;em&gt;multi-user&lt;/em&gt; interaction: a shared app session could exist across two or more smartphones, perhaps even during outages of the RecipeRadar search service.  The initial &lt;a href=&#34;https://www.usability.gov/how-to-and-tools/methods/use-cases.html&#34;&gt;use case&lt;/a&gt; for that was to enable multi-person households to co-ordinate food shopping; a companion task to meal planning.&lt;/p&gt;
&lt;p&gt;One of the core challenges in a peer-to-peer user application is how to maintain consistent state between each client &amp;ndash; in other words, for each user to have the same model of the world while they use the application.  This is particularly tricky because user devices aren&amp;rsquo;t online continuously.  Your housemate might turn on airplane mode to save battery while doing the weekly shopping, and you might be editing the shopping list from home at the same time.  What happens to the combined edits from both of you when your housemate re-activates their data connection?&lt;/p&gt;
&lt;p&gt;The job of a good technology library is to hide (or to &lt;a href=&#34;https://en.wikipedia.org/wiki/Abstraction_layer&#34;&gt;&amp;lsquo;abstract&amp;rsquo;&lt;/a&gt;, to use industry terminology) as many of the details of questions like these from developers.  Writing a library that exposes a sensible set of operations that makes it easy and straightforward to achieve objectives while making it difficult or impossible to misuse the system is a large part of &lt;a href=&#34;https://www.redhat.com/en/topics/api/what-is-api-design&#34;&gt;good API design&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Among libraries that provide support for multi-party data consistency, there are two popular modern schools of design: &lt;a href=&#34;https://en.wikipedia.org/wiki/Operational_transformation&#34;&gt;Operational Transformations&lt;/a&gt; have proven popular in some cloud-based collaboration suites, and &lt;a href=&#34;https://crdt.tech/&#34;&gt;Conflict-free Replicated DataTypes&lt;/a&gt; provide an alternative that does not require a central co-ordination authority - arguably a benefit, but also a drawback under some circumstances, because the ability to decide what edits are valid can be difficult in a distributed environment, and especially so in situations where some clients may be untrusted or have software bugs (that is: reality).&lt;/p&gt;
&lt;p&gt;We decided to explore the edge of what&amp;rsquo;s technically feasible, and began exploring CRDTs.  Of the available CRDT libraries compatible with the ecosystem of our application (JavaScript within a web browser context), two libraries in particular appeared promising to us:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/peer-base/peer-base/&#34;&gt;&lt;code&gt;peer-base&lt;/code&gt;&lt;/a&gt; - a library to assist the construction of distributed peer-to-peer applications; there isn&amp;rsquo;t much evidence of developer activity in the past few years although there is at least one impressive video demonstration of an app that uses the library: &lt;a href=&#34;https://github.com/jbenet/peer-chess/&#34;&gt;&lt;code&gt;peer-chess&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/yjs/yjs/&#34;&gt;&lt;code&gt;yjs&lt;/code&gt;&lt;/a&gt; - an actively-maintained and fairly popular CRDT-based library that provides integrations with some existing text editing components, including &lt;a href=&#34;https://prosemirror.net/&#34;&gt;ProseMirror&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also learned about &lt;a href=&#34;https://github.com/FujitsuLaboratories/cattaz/&#34;&gt;Cattaz&lt;/a&gt;, a research project by Fujitsu Labs that builds upon YJS to demonstrate rich collaborative editing capabilities as part of a wiki-based document editing tool.&lt;/p&gt;
&lt;p&gt;RecipeRadar is registered as a company in the United Kingdom, and although it may be an overly-cautious interpretation of the &lt;a href=&#34;https://www.gov.uk/government/publications/draft-online-safety-bill&#34;&gt;draft Online Safety Bill&lt;/a&gt; regulations, we determined that allowing our users to communicate with each other, even within a potentially limited scope such as shopping list contents, could open us up to additional technical compliance requirements.  Such functionality may still prove worthwhile in future, but we&amp;rsquo;d like to wait to see how the regulatory landscape evolves before spending development effort in this area.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;recipe-scrapers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Retrieving recipes from the world wide web and making them searchable is the core of what RecipeRadar does, and the &lt;a href=&#34;https://github/com/hhursev/recipe-scrapers/&#34;&gt;&lt;code&gt;recipe-scrapers&lt;/code&gt;&lt;/a&gt; library is a key component that simplifies that process for us: it is a library that accepts the HTML of a recipe webpage as input, and it provides access to discrete recipe-related fields (the title of the recipe, the author&amp;rsquo;s name, the list of ingredients, and so on) as output.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;A woodworking worktop with some work-in-progress chopsticks&#34; src=&#34;https://blog.reciperadar.com/images/chopsticks.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Where possible, &lt;code&gt;recipe-scrapers&lt;/code&gt; reads recipe information from a standard &lt;a href=&#34;https://schema.org/Recipe&#34;&gt;&lt;code&gt;schema.org&lt;/code&gt; format&lt;/a&gt; that many recipe websites have adopted - and in situations where that isn&amp;rsquo;t possible, it can attempt to find the same data using another library, &lt;a href=&#34;https://beautiful-soup-4.readthedocs.io/en/latest/&#34;&gt;&lt;code&gt;beautifulsoup&lt;/code&gt;&lt;/a&gt; that is purpose-designed to query the contents of HTML and XML documents.&lt;/p&gt;
&lt;p&gt;We chose to integrate &lt;code&gt;recipe-scrapers&lt;/code&gt; partly because the programming language that it&amp;rsquo;s written in, &lt;a href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt;, is the one that we&amp;rsquo;re most familiar with and that we use throughout most of the the RecipeRadar &lt;a href=&#34;https://en.wikipedia.org/wiki/Solution_stack&#34;&gt;technology stack&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;recipe-scrapers&lt;/code&gt; has a friendly, collaborative developer community that we participate in, and we try to walk a careful line of encouraging and improving the functionality that the library provides while not pulling it in a direction that favours RecipeRadar to the detriment of others.  Generally we expect that the use cases we have for the library are similar to those of other people who use it &amp;ndash; that is to say, we think that our incentives are broadly aligned with those of its&amp;rsquo; community, and we consider it important to maintain that alignment.&lt;/p&gt;
&lt;p&gt;It doesn&amp;rsquo;t do &lt;em&gt;everything&lt;/em&gt; that we need; &lt;code&gt;recipe-scrapers&lt;/code&gt; won&amp;rsquo;t extract ingredient names, quantities and units from each line in an ingredient list, for example.  But in software, that can be a good thing: each component should focus on what it does well, and subtasks can be delegated.  Roughly speaking this is referred to as the &lt;a href=&#34;https://en.wikipedia.org/wiki/Separation_of_concerns&#34;&gt;principle of separation of concerns&lt;/a&gt; in software engineering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;hashedindex&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Search engine technology is important throughout RecipeRadar - not only to provide the recipe search functionality that we make accessible through our web application, but also during processing of recipe text.&lt;/p&gt;
&lt;p&gt;Part of our work involves maintaining a dataset of more than two thousand named products (ingredients).  We use that dataset as a reference when we crawl recipes from the web, and we attempt to annotate each ingredient listing with a relevant product name.&lt;/p&gt;
&lt;p&gt;Matching that text is itself a search problem: what is the best product match within a snippet of text such as &lt;code&gt;block of cheddar, finely grated&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;To produce the answer to that question (&lt;code&gt;cheddar&lt;/code&gt;), we &lt;a href=&#34;https://github.com/openculinary/knowledge-graph/blob/73d44627369728458cff9b6f5278948f5c71ec46/web/models/product_graph.py#L15-L38&#34;&gt;build a search index of known product names&lt;/a&gt;, and then we use the input text &amp;ndash; the ingredient&amp;rsquo;s description &amp;ndash; as a &lt;a href=&#34;https://github.com/openculinary/knowledge-graph/blob/73d44627369728458cff9b6f5278948f5c71ec46/web/ingredients.py#L58-L67&#34;&gt;query to find and rank the results&lt;/a&gt;.  That might seem slightly counter-intuitive: we&amp;rsquo;re using content from the web as a query, and searching across a set of documents that are typically very short - &lt;code&gt;cheddar&lt;/code&gt; is likely the entire content of the document we&amp;rsquo;re looking for in the given example.  This contrasts to most search engine use cases, where queries are usually shorter than the documents that are retrieved &amp;ndash; but in this case, the situation is reversed.&lt;/p&gt;
&lt;p&gt;Why did we use search engine technology to implement this solution?  Well, it&amp;rsquo;s largely because it&amp;rsquo;s an area of technology designed to deal with the kind of linguistic ambiguity that occurs in text that was written by and intended for humans, where spelling mistakes and differing word endings (plurals, for example) can occur, and where ranking of multiple potentially-relevant results can be important.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/MichaelAquilina/hashedindex/&#34;&gt;&lt;code&gt;hashedindex&lt;/code&gt;&lt;/a&gt; library provides a neat Python-based implementation of text tokenization and search indexing, providing the basis for our in-process Python product search technology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thanks!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s all for this post!  Thanks for reading - we&amp;rsquo;ll share what we&amp;rsquo;ve learned about more of the open source libraries used within RecipeRadar on this blog in future.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Ingredient parsing: handling plurality</title>
      <link>https://blog.reciperadar.com/posts/ingredient-parsing-handling-plurality/</link>
      <pubDate>Thu, 25 Feb 2021 18:01:12 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/ingredient-parsing-handling-plurality/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is the second post in a &lt;a href=&#34;https://blog.reciperadar.com/tags/parsing/&#34;&gt;series&lt;/a&gt; that explores the technology that RecipeRadar uses to process and store recipe ingredients&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;https://blog.reciperadar.com/posts/introduction-to-ingredient-parsing/&#34;&gt;part one&lt;/a&gt;, we introduced a simplified version of the data model and XML format that RecipeRadar uses to represent ingredient information.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll explain how we handle singular and plural ingredient names for English-language ingredient text.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s begin by presenting two of RecipeRadar&amp;rsquo;s ingredient search use cases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use case 1: Search-by-ingredients&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;RecipeRadar should allow users to search based on the ingredients they have available, without having to specify quantities.  A user may have tofu and a red onion available at home, for example, and may want to exclude recipes that contain beef.&lt;/p&gt;
&lt;p&gt;In English, the words &amp;rsquo;tofu&amp;rsquo; and &amp;lsquo;beef&amp;rsquo; do not have plural forms, so we will focus on the &amp;lsquo;red onion&amp;rsquo; ingredient.&lt;/p&gt;
&lt;p&gt;For this user&amp;rsquo;s query, we&amp;rsquo;d like our search results to include recipes that contain &lt;em&gt;either&lt;/em&gt; &lt;code&gt;red onion&lt;/code&gt; (singular) &lt;em&gt;or&lt;/em&gt; &lt;code&gt;red onions&lt;/code&gt; (plural) as ingredients.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use case 2: Ingredient autocompletion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;RecipeRadar should provide relevant &lt;a href=&#34;https://en.wikipedia.org/wiki/Autocomplete&#34;&gt;autocompletion&lt;/a&gt; suggestions when the user begins entering an ingredient name.&lt;/p&gt;
&lt;p&gt;For example, if the user has entered the characters &lt;code&gt;green ol&lt;/code&gt;, then we may want to display either &lt;code&gt;green olive&lt;/code&gt; or &lt;code&gt;green olives&lt;/code&gt; as a suggestion, but we do &lt;em&gt;not&lt;/em&gt; want to display both &amp;ndash; they are the same ingredient.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design Considerations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As with many system design problems, there is more than one possible solution, and &lt;a href=&#34;https://en.wikipedia.org/wiki/Trade-off&#34;&gt;trade-offs&lt;/a&gt; are involved when choosing an approach.&lt;/p&gt;
&lt;p&gt;Some of the questions that we asked ourselves were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How can we ensure that a query for an ingredient will match recipes that contain it in either singular or plural form?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How can we determine whether to suggest the singular or plural form of an ingredient during autocompletion?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How can we minimize application complexity?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How can we ensure that search responses are returned quickly?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Chosen Approach&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We currently use the following strategy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Store the original plurality for each ingredient named in the source recipe&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Also&lt;/em&gt; store the singular form of each ingredient name&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Require that searches use the singular form of the ingredient name&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To determine suggestion plurality, count the number of times singular vs plural was used, and display the more &amp;lsquo;popular&amp;rsquo; form&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach is relatively wasteful in terms of storage, since we store both the original and singular forms of each ingredient.&lt;/p&gt;
&lt;p&gt;However, it is also relatively simple to explain and implement, and can be achieved without managing a set of &amp;lsquo;preferred pluralities&amp;rsquo; for each ingredient.&lt;/p&gt;
&lt;p&gt;It also has a nice property that it will automatically adjust to reflect content retrieved from the web.  For example, if most recipes switch from using a traditionally singular ingredient name to a plural form in future, then RecipeRadar&amp;rsquo;s suggestions will adapt to that over time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation Reference&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At the time this article was written, most of the relevant code is found in these places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Storage: the &lt;a href=&#34;https://github.com/openculinary/backend/blob/5382aea14d256dd471d5529592ac5632e520eb7d/reciperadar/models/recipes/ingredient.py#L54-L59&#34;&gt;product name and related fields&lt;/a&gt; in the RecipeRadar ingredient model&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Storage: the &lt;a href=&#34;https://github.com/openculinary/backend/blob/5382aea14d256dd471d5529592ac5632e520eb7d/scripts/update-recipe-index.py#L49-L59&#34;&gt;ingredient product properties&lt;/a&gt; stored in the &lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.11/mapping.html&#34;&gt;Elasticsearch Mapping&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Autosuggest: the &lt;a href=&#34;https://github.com/openculinary/api/blob/ae5c00d5e25ed51f5d832910f38bfd9969934929/reciperadar/search/ingredients.py#L33-L69&#34;&gt;plurality detection code&lt;/a&gt;, which uses &lt;a href=&#34;https://www.elastic.co/guide/en/elasticsearch/reference/7.11/search-aggregations.html&#34;&gt;Elasticsearch Aggregations&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User interface: the &lt;a href=&#34;https://github.com/openculinary/frontend/blob/fcc8ffb02d50bb6dfb17a5be362356f31ef33e8e/src/app/autosuggest.js#L31-L37&#34;&gt;autosuggest result processing code&lt;/a&gt;, which uses the &lt;a href=&#34;https://github.com/select2/select2/&#34;&gt;select2&lt;/a&gt; library to place each ingredient&amp;rsquo;s &lt;em&gt;singular&lt;/em&gt; name into input fields, where they are later &lt;a href=&#34;https://github.com/openculinary/frontend/blob/fcc8ffb02d50bb6dfb17a5be362356f31ef33e8e/src/app/views/search.js#L37-L38&#34;&gt;retrieved when a search is performed&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Keeping busy with maintenance and bugfixes</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2021-02-12/</link>
      <pubDate>Fri, 12 Feb 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2021-02-12/</guid>
      <description>&lt;p&gt;The team learned of some existing issues in the &lt;a href=&#34;https://github.com/psf/black/&#34;&gt;&lt;code&gt;black&lt;/code&gt;&lt;/a&gt; Python code formatter that we use to format some of our published code, and is providing time to help.&lt;/p&gt;
&lt;p&gt;The team has also been working on maintenance and bugfixes since the last fortnightly update:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Preparations have been put in place to update RecipeRadar when the release of &lt;a href=&#34;https://github.com/sqlalchemy/sqlalchemy/&#34;&gt;&lt;code&gt;SQLAlchemy&lt;/code&gt;&lt;/a&gt; v1.4 lands, which is anticipated within the next few weeks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A serious user-facing bug that prevent recipe scaling was &lt;a href=&#34;https://github.com/openculinary/frontend/issues/191&#34;&gt;identified and fixed&lt;/a&gt; - we believe that this affected users who retrieved the application between 2021-01-06 and 2021-02-08&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have migrated handling of fractional amounts in the application to use a purpose-designed library, &lt;a href=&#34;https://www.npmjs.com/package/fraction.js&#34;&gt;&lt;code&gt;fraction.js&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An updated version of &lt;a href=&#34;https://pypi.org/project/hashedixsearch/&#34;&gt;&lt;code&gt;hashedixsearch&lt;/code&gt;&lt;/a&gt; was released&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Progress on collaborative editing has continued, and most recently we&amp;rsquo;ve begun experimenting with &lt;a href=&#34;https://en.wikipedia.org/wiki/Markdown&#34;&gt;&lt;code&gt;Markdown&lt;/code&gt;&lt;/a&gt; syntax highlighting of shared text&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are a few different directions we would like to continue in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ensuring that the credits on the site are updated to reflect more of the contributions included so far&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Providing NPM packaging for our published &lt;code&gt;feedback.js&lt;/code&gt; modifications could be beneficial long-term, even if we are the only consumers of it for now&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multi-user and multi-device collaboration, as ever, remains a product area that we would like to progress&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continuing our blog series on &lt;a href=&#34;https://blog.reciperadar.com/posts/introduction-to-ingredient-parsing/&#34;&gt;ingredient parsing&lt;/a&gt; would be worthwhile&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Video demonstration: multi-device collaboration!</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2021-01-08/</link>
      <pubDate>Fri, 08 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2021-01-08/</guid>
      <description>&lt;p&gt;This week&amp;rsquo;s update includes a video feature-preview of the (oft-touted, rarely progressed) multi-device collaboration feature.&lt;/p&gt;
&lt;p&gt;The user interface is intended to be as straightforward as possible. You&amp;rsquo;ll pick a username and a &amp;lsquo;room name&amp;rsquo; - a shared name for the place you&amp;rsquo;d like your meal plan and shopping list to be available - and by providing that room name to your friends or other devices, they&amp;rsquo;ll be able to participate equally in the session.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;ll be no user account to create - and thus no login details to remember or worry about, no unwanted marketing or risk of spam emails - and none of your personal information will be shared with RecipeRadar.&lt;/p&gt;
&lt;p&gt;Attached is a short video clip of the feature as it currently exists in development - demonstrating me adding a note to a shared shopping list from another device.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;A video that displays a remote user adding a note (to remember the milk) to a shopping list&#34; src=&#34;https://blog.reciperadar.com/videos/collaboration.apng&#34;&gt;&lt;/p&gt;
&lt;p&gt;As usual, we&amp;rsquo;re building upon functionality provided by other free and open source components. In this case credit is due to the &lt;a href=&#34;https://yjs.dev/&#34;&gt;&lt;code&gt;YJS&lt;/code&gt;&lt;/a&gt; collaborative editing library, and the &lt;a href=&#34;https://codemirror.net/&#34;&gt;&lt;code&gt;CodeMirror&lt;/code&gt;&lt;/a&gt; text editor.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Reflecting on 2020</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-12-18/</link>
      <pubDate>Fri, 18 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-12-18/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Nutritional Information&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The main item of news today is that we&amp;rsquo;ve launched display of nutritional information in the application. Not all &amp;ndash; and in fact, not many &amp;ndash; recipes that we&amp;rsquo;ve collected so far have nutritional information included alongside them, but when present that information will now be displayed in the search results.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re currently refreshing (or &amp;lsquo;reindexing&amp;rsquo; as we call it within the team) the recipe data on RecipeRadar, and more nutritional information will appear as this process continues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reflection on 2020&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rather than provide a lengthy update this week, we&amp;rsquo;re going to reflect on some of the features added during the year.&lt;/p&gt;
&lt;p&gt;During 2020 we&amp;rsquo;ve added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Smarter &amp;lsquo;partial&amp;rsquo; name matching during ingredient search&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recipe yield scaling&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A recipe detail page that can be shared via hyperlink&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dietary properties (vegetarian, dairy-free, &amp;hellip;) in recipe search results&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Filtering of search results by recipe website&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tolerance for spelling errors during ingredient search&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A recipe &amp;rsquo;explore&amp;rsquo; view that provides simple yes/no ingredient prompts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;hellip;and last but not least, rendering of nutritional information&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We were a touch optimistic on some of our &lt;a href=&#34;https://github.com/openculinary/company/blob/7c92032146cce0be6f1a94fa8b26194e9757bc2d/roadmap/reciperadar.md&#34;&gt;planned roadmap&lt;/a&gt;, but that&amp;rsquo;s ok; work will recommence fresh next year, and perhaps we&amp;rsquo;ll be better prepared to plan future tasks with the added experience of hindsight.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>A new way to find recipes: the Recipe Explorer!</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-12-04/</link>
      <pubDate>Fri, 04 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-12-04/</guid>
      <description>&lt;p&gt;During the last two weeks, we had a relatively radical idea for a way to explore recipes on RecipeRadar.&lt;/p&gt;
&lt;p&gt;Rather than prompting people to enter the ingredients they have (requiring a modest but noticeable amount of data entry), we can &lt;em&gt;present&lt;/em&gt; a list of common recipe ingredients to the user, and allow them to use swipe gestures to say yes/no to the ingredients that they have, saving on typing.&lt;/p&gt;
&lt;p&gt;As they swipe to indicate whether each ingredient is available, the list of subsequent ingredient choices updates dynamically based on the recipes that match the ingredient selections made so far.&lt;/p&gt;
&lt;p&gt;A beta version of this interface is &lt;a href=&#34;https://www.reciperadar.com/#explore&#34;&gt;now live&lt;/a&gt; - please try it out if you have time, and send us some feedback!&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a screenshot to give you an idea how this works:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;A list of ingredient names arranged vertically, with four ingredients selected as available and one selected as unavailable by the user&#34; src=&#34;https://blog.reciperadar.com/images/recipe-explorer.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Work continues towards restoring multi-user collaboration (as we seem to keep on harping on about in these updates). It&amp;rsquo;d be great to re-release that functionality before the end of the year; let&amp;rsquo;s see how we get on.&lt;/p&gt;
&lt;p&gt;We are also planning on generating a web of static content pages based on the recipe and ingredient metadata we have within RecipeRadar.&lt;/p&gt;
&lt;p&gt;The goal is for these pages to be genuinely useful to users who are looking for information about ingredients while also providing a search-engine-friendly content directory that generalized search engines like Google, Bing and Yahoo can index.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Blog updates, filter-recipes-by-website, and more</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-11-20/</link>
      <pubDate>Fri, 20 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-11-20/</guid>
      <description>&lt;p&gt;Welcome to another almost-fortnightly RecipeRadar update.&lt;/p&gt;
&lt;p&gt;There have been a few developments since the last update:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Our first feature-related blog post, &lt;a href=&#34;https://blog.reciperadar.com/posts/introduction-to-ingredient-parsing/&#34;&gt;&amp;ldquo;An introduction to ingredient parsing&amp;rdquo;&lt;/a&gt; went live in early November - part of a series with follow-up posts coming soon&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;ve &lt;a href=&#34;https://github.com/openculinary/backend/issues/34&#34;&gt;completed&lt;/a&gt; a large-scale refactoring (re-organization of code and data) to make it easier to manage and correct the information that we store about ingredients. As a side-effect, this has further improved our recipe indexing performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;ve added the ability to &lt;a href=&#34;https://github.com/openculinary/frontend/pull/177&#34;&gt;filter search results by recipe website&lt;/a&gt;. If you have a favourite recipe website, or if there are websites that you don&amp;rsquo;t like, you can now choose to show/hide those in your search results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The application now displays dietary properties alongside each recipe, indicating whether they are dairy-free, gluten-free, vegan and vegetarian&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;Four icons indicating the dietary properties of a recipe&#34; src=&#34;https://blog.reciperadar.com/images/dietary-properties.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The largest work-in-progress feature is the long-awaited &lt;em&gt;collaboration&lt;/em&gt; feature, restoring multi-device application sessions.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s proving difficult for the engineering team to get traction on - the design in particular is fairly complicated and important to get right, but we&amp;rsquo;re working on it.&lt;/p&gt;
&lt;p&gt;Additionally, we have some smaller features that we&amp;rsquo;re hoping to look at soon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Adding a &lt;a href=&#34;https://github.com/openculinary/frontend/issues/176&#34;&gt;&amp;lsquo;share link&amp;rsquo; option&lt;/a&gt; from the recipe view page may be a quick win&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We may be able to improve search performance by &lt;a href=&#34;https://github.com/openculinary/backend/issues/38&#34;&gt;removing some unused fields&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, we&amp;rsquo;re still hoping to surface recipe nutritional information once this is available via the &lt;a href=&#34;https://github.com/hhursev/recipe-scrapers&#34;&gt;&lt;code&gt;recipe-scrapers&lt;/code&gt;&lt;/a&gt; library. More news on that when we have it.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>An introduction to ingredient parsing</title>
      <link>https://blog.reciperadar.com/posts/introduction-to-ingredient-parsing/</link>
      <pubDate>Fri, 06 Nov 2020 11:02:32 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/introduction-to-ingredient-parsing/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is the first post in a series that explores the technology that RecipeRadar uses to process and store recipe ingredients&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As a recipe search engine, &lt;a href=&#34;https://www.reciperadar.com&#34;&gt;RecipeRadar&lt;/a&gt; aims to collect and understand recipe content from around the web.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re able to crawl recipes from any website supported by the &lt;a href=&#34;https://github.com/hhursev/recipe-scrapers&#34;&gt;recipe-scrapers&lt;/a&gt; Python library, and the results of each crawl include &amp;ndash; among other details &amp;ndash; a list of the recipe&amp;rsquo;s ingredients and a list of the preparation step involved.  Both of these lists are represented as lines of text, as written by the original recipe author.&lt;/p&gt;
&lt;p&gt;For each ingredient there are two key pieces of information we&amp;rsquo;d like to identify: the &lt;em&gt;name&lt;/em&gt; of the ingredient, and the associated &lt;em&gt;quantity&lt;/em&gt; of it that is required.  Using these, we can provide search-by-ingredient functionality &amp;ndash; &lt;em&gt;&amp;ldquo;show me recipes containing tomatoes&amp;rdquo;&lt;/em&gt; &amp;ndash; and also turn a meal plan into a shopping list that includes sum totals of the ingredients required.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s use some real-world ingredient descriptions as examples.  One recipe could contain an ingredient with the description &amp;ldquo;2 cups of vegetable stock&amp;rdquo;, while a second recipe may list &amp;ldquo;30ml vegetable stock&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Within RecipeRadar&amp;rsquo;s &lt;a href=&#34;https://en.wikipedia.org/wiki/Data_model&#34;&gt;data model&lt;/a&gt;, we refer to the purchasable contents of an ingredient as the &amp;lsquo;product&amp;rsquo; (&lt;code&gt;vegetable stock&lt;/code&gt; in both of these examples), and the amount required as the &amp;lsquo;quantity&amp;rsquo; (&lt;code&gt;2 cups&lt;/code&gt; and &lt;code&gt;30ml&lt;/code&gt; respectively).&lt;/p&gt;
&lt;p&gt;So far, so good.  The situation becomes a little more complicated when we realize that recipe authors add all kinds of useful flair and detail to their ingredient descriptions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a pinch of freshly ground black pepper&lt;/li&gt;
&lt;li&gt;2 large apples, cut into chunks&lt;/li&gt;
&lt;li&gt;a bunch of kale, roughly chopped&lt;/li&gt;
&lt;li&gt;one medium apple&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here we find products (&lt;code&gt;black pepper&lt;/code&gt;, &lt;code&gt;apples&lt;/code&gt;, &lt;code&gt;kale&lt;/code&gt;) and quantities interleaved with additional descriptive details (&lt;code&gt;freshly ground&lt;/code&gt;, &amp;hellip;).  We&amp;rsquo;d like to keep that extra information around &amp;ndash; it can help with preparation and selection of ingredients, and it helps to ensure that the recipe author&amp;rsquo;s instructions are faithfully maintained.&lt;/p&gt;
&lt;p&gt;Although inter-service communication within RecipeRadar typically uses &lt;a href=&#34;https://www.json.org/&#34;&gt;JSON&lt;/a&gt; to serialize objects and data, we&amp;rsquo;ve found that JSON is not well suited to representing text with inline metadata.  Instead, we use &lt;a href=&#34;https://www.w3.org/XML/&#34;&gt;XML&lt;/a&gt; which allows us to add markup that is attached to individual phrases.&lt;/p&gt;
&lt;p&gt;Taking the first example from the ingredient list above, we could use XML to annotate the product and quantities like so: &lt;code&gt;a &amp;lt;quantity&amp;gt;pinch&amp;lt;/quantity&amp;gt; of freshly ground &amp;lt;product&amp;gt;black pepper&amp;lt;/product&amp;gt;&lt;/code&gt;.  In practice, RecipeRadar uses a slightly different XML schema but the principle is the same.&lt;/p&gt;
&lt;p&gt;In our next blog post, we&amp;rsquo;ll cover some of the code that extracts product names and ingredient quantities from plain text, and explain how we use the resulting information to provide recipe search and meal planning functionality.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Construction continues.. and an update on indexing performance</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-10-23/</link>
      <pubDate>Fri, 23 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-10-23/</guid>
      <description>&lt;p&gt;At RecipeRadar engineering HQ, feature development has been continuing - at a slightly unpredictable pace - in a few parallel areas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Collaboration (unblocked)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As mentioned during the previous update, we had been blocked on multi-device collaboration work due to an &lt;a href=&#34;https://github.com/dfahlander/Dexie.js/issues/1126&#34;&gt;issue&lt;/a&gt; affecting database unit tests. The good news is that the issue has since been &lt;a href=&#34;https://github.com/dfahlander/Dexie.js/pull/1138&#34;&gt;fixed&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Work on multi-device sessions should recommence shortly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Surfacing nutritional information (blocked)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Display of nutritional information within the application is in progress, but we&amp;rsquo;ve hit some snags estimating aggregate nutritional information for recipes.&lt;/p&gt;
&lt;p&gt;In short, there are too many gaps in the data for us to accurately predict recipe nutrition from the ingredients where we have known metric quantities.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re likely to wait until nutritional information is &lt;a href=&#34;https://github.com/hhursev/recipe-scrapers/issues/241&#34;&gt;supported natively&lt;/a&gt; in the &lt;em&gt;recipe-scrapers&lt;/em&gt; library before continuing. We&amp;rsquo;re optimistic that this feature will simultaneously allow us to display accurate nutritional information, while also allowing us to backfill gaps in our knowledge base.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dietary properties (landing soon)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Support for recipe dietary properties (&amp;lsquo;dairy free&amp;rsquo;, &amp;lsquo;vegetarian&amp;rsquo;, &amp;hellip;) is in progress, and should be ready for user testing next week.&lt;/p&gt;
&lt;p&gt;The RecipeRadar application will display icons to indicate the dietary properties of recipes in the search results, and also allow searching/filtering by those properties.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(Re)Indexing performance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Recent work related to recipe metadata has highlighted performance problems during (re)indexing of search engine contents.&lt;/p&gt;
&lt;p&gt;Currently it takes approximately two days to reindex the entire recipe document set, which makes development iteration challenging.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve spent time to identify areas for performance improvement and it appears that disk storage is our current bottleneck.&lt;/p&gt;
&lt;p&gt;We may need to order some new disks for our server to make significant improvements; this work is planned and tracked in &lt;a href=&#34;https://github.com/openculinary/infrastructure/issues/27&#34;&gt;infrastructure issue #27&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Resuming work on collaborative sessions and surfacing additional recipe metadata in the application will be our primary focuses over the next two weeks.&lt;/p&gt;
&lt;p&gt;The past few weeks have been very consciously focused on data and enabling features, and we hope to revisit application UI and UX improvements in the near future.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Multi-device collaboration, and a discussion on Hacker News</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-10-09/</link>
      <pubDate>Fri, 09 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-10-09/</guid>
      <description>&lt;p&gt;Well, it&amp;rsquo;s been a &lt;em&gt;little&lt;/em&gt; over a fortnight since the last update; despite that, progress continues on RecipeRadar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multi-device Collaboration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After some deep thought regarding a technical design for multi-user collaboration on RecipeRadar, we now have a &lt;a href=&#34;https://github.com/openculinary/frontend/issues/169&#34;&gt;specification&lt;/a&gt; written up. The engineering team is working towards implementing this.&lt;/p&gt;
&lt;p&gt;Most good software includes tests to ensure that the code does what it intends to and that it doesn&amp;rsquo;t break during future changes. Unfortunately we&amp;rsquo;re hit a slight roadblock when attempting to write unit tests that cover the database functionality included in the application. The team has &lt;a href=&#34;https://github.com/dfahlander/Dexie.js/issues/1126&#34;&gt;reported the issue&lt;/a&gt; upstream and is working on a &lt;a href=&#34;https://github.com/dfahlander/Dexie.js/pull/1138&#34;&gt;possible fix&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hacker News Discussion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There was a recent discussion thread on the popular &amp;lsquo;&lt;a href=&#34;https://news.ycombinator.com/&#34;&gt;Hacker News&lt;/a&gt;&amp;rsquo; technology forum regarding recipe search websites. You can read the entire thread &lt;a href=&#34;https://news.ycombinator.com/item?id=24630023&#34;&gt;here&lt;/a&gt;; RecipeRadar participated in the conversation, and as a result:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We fixed some issues related to &lt;a href=&#34;https://github.com/openculinary/backend/issues/24&#34;&gt;missing tuna-and-teriyaki-related recipes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We received some &lt;a href=&#34;https://github.com/openculinary/frontend/issues/172&#34;&gt;feedback and ideas&lt;/a&gt; regarding &amp;lsquo;staple&amp;rsquo; kitchen ingredients&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some users contributed suggestions regarding kitchen pantry &lt;a href=&#34;https://github.com/openculinary/api/issues/81&#34;&gt;inventory management integrations&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re hopeful that work on multi-user collaboration will soon become unblocked.&lt;/p&gt;
&lt;p&gt;While we&amp;rsquo;re waiting for that to be the case, there are also a few smaller feature items that may we start work on, including showing some of the ingredient nutritional data (that we recently integrated into the knowledge graph) alongside each recipe.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Progress update on recipe metadata extraction</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-08-28/</link>
      <pubDate>Fri, 28 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-08-28/</guid>
      <description>&lt;p&gt;This fortnight&amp;rsquo;s update is relatively short; the engineering team is getting back up to speed following some holiday/vacation time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nutritional Information&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Development towards including ingredient nutritional metadata is making &lt;a href=&#34;https://github.com/openculinary/knowledge-graph/pull/48&#34;&gt;good&lt;/a&gt; &lt;a href=&#34;https://github.com/openculinary/knowledge-graph/pull/49&#34;&gt;progress&lt;/a&gt; - the team&amp;rsquo;s been in contact with the author of the open source &lt;a href=&#34;https://github.com/tomwhite/ingreedy-js&#34;&gt;&lt;code&gt;ingreedy-js&lt;/code&gt;&lt;/a&gt; project that has already constructed an excellent dataset of nutritional metadata. That dataset has now been fuzzy-matched and included into the RecipeRadar ingredients knowledge base.&lt;/p&gt;
&lt;p&gt;The next step will be to index that metadata into our search engine so that approximate aggregate nutritional data is available to surface in future application features.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Direction Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It looks like Facebook&amp;rsquo;s &lt;a href=&#34;https://github.com/facebook/duckling&#34;&gt;&lt;code&gt;duckling&lt;/code&gt;&lt;/a&gt; natural language parsing project could be very helpful to extract additional information &amp;ndash; temperatures, for example &amp;ndash; from recipe directions. We would prefer to run this tool as a service within our Kubernetes container environment, and in order to do so we&amp;rsquo;ve proposed a small fix/change upstream to them and are awaiting feedback.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These tasks are likely to continue within the next two weeks, and after that we&amp;rsquo;ll be working on one of our most important long-term pieces of functionality: collaborative (aka &amp;lsquo;multiplayer&amp;rsquo;) RecipeRadar sessions.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Getting started with Nutritional Information</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-07-31/</link>
      <pubDate>Fri, 31 Jul 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-07-31/</guid>
      <description>&lt;p&gt;While there&amp;rsquo;s no single large feature that has landed in RecipeRadar in the past fortnight, there are a number of irons in the fire.&lt;/p&gt;
&lt;p&gt;This week&amp;rsquo;s update is primarily textual rather than visual &amp;ndash; we don&amp;rsquo;t have any screenshots to share this time &amp;ndash; but as you&amp;rsquo;ll see, that&amp;rsquo;s appropriate given some of the work we&amp;rsquo;ve been doing.&lt;/p&gt;
&lt;p&gt;The items we&amp;rsquo;re making progress on currently include:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nutritional Information&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve identified a number of trustworthy and authoritative sources of ingredient nutritional information, including the USDA&amp;rsquo;s &lt;a href=&#34;https://fdc.nal.usda.gov/&#34;&gt;FoodData Central&lt;/a&gt; and UK&amp;rsquo;s &lt;a href=&#34;https://www.gov.uk/government/publications/composition-of-foods-integrated-dataset-cofid&#34;&gt;CoFID&lt;/a&gt; dataset.&lt;/p&gt;
&lt;p&gt;The next challenge is to find a good way to associate the records from these datasets with the ingredient identifiers that RecipeRadar uses internally, and to update the knowledge-graph so that it can store and serve the associated metadata.&lt;/p&gt;
&lt;p&gt;Please note that we don&amp;rsquo;t intend to surface this nutritional information to users via the application during Q3; we do however have &lt;a href=&#34;https://github.com/openculinary/company/blob/main/roadmap/reciperadar.md#q4-2020&#34;&gt;plans&lt;/a&gt; to offer functionality related to dietary planning in Q4, and that will incorporate nutritional factors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Direction Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Over the past couple of weeks, we&amp;rsquo;ve explored various options related to extraction of metadata from recipe text &amp;ndash; we want to identify the various &lt;em&gt;actions&lt;/em&gt; involved when preparing recipes (&amp;quot;&lt;code&gt;combine&lt;/code&gt; the flour and milk&amp;quot;) and also to discover the important &lt;em&gt;entities&lt;/em&gt; involved in each step (&amp;ldquo;pre-heat the oven to &lt;code&gt;200 F&lt;/code&gt;&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;The ideal outcome of this &amp;ndash; which could take some time &amp;ndash; is that we will be able to use the &lt;a href=&#34;https://en.wikipedia.org/wiki/Coreference&#34;&gt;co-references&lt;/a&gt; discovered in recipe directions to represent those visually, as in the example diagram included in the application&amp;rsquo;s &lt;a href=&#34;https://www.reciperadar.com/#about-vision&#34;&gt;vision statement&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As part of the work towards this, we have &lt;a href=&#34;https://github.com/openculinary/knowledge-graph/pull/45&#34;&gt;re-structured&lt;/a&gt; some of the responses of the knowledge-graph so that they return data in XML format. The primary driving reasons for this are that XML can represent data as a tree/graph (which we want) and also that it can represent entities interleaved in-line with natural language text (which we also want).&lt;/p&gt;
&lt;p&gt;In addition, we are now performing &lt;a href=&#34;https://github.com/openculinary/knowledge-graph/pull/47&#34;&gt;basic identification of verbs&lt;/a&gt; in recipe directions. This is relatively straightforward thanks to modern open-source natural language processing libraries. We&amp;rsquo;ll need to introduce more advanced techniques from these libraries in order to reach a better understanding and representation of recipe text.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s hard to say precisely where we&amp;rsquo;ll get to with each of these goals within the next two weeks &amp;ndash; perhaps moreso because our entire engineering team (currently a euphemism for &amp;lsquo;me&amp;rsquo;) will be on holiday until mid-late August.&lt;/p&gt;
&lt;p&gt;Integrating nutritional data before then seems like an ambitious but achievable goal, and we may send a mini-update if we manage that.&lt;/p&gt;
&lt;p&gt;Either way, you can expect the next &amp;lsquo;fortnightly&amp;rsquo; update roughly a month from now.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Internal tooling: recipe crawler diagnostics</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-07-17/</link>
      <pubDate>Fri, 17 Jul 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-07-17/</guid>
      <description>&lt;p&gt;The last couple of weeks have been slow and steady in terms of RecipeRadar software engineering progress.&lt;/p&gt;
&lt;p&gt;The main focus recently has been on providing &lt;a href=&#34;https://github.com/openculinary/frontend/issues/38&#34;&gt;recipe data debug tooling&lt;/a&gt; in order to help identify and fix future data quality issues. Here&amp;rsquo;s an overview of how that works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recipe Data Diagnostics&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When users are searching for recipes, it&amp;rsquo;s important that we display accurate representations of the ingredients and directions for each recipe.&lt;/p&gt;
&lt;p&gt;RecipeRadar takes recipes from all over the web and translates them into a common representation in a format called &lt;a href=&#34;https://en.wikipedia.org/wiki/JSON&#34;&gt;&lt;code&gt;JSON&lt;/code&gt;&lt;/a&gt;, with a lot of help from the ever-improving &lt;a href=&#34;https://github.com/hhursev/recipe-scrapers&#34;&gt;&lt;code&gt;recipe-scrapers&lt;/code&gt;&lt;/a&gt; library.&lt;/p&gt;
&lt;p&gt;Sometimes, the contents or format of the recipe website may change &amp;ndash; and sometimes our own processing of the data may change (for example, after we learn about a new ingredient or item of kitchen equipment, we can add additional metadata to the JSON format).&lt;/p&gt;
&lt;p&gt;The newly-added recipe diagnostics page shows the contents of the recipe, as it was &lt;em&gt;last indexed&lt;/em&gt; into RecipeRadar&amp;rsquo;s search engine, and also as it &lt;em&gt;appears currently&lt;/em&gt; when applying the latest crawling &amp;amp; post-processing operations.&lt;/p&gt;
&lt;p&gt;How does that all look in practice? Well, &lt;a href=&#34;https://www.reciperadar.com/diagnostics/#recipe&amp;id=cpkVntbJ8jDNE1yj1f1caJsuR9&#34;&gt;here&amp;rsquo;s an example&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;A JSON-format diff that indicates that a red chilli ingredient has been added&#34; src=&#34;https://blog.reciperadar.com/images/recipe-diff.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;In this case we can see that the version of the recipe in the search engine contains 19 unique ingredient products (note the strikeout text in red), and the newly-crawled version of the recipe contains 21 &amp;ndash; one new ingredient is visible in the large block of green text.&lt;/p&gt;
&lt;p&gt;That means we should probably re-crawl and re-index this recipe so that users can find the updated (and in this case, more accurate) representation of the recipe.&lt;/p&gt;
&lt;p&gt;Something&amp;rsquo;s still a little unusual in this case however - the singular form of the product name is &amp;lsquo;red chilly&amp;rsquo;. It&amp;rsquo;d be worth investigating and resolving that as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s uncertain exactly what feature we&amp;rsquo;ll be working on next, but it&amp;rsquo;s likely &lt;em&gt;either&lt;/em&gt; going to be gathering ingredient nutritional data, &lt;em&gt;or&lt;/em&gt; it&amp;rsquo;ll be figuring out how to support ingredient substitutions (for example, substitute spices or proteins).&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Spelling suggestions are live!</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-07-03/</link>
      <pubDate>Fri, 03 Jul 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-07-03/</guid>
      <description>&lt;p&gt;Q2 2020 is now complete, and I&amp;rsquo;m glad to say that we managed to achieve almost all of the &lt;a href=&#34;https://github.com/openculinary/company/blob/main/roadmap/reciperadar.md#q2-2020&#34;&gt;goals&lt;/a&gt; for the quarter. The only task that has rolled over into Q3 is the selection of a graph database technology, in order to support the &lt;a href=&#34;https://github.com/openculinary/knowledge-graph&#34;&gt;&lt;code&gt;knowledge-graph&lt;/code&gt;&lt;/a&gt; component.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spelling Suggestions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;During the last update I mentioned that we had discovered the &lt;a href=&#34;https://github.com/seperman/fast-autocomplete&#34;&gt;&lt;code&gt;fast-autocomplete&lt;/code&gt;&lt;/a&gt; software library as a candidate to provide spelling suggestions on RecipeRadar.&lt;/p&gt;
&lt;p&gt;Although that project does look great, we discovered an issue with it during integration. Out of the box, it doesn&amp;rsquo;t provide search suggestions when you search for a word that is in the middle or at the end of an ingredient name.&lt;/p&gt;
&lt;p&gt;For example, searching for &amp;lsquo;cream&amp;rsquo; would &lt;em&gt;not&lt;/em&gt; suggest &amp;lsquo;sour cream&amp;rsquo; using the default fast-autocomplete configuration.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s significant because it&amp;rsquo;s an existing feature that we support and would like to retain for RecipeRadar - it&amp;rsquo;s useful and has been &lt;a href=&#34;https://github.com/openculinary/frontend/issues/90&#34;&gt;requested&lt;/a&gt; in the past.&lt;/p&gt;
&lt;p&gt;As a result, we&amp;rsquo;ve decided to re-use our existing &lt;a href=&#34;https://www.elastic.co/&#34;&gt;&lt;code&gt;Elasticsearch&lt;/code&gt;&lt;/a&gt; search engine to provide ingredient spelling suggestions.&lt;/p&gt;
&lt;p&gt;When you start entering some text, the application looks in the set of ingredients for near-matches on &lt;em&gt;any&lt;/em&gt; word in the ingredient:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;A user has mis-spelled &amp;ldquo;hummus&amp;rdquo; and the system is able to display the correct spelling&#34; src=&#34;https://blog.reciperadar.com/images/suggestions.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m glad to report that this feature is now &lt;a href=&#34;https://www.reciperadar.com/#search&#34;&gt;live on RecipeRadar&lt;/a&gt;; please give it a try and let me know what you think.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With the previous quarter recently complete, it&amp;rsquo;s a good time to look further into the horizon to see what&amp;rsquo;s planned over the next few months.&lt;/p&gt;
&lt;p&gt;Among the most promising planned features are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Restoring multi-user collaboration support, so that you can share your meal planning session with friends and family&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Providing ingredient substitutions, so that you&amp;rsquo;re able to find more recipes that use the ingredients you have in stock&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gathering nutritional information into the knowledge graph, so that we can use that information to unobtrusively guide users towards making healthy eating decisions&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are ambitious, and will run in parallel with our regular work including bugfixes, incrementally adding user interface improvements, and recipe search result tuning.&lt;/p&gt;
&lt;p&gt;We may have to rearrange the roadmap tasks a little as we learn more about the size of work involved for each feature, but this is what we&amp;rsquo;re setting out to do, starting on Monday.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Introducing the Recipe Detail Page</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-06-19/</link>
      <pubDate>Fri, 19 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-06-19/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Recipe Detail Page&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To make better use of device screen space, clicking on a recipe now takes you to a full-screen &amp;lsquo;recipe detail page&amp;rsquo; where everything needed for meal preparation is displayed on a single bookmarkable page.&lt;/p&gt;
&lt;p&gt;The page incorporates a number of aspects from &lt;strong&gt;Monica&lt;/strong&gt;&amp;rsquo;s screen designs, including the ability for the user to hover-to-highlight recipe direction steps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recipe Scaling&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re eagle-eyed (or had been waiting for this feature) then you may have spotted that the &amp;lsquo;servings&amp;rsquo; field on the recipe details page is an edit box.&lt;/p&gt;
&lt;p&gt;When viewing a recipe (via the recipe detail page) you can now adjust the number of servings, and the quantity of the ingredients will automatically be updated to match.&lt;/p&gt;
&lt;p&gt;Note that this feature isn&amp;rsquo;t hugely &amp;lsquo;smart&amp;rsquo; yet. It doesn&amp;rsquo;t, for example, understand that the concept of one-and-a-half eggs may not make much sense. There&amp;rsquo;s &lt;a href=&#34;https://github.com/openculinary/frontend/issues/148&#34;&gt;more&lt;/a&gt; &lt;a href=&#34;https://github.com/openculinary/frontend/issues/149&#34;&gt;work&lt;/a&gt; planned to improve the functionality it provides - and it would benefit from your feedback and testing, too!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve made some progress investigating how to provide &lt;a href=&#34;https://github.com/openculinary/api/issues/20&#34;&gt;spelling corrections&lt;/a&gt; during ingredient name search on RecipeRadar, and have discovered a open source software library called &lt;a href=&#34;https://github.com/seperman/fast-autocomplete&#34;&gt;fast-autocomplete&lt;/a&gt; that looks ideal for the purpose.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;A user has entered the letters &amp;ldquo;c&amp;rdquo;, &amp;ldquo;h&amp;rdquo; and &amp;ldquo;e&amp;rdquo;, and the word &amp;ldquo;cheese&amp;rdquo; has appeared as a suggestion&#34; src=&#34;https://blog.reciperadar.com/images/spelling.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Work has begun on integrating this library with RecipeRadar, and there should be more news on this soon.&lt;/p&gt;
&lt;p&gt;We should also be making some decisions regarding selection of a user interface framework (for the application interface) and a graph database (for ingredient knowledge representation and storage) within the next two weeks.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Database architecture updates and an internationalization question</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-06-05/</link>
      <pubDate>Fri, 05 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-06-05/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Updated Website Prototypes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the features of the screens that may involve the most complex user interactions and information presentation is the selection, display and navigation of planned meals (calendarization).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Architecture Investments&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you interact with RecipeRadar on your phone or on your computer, the information presented to you is served by our recipe search engine, which is based on the open source &lt;a href=&#34;https://www.elastic.co/elasticsearch/&#34;&gt;&lt;code&gt;Elasticsearch&lt;/code&gt;&lt;/a&gt; product.&lt;/p&gt;
&lt;p&gt;We also use the popular open source &lt;a href=&#34;https://www.postgresql.org/&#34;&gt;&lt;code&gt;PostgreSQL&lt;/code&gt;&lt;/a&gt; database to store persistent data: ingredients, recipes, our progress crawling the recipe web, and user search logs (which do not contain any &lt;a href=&#34;https://en.wikipedia.org/wiki/Personal_data&#34;&gt;personally-identifying information&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Until recently, both the search engine and database have had to be online continuously for the application to work correctly, and upgrades to the latter were performed manually.&lt;/p&gt;
&lt;p&gt;The main risk introduced during manual database upgrades is that there are fewer guarantees that the changes will be applied and will behave the same way that they did during development.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m glad to say that following &lt;a href=&#34;https://github.com/openculinary/infrastructure/issues/8&#34;&gt;some modifications&lt;/a&gt;, the entire RecipeRadar application experience can now be served by the search engine &lt;a href=&#34;https://github.com/openculinary/api&#34;&gt;API&lt;/a&gt;, even when the database is temporarily unavailable. Support has also &lt;a href=&#34;https://github.com/openculinary/backend/issues/2&#34;&gt;been added&lt;/a&gt; &amp;ndash; albeit not yet thoroughly tested &amp;ndash; for scripted database upgrades.&lt;/p&gt;
&lt;p&gt;These improvements reflect progress against our tentative &lt;a href=&#34;https://github.com/openculinary/company/pull/4&#34;&gt;product roadmap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Company Accounts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Although I don&amp;rsquo;t have much feedback to report yet, I&amp;rsquo;ve been spending a little time investigating potential options around company financial reporting and accounting. This will take place in the UK and I hope that there will be a good level of transparency achieved in the process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Internationalization Support&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Does anyone on our list have experience using &lt;a href=&#34;https://weblate.org/en/&#34;&gt;&lt;code&gt;Weblate&lt;/code&gt;&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;It looks perfect for our translation use cases; it&amp;rsquo;s open source, and provides &amp;lsquo;continuous localization&amp;rsquo; &amp;ndash; the idea is that translators&amp;rsquo; work should be incorporated into the application on a regular basis, matching the cadence of application releases.&lt;/p&gt;
&lt;p&gt;Ideally, if we release two updates for RecipeRadar during a given day, and a contributor provides a verified, approved translation in the time between those two releases, then it should be included in the second release).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Looking at our Q2 2020 roadmap, we have a few user-facing features that we&amp;rsquo;re aiming to implement over the next few weeks. The next items we&amp;rsquo;ll be looking at include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A &amp;lsquo;recipe detail&amp;rsquo; page in the application&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The ability to scale up/down the number of servings for recipes on the detail page&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for spelling corrections during ingredient and equipment search&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It may be a stretch to achieve all of these within a two-week duration, but we&amp;rsquo;ll see how we get on. Expect to hear some updates on these in the next fortnightly update.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Partial ingredient search, meal planner updates, and more</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-05-22/</link>
      <pubDate>Fri, 22 May 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-05-22/</guid>
      <description>&lt;p&gt;The last two weeks have included improvements to our ingredient search engine suggestions, meal planning improvements, and proposal of a &lt;a href=&#34;https://github.com/openculinary/company/pull/4&#34;&gt;product roadmap&lt;/a&gt;. We&amp;rsquo;d love feedback on these, and the roadmap in particular!&lt;/p&gt;
&lt;p&gt;We made incremental progress on our internationalization processes (by &lt;a href=&#34;https://github.com/openculinary/internationalization/pull/16&#34;&gt;trialing&lt;/a&gt; use of an application called &lt;a href=&#34;https://poedit.net/&#34;&gt;&lt;code&gt;poedit&lt;/code&gt;&lt;/a&gt;), but the process still involves some friction.&lt;/p&gt;
&lt;p&gt;Support for viewing historic meal calendar entries remains on the near-term task list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Partial Ingredient Name Suggestions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you start typing &amp;rsquo;tomato&amp;rsquo; on RecipeRadar, the search engine will scan for suggestions across recipes that contain matching ingredient text, such as &lt;code&gt;1 tomato&lt;/code&gt; or &lt;code&gt;two tomatoes&lt;/code&gt; (i.e. both plural and singular forms).&lt;/p&gt;
&lt;p&gt;In this example, RecipeRadar suggests the plural name &amp;rsquo;tomatoes&amp;rsquo; to you, because the plural text appears more often in the recipe set than the singular form &amp;rsquo;tomato&#39;.&lt;/p&gt;
&lt;p&gt;Until recently, these suggestions would &lt;em&gt;only&lt;/em&gt; include ingredients where your input is a strict prefix of the ingredient name. So you might be offered &amp;ldquo;tomatoes&amp;rdquo; and &amp;ldquo;tomato sauce&amp;rdquo; as selections, but you would not be prompted with &amp;ldquo;cherry tomatoes&amp;rdquo; as an ingredient to search for.&lt;/p&gt;
&lt;p&gt;This limitation (as &lt;a href=&#34;https://github.com/openculinary/frontend/issues/90&#34;&gt;reported&lt;/a&gt; a little over a month ago) has now been removed, making it easier to search for all kinds of ingredients and ingredient variants.&lt;/p&gt;
&lt;p&gt;Have you encountered any problems finding ingredients or recipes on RecipeRadar? Let us know via the &amp;lsquo;Feedback&amp;rsquo; button or by &lt;a href=&#34;https://github.com/openculinary/frontend/issues/new&#34;&gt;filing a GitHub issue&lt;/a&gt; and we&amp;rsquo;ll take a look.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Meal Planner Messaging&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Some small changes have been applied to meal planning in the application this week.&lt;/p&gt;
&lt;p&gt;While users can still create a shopping list without planning any meals, the &amp;lsquo;suggested action&amp;rsquo; for each recipe search result now leads them towards meal planning rather than shopping list creation:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;A recipe result with a button labeled &amp;ldquo;Add to meal planner&amp;rdquo;&#34; src=&#34;https://blog.reciperadar.com/images/call-to-action.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;This aligns with our idea that users can save time, eat more healthily, and reduce food wastage by planning ahead for multiple meals.&lt;/p&gt;
&lt;p&gt;To further attract users towards meal planning and to inform them about the state of their meal calendar, we have added a visual cue with the number of entries in the meal planner:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Navigation menu, with notifications displaying the number of meal planner and shopping list items&#34; src=&#34;https://blog.reciperadar.com/images/meal-planner-cue.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;These small features will become increasingly valuable after we re-enable multi-device and multi-user session sharing.&lt;/p&gt;
&lt;p&gt;Allowing family members and friends to view the state of meal planning and shopping at-a-glance, and providing access to the shopping list you created at home on your desktop computer while out with your smartphone are two of the cases we are considering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Product Roadmap&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Progress on RecipeRadar over the next few months should be methodical and sustainable; we have a large number of product goals, and while we can&amp;rsquo;t achieve them all instantly, we can arrange them thoughtfully so that we gradually deliver application improvements for users while retaining high quality and ensuring that our code remains easy to modify and extend, allowing us to reach our longer-term goals eventually.&lt;/p&gt;
&lt;p&gt;To more easily communicate what those product goals are, and in what order we currently plan to implement them, we have drafted a &lt;a href=&#34;https://github.com/openculinary/company/pull/4&#34;&gt;RecipeRadar Product Roadmap&lt;/a&gt;. Please take a look and provide your feedback here or on the GitHub pull request.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As you&amp;rsquo;ll see on the roadmap, there are a number of architectural investments that we believe make sense to apply during the remainder of Q2 2020 (Apr to Jun 2020).&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s likely that these will compose the bulk of our engineering work over the next two weeks; we may also take the opportunity to look into improving company transparency via &lt;a href=&#34;https://opencollective.com/&#34;&gt;OpenCollective&lt;/a&gt; and perhaps by increasing the external visibility of internal mailing lists.&lt;/p&gt;
&lt;p&gt;As mentioned previously, adding the ability to view historic meal calendar entries in the application also remains on the near-term todo-list.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Open source ethics, ingredient highlighting, and entry to the Progressive Web App Store</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-05-08/</link>
      <pubDate>Fri, 08 May 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-05-08/</guid>
      <description>&lt;p&gt;Progress on RecipeRadar over the previous fortnight has included improvements to our data processing infrastructure, continued refinement of our screen prototypes, and exploration of collaboration tools and technology selections.&lt;/p&gt;
&lt;p&gt;As you may have seen on the discussion list, &lt;strong&gt;Monica&lt;/strong&gt; has been iterating on the screen designs for web and mobile, and in particular the prototype meal planner calendar is looking great. I&amp;rsquo;d like us all to spend a bit more time to make sure these designs are simple and usable. We should initially remove non-essential features, since we continue to have limited software development bandwidth at the moment.&lt;/p&gt;
&lt;p&gt;Speaking of which: if you know any developers (senior or junior) who would be interested in learning about the project&amp;rsquo;s code and potentially getting involved further, please send them our way.&lt;/p&gt;
&lt;p&gt;Does anyone have experience and/or opinions regarding the &lt;a href=&#34;https://flutter.dev/&#34;&gt;&lt;code&gt;Flutter&lt;/code&gt;&lt;/a&gt; application framework? There&amp;rsquo;s a chance RecipeRadar may migrate to use it in future.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Organizational Goals&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Today I was reading two articles that I&amp;rsquo;d like to share since it may help explain the direction I&amp;rsquo;d like to take the organization in, eventually, assuming that the application gains traction.&lt;/p&gt;
&lt;p&gt;One article is &lt;a href=&#34;https://www.oreilly.com/openbook/opensources/book/tiemans.html&#34;&gt;&amp;lsquo;Open Sources: Voices from the Open Source Revolution&amp;rsquo;&lt;/a&gt;, and it is a record of the challenges and obstacles encountered by Cygnus, an early example of a business founded on open source software. When reading, please bear in mind that software is only one type of digital content &amp;ndash; I believe the principles may apply to other digital creations.&lt;/p&gt;
&lt;p&gt;While initially potentially seeming to conflict with the previous article &amp;ndash; but in my opinion, equally based in the same reality &amp;ndash; the second article is &amp;lsquo;&lt;a href=&#34;https://www.ashedryden.com/blog/the-ethics-of-unpaid-labor-and-the-oss-community&#34;&gt;The Ethics of Unpaid Labor and the OSS Community&lt;/a&gt;&amp;rsquo; and it neatly describes an ongoing concern I have about driving the RecipeRadar project and asking for contributions while not necessarily providing much in return, yet.&lt;/p&gt;
&lt;p&gt;Open digital environments &lt;em&gt;should&lt;/em&gt; lend themselves well to contributions from diverse backgrounds, and should be something that people can contribute to from home and to build up a portfolio of work &amp;ndash; or for pure enjoyment and interest in the field. And eventually the application should also provide value not just to ourselves as users, but also potentially in terms of funds to sustain continued contributions. In practice, opportunity is often equally distributed, and I&amp;rsquo;d welcome ideas to create a more inclusive and sustainable environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ingredient and Direction Highlighting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One major benefit that RecipeRadar will provide compared to many existing recipe software tools is that it will understand information and context about the ingredients and nutrition in recipes, and will eventually &amp;ndash; and always optionally &amp;ndash; offer to help organize kitchen appliances and preparation timing. A simple recurring example I use is that it could identify that a recipe involves pre-heating an oven; and RecipeRadar could offer a reminder to let someone in your home know that it&amp;rsquo;s time to set the oven temperature.&lt;/p&gt;
&lt;p&gt;As one of many steps towards this goal of a &amp;lsquo;smart and respectful&amp;rsquo; kitchen assistant, ingredient and equipment metadata is now extracted from recipes, and formatting and punctuation of the original author&amp;rsquo;s intent are retained (thanks again, &lt;strong&gt;Citra&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;To re-state the goal again here: we aim to add valuable additional information to the original recipe, and will always attribute and link back to the original source.&lt;/p&gt;
&lt;p&gt;Here are some examples from a search for &lt;a href=&#34;https://www.reciperadar.com/#action=search&amp;include=lentil&amp;equipment=slow%20cooker&#34;&gt;slow cooker lentil recipes&lt;/a&gt; earlier today - notice that the application has identified the matching ingredient, and highlighted the equipment used in the recipe directions.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Recipe ingredient list with &amp;rsquo;lentils&amp;rsquo; highlighted&#34; src=&#34;https://blog.reciperadar.com/images/ingredient-highlighting.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Recipe directions with highlighting of the phrase &amp;lsquo;slow cooker&amp;rsquo;&#34; src=&#34;https://blog.reciperadar.com/images/equipment-highlighting.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PWA Store&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Following submission two weeks ago, RecipeRadar has been &lt;a href=&#34;https://progressiveapp.store/pwa/RecipeRadar&#34;&gt;accepted into the Progressive Web App Store&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;This is great news and some people have already left reviews and our first review, featuring PB&amp;amp;J Sushi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I mentioned in the last update that we&amp;rsquo;ll be looking for translations of messages that appear in the application soon. This is something we didn&amp;rsquo;t quite get around to over the previous two weeks, but it should be progressing within the next fortnight.&lt;/p&gt;
&lt;p&gt;Now that the bulk of the backend data pipeline work for ingredient and direction highlighting is completed, focus can return to the frontend user interface and search improvements. Some items we&amp;rsquo;ll look at in the next two weeks include: &lt;a href=&#34;https://github.com/openculinary/frontend/issues/90&#34;&gt;partial name search&lt;/a&gt;, &lt;a href=&#34;https://github.com/openculinary/frontend/issues/40&#34;&gt;historic meal planner entries&lt;/a&gt;, and &lt;a href=&#34;https://github.com/openculinary/frontend/issues/129&#34;&gt;messaging improvements&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Updated search control designs, and de-duplication of recipes</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-04-24/</link>
      <pubDate>Fri, 24 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-04-24/</guid>
      <description>&lt;p&gt;The last two weeks have involved quality improvements, design prototyping, and preparatory work as we prepare to introduce more contributors to RecipeRadar.&lt;/p&gt;
&lt;p&gt;Have you experienced any ingredient shortages or price changes during the coronavirus pandemic?&lt;/p&gt;
&lt;p&gt;In future we hope that RecipeRadar will automatically offer information on local ingredient availability, seasonality, and pricing. This and other plans will be detailed in an upcoming roadmap document.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design Iteration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As you may have seen on the mailing list, &lt;strong&gt;Monica&lt;/strong&gt; has been preparing screens to provide an improved search experience in the application.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;A design for updated search controls&#34; src=&#34;https://blog.reciperadar.com/images/ingredient-selection.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;These are exciting changes and they provide the opportunity to make each RecipeRadar session more intuitive and rewarding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A &lt;a href=&#34;https://github.com/openculinary/api/issues/3&#34;&gt;long-standing issue&lt;/a&gt; that allowed duplicate recipes to appear in search results has been thoroughly solved!&lt;/p&gt;
&lt;p&gt;The solution took some careful planning and implementation, and is &lt;a href=&#34;https://github.com/openculinary/api/pull/45/files#diff-8849635885fa3990203733414322d517R125-R181&#34;&gt;documented&lt;/a&gt; for future reference.&lt;/p&gt;
&lt;p&gt;If you see anything that looks unusual while using RecipeRadar, please feel free to report an issue via the &amp;lsquo;Feedback&amp;rsquo; button in the app, or directly &lt;a href=&#34;https://github.com/openculinary/frontend/issues&#34;&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Call for Developers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re looking for more software developers to help implement features and improvements for RecipeRadar.&lt;/p&gt;
&lt;p&gt;Alongside the Code of Conduct mentioned in the last update, we now also have a set of &lt;a href=&#34;https://github.com/openculinary/.github/blob/1b423f23ce6ec48ad7bd95f59189e81617ab21f5/CONTRIBUTING.md&#34;&gt;Contribution Guidelines&lt;/a&gt; to help developers (and other contributors) get started in the most effective way possible.&lt;/p&gt;
&lt;p&gt;If you know any software developers who are looking for projects to contribute to, please send them our way. Soon we&amp;rsquo;ll also be ready to invite help from anyone who can offer translations of the application into different languages.&lt;/p&gt;
&lt;p&gt;Although we don&amp;rsquo;t currently offer financial compensation, we can offer attribution and credit for work provided, and I&amp;rsquo;d personally be glad to supply references for any work contributed to RecipeRadar when people are applying for jobs in future.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PWA Store&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;RecipeRadar has been submitted for inclusion in the &lt;a href=&#34;https://progressiveapp.store/&#34;&gt;Progressive Web App Store&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;The PWA Store is similar to the iOS App Store and Android Play Store that you are more likely to be familiar with, and offers web-based applications that you can install for free on your own devices.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the features we&amp;rsquo;re most excited about is the inclusion of more ingredient context in recipe search results.&lt;/p&gt;
&lt;p&gt;Where you would previously have seen a recipe call simply for &lt;code&gt;onions&lt;/code&gt;, in future you&amp;rsquo;ll see the full ingredient description, such as &lt;code&gt;large onions, diced&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The ingredient name will continue to be highlighted so that you can see at-a-glance how many ingredients match in each search result.&lt;/p&gt;
&lt;p&gt;Thanks again to &lt;strong&gt;Citra&lt;/strong&gt; for &lt;a href=&#34;https://github.com/openculinary/frontend/issues/94#issuecomment-613155354&#34;&gt;reporting&lt;/a&gt; this issue &amp;ndash; it should soon be resolved thanks to a lot of &lt;a href=&#34;https://github.com/openculinary/api/pull/49&#34;&gt;preparatory work&lt;/a&gt; behind-the-scenes.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>RecipeRadar</title>
      <link>https://blog.reciperadar.com/posts/principles/</link>
      <pubDate>Fri, 10 Apr 2020 17:54:52 +0100</pubDate>
      <guid>https://blog.reciperadar.com/posts/principles/</guid>
      <description>&lt;p&gt;RecipeRadar aims to provide recipe search, meal planning, and cooking guidance
to a global audience via services which are simple, intuitive, collaborative
and effective, and always designed with users as our first priority.&lt;/p&gt;
&lt;p&gt;We believe that eating well and making informed consumption decisions are a
benefit to everyone, both individually and collectively.&lt;/p&gt;
&lt;p&gt;We believe that the best technology is designed with users as the sole and
primary benefactors, and that they should have the ability to inspect, modify
and adjust that technology.&lt;/p&gt;
&lt;p&gt;To meet these principles, we have made a number of intentional decisions about
the structure of the company and our service:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RecipeRadar is developed by OpenCulinary C.I.C., a UK Community Interest
Company.  The use of this company structure locks in social goals and reduces
the potential for growth or revenue pressures to lead the service in
directions which negatively affect users.  If you&amp;rsquo;re curious to learn more,
please read our &lt;a href=&#34;https://github.com/openculinary/company&#34;&gt;company
documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All of the code for our application and service is publicly available under
the AGPLv3 license, and we gladly accept changes and contributions
from our user community.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We do not use any proprietary software anywhere in the delivery of our
service, which means that you can inspect and reproduce any part of our
&lt;a href=&#34;https://github.com/openculinary/&#34;&gt;technology stack&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No personal data about you is stored on our servers; the only data
transmitted from the application to the server is the data required to
fulfill service requests.  For example, when searching for recipes, the
application sends the list of ingredients you specify so that the server
can respond with suitable results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Further to this, no cookies are stored in your browser, and no cookie data
is sent to our servers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When &lt;em&gt;any&lt;/em&gt; data is transferred between the application and our servers, it
is always encrypted with TLS.  We use a strong cipher suite, and we test our
configuration using SSL Labs&amp;rsquo; &amp;lsquo;SSL Server Test&amp;rsquo; tool to discover areas for
improvement.  If you discover or suspect any issue with our application or
server security, please &lt;a href=&#34;mailto:security@reciperadar.com&#34;&gt;let us know&lt;/a&gt; and
we&amp;rsquo;ll investigate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Our first fortnightly update on the blog!</title>
      <link>https://blog.reciperadar.com/posts/fortnightly-update-2020-04-10/</link>
      <pubDate>Fri, 10 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.reciperadar.com/posts/fortnightly-update-2020-04-10/</guid>
      <description>&lt;p&gt;Progress on RecipeRadar has been ramping up over the past few days; here are some updates on recent developments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Homepage Updates&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Thanks to &lt;strong&gt;Susan&lt;/strong&gt; and &lt;strong&gt;Liz&lt;/strong&gt;, the homepage search controls have had a revamp:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;The RecipeRadar homepage recipe search controls&#34; src=&#34;https://blog.reciperadar.com/images/homepage.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;All three of the recipe search fields are now shown by default, and the wording has been simplified and improved to cater to people finding ingredients unavailable due to the COVID-19 crisis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User Experience Improvements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While &lt;a href=&#34;https://github.com/openculinary/frontend/issues/70&#34;&gt;more work remains&lt;/a&gt; to improve ingredient search, incremental progress is being made.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Handling of &amp;rsquo;enter&amp;rsquo; keypresses has been &lt;a href=&#34;https://github.com/openculinary/frontend/pull/75&#34;&gt;adjusted&lt;/a&gt;, with more improvements to follow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Citra&lt;/strong&gt; has reported an &lt;a href=&#34;https://github.com/openculinary/frontend/issues/90&#34;&gt;issue&lt;/a&gt; regarding &amp;lsquo;partial&amp;rsquo; ingredient search and there is a plan to handle this in the RecipeRadar Search API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href=&#34;https://github.com/openculinary/frontend/pull/84&#34;&gt;bugfix&lt;/a&gt; has been applied to ensure that pressing the search button always scrolls the user to see their search results. In future we plan to add &lt;a href=&#34;https://github.com/openculinary/frontend/issues/87&#34;&gt;automated testing&lt;/a&gt; to ensure that the bug can&amp;rsquo;t reappear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href=&#34;https://github.com/openculinary/frontend/pull/86&#34;&gt;performance issue&lt;/a&gt; relating to recipe result lists was identified and fixed, leading to a more responsive search experience&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Blog is Ready to Roll&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://blog.reciperadar.com/&#34;&gt;RecipeRadar blog&lt;/a&gt; is up and running, and posts can be added via the blog&amp;rsquo;s &lt;a href=&#34;https://github.com/openculinary/blog&#34;&gt;GitHub repository&lt;/a&gt;. If you&amp;rsquo;d feel like writing some content for the service - or know someone who would - please contact &lt;a href=&#34;mailto:james@reciperadar.com&#34;&gt;James&lt;/a&gt; with details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code of Conduct&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An organization-wide &lt;a href=&#34;https://github.com/openculinary/.github/blob/master/CODE_OF_CONDUCT.md&#34;&gt;Code of Conduct&lt;/a&gt; has been introduced, and aims to foster a comfortable and pleasant environment for discussion and collaboration.&lt;/p&gt;
&lt;p&gt;If you have any concerns about anyone&amp;rsquo;s conduct relating to RecipeRadar, please contact us at &lt;a href=&#34;mailto:conduct@reciperadar.com&#34;&gt;conduct@reciperadar.com&lt;/a&gt; and we&amp;rsquo;ll address it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming up next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s plenty more in store over the next couple of weeks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;ll be investigating improvements to &lt;a href=&#34;https://github.com/openculinary/frontend/issues/89#issuecomment-612141517&#34;&gt;link sharing&lt;/a&gt; so that people can more easily share recipe ideas they find with friends&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There&amp;rsquo;s a &lt;a href=&#34;https://github.com/openculinary/frontend/issues/88&#34;&gt;user experience bug&lt;/a&gt; relating to &amp;lsquo;jumpy&amp;rsquo; search results that we&amp;rsquo;re planning to get rid of&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;ll be &lt;a href=&#34;https://github.com/openculinary/crawler/issues/6&#34;&gt;upgrading the recipe crawling library&lt;/a&gt; that we use, and that will provide us with more sources of recipes from the web&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Welcome!</title>
      <link>https://blog.reciperadar.com/posts/welcome/</link>
      <pubDate>Tue, 29 Oct 2019 13:13:48 -0700</pubDate>
      <guid>https://blog.reciperadar.com/posts/welcome/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://blog.reciperadar.com/tags/engineering/&#34;&gt;engineering&lt;/a&gt; tag will be the home for a series of
articles detailing the engineering effort behind building RecipeRadar, a recipe
search engine and meal planner.&lt;/p&gt;
&lt;p&gt;From Kubernetes to proxy caching, from Python to ingredient graphs, we&amp;rsquo;ll
write content to explain the technology behind the application, and how those
technologies were selected and evaluated.&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
