This project
Carrot Cake
Here's one I made earlier

is the combination (or convergence - get it?) of several of my hobbies: food, cooking and software. I do this project in my free time, and as a labour of love. I'll never get rich from this, but it's fun and it keeps my skills sharp. Any money I do make from this project will probably be squandered on beer and silly t-shirts. Well one can dream.

My long-term goal for this project is to build a recipe platform which lets people anywhere in the world cook and share great food and recipes, regardless of where they are or what language they speak. The point is not just to support different languages and measurement systems, but also to convert between them so anyone anywhere can access it. I'd love to draw together a community of food lovers, not just some user base for a monetized website: the site upkeep would be covered by donations, user data wouldn't be sold or passed on, and the site wouldn't be polluted with advertising. I would give it away for free to regular folk and non-profit organisations, and it would work even in places without internet access.

And hey, while I'm waiting for that all to happen, the project serves as decent portfolio project (should I ever, like you know, need to get a job or something).

Story time...
Pavlova
Pavlova, proudly invented in New Zealand!

The recipe management idea first came to me back in 2010 at a festival in New Zealand where around 300 people gathered out in the middle of nowhere and just kind of hung-out for a week running workshops, volunteering, being creative, releasing their inner butterflies, and doing basically whatever they feel. I was approached by the guy managing the kitchen team for this whole event. He had been cranking out two meals per day for 7+ days for 300 people - including special diets - and had been planning everything using Excel (I know!), and on hearing that I was in IT asked whether there might be a better way to manage it all. Barry gave me a copy of his spreadsheet and I started kicking around ideas about how such a system might be implemented.

Nothing much really happened until a few years later that I had the idea of trying to implement it using Eclipse Scout. I had been working with that tech recently at that point, and took it on as a good learning experience. Why not.

So I do. I start investing spare time making this recipe management system, using Scout to handle the data entry and Jasper Reports to generate the printouts. At one point I had the idea of having a central online recipe database, and being able to connect multiple clients to it, so I did. I added offline support too, since the festival is in a cellphone black-spot and can't access the server. So that necessitated an offline database (Derby) and data synchronizing. I even got it running on a free Openshift server. All great learning experiences. And so, the very first version of ConvergenceMenu was completed (SVN tagged) on 18 September 2013. So what next?

Well, there was still no landing page - just the Scout server. After having been working on a Java EE project at work, I decided to build a little website for my server - again, "just for fun". I used the relatively new and obscure Bootsfaces (which worked out well I think), registered the www.convergencemenu.com domain (16th November 2014), and got a web project up and running, still using Openshift's (slow, but free) hosting. By late 2014 the website was up. It worked. Technically.

Since then I've moved the website to paid hosting, rebuilt the website, fended off hackers, added lots of stuff to the back-end, and upgraded pretty much everything (alongside my regular work). In 2017 I returned to the same festival to see if it would fly. It really didn't; the configuration was too clumsy, the model was too strict, and there were bugs hiding everywhere like cockroaches. Damn. On the plus side I took away some really great feedback, a clear idea of what needs to be fixed, and some great experience volunteering in the kitchen. I got stuck right into adding the missing features, removing bugs, and updating the website once again.

More time went by. Covid happened. I decided to make some improvements, but had difficulties setting up my old development environment. Java EE/Bootsfaces was well out of date, Eclipse Scout was a few major releases behind also, and modern IDEs didn't really play nicely with this old tech. The web world had well and truly moved on, and so I decided I had to also. It was time for a complete rewrite. I chose Java Spring with Hibernate for the back-end, and Thymeleaf and Bootstrap for the front-end, keeping the postgres DB the same. I have re-written all of the templates, and retained as much of the functionality as I think makes sense. At the same time I have stripped back parts of the website I don't think are necessary (e.g. login, sign-up, etc - the back-end scout server can be used for most of that). What's left is a minimum viable product for displaying recipes. I'm happy with that for now.

Big thanks
Marco
No more tears
are due to:
  • all of the awesome often-source software I use or have used. Eclipse and IntelliJ IDEs, the Eclipse Scout framework, Spring, Thymeleaf, Bootstrap, PostgreSQL, CentOS, and even Java itself. It's all free, and that's awesome.
  • Let's Encrypt for free SSL certification.
  • all those tolerant souls who have endured conversations about the project over the years.
  • all users of the site - especially those brave enough to put their recipes up.
  • my dear wife Nina, who for the longest time was my entire user base, and who endures much and complains only moderately.
  • Barry and Riss, who helped get me started. Cheers guys.
  • Bise and (again) Nina for help with site translations.
  • Radio Paradise, a music streaming service I listen to while cooking and coding, whose donation-based system inspired me to try.
  • anyone who slaves their asses off in hot kitchens all day every day. Chefs, line cooks, dishies, the lot of you who conspire to bring the nice edible things to my table. My respect: you haz it.
What's new?

The old JSF/Bootsfaces is well out of date, and improvements are becoming difficult using the dated tooling. I decided to rebuild the entire website using modern architecture. At the same time the webserver started having problems with memory, and the hosting provider (Gandi) changed their terms and pricing. It was time for a change.
  • Ditched JSF / Bootsfaces
  • Rebuilt a minimal version of the website using Thymeleaf / Boostrap with a Java Spring backend.
  • Migrated server to new host, requiring a complete setup of the web server.
  • Ditched login area and back-end for now. Will add again when time allows. Priority is to get the recipes online.

  • Major upgrade of back-end to latest Scout framework version (requiring full code migration)
  • Merged ingredient list into recipe form.
  • Added recipe and ingredient quick-searches to homepage.
  • Added featured recipe book to homepage.
  • Added Portuguese.
  • Dropped the offline support (for now - may add back later).

  • Fixed some issues with unit conversion behaving very weirdly in very specific situations.
  • Improved the unit converter page usability.
  • Several minor usability improvements and admin features in the back-end app.

Fixed a few minor things which were bothering me:

  • Included private units in unit selection when a unit-system preference is set (back-end)
  • Fixed an issue where the original image file was deleted when uploading images via the back-end desktop app.
  • Updated the recipes (and myrecipes) tables to highlight multilingual recipes.
  • Fixed issue where recipes shared in multiple recipe books were appearing multiple times in search results.

Being stuck at home during this crazy period of coronavirus isolation, I've had time to add something which has been on my list for a while: proper support for attributing credit. It's now possible to credit the source of your inspiration, and to even link to their website (which is a nice way to say thanks, and is good for their business and google ranking).

Other bugfixes & minor enhancements:

  • Placed click-able links in the recipe table, which lets you open them in new tabs (thx Kaja!) :)
  • Made translations appear correctly on the 'my recipes' table.
  • Fixed minor SEO issues

Also thanks to Nina for help with translations and idea-bouncing (as usual). :)

Due to the sheer scale of work required to implement multilingual support, this release has been a long time in the works. But now at long last, it's done! To start with, I've only added translations for Croatian to see how it goes (heartfelt thanks to my translating crew: punica Bise and žena Nina), and I'll add more languages later depending on the response I get. (BTW if you'd like the website to support your language, please get in touch! Especially if you're willing to help with translating it I'd love to hear from you!)

But the website translations are just the beginning. What's even cooler is multilingual support for the actual recipes themselves. This means a recipe can be entered in multiple languages, including not just its original text but also common languages (e.g. English, Spanish, etc). In this way it's possible to open traditional cooking to the world while preserving its authenticity.

And it's not just the recipe texts. Ingredients, units, and everything are translatable. The entire recipe can be switched to a different language without losing its meaning.

Other bugfixes & minor enhancements:

  • Implemented sending of e-mails
  • Added e-mail verification step for account sign-up
  • Cosmetic fixes for recipe display page and report
  • Fixed glitch converting between unit systems on unit conversion page
  • Fixed minor bug which hindered sharing from back-end.
  • Fixed structured data and added language tags for the google spider bot.
  • Minor irritating post-release bugfixes (v2.5.1).
  • Recipe presentation tweaks, back-end translation bugfixes, submission approval process fixes (v2.5.2).

Bugfixes & minor enhancements:

  • Fixed unit conversion scaling issue in recipe reports (oops!)
  • Redirects to user's recipe list after login (instead of account).
  • Fixed website recipe visibility issue with privately shared recipes
  • Fixed back-end recipe visibility issue for privately shared recipes.
  • Updated share-with-group option in back-end to disable groups where the recipe has already been shared.

This release contains only one feature, but oh, what a feature: Units conversion is here!

What this means, is that recipes can be converted between unit systems. So a recipe written in metric measures can be switched to UK or US imperial units (or whatever) directly from the website. Why is this cool? Because it's one less barrier preventing people of different cultures from sharing their recipes. Especially if you grew up in one of those weird places that use decagrams or fluid ounces. ;)

To be fair, it's not magic; it's strictly mass-to-mass or volume-to-volume (you need density to do mass-to-volume, and that's too crazy even for me - this was mind-bendy enough), and you need to relate it back to grams or milliliters. But hey, this is a big step even so.

I also linked up the user preferences (and made it editable from the website), so your preferred unit system is loaded by default. You can still use the original measures if you wish, and if you don't see a unit you'd like to cook with, you can just go and create your own.

FAQ & licensing.

  • Added a long-overdue FAQ page.
  • Implemented license types and guests limits.
  • Fixed user display-name presentation.
  • Fixed offline DB driver issue
  • Made the terms and conditions available on their own page
  • Improved recipe report layout
  • Upgraded to latest JasperReports (v6.7.0)

Introducing Fridge Mode: search for recipes using ingredient you have!

  • Ingredient-based recipe search.
  • Can search by dietary requirements.
  • Can search within a recipe book or your own personal recipe library (when logged in).
  • Also searches for recipes with related (i.e. more specific forms of) ingredients.
  • Shows recipe-match accuracy (how many ingredients matched out of how many you searched for, and how many extra ingredients you'd have to buy).

Other back-end bugfixes from v2.4.4/5 and minor website enhancements.

  • Added make-copy function for copying of shared recipes (when granted).
  • Enforced group-name uniqueness.
  • Fixed issue with loading certain outlines on mobile web.
  • Fixed shared-recipe visibility issue.
  • Fixed SEO thumbnail URL, so Google et al. can preview the recipe pictures better.
  • Implemented http security headers to the front-end website for reduced insecurity!
  • Reorganized menu bar (and icons! It's better now).

Recipe books added to website!

  • Recipe book pages added to showcase public groups.
  • Permission controls implemented for accessing recipes in private groups (when logged in).
  • Recipe URL scheme simplified from viewrecipe.xhtml to recipe.xhtml (incl. redirect for old links).
  • Improved page meta-data to appease the search-engine gods.
  • Fixed image stretching issue on home-page recipe carousel.
  • Fixed issue with recipe printout preview not being closable on mobile devices.

Bugfixes from 2.4.0-2 + minor improvements.

  • Fixed issue with SEO and report banner (http vs https links)
  • Made recipes & sides swappable
  • Fixed error in calculation table
  • Minor formatting and layout improvements
  • Improved table-refreshing event handling
  • Fixed dietary flag presentation in event plan
  • Made 'Estimate Yield' function obey unit system preference
  • Fixed bugs when duplicating meals, deleting recipes and configuring private unit systems.

More bugfixes from 2.4.0-1.

  • Fixed several issues preventing the creating, editing or merging ingredients and meals.
  • Made recipe variations and dietary flags visible in the recipe preview and in reports.
  • Improved recipe preview layout for mobile/tablet.
  • Made unit lookup calls be displayed hierarchically (within unit systems) when no unit system preference is set.
  • Reworked data reloading after editing data.

Mainly a bugfix release (from 2.4.0) + a few minor updates.

  • Fixed major issue preventing mobile and tablet back-end from working
  • Fixed errors in SEO structured data
  • Added Desktop Client downloads to server for licensed users (+ implemented security).
  • Simplified Terms of Use text, updated about and error pages
  • Added dietary flags disclaimer to shared recipes
  • Reworked desktop client packaging (reduced download size, updated JRE)

Major upgrade to front-and-back-end containing critical features to support event planning, plus multiple enhancements to the website.

Main improvements for 2.4.0:

  • New recipe preview page with recipe scaling
  • Added recipe dietary flags (Vegetarian, etc)
  • Added unit systems (metric, imperial, etc)
  • Recipe variations (duplicates a recipe, maintains link back to original)
  • New 'functional' report for meal planning
  • Improved database performance (DB restructuring, performance tweaking)

Noteworthy front-end (website) changes:

  • New recipe preview page
  • Recipe report generation now supports scaling + images in HTML preview
  • Search-engine optimization (dynamic sitemap.xml)
  • Content made visible to search engines (json+ld structured data)
  • Social-networking share buttons (custom-built to prevent tracking)
  • Upgraded web framework (Bootsfaces) to latest (1.2.0)
  • Automatic renewal of SSL certificates (Certbot)
  • Fixed user signup page (oops!)
  • Many other minor tweaks, fixes and upgrades to improve the website speed and usability

Noteworthy back-end (recipe management) changes:

  • Improved UI for adding ingredients to recipes
  • Guest count can now be set per meal (within an event)
  • Added a 'functional' A4 landscape no-frills event plan.
  • Automatic insertion of core data to offline database
  • Converted recipe images from png to jpg format (reduces disk usage by 95%, increases load speed)
  • Implemented favourite and startup views
  • Added day selection, section selection and excel format option to report generation
  • Reporting engine (Jasperreports) upgraded to latest (6.5.1)
  • Offline db (derby) upgraded to latest (10.14.2.0)
  • Many, many bugfixes

For detailed information, see trello archives.

New in 2.3.4: (...yeah, actually mostly just bug fixes from 2.3.3. :)

  • Fixed shopping list from showing private units and suppliers from other users
  • Fixed ingredients from being configured as a side dish when they are added to a recipe (again).
  • Fixed several issues where some ingredients were being excluded from reports, shopping lists and calculations
  • Integrated google analytics (helps me monitor web traffic)
  • Migrated TODOs to Trello board (still private, but ask if you want to contribute)

New in 2.3.3:

  • Made section description multi-line
  • Defined reserved units "servings" and "pieces"
  • Improved cooking time recognition
  • Fixed uploading of recipe images on web
  • Implemented SSL encryption
  • Migrated to more serious web hosting
  • Removed image border from report
  • Enabled text-wrapping of notes (and ingredients) in report
  • Moved 'servings' from bottom of report to adjacent to 'cooking time' (right-aligned)
  • Fixed vertical space issue of preparation text
  • Added recipe descriptions
  • Ingredients are inexplicably being set to 'suitable for side'.
  • Renamed 'fresh' to perishable
  • Added descriptions to recipes

New in 2.3.1:

  • UI improvements when adding ingredients
  • Recipe yield auto-estimation
  • Event flexibility improved
  • Some bug fixes.
  • Some new bugs.

Site improvements:

  • 'My Recipes' page with HTML preview and pdf download
  • Public recipe book for shared recipes (with static URLs for linking and sharing)
  • Single login works for both the website and the ConvergenceMenu app.
  • Simple unit conversion tool converts between known units

New in 2.2.0:

  • Recipe ingredient 'sections' let you break a recipe's ingredients into blocks, with descriptions.
  • Automatic unit conversion to 'most human-readable' form, because you'd rather add 1 litre than 200 tsp.
  • Addition of 'sub-ingredients' for better searching and organising.
  • Drag-and-drop recipe ingredient (and section) reordering.
  • Some bug fixes.
  • Some new bugs.