CritiqueBrainz is a repository for Creative Commons licensed music and book reviews. Here you can read what other people have written about an album or event and write your own review!
CritiqueBrainz is based on data from MusicBrainz - open music encyclopedia and BookBrainz - open book encyclopedia.
Everyone - including you - can participate and contribute.
| Description | Number |
|---|---|
| Number of Reviews | 0 |
| Number of Users | 4 |
No reviews found
No reviews found
CritiqueBrainz is a repository for Creative Commons licensed music and book reviews. It is based on data from MusicBrainz and BookBrainz, open music and book encyclopedias.
Installation paths relative to:
/usr/local/lib/python3.11/site-packages
| Package | Version | Installed Path |
|---|---|---|
| astroid | 2.11.7 | |
| asttokens | 3.0.0 | |
| async-timeout | 5.0.1 | |
| attrs | 25.4.0 | |
| Authlib | 1.3.0 | |
| babel | 2.17.0 | |
| beautifulsoup4 | 4.8.0 | |
| bleach | 5.0.1 | |
| blinker | 1.9.0 | |
| brainzutils | 2.8.0 | |
| certifi | 2025.10.5 | |
| cffi | 2.0.0 | |
| charset-normalizer | 3.4.4 | |
| click | 8.1.3 | |
| coverage | 7.11.0 | |
| cryptography | 46.0.3 | |
| decorator | 5.2.1 | |
| dill | 0.4.0 | |
| dnspython | 2.8.0 | |
| email-validator | 1.1.3 | |
| executing | 2.2.1 | |
| flake8 | 4.0.1 | |
| flask | 3.0.0 | |
| flask-babel | 4.0.0 | |
| flask-debugtoolbar | 0.13.1 | |
| Flask-Login | 0.6.3 | |
| flask-shell-ipython | 0.5.3 | |
| Flask-SQLAlchemy | 2.5.1 | |
| Flask-UUID | 0.2 | |
| flask-wtf | 1.2.1 | |
| greenlet | 3.2.4 | |
| idna | 3.11 | |
| iniconfig | 2.3.0 | |
| ipython | 9.7.0 | |
| ipython-pygments-lexers | 1.1.1 | |
| isort | 5.13.2 | |
| itsdangerous | 2.1.2 | |
| jedi | 0.19.2 | |
| jinja2 | 3.1.4 | |
| langdetect | 1.0.7 | |
| lazy-object-proxy | 1.12.0 | |
| Markdown | 3.3.6 | |
| MarkupSafe | 2.1.3 | |
| matplotlib-inline | 0.2.1 | |
| mbdata | 27.1.0 | |
| mccabe | 0.6.1 | |
| msgpack | 0.5.6 | |
| musicbrainzngs | 0.7.1 | |
| orjson | 3.9.15 | |
| packaging | 25.0 | |
| parso | 0.8.5 | |
| pexpect | 4.9.0 | |
| pip | 21.0.1 | |
| platformdirs | 4.5.0 | |
| pluggy | 1.6.0 | |
| prompt-toolkit | 3.0.52 | |
| psycopg2-binary | 2.9.11 | |
| ptyprocess | 0.7.0 | |
| pure-eval | 0.2.3 | |
| py | 1.11.0 | |
| pycodestyle | 2.8.0 | |
| pycountry | 1.20 | |
| pycparser | 2.23 | |
| pyflakes | 2.4.0 | |
| pygments | 2.19.2 | |
| pylint | 2.13.5 | |
| pytest | 7.1.1 | |
| pytest-cov | 3.0.0 | |
| python-dateutil | 2.6.1 | |
| pytz | 2025.2 | |
| redis | 4.4.4 | |
| requests | 2.32.0 | |
| requests-mock | 1.9.3 | |
| sentry-sdk | 1.37.1 | |
| setuptools | 68.2.2 | |
| six | 1.17.0 | |
| soupsieve | 2.8 | |
| SQLAlchemy | 1.4.41 | |
| sqlalchemy-dst | 1.0.1 | |
| stack-data | 0.6.3 | |
| tomli | 2.3.0 | |
| traitlets | 5.14.3 | |
| transifex-client | 0.12.4 | |
| typing-extensions | 4.15.0 | |
| urllib3 | 2.5.0 | |
| uWSGI | 2.0.23 | |
| wcwidth | 0.2.14 | |
| webencodings | 0.5.1 | |
| werkzeug | 3.0.6 | |
| wheel | 0.41.2 | |
| wrapt | 1.17.3 | |
| WTForms | 3.0.1 |
| Resource | Value |
|---|---|
| User CPU time | 8.863 msec |
| System CPU time | 4.913 msec |
| Total CPU time | 13.776 msec |
| Elapsed time | 44.954 msec |
| Context switches | 36 voluntary, 1 involuntary |
| Key | Value |
|---|---|
| HTTP_ACCEPT | */* |
| HTTP_ACCEPT_ENCODING | gzip, br, zstd, deflate |
| HTTP_CONNECTION | close |
| HTTP_HOST | oauth.critiquebrainz.org |
| HTTP_REFERER | http://oauth.critiquebrainz.org/ |
| HTTP_USER_AGENT | Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com) |
| QUERY_STRING | |
| REMOTE_ADDR | 172.17.0.3 |
| REQUEST_METHOD | GET |
| SCRIPT_NAME | |
| SERVER_NAME | 0.0.0.0 |
| SERVER_PORT | 8200 |
| SERVER_PROTOCOL | HTTP/1.1 |
| SERVER_SOFTWARE | Werkzeug/3.0.6 |
| View Function | args | kwargs |
|---|---|---|
| critiquebrainz.frontend.views.index.index | [] | None |
| Variable | Value |
|---|
No SESSION data
| Variable | Value |
|---|
| Variable | Value |
|---|
| Key | Value |
|---|---|
| ADMIN_NOTIFICATION_EMAIL_ADDRESS | None |
| ADMINS | [] |
| APPLICATION_ROOT | '/' |
| BB_DATABASE_URI | 'postgresql://bookbrainz:bookbrainz@critiquebrainz_db:5432/bookbrainz' |
| DEBUG | True |
| DEBUG_TB_ENABLED | True |
| DEBUG_TB_HOSTS | () |
| DEBUG_TB_INTERCEPT_REDIRECTS | False |
| DEBUG_TB_PANELS | ('flask_debugtoolbar.panels.versions.VersionDebugPanel', 'flask_debugtoolbar.panels.timer.TimerDebugPanel', 'flask_debugtoolbar.panels.headers.HeaderDebugPanel', 'flask_debugtoolbar.panels.request_vars.RequestVarsDebugPanel', 'flask_debugtoolbar.panels.config_vars.ConfigVarsDebugPanel', 'flask_debugtoolbar.panels.template.TemplateDebugPanel', 'flask_debugtoolbar.panels.sqlalchemy.SQLAlchemyDebugPanel', 'flask_debugtoolbar.panels.logger.LoggingPanel', 'flask_debugtoolbar.panels.route_list.RouteListDebugPanel', 'flask_debugtoolbar.panels.profiler.ProfilerDebugPanel', 'flask_debugtoolbar.panels.g.GDebugPanel') |
| EXPLAIN_TEMPLATE_LOADING | False |
| LANGUAGES | {'en': 'English', 'he': 'עברית', 'hr': 'hrvatski', 'nl': 'Nederlands', 'et': 'eesti', 'fi': 'suomi', 'fr': 'français', 'de': 'Deutsch', 'it': 'italiano', 'nb': 'norsk bokmål', 'pl': 'polski', 'es': 'español', 'sv': 'svenska', 'ru': 'русский'} |
| MAIL_FROM_ADDR | 'no-reply@critiquebrainz.org' |
| MAIL_PASSWORD | None |
| MAIL_PORT | 25 |
| MAIL_SERVER | 'localhost' |
| MAIL_USERNAME | None |
| MAX_CONTENT_LENGTH | None |
| MAX_COOKIE_SIZE | 4093 |
| MB_DATABASE_URI | 'postgresql://musicbrainz:musicbrainz@db:5432/musicbrainz_db' |
| MBSPOTIFY_ACCESS_KEY | None |
| MBSPOTIFY_BASE_URI | 'https://mbspotify.musicbrainz.org/' |
| METABRAINZ_WEBHOOK_SECRET | 'mebw_0fc8ee1b9d983228560e97c52614a78c95ef4d8d4cef502c2c3212f20806072e' |
| MUSICBRAINZ_ACCESS_TOKEN_URL | 'https://test.metabrainz.org/oauth2/token' |
| MUSICBRAINZ_AUTHORIZE_URL | 'https://test.metabrainz.org/oauth2/authorize' |
| MUSICBRAINZ_CLIENT_ID | 'SMQolJzk3msa48CcxU59JQhg' |
| MUSICBRAINZ_CLIENT_SECRET | 'mebs_H8wwh6WQ1XXQtN2WKCIJ5MhnEKqH8zRkdbndZCIUVrUXpJrUTEyXY6gZn32pppGI' |
| MUSICBRAINZ_HOSTNAME | None |
| MUSICBRAINZ_OAUTH_URL | 'https://test.metabrainz.org/oauth2' |
| MUSICBRAINZ_USERAGENT | 'CritiqueBrainz' |
| OAUTH_GRANT_EXPIRE | 60 |
| OAUTH_TOKEN_EXPIRE | 3600 |
| OAUTH_TOKEN_LENGTH | 40 |
| PERMANENT_SESSION_LIFETIME | datetime.timedelta(days=31) |
| POPULAR_REVIEWS_LIMIT | 6 |
| PREFERRED_URL_SCHEME | 'http' |
| PROPAGATE_EXCEPTIONS | None |
| REDIS_HOST | 'critiquebrainz_redis' |
| REDIS_NAMESPACE | 'CB' |
| REDIS_PORT | 6379 |
| SECRET_KEY | 'CHANGE_THIS' |
| SEND_FILE_MAX_AGE_DEFAULT | None |
| SERVER_NAME | None |
| SESSION_COOKIE_DOMAIN | None |
| SESSION_COOKIE_HTTPONLY | True |
| SESSION_COOKIE_NAME | 'session' |
| SESSION_COOKIE_PATH | None |
| SESSION_COOKIE_SAMESITE | None |
| SESSION_COOKIE_SECURE | False |
| SESSION_REFRESH_EACH_REQUEST | True |
| SPOTIFY_CLIENT_ID | '' |
| SPOTIFY_CLIENT_SECRET | '' |
| SQLALCHEMY_DATABASE_URI | 'postgresql://critiquebrainz:critiquebrainz@critiquebrainz_db:5432/critiquebrainz' |
| SQLALCHEMY_RECORD_QUERIES | True |
| SQLALCHEMY_TRACK_MODIFICATIONS | False |
| SUPPORTED_LANGUAGES | ['en', 'he', 'hr', 'nl', 'et', 'fi', 'fr', 'de', 'it', 'nb', 'pl', 'es', 'sv', 'ru'] |
| TEMPLATES_AUTO_RELOAD | None |
| TESTING | False |
| TRAP_BAD_REQUEST_ERRORS | None |
| TRAP_HTTP_EXCEPTIONS | False |
| USE_X_SENDFILE | False |
| Variable | Value |
|---|---|
| current_user | <critiquebrainz.data.mixins.AnonymousUser object at 0x769dfe345e90> |
| g | <flask.g of 'critiquebrainz.frontend'> |
| get_static_path | <function get_static_path at 0x769e075afa60> |
| popular_reviews | [] |
| recent_reviews | [] |
| request | <Request 'http://oauth.critiquebrainz.org/' [GET]> |
| reviews_total | '0' |
| session | <SecureCookieSession {}> |
| users_total | '4' |
The toolbar was unable to fetch the SQLAlchemy queries for this request. To enable the SQLAlchemy query display, please:
The Flask-SQLAlchemy extension needs to be configured for this application. Please see the Flask-SQLAlchemy documentation for details.
No messages logged.
| URL route | Endpoint name | HTTP methods | Is alias | Redirect to |
|---|---|---|---|---|
| / | frontend.index | GET, HEAD, OPTIONS | False | None |
| /about | frontend.about | GET, HEAD, OPTIONS | False | None |
| /artist/<uuid:id> | artist.entity | GET, HEAD, OPTIONS | False | None |
| /author/<uuid:id> | bb_author.entity | GET, HEAD, OPTIONS | False | None |
| /comments/<uuid:id>/delete | comment.delete | GET, HEAD, OPTIONS, POST | False | None |
| /comments/<uuid:id>/edit | comment.edit | OPTIONS, POST | False | None |
| /comments/create | comment.create | OPTIONS, POST | False | None |
| /edition-group/<uuid:id> | bb_edition_group.entity | GET, HEAD, OPTIONS | False | None |
| /event/<uuid:id> | event.entity | GET, HEAD, OPTIONS | False | None |
| /guidelines | frontend.guidelines | GET, HEAD, OPTIONS | False | None |
| /label/<uuid:id> | label.entity | GET, HEAD, OPTIONS | False | None |
| /literary-work/<uuid:id> | bb_literary_work.entity | GET, HEAD, OPTIONS | False | None |
| /log/ | log.browse | GET, HEAD, OPTIONS | False | None |
| /log/more | log.more | GET, HEAD, OPTIONS | False | None |
| /login/ | login.index | GET, HEAD, OPTIONS | False | None |
| /login/logout | login.logout | GET, HEAD, OPTIONS | False | None |
| /login/musicbrainz | login.musicbrainz | GET, HEAD, OPTIONS | False | None |
| /login/musicbrainz/post | login.musicbrainz_post | GET, HEAD, OPTIONS | False | None |
| /mapping/<uuid:release_group_id> | mapping.spotify_list | GET, HEAD, OPTIONS | False | None |
| /mapping/spotify/add | mapping.spotify_add | GET, HEAD, OPTIONS | False | None |
| /mapping/spotify/confirm | mapping.spotify_confirm | GET, HEAD, OPTIONS, POST | False | None |
| /mapping/spotify/report | mapping.spotify_report | GET, HEAD, OPTIONS, POST | False | None |
| /moderators/ | moderators.mods_list | GET, HEAD, OPTIONS | False | None |
| /oauth/authorize | oauth.authorize_prompt | GET, HEAD, OPTIONS, POST | False | None |
| /place/<uuid:id> | place.entity | GET, HEAD, OPTIONS | False | None |
| /profile/applications/ | profile_applications.index | GET, HEAD, OPTIONS | False | None |
| /profile/applications/<client_id>/delete | profile_applications.delete | GET, HEAD, OPTIONS | False | None |
| /profile/applications/<client_id>/edit | profile_applications.edit | GET, HEAD, OPTIONS, POST | False | None |
| /profile/applications/<client_id>/token/delete | profile_applications.token_delete | GET, HEAD, OPTIONS | False | None |
| /profile/applications/create | profile_applications.create | GET, HEAD, OPTIONS, POST | False | None |
| /profile/delete | profile_details.delete | GET, HEAD, OPTIONS, POST | False | None |
| /profile/edit | profile_details.edit | GET, HEAD, OPTIONS, POST | False | None |
| /rate/ | rate.rate | OPTIONS, POST | False | None |
| /recording/<uuid:id> | recording.entity | GET, HEAD, OPTIONS | False | None |
| /release-group/<uuid:id> | release_group.entity | GET, HEAD, OPTIONS | False | None |
| /release/<uuid:id> | release.entity | GET, HEAD, OPTIONS | False | None |
| /reports/ | reports.index | GET, HEAD, OPTIONS | False | None |
| /reports/<uuid:user_id>/<int:revision_id>/archive | reports.archive | GET, HEAD, OPTIONS | False | None |
| /reports/more | reports.more | GET, HEAD, OPTIONS | False | None |
| /review/ | review.browse | GET, HEAD, OPTIONS | False | None |
| /review/<uuid:id> | review.entity | GET, HEAD, OPTIONS | False | None |
| /review/<uuid:id>/delete | review.delete | GET, HEAD, OPTIONS, POST | False | None |
| /review/<uuid:id>/edit | review.edit | GET, HEAD, OPTIONS, POST | False | None |
| /review/<uuid:id>/hide | review.hide | GET, HEAD, OPTIONS, POST | False | None |
| /review/<uuid:id>/report | review.report | GET, HEAD, OPTIONS, POST | False | None |
| /review/<uuid:id>/revisions | review.revisions | GET, HEAD, OPTIONS | False | None |
| /review/<uuid:id>/revisions/<int:rev> | review.entity | GET, HEAD, OPTIONS | False | None |
| /review/<uuid:id>/revisions/compare | review.compare | GET, HEAD, OPTIONS | False | None |
| /review/<uuid:id>/revisions/more | review.revisions_more | GET, HEAD, OPTIONS | False | None |
| /review/<uuid:id>/unhide | review.unhide | GET, HEAD, OPTIONS, POST | False | None |
| /review/<uuid:id>/vote/delete | review.vote_delete | GET, HEAD, OPTIONS | False | None |
| /review/<uuid:review_id>/revision/<int:revision_id> | review.redirect_to_entity | GET, HEAD, OPTIONS | False | None |
| /review/<uuid:review_id>/vote | review.vote_submit | OPTIONS, POST | False | None |
| /review/write/ | review.create | GET, HEAD, OPTIONS | False | None |
| /review/write/<entity_type>/<entity_id>/ | review.create | GET, HEAD, OPTIONS, POST | False | None |
| /review/write/get_language | review.get_language | OPTIONS, POST | False | None |
| /robots.txt | robots_txt | GET, HEAD, OPTIONS | False | None |
| /search/ | search.index | GET, HEAD, OPTIONS | False | None |
| /search/more | search.more | GET, HEAD, OPTIONS | False | None |
| /series/<uuid:id> | bb_series.entity | GET, HEAD, OPTIONS | False | None |
| /static/<path:filename> | static | GET, HEAD, OPTIONS | False | None |
| /statistics/ | statistics.statistics | GET, HEAD, OPTIONS | False | None |
| /user/<string:user_ref> | user.reviews | GET, HEAD, OPTIONS | False | None |
| /user/<string:user_ref>/block | user.block | GET, HEAD, OPTIONS, POST | False | None |
| /user/<string:user_ref>/info | user.info | GET, HEAD, OPTIONS | False | None |
| /user/<string:user_ref>/unblock | user.unblock | GET, HEAD, OPTIONS, POST | False | None |
| /webhooks/metabrainz | webhook.receive_metabrainz_webhook | OPTIONS, POST | False | None |
| /work/<uuid:id> | work.entity | GET, HEAD, OPTIONS | False | None |
| Key | Value |
|---|---|
| _flask_babel | namespace(babel_locale=Locale('en'), babel_domain=<Domain(None, ['messages'])>) |
| _login_user | <critiquebrainz.data.mixins.AnonymousUser object at 0x769dfe345e90> |
| debug_toolbar | <flask_debugtoolbar.DebugToolbarExtension object at 0x769e0a8c73d0> |