- Fixed server error when submitting empty tag
- Fixed ingredient name encoding in markdown export
- Added historical bar origin field to cocktail
- Added ingredient reviews
- Correctly match unspecified cocktail ingredients when variants are in shelf
- Dilution percentage is now considered when calculating total cocktail volume
- Fixed unable to change existing invalid currency code on bar
- Fixed missing access check for cocktail in cocktail tags generation
- Added menu edit and view permissions to PAT
- Added US/UK standard drink setting to bar settings
- Updated starter media catalog
- Added more public cocktail filters
- Fixed author and year not being imported via datapack
- Added bar member cocktail reviews
- Added cocktail sort options:
review_count,year - Added ingredients filter options:
distillery,origin - Added origins and distilleries to
metaon GET/ingredientsendpoint
- Fixed robots txt not parsing some URLs as allowed
- Added cocktail year filtering
- Relaxed slug regex to allow for legacy slugs
- Fixed missing currency validation when creating bar
- Fixed missing location header expose in CORS response
- Added immutable starter media catalog
- Fixed OIDC session store exception
- Added support for half-star ratings
- Fixed wrong openapi schema for leave member
- Fixed quantity exception in cocktail recommender
- Added
favorited_by_usercocktail filtering - Added
authorcocktail filtering - Glass images are now exported in datapack export
- Fixed migration issue when bar had members that were deleted
There is no specific migration steps you need to follow.
This release mostly introduces a big code refactoring. But there is still some new stuff available.
If you are used to having two shelves, one for your personal ingredients and one for your bar, keep in mind that this is no longer the case with this release. The only thing initially available is bar shelf. User shelves will be slowly migrated to new user multi-inventory system. If you want to keep that functionality, wait for one of the next releases.
- Removed
Moderatorrole- Existing moderators will be migrated to Admin role
- Removed user based shelf → replaced with multi-inventory per member
- Data is migrated to
member_inventorytable, members can now have multiple named inventories - Shelf routes moved:
/members/{id}/inventories/*and/bars/{id}/inventory/* - WIP: UI integration still being tested
- Data is migrated to
usersroute prefix has been changed tomembers- Profile endpoints reorganized:
- DELETE
/profilenow deletes user account (was DELETE/users/{id}) - POST
/profile/change-passwordadded (was POST/password-check→ removed)
- DELETE
- Removed GET
/{id}/membershipsand DELETE/{id}/membershipsfrombarsendpoint (now handled viamembersendpoint) - Removed DELETE
/{id}/memberships/{userId}frombarsendpoint - GET
/{id}/statsfrombarsendpoint has been replaced by astatsprefix with specific endpoints (totals,taste,ingredient-distribution,top) - PUT
/{id}/cocktailsfor collections has been renamed tosync - Reworked how menu categories are stored
- Menu request payload is now updated
- Response of POST and PUT
/ingredientsno longer returns the whole object - Removed
POST /images/{id}(update) andGET /images(list) endpoints - Removed
explore/*routes (consolidated intopublic/*endpoints) - Removed MCP server
- Shelf/favorites routes reorganized:
- Moved GET
/usersto GET/members - Removed GET
/bars/{id}/memberships - Moved POST
/bars/{id}/memberships/{userId}to POST/members - Moved PUT
/bars/{id}/membershipsto PUT/members/{userId} - Moved DELETE
/bars/{id}/memberships/{userId}to DELETE/members/{userId} - Moved shelf ingredients/cocktails/favorites/recommend to
/members/{id}/inventories/*and/bars/{id}/inventory/* - Moved
/{id}/cocktail-favoritesfor members
- Moved GET
- Added
ingredients/{idOrSlug}/extraendpoint showing unlockable cocktails - Added
is_bar_inventory_awareto menu items- Shows if menu item availability depends on bar inventory
- Added
is_enabledto menu category - You can now add amounts and units to ingredient parts
- Added
authorfield to cocktail recipes - OpenAPI docs now use Scalar UI (replaces Elements)
- Added generic OIDC SSO provider #594
- Fixed html entities getting encoded in markdown export
- Fix missing cocktail request validation (
amountandunits) when creating a new cocktail
- Increased auth endpoint rate limits :)
- Added rate limiting to auth endpoints
- Added
/generate/cocktail-image, used to generate cocktail images with AI- Currently only supports OpenAI and Gemini providers
- Added
GEN_AI_IMAGE_PROVIDERandGEN_AI_IMAGE_MODELenv variables - Examples:
# OpenAI Example GEN_AI_IMAGE_PROVIDER=openai GEN_AI_IMAGE_MODEL=gpt-image-1 OPENAI_API_KEY=sk-your-key # Gemini Example GEN_AI_IMAGE_PROVIDER=gemini GEN_AI_IMAGE_MODEL=gemini-3.1-flash-image-preview GEMINI_API_KEY=your-key
- Added
is_ai_image_enabledto server status endpoint
- Fixed adding ingredients to shelf removing matching shopping list items outside the current bar
- Updated AI prompts
- Fixed email header links
- Correctly check
bar_idalongsidepublic_idfor public cocktails - Validate image URLs when uploading images
- Fixed vulnerable dependency
- Fixed datapack import trying to set wrong unknown columns
- Added
kanidmSSO provider - Added generative AI endpoints
- Support is added via PrismPHP library. So you can use any provider supported by this library.
- Added
/generate/ingredient, used to complete ingredient data based on the name - Added
/generate/cocktail-tags, used to suggest cocktail tags - Added
/generate/cocktail-recipe-from-text, used to generate structured recipe output from raw text - Here's an example of env configuration:
# To use with ollama: GEN_AI_PROVIDER=ollama GEN_AI_MODEL=ministral-3 OLLAMA_URL= #Optional, will use http://localhost:11434 by default # To use with openai: GEN_AI_PROVIDER=openai GEN_AI_MODEL=gpt-4 OPENAI_API_KEY=sk-proj-your-key OPENAI_ORGANIZATION= #Optional
- Correctly clean up old image when new one is uploaded
- Removed feeds
- Improved bar delete query plan
- Updated default recipes data
- Added
filtersproperty tometaproperty in public cocktails index- Added
collectionslist- This will show all collections that are shared with the bar
- Added
- Added
collection_idfilter to public cocktails index
- Fixed crash when metrics are enabled
- Fixed missing calculator reference in datapack import
- Fixed empty menu when only ingredients are added
- Added
SCRAPING_HTTP_PROXYenv variable- You can now set an HTTP proxy for scraping requests
- Example value:
http://username:password@proxyserver:port
- Added
SCRAPING_CLIENT_CERTenv variable- You can now set a client certificate for scraping requests
- Example value:
/var/www/cocktails/storage/bar-assistant/my-cert.pem
- Improved search results for queries with multiple words
- Fixed out of memory errors when exporting large bars
- Added
locked_user_cocktailsfilter to cocktails endpoint- This will show cocktails that are locked for the user (not all ingredients are in user's shelf)
- Added
locked_bar_cocktailsfilter to cocktails endpoint- This will show cocktails that are locked for the bar (not all ingredients are in bar's shelf)
- Added
potential_bar_shelf_cocktailssort to ingredients endpoint- This will sort ingredients by how many new cocktails would be unlocked for the bar if the ingredient is added to bar shelf
- Docker image is now built on top of PHP 8.4 base image
- Fixed shopping list access check
- Fixed CSV import errors
- Public menu can be enabled independently of
is_publicbar setting
- Documented
public/{slugOrId}endpoints- You can now access public bar data via
public/{slugOrId}endpoints - Added GET
public/{slugOrId}/menuendpoint - Added GET
public/{slugOrId}/cocktailsendpoint - Added GET
public/{slugOrId}/cocktails/{cocktailId}endpoint - Added
is_publicproperty toBarschema- If set to
true, bar will expose public endpoints/public/{barId}/*
- If set to
- You can now access public bar data via
- Added
is_menu_enabledto publicBarschema
- Fixed search driver indexing calls when not using search driver
- Default ingredient unit bar setting is not correctly applied when importing data via datapack
- Fixed unique constraint violation when adding ingredients into bar shelf
- Fixed missing API ability on
import/cocktailendpoint
- Added
bars/{id}/sync-datapackendpoint- This endpoint will sync existing bar data with the default datapack
- Existing recipes and ingredients will not be overwritten, only new data will be added
- Recommendations now take into account bar shelf ingredients, recipe recency and negative tags
- Import parent cocktails via datapack
- Added
is_publicproperty toBarschema- If set to
true, bar will expose public endpoints/public/{barId}/* - New public endpoints are still being documented
- If set to
- Added optional
html_contentto scrape request schema- This allows you to send raw HTML content to scrape endpoint, instead of server making a request to the URL
- Scraping now respects
robots.txtrules - Scraping is now done with identifiable user agent
- Fixed
parent_cocktail_idtype error when importing data via datapack
- Added cocktail recipe parent ID tracking
- Enables recipe varieties/riffs
- Copying recipe will automatically reference the copied recipe as a parent cocktail
- Added
parent_cocktail_idtoCocktailschema - Added
varietiestoCocktailschema
- Added cocktail recipe year
- Fixed missing detailed error message when scraping failes
- Fixed calculator import error on null values
- Fixed missing cocktail recipes with duplicated names in datapack export
- Fixed total missing ingredients counting when filtering by ingredient
- Added images upload support to glass types
- Added
supports_recipe_importto feed item
- Added missing glass volume and volume units to datapack export
- Fixed menu cocktails not getting removed correctly
- Fixed recipe matching when complex ingredient includes multiple ingredient parts
- Added Zitadel as SSO provider
- ABV now gets recalculated when method dilution percentage changes
- Fix materialized path migration failing in certain cases
- Added PocketId as a SSO provider
# Setup via:
POCKETID_BASE_URL=
POCKETID_CLIENT_ID=
POCKETID_CLIENT_SECRET=
POCKETID_REDIRECT_URI=
- Added import support for
cocktailexplorer.co
- Fixed menu item having wrong thumb path
- Fixed wrong thumbnail URL getting synced into search engine
- Query string
stateis always being sent when using Authelia as SSO provider
- Automatic ingredient units filler function now tries to convert to default bar unit
- Fixed OpenAPI schema not being in sync with some responses
- Added
ENABLE_PASSWORD_LOGINvariable- You can now disable password login by setting this to false
- Added external feeds support
- We now collect RSS feeds from popular cocktail related websites and show recipes and news items
- Currently in beta, can be enabled with
ENABLE_FEEDS=trueenv variable
- Added
unitsto ingredients- Used to define default units for specific ingredients
- Added more
infoandwarninglevel logs to authentication - Added
is_feeds_enabledandis_password_login_enabledtoServerVersionschema - Added
bars.readandbars.writeto personal access token abilities
- Search index sync refresh no longer happens automatically on docker (re)start
- You should now run it manually or via bar optimize endpoint
- Fixed missing
imagesonBarRequestschema - Fixed missing properties on
Ingredientschema
- Added
thumb_urltoImageschema - Added
imagetoCocktailBasicandIngredientBasicschemas - Added POST
/bars/{id}/optimizemethod- Used to run some optional commands per bar like, recalculating ABV, refreshing bar search index, recalculating ingredient hierarchy
- Added cocktail tag index
- Fixed
MenuandMenuRequestschemas being out of sync - Fixed duplicated queries when fetching descendants
- Fixed cast error when duplicating recipe
- Optimized ancestors query execution
- Added missing menu schema changes
- Added route parameters type validation
- Fixed SQL error when filtering by bar ingredients
Here's a quick summary of the more interesting changes:
- Added SSO support
- Added nested ingredient hierarchy and removed ingredient categories. You can now assign parent child relationships for ingredients and use all descendants of a given ingredient as a possible substitute. This gives option for users to manage more complex ingredient taxonomies, like "Spirits > Rum - Blended > Rum - Blended Lightly Aged"
- Various query optimizations, the app should now be faster and more efficient on large datasets
- Removed ingredient categories
- Existing ingredient categories will be migrated to nested ingredient hierarchy, with ingredient category as the root node
- Removed
category_idfrom ingredient filters
- Removed "Track parent ingredients as a substitutes" option
- This is now default behavior
- Updated Menu schema
- Added MenuItem schema to support multiple menu item types
- Removed
bar_idquery param support- Use
Bar-Assistant-Bar-Idrequest header instead
- Use
- Added nested ingredient hierarchy
- Updated
IngredientandCocktailIngredientschemas to reflect the new structure - All descendants of a given ingredient are now considered as possible substitutes
- You can specify if you want to use all descendants of a given ingredient as a possible substitute
- Max nesting level is 10
- Added
ingredients/{id}/treeendpoint to show ingredient hierarchy - Added
bar:rebuild-hierarchy {barId}artisan command to rebuild ingredient hierarchy - Added
parent_ingredient_id,descendants_offilters toingredientsendpoint
- Updated
- You can now add ingredients to the menu
- Public menu schema now contains item images and bar shelf status
- Added SSO support
- You can now login via SSO if the server is properly configured
- Currently supports: Google, GitHub, GitLab, Keycloak, Authentik, Authelia
- Added GET
sso/providersendpoint to list available SSO providers - Added GET
sso/{provider}/redirectendpoint to redirect to SSO provider - Added GET
sso/{provider}/callbackendpoint to handle SSO callback - Added DELETE
profile/sso/{provider}endpoint to remove SSO credentials from user - Updated
Profileschema
- Added
recommender/cocktailsendpoint- You can now get recommendations based on your favorite cocktails
- Added user profile settings
- Used to store default settings like language and theme
- Added support for default bar currency
- Added
sugar_g_per_ml,acidity,distilleryproperties toIngredientschema
- Updated Laravel to version 12
- Import
sourceproperty can now be JSON object
- Publish image to GitHub Container Registry
- Fix security issue in dependencies
- You can now use
*inMETRICS_ALLOWED_IPSto allow all IPs - Calculators are now included in
datapackexport
- Fixed diffords guide scraper missing instructions
- Added calculators, unleash your inner Kevin Kos
- Add inputs and formulas to calculate your favorite syrups, batches, juices, etc.
- Added
/calculatorsendpoint - Added
calculator_idto ingredient schema
- Added scrape support for recipes from
Crafted Pour - Added
randomsort attribute to/cocktailsendpoint - Added prometheus metrics
- Added
/metricsendpoint - Added
METRICS_ENABLEDenvironment variable- To enable metrics redis is required
- Added
METRICS_ALLOWED_IPSenvironment variable- If you enable metrics, you need to specify allowed IPs to access the
/metricsendpoint - Define multiple IPs separated by commas
- If you enable metrics, you need to specify allowed IPs to access the
- Added
php artisan bar:clear-metricscommand - Added
provisioning_bars_totalmetric - Added
active_bars_totalmetric - Added
deactivated_bars_totalmetric - Added
active_users_totalmetric - Added
api_request_processing_millisecondsmetric
- Added
- Improve error handling when scraping recipes from unsupported sites
- CSV import now matches categories by case-insensitive name
- Added
/import/ingredientsendpoint to import multiple ingredients from a CSV file - Added
is_favoritedto cocktail schema - Added filter by
nameto/cocktail-methodsendpoint - Added support for Sentry error reporting via
SENTRY_LARAVEL_DSNenv variable - Added
bar:migrate-shelfcommand for server owners - Added
org.opencontainers.image.sourcelabel to docker image
- Properties
in_shelfandin_bar_shelfon cocktail schema correctly match substitute and complex ingredients - Fixed unit parsing for scraping and importing cocktails
Ignored, mistake in release protocol
- Fixed wrong substitutes ingredient id counting
- Fixed overcounting ingredients which led to incorrect recipe matching if multiple substitutes were used
- Added missing filter
missing_bar_ingredientsattribute to/cocktailsendpoint
- Optimized ingredients list query
- Moved SQLite optimizations from docker entry point to api
- Fixed missing rate limit for imports
- Fixed missing max images validation for cloud instance
- Fixed markdown export encoding special characters
- Fixed missing complex ingredients on import
- Fix unhandled exception when menu cocktail has
nullas currency
- Login endpoint now requires confirmation if
mail_require_confirmationis enabled - Meilisearch tokens are now updated on docker restart only if the key has changed
- Ingredient and Bar
imagesnow have size validation - Removed wrong token ability check for export download
- Fixed issues with search tokens not clearing correctly
- Improved search indexing on larger datasets
- Fixed personal access token middleware handling
- Price calculations for price per pour should be more accurate now
- Added cocktail prices
- Added
/cocktails/{id}/pricesendpoint - Show all calculated prices per price category
- Automatically converts units to calculate the price if possible
- Added
- Added
/menu/exportendpoint- Exports menu as CSV
- Added
/bars/{id}/cocktailsendpoint, showing bar shelf cocktails - Added
/bars/{id}/ingredients/recommendendpoint, showing next recommended ingredients for bar BasicCocktailschema now includesshort_ingredientsproperty- Bar shelf is included in datapack export
- Bar shelf can be imported from datapack
- Added
total_bar_shelf_ingredientsto stats endpoint - You can run the app as a worker if you set
APP_ROLE=workerenv variable
- Fixed missing substitute ingredient unit conversion in exports
- Fixed missing max amount when importing from export
- Stat
total_bar_shelf_cocktailsnow includes extra ingredients ifuse_parent_as_substituteflag is enabled
- Added bar shelf
- Each bar now has its own shelf which can be viewed by every bar member
- Currently members with Admin and Moderator roles can manage bar shelf
- Bar shelf will be initially populated with all ingredients that current bar owner has in his shelf
- Added GET
/bars/{id}/ingredientsendpoint - Added POST
/bars/{id}/ingredients/batch-storeendpoint - Added POST
/bars/{id}/ingredients/batch-deleteendpoint - Added filtering by
bar_shelfattribute to/ingredientsand/cocktailsendpoints - Added sorting by
missing_bar_ingredientsattribute to/cocktailsendpoint - Added
total_bar_shelf_cocktailsto/statsendpoint - Added bar shelf status attributes to
IngredientandCocktailresponse schemas
- You can now add images to Bar resource
- Allows to upload custom bar logo, for example
- Fallback to "EUR" for unknown currencies in menu (fixes migration issues from v3)
- Added validation to endpoints that manage user and bar shelf
- Check for shelf ingredients before adding them to the shelf
- Fix for missing directories in docker entrypoint
- Fix export id generation
- Added prod target to docker image
- Fixed wrong endpoint name
- Fixed a bug where the bar import command checked the wrong filepath
- Fixed a bug where cocktails with substitutes + any other filter were not being filtered correctly
This is a new major release. Here's a quick summary of the more interesting changes:
- Docker image is now run as an unprivileged user by default. This has various implications, so please check the migration guide for more info
- Improved API endpoint naming and structure
- Added public Bar Assistant JSON schema specification for cocktail recipes
- Data exporting is now available in multiple formats
- Minimal PHP version is now 8.3
- Removed
imagickPHP extension - New extensions required:
ffi - Removed importing cocktails from collections
- Removed importing data from Bar Assistant v2
- List all cocktails and ingredients endpoints don't have default includes anymore
- Refer to OpenAPI documentation for a list of available includes
- Shelf
- Moved
/shelf/ingredientsto/users/{id}/ingredients- Changed response schema, now returns
IngredientBasic - Supports pagination
- Changed response schema, now returns
- Moved
/shelf/cocktailsto/users/{id}/cocktails- Changed response schema, now returns
CocktailBasic - Supports pagination
- Changed response schema, now returns
- Moved
/shelf/cocktails/favoritesto/users/{id}/cocktails/favorites- Changed response schema, now returns
CocktailBasic - Supports pagination
- Changed response schema, now returns
- Moved
- Removed
cocktailsproperty fromIngredientschema- Use
/ingredients/{id}/cocktailsendpoint instead - Supports pagination
- Use
- Moved
/ingredients/recommendto/users/{id}/ingredients/recommend - Grouped
/login,/logout,/register,/forgot-password,/reset-passwordand/verify/{id}/{hash}endpoints into/auth - Shopping list
- Moved
/shopping-listto/users/{id}/shopping-list- Updated
ShoppingListschema
- Updated
- Moved
- Collections
- Removed PUT
/collections/{id}/cocktails/{cocktailId}endpoint - Removed
/collections/{id}/shareendpoint - Removed DELETE
/collections/{id}/cocktails/{cocktailId}endpoint - Removed PUT
/collections/{id}/cocktails/{cocktailId}endpoint - Changed POST
/collections/{id}/cocktailsendpoint to PUT/collections/{id}/cocktails - Moved GET
/collections/sharedto GET/bars/{id}/collections
- Removed PUT
- Ratings
- Moved
/ratings/cocktails/{id}to/cocktails/{id}/ratings - Changed POST ratings response status code to 201
- Moved
- Menu
- Changed
priceattribute in menu request fromstringtointeger
- Changed
- Exports
- Added POST
/exports/{id}/downloadendpoint- Used to generate a download link for an export
- Added GET
/exports/{id}/downloadendpoint- Now requires a token and an expiration date
- Authorization is not required anymore
- Used to download an export
- Added POST
- Import
- Importing now requires a valid JSON schema
- Removed
saveparameter from/import/cocktailendpoint
- Removed
main_image_idfrom cocktail model- Use
images.sortinstead
- Use
- Removed
main_image_idfrom ingredient model- Use
images.sortinstead
- Use
- Stats
- Moved
/statsto/bars/{id}/stats
- Moved
- Introduced
Bar-Assistant-Bar-Idheader to specify bar id- Used for all endpoints that require bar id
- You can still send
bar_idquery parameter when needed, but it is considered deprecated
- Added
/ingredients/{id}/cocktailsendpoint, lists all cocktails that use this ingredient- Includes cocktails that use this ingredient as a substitute
- Added
/ingredients/{id}/substitutesendpoint, lists all ingredients that are used as a substitute for this ingredient in cocktail recipes - Introduced new export recipe schema
- Added
quantityto shopping list ingredients - Images are now converted to WebP format before saving to disk
- Added
/imagesendpoint, this endpoint is used to list all user uploaded images - Bar search tokens are now saved in database
- Added
/import/scrapeendpoint- This endpoint is used to extract recipe data from a website
- Result is a JSON schema that can be imported via
/import/cocktailendpoint - Images in response are now base64 encoded. This allows more flexibility in image handling for the clients
- Added
used_as_substitute_forandcan_be_substituted_withto ingredient response
- Recommended ingredients now take complex ingredients into consideration
- Image processing moved from Imagick to Vips
- This now requires
libvipsto be installed on the server- You can install it via
apt-get install -y --no-install-recommends libvips42
- You can install it via
- This now requires
ffiPHP extension to be installed, and some .ini tweaks
- This now requires
- Meilisearch client API keys are now generated via artisan command
- All dates in responses are now in ISO 8601 format
- You can now update slug of existing bar
- Fix missing base data in recipes export
- Updated the way OpenAPI specification is generated
- Now generated directly from the code
- Should improve sync between docs and implementation
- Updated docs rendering
- Improved complex ingredient matching
- Fixed wrong matching cocktails when parent ingredient tracking is enabled
- Added price categories
- Categorize prices by currency and name
- Added ingredient prices
- Add price per unit
- Assign price categories
- Added
json+ldcocktail share type
- Added
intlPHP extension to docker images
- Fix glass volume not nullable #301
- Added support for complex ingredients
- Complex ingredient is ingredient that contains other ingredients
- If you have all ingredients that are a part of complex ingredient, that complex ingredient will be automatically matched in your shelf
- For example: If you have a "Lemon", you should also match "Lemon juice"
- Ingredients now include
in_shelf,in_shelf_as_substitute,in_shelf_as_complex_ingredientattributes to show how are they matched in your shelf
- Added ingredient bar ownership validation when adding complex and cocktail ingredients
- Punchdrink scraper now scrapes "Editors note" part of the recipe and includes it into description
- Upgraded framework to Laravel 11
- Added
bar:merge-ingredientscommand- Used for merging multiple ingredients into one
- Improved ImbibeMagazine scraper, now supports recipes in "older" format
- Optimized ingredients list endpoint DB queries
- Optimized similar cocktails list endpoint DB queries
- [Internal] Moved to Laravel Pint for code style
- [Internal] Imagick extension is now used int tests
- [Internal] Tests are now run in parallel in CI
- Fixed a crash when importing ingredients from array without sort attribute
- Added bar settings
- Currently supports
default_unitsanddefault_lang
- Currently supports
- You can change units used in collection CSV, markdown and text share by passing query string
unitswith one of the following units:ml,cl,oz - CocktailIngredient schema now includes converted and formatted values for:
ml,cl,oz - Added
volumetoGlassschema - Added
volume_unitstoGlassschema
- Updated cocktail text share format
- Added more logging to docker runtime
- Add POST
bars/{id}/transferendpoint- This is used to transfer bar ownership to another user
- Updated the way permissions are handled in when bar assistant container starts.
- This should improve startup/restart time after the initial setup
- Allow scraping and ratings in demo environment
- Hide tokens in demo environment
- Fix fatal error while importing unknown JSON format as a collection
- Fix missing unique IDs for resources with same name when creating exports
- Target master branch
- Fix fatal error while importing unknwon JSON format as a collection
- Fix missing unique IDs for resources with same name when creating exports
- Added
volume_mlproperty to cocktail schema- Shows approximate total drink volume
- Added
alcohol_unitsproperty to cocktail schema- Shows approximate drink alcohol units
- Added
caloriesproperty to cocktail schema- Shows approximate drink calories
- Added "KindredCocktails" scraper
- ABV calculation now supports all standard units
- "CocktailParty" scraper now correctly shows source ingredient string
- Bar export files now correctly get cleaned when deleting a bar
- Fixed recipes failing to import when ingredients were missing a category
- "CocktailParty" scraper now correctly parses units
- Other minor scraping fixes
- Added
/exportsendpoints- With this endpoint you can now manage recipe exporting for specific bars
- Added
specific_ingredientscocktails filter- This will show recipes that always contain specific ingredients
- Added
public_idandslugto public menu cocktail response
- Fixed "CocktailParty" scraper
- Added POST
/cocktails/{id}/copyendpoint - Added POST
/password-checkendpoint
- Updated and consolidated cocktail recipe share structure
- Cocktails now sync thumbnail URL to search engine
- Fixed search sometimes not correctly showing all results, for example, searching for
armywould not showarmy & navy
- Added
/tokensendpoint- You can create and manage custom Personal Access Tokens
- Current available token abilities are
cocktails.read,cocktails.write,ingredients.readandingredients.write - Tokens can have expiration date
- You can now pass optional
token_namewhen requesting a new token vialoginendpoint
- Added
slugcolumn tobarstable - Added a simple bar menu
- Added POST and GET
/menuendpoints - Added GET
/explore/menus/{barSlug}public endpoint - This is a simple menu implementation, more features are coming in future
- Added POST and GET
- When exporting and importing recipe data, timestamps are also imported
- Added
favorite_tagsto stats endpoint - Added
--typeoption to recipes export- Suports
yml(default) andjson
- Suports
- Optimized cocktail shelf query when parent ingredient tracking is on
- Searching by name now also searches slug
- Fixed missing substitute ingredient data on default recipe data import
- Fixed missing parent ingredient data on default recipe data import
- Fixed missing ingredient note data on default recipe data import
- Added
missing_ingredientscocktails filter - Added
use_parent_as_substitutesetting to bar memberships- With this you can toggle using parent ingredient of a specific ingredient as a substitute in your shelf
- Before, this was available via experimental
PARENT_INGREDIENT_SUBSTITUTEenv variable
- Added
csvexport to cocktail collections - Added
/ingredients/recommendendpoint- This provides recommendations regarding the additional ingredients that may be added to your shelf to expand potential new cocktail recipes.
- Removed
PARENT_INGREDIENT_SUBSTITUTEenv variable - Update login error message depending on mail confirmation config
- Update min log level to "warning"
- Updated cocktail markdown export format
- JSON export format is now the same as exported YAML recipes
- Bar Assistant now has a new cloud offering and homepage: barassistant.app
- Added
total_bar_memberscount - You can now edit existing image
- Added missing ingredient created and updated timestamps
- Correctly cleanup user images after deleting a user via cli
- Add missing endpoints to docs
- Account deleted mail not getting sent correctly
- Send transactional email about password change
- Send transactional email about account deletion
- Bars can now have different statuses:
active- Active bar, default valuedeactivated- Deactivated bar, no one can access itprovisioning- Bar is currently getting populated with data. Usually set at the start of bar setup and removed after all data has been imported.
- Added new endpoints
- POST
/bars/{id}/status- To update bar status
- POST
- Images now get resized up to 1400px height max
- Update email styling
- Added
bcmathextension - Added CORS headers to images
- Importing cocktails now use the same authorization policy as cocktail creation
- You can now exclude cocktails by specific ingredients #230
- Added
filter[ignore_ingredients]=3,7,9filter tococktailsendpoint
- Added
- Added
cronto docker image and enabled Laravel task scheduler
- Added support for Meilisearch v1.5
- Default login tokens now expire after 7 days
- Improved scraping support for Liquor.com
- Updated base docker image used as base
- Removed algolia package
- Removed searchable
dateattribute fromcocktailsindex - Removed searchable
originattribute fromingredientsindex
- Fixed typos in OpenAPI spec
- Bars can only be deleted by a bar owner (user that created the bar)
- Add missing mail confirmation when creating a user via
usersendpoint
- You can now send emails from Bar Assistant if you have the correct settings
- To configure SMTP, set the following ENV variables:
MAIL_HOST=MAIL_PORT=MAIL_ENCRYPTION=MAIL_USERNAME=MAIL_PASSWORD=
- To request other drivers that Laravel supports, open a new github issue
- To configure SMTP, set the following ENV variables:
- Added POST
/forgot-passwordendpoint- You can use this endpoint to request a password change email
- You must set the reset URL by setting
MAIL_RESET_URLenv variable- For example:
MAIL_RESET_URL="https://bar.local/reset-password?token=[token]"
- For example:
- Added POST
/reset-passwordendpoint- You can use this endpoint to reset the password with confirmation key from the email
- Added
MAIL_REQUIRE_CONFIRMATIONenv variable, (falseby default)- If you enable this, users will have to verify their accounts via link in a email before authenticating
- You must set the confirmation URL by setting
MAIL_CONFIRM_URLenv variable- For example:
MAIL_CONFIRM_URL="https://bar.local/confirmation/[id]/[hash]"
- For example:
- Added GET
/verify/{id}/{hash}endpoint
- More information about email settings will be added to docs
- Enabled sqlite WAL mode
- From now, passwords can't be shorter than 5 chars
- Improved tag matching, tags are now matched by their lowercase name, and duplicates are ignored
- Removed some properties from a public cocktail endpoint response:
main_image_id,images.file_path,images.id.
- Added utensils to exported recipes
- Fixed cocktail utensil migration from v2
- Updated base bar cocktails and ingredients
- Now includes data from https://github.com/bar-assistant/data
- Added
php artisan bar:export-recipes {barId}command- This will export all recipes from a bar in a .yml format, similar to repository mentioned above
- Added
php artisan bar:import-recipes {filename}command- This will import recipe data exported via upper method
- Added
php artisan bar:delete-user {email}command- This will completely delete user and all his data, including cocktails, bars and ingredients he created.
- Command
php artisan bar:export-zipis now deprecated and will be removed in future versions- You can only import data from the same version of Bar Assistant that your exported data from
- Command
php artisan bar:import-zipis now deprecated and will be removed in future versions- Passwords and emails are not included by default when exporting data
- Users that delete their account will now be "soft" deleted
- All their user data will be anonymized
- All bar memberships and related data will be deleted
- Invisible
chars are now removed when importing data from scrapers - Fix some auth errors when updating images
- Fix joining wrong columns on bar export leading to import errors #218
- Added
bar:export-zipcommand- You can use this command to export all the data from specific bars
- For example:
php artisan bar:export 5 7 9will export all data from bars with id: 5, 7, 9
- Added
bar:import-zipcommand - Now you can share your collections with other bar members
- Added
/collections/sharedendpoint - Added
is_bar_sharedproperty to collection request
- Added
- Fix cocktail share endpoint not working if ingredient does not have category
- Added missing properties to public recipe (ingredient note and substitute amounts)
- Fixed role not updating on user save
- Joining a bar will default to "Guest" role instead of "General"
- Bar Assistant now supports multiple bars.
- With this change a lot of endpoints now require to have bar reference, this comes in a form of
bar_idquery parameter - Please refer to the new schema specification to see what endpoints now require
bar_idquery parameter
- With this change a lot of endpoints now require to have bar reference, this comes in a form of
- This update also changed a lot database table schemas, so I advise you to create a backup of your data before you update to v3
- Users can be invited or join with invite code to specific bars
- Users can have one of the following roles in a bar:
- Guest
- Rate and favorite cocktails
- Create personal collections
- General
- Everything as "Guest"
- Can add cocktails and ingredients
- Moderator
- Everything as "General"
- Can not modify bar
- Can not change user roles
- Admin
- Everything as "Moderator"
- Full access to all bar actions
- Guest
- Updated a lot of schemas, refer to openapi specification to see the changes
- Token response is now wrapped with
dataobject like the rest of the endpoints endpoint - Removed POST
shelf/ingredientsendpoint - Removed POST
shelf/ingredients/{ingredientId}endpoint- Upgrade guide: Use
shelf/ingredients/batch-storeendpoint
- Upgrade guide: Use
- Removed DELETE
shelf/ingredients/{ingredientId}endpoint- Upgrade guide: Use
shelf/ingredients/batch-deleteendpoint
- Upgrade guide: Use
- Removed
notesproperty fromCocktailschema- Upgrade guide: Use
notes/endpoint to get users notes
- Upgrade guide: Use
- Removed
glasses/findendpoint- Upgrade guide: Use
glasses/endpoint withfilter[name]query string
- Upgrade guide: Use
- Removed GET
/imagesendpoint - Removed
bar:make-admincommand - Removed
bar:opencommand - Removed
bar:refresh-user-search-keyscommand - Removed
bar:import-zipcommand - Removed
bar:export-zipcommand - Removed
bar:scrapecommand - Renamed
/userendpoint to/profile - Renamed
user_idfilter oncocktailsendpoint tocreated_user_id - Renamed
user_idfilter oningredientsendpoint tocreated_user_id - Ingredient category is not required anymore when adding an ingredient
- Added
bars/endpoint - Added GET
notes/endpoint - Stats now have users top 5 favorite ingredients, calculated from favorite cocktails
- Importing cocktails from collection now has actions on how to handle duplicates
- Added
bar:backup {barId}command - Cocktail ingredient now supports variable amounts, you can add max amount with
amount_maxattribute - Cocktail ingredient now can have a note attached
- Cocktail substitutes now have the following attributes:
ingredient_id,amount,amount_max,units - Added options on how to handle duplicated recipes when importing collection
- Duplicates are matched by recipe name
- Possible actions:
- Do nothing
- Overwrite duplicated
- Skip duplicates
- Added
average_rating_minfilter tococktailsendpoint - Added
average_rating_maxfilter tococktailsendpoint
- Default database filename changed to
database.ba3.sqlite - Optimized base images of cocktails and ingredients
- Cocktail and ingredient images are now categorized in folders by bar id
- Merged all migrations to a single one
- Meilisearch API keys are now generating tenant tokens
- Changed the way slugs are generated, they now include bar id
- Changed what attributes are searchable
- Removed from
cocktailsindex:garnish,image_hash,main_image_id,user_id,glass,average_rating,main_ingredient_name,calculated_abv,method,has_public_link - Added to
cocktailsindex:bar_id - Removed from
ingredientsindex:strength_abv,color - Added to
ingredientsindex:bar_id
- Removed from
- Added export options for version 3:
php artisan bar:export-zip --version3
- Fixed migrations missing on first start
- Fixed notes staying after cocktail delete
- Fixed missing env variable
- Fixed null mapping of cocktail substitutes when importing from collection
- Fixed failing migrations due to meilisearch syncing #158
- Fixed missing utensil info on GET cocktail endpoint
- Fixed missing ratings
- Added
markdowntype to share endpoint - Added
/collections/{id}/shareendpoint- You can share your collection as JSON, YAML
- Added
/shopping-list/shareendpoint #124- You can share shopping list as markdown
- Added
utensils#127- You can attach required utensils for cocktail recipes
- Added
/ingredients/{id}/extra#133- This will show you how many cocktails you can make if you add ingredient to shelf
- Added next and prev cocktail actions #149
- Added new scrapers
- Steve The Bartender
- Property
ingredientsonCocktailschema is now only shown if you include it withinclude=ingredientsquery string - Property
short_ingredientsonCocktailschema removed - Property
tagsonCocktailschema is now array of objects - Property
ingredient_category_idonIngredientschema removed - Improved website recipe scraping
- Added new scrapers
- CocktailsDistilled
- Added
total_collectionstoStatsResponseschema - Added new sort to
ingredientsendpoint:total_cocktails - Removed
user_idfromCocktailschema - Removed
main_ingredient_namefromCocktailschema
- Property
short_ingredientsonCocktailschema will be removed in next release - Property
tagsonCocktailschema will be changed to array of objects in next release, currentlycocktail_tags - Property
ingredient_category_idonIngredientschema will be changed to array of objects in next release, currentlycocktail_tags - Property
ingredientsonCocktailschema will be only shown if you are including the relationship via query parameter in the next release
- Fixed typo for
includequery param in specification #147 - Importing recipes via API calls will correctly set cocktail author
- Improved recipe instructions parsing for default parser
- Added cocktails count to
tag,glassandcocktail_methodresources - Added
abv_min,abv_max,user_rating_min,user_rating_maxandmain_ingredient_idcocktail query filters - Added
main_ingredientsingredient query filter - Added
shelf_ingredientscocktail query filter- This will return all cocktails you can make with the given ingredients
- This allows you to create on-the-fly custom shelf cocktails
- Added POST
/collections/{id}/cocktailsendpoint- This endpoint allows you to add multiple cocktails to collection with single call
- Added
cocktailsrequest property toCollectionRequestschema- This allows you to add cocktails when creating new collection
- Added
includequery option tococktailsendpoint- This is used to toggle extra available data when fetching cocktails
- ABV is now saved in the cocktails table with the cocktail #139
- Default results per page on
cocktailsresource increased to 25
- Property
user_idonCocktailschema will be removed in next release, useuser.idproperty instead - Property
main_ingredient_nameonCocktailschema will be removed in next release
- Fixed boolean query filters not correctly filtering the results
- Fixed slugs with only numbers fetching by
idcolumn first instead ofslug#140 - Added missing cache clearing after importing data from zip file
- Fixed missing eager load of
userrelation when fetching cocktails - Fixed old cocktail ingredients not having correct ingredient sorting
- Fixed image extension detection sometimes falling back to jpg for no good reason
- Improved schema scraping, and added new scrapers for
- CocktailParty
- LiberAndCo
- DiffordsGuide
- TheCocktailDB
- Added
user_nameto cocktail response - Added filters to
/collectionsendpoint - Added
missing_ingredientssort to cocktails endpoint- This will sort by number of user's missing ingredients #137
- Added
/cocktails/{id}/similarendpoint to show similar cocktails #40
- Added support for Meilisearch v1.2
- Added
/import/cocktailendpoint- Supports importing cocktails in YAML and JSON formats
- Supports importing cocktails from URLs that are supported by built in scrapers
- Added
/cocktail/{id}/shareendpoint- Supports sharing cocktails in JSON, YAML, XML and plain text format
- Disabled foreign key checks when importing data from zip file #117
- Minimum supported Meilisearch version is 1.1
- Upgrade guide: If you are using docker bump meilisearch version to 1.1. You can safely delete Meilisearch container and it's volume, Bar Assistant will sync data when you restart the Bar Assistant container
- Changed query parameters for
/cocktailsendpoint- Upgrade guide: Refer to API spec to see new parameters
- Changed query parameters for
/ingredientsendpoint- Upgrade guide: Refer to API spec to see new parameters
- Removed
/cocktails/user-favoritesendpoint- Upgrade guide: Available via
/cocktails?filter[favorites]=true
- Upgrade guide: Available via
- Updated
/cocktails/user-shelfto return only cocktail ids and moved to/shelf/cocktails- Upgrade guide: Old response schema available via
/cocktails?filter[on_shelf]=true
- Upgrade guide: Old response schema available via
- Removed
/ingredients/findendpoint- Upgrade guide: Available via
/ingredients?filter[name_exact]=whiskey
- Upgrade guide: Available via
- Removed
/cocktails/randomendpoint - Updated
/shelfendpoints to make more sense- Moved GET
/cocktails/user-shelfendpoint to GET/shelf/cocktails - Moved GET
/shelfendpoint to GET/shelf/ingredients - Moved POST
/shelfendpoint to POST/shelf/ingredients - Moved POST
/ingredients/{ingredientId}endpoint to POST/shelf/ingredients/{ingredientId} - Moved DELETE
/ingredients/{ingredientId}endpoint to DELETE/shelf/ingredients/{ingredientId}
- Moved GET
- Moved PUT
/images/{id}endpoint to POST/images/{id}- You can now use this method as a pseudo PATCH operation on image resource
- You can now update the image file
- Removed
site_search_indexindexing- Upgrade guide: If possible migrate to federated/multi-index search
- Redis is now mandatory dependency
- Upgrade guide: Setup redis with
REDIS_HOST,REDIS_PASSWORD,REDIS_PORTenv variables
- Upgrade guide: Setup redis with
- Removed
bar:dump-searchcommand- Upgrade guide: Follow migration/upgrade guide for your selected search driver
- Removed
idfromCocktailIngredientschema - Updated
UserIngredientschema - Updated
Ingredientschema- Moved
parent_ingredient_idtoparent_ingredientobject, accessible viaparent_ingredient.id
- Moved
- Removed
DISABLE_LOGINenv variable
- Meilisearch is no longer mandatory dependency for API to work
- Added support for all default Laravel Scout drivers, meaning:
- You can now use Algolia as your search engine
- You can now use database as your search engine
- Added
DISABLE_LOGINenvironment variable- This will remove the need to authenticate with token to access the api
- Added GET
/imagesendpoint ImageRequestschema now supportsimage_urlparameter to upload image from URL- Added
MAX_USER_BARSenv variable, defaults to 50- This limits how many bars can a single user create
- Fixed openapi swagger docs url
- Enabled xdebug in local development dockerfile
- Replaced default image processor GD with Imagick
- Fix missing array key error on public pages
- Fix cocktail ingredient units and amount display
- Added notes endpoint
- Currently only supported for
cocktailsresource
- Currently only supported for
- Added cocktail collections endpoint
- Added new ENV variable:
PARENT_INGREDIENT_SUBSTITUTE- This will take in account parent ingredients when querying what cocktails you can make #95
- Added
total_shelf_ingredientsto stats endpoint
- Optimized some SQL queries
- Now running on PHP 8.2
- Added support for Meilisearch v1.1
- Added
on_shelffilter to ingredients list
- Added image placeholder hash with ThumbHash algorithm
- Moved default zip export path to
storage/bar-assistant/
- Added
public_idto cocktail schema response - Added endpoint for removing public link
- Ignore null passwords when updating profile
- Increase production upload body size
- Added
sortattribute to image resource
- When editing cocktail with new images, Bar Assistant will now add new images instead of overwriting the existing ones
- Increased web server upload file size in docker development environment
- Application version now automatically tagged with github ref
- Fix importing cocktails from the CLI #83
This update includes a big change to docker image configuration:
- Now using PHP-fpm and Nginx
- New volume mapping:
/var/www/cocktails/storage/bar-assistant - Improved error logging
- Updated Meilisearch to stable version (1.0)
As such you should follow the migration guide available here.
- Fix type cast issue when adding ingredients to cocktail #77
- Updated framework to Laravel 10
- Updated docker image configuration
- Added support for Meilisearch 1.0
- Fix max total hits limit for search indexes
- Added
/findendpoint to search resource by name- Added to cocktails and ingredients endpoint
- Added
parent_ingredient_idto ingredient response
- Updated packages, including security fix for
symfony/http-kernel
- Updated import and export commands
- Set method for existing cocktails without method
- This syncs stock cocktail data with existing data
- Fix permission bug introduced by copying app files in docker
- Added cocktail ABV, calculated from cocktail ingredients
- Added cocktail methods
- Added command to refresh meilisearch user API keys
- Recipe scraping
- Added
/scrape/cocktailendpoint - BA will now try to parse JSON+LD schema and microdata if no specific site parser exists
- Support for TheDrinkBlog
- Added
- Added automatic dev docker images building
- Fix some scraper issues
- Fix Imbibe scraper issue with instructions counter
- Updated order of some base cocktail ingredients
- Added zip extension to dockerfile
Some of this features are available but still need documenting and testing
- Added experimental features like exporting and import recipes between BA instances
- Added
/cocktails/{id}/make-publicmethod- This will create a publicly accessible cocktail data at
/explore/cocktails/{ulid}
- This will create a publicly accessible cocktail data at
- Added
/statsendpoint - Added
order_byquery parameter to/cocktailsendpoint - Added
limitquery parameter to/cocktails/user-shelfendpoint - Added
limitquery parameter to/ingredientsendpoint - Added
created_atattribute to cocktail response schema
- Updating tags now reflects changes in cocktail index
- Increased cocktail thumbnail size to 400x400
- Updated ingredients index
- Added
strength_abv,color,origin
- Added
This update includes changes to authorization. Users can now be admins and have elevated privilages. Since this is a new change you will not have any admins in your instance if you are not starting from a fresh install. To make yourself admin you need to run the following command with the email you are using to login:
$ php artisan bar:make-admin your@email.comOr in docker/compose:
$ docker compose exec -it bar-assistant php artisan bar:make-admin your@email.com- Added
usersendpoint to manage users - User can now have admin role
- Added command to convert a single user to admin
- Implemented authorization
- Management of users is allowed only to admins
- Update and delete of glass type allowed only to admins
- Update and delete of ingredient categories allowed only to admins
- All cocktails and ingredients created by the system can only be updated and delete by admin
- Added ingredient parser
- Allows easier extraction of scraped data
- Recipe scraping
- Support for Haus Alpenz
- Sync site search index on docker start
- Added
main_ingredient_nameto cocktail response schema- Ingredients that are first added to cocktail are considered as main ingredient
- Added development docker compose file
- Added
limitquery attribute to cocktail favorites endpoint
- Added
user_idtoimagestable - Add flush index option to
bar:refresh-searchcommand - Optimized cocktail favorites query
- Added
/tagsendpoint to manage tags - Added cocktail ratings
- Added
/ratingsendpoint to manage ratings - Added average rating attribute to cocktails index
- Added
- Recipe scraping
- Support for Imbibe Magazine
- Support for Eric's Cocktail Guide
- Add
-doption to dump data without importing
- Add Meilisearch dump index command
- This will help with future Meilisearch updates
- Fix cocktail image overwriting when cocktails have the same name
- Delete user API tokens when changing the password
- Sync cocktails and ingredients with meilisearch after docker restart
- Bump version in openapi spec
- Add
php artisan bar:scrapcommand to scrape recipes from the supported websites- Support for TuxedoNo2
- Support for A Couple Cooks
- Add cocktails thumbnail generation endpoint
- Enabled GD extension in docker
- Sort ingredient categories by name
- Sort related cocktails in ingredient resource by name
- Escape ingredient description
- Use
docker-php-extension-installerfor docker image
- Make cocktail
idattribute filterable in cocktails index - Add
per_pagequery parameter to cocktails endpoint (defaults to 15) - Add profile update endpoint
- Search index settings are updated on docker restart
- Sort shelf cocktails by name
- Document missing query parameters in OA specification
- Cover all endpoints with tests
- Add coding style
- Update OpenApi spec and endpoints
- Delete responses now return 204
- Add contract testing
- Update related ingredients
- Add response caching, disabled by default
- Cache docker image steps in GH actions
- Add cascading deletes for some foreign keys
- Use redis for session and cache
- Automatically select some ingredients when running the application for the first time
- Add OpenAPI specification and
/docsroute - Fixed an error response when adding ingredient to the shelf from shopping list
- Updated some endpoints to be more consistent
- Include substitute ingredients when showing a list of shelf cocktails
- Added debugbar
- Remove the need to run
chownin docker container - Add demo environment support
- Enable opcache in docker image
- Cache route and config in docker image
- Refactor image uploading and handling
- Updates for some base ingredients
- Add more popular cocktails
- Finish cocktail ingredient substitutes endpoints
- Finish glass type endpoints
- Move "Uncategorized" ingredient category to id: 1
- Cocktail save/update methods now save glass type
- Update docker entrypoint with better up/down handling
- Use
laravel/sluggablepackage for ingredient and cocktail slug generation - Added currently used Meilisearch host to user endpoint response
- Update Meilisearch cocktail index settings
- Add
user_idto cocktail index - Implement ingredient varieties feature #6
- Increased API request rate limiting
- Add cocktail ingredient substitutes feature
- Add a new cocktail source list
- Exclude optional cocktail ingredients from shelf cocktail matching
- Implement all ingredient category resource endpoints
- Update postman collection
- Implement more tests
- Add docker build action
- Add glasses
- Update base cocktail db
- Update error handling
- Add logout
- Initial release