Coder Social home page Coder Social logo

lemeryfertitta / climbdex Goto Github PK

View Code? Open in Web Editor NEW
32.0 4.0 9.0 123.51 MB

Search engine for training board climbs

Home Page: https://climbdex.com

License: MIT License

JavaScript 42.24% Python 21.50% Procfile 0.03% Shell 0.22% Jinja 29.04% CSS 6.97%
climbing kilter-board kilterboard aurora-climbing tension-board tensionboard

climbdex's Introduction

Climbdex

Climbdex is a search engine for "standardized interactive climbing training boards" (SICTBs) designed with the goal of adding missing functionality to boards that utilize Aurora Climbing's software, such as Kilter, Tension, and Decoy. The primary missing feature provided by this engine is a "filter by hold" feature to find climbs with specific sets of holds. There are some additional improvements to other options for filtering and sorting through climbs as well.

Try it out here.

This app was partially inspired by Tim Parkin's excellent Moonboard Search Engine.

The climb databases are downloaded and synchronized using the BoardLib Python library.

Features

These are the features that Climbdex provides which are currently not supported by the official apps:

  • Hold filtering
    • Select holds to require them to be present in the resulting climbs.
    • Click multiple times on a hold to change the color.
    • If "strict" color matching is selected, the color of the hold must be an exact match. If "any" color matching is selected, the color of the holds will be ignored.
    • On mirrored board layouts, the mirror image of the filtered hold sequence will also be included in the search results.
  • Precise quality and difficulty ratings
    • The exact average (to the hundredths place) of the grade and star ratings are displayed to give a better sense of the true difficulty and quality of a climb.
    • There is a "difficulty accuracy" filter which can be used in combination with minimum ascents to help find benchmark climbs of a grade.
  • Bookmarking
  • Web access
    • No mobile app required to search for climbs
    • To light up the climbs, the mobile app is needed, but if app links are setup correctly, you can click on the climb name in Climbdex and be taken directly to the climb on the app.
    • Climbdex is a PWA which means the app can be installed on almost any platform and behave similarly to a native mobile or desktop app.
  • All of the supported boards on one app.

Development

To run Climbdex locally, clone the repository and install the Python dependencies (venv reccommended):

python3 -m pip install -r requirements.txt

After the dependencies are installed, start a server:

gunicorn wsgi:app

To actually use most of the features of Climbdex, at least one of the local SQLite databases are required. To download a database, use the sync_db script:

bin/sync_db.sh <board_name>

where <board_name> is one of decoy, grasshopper, kilter, tension or touchstone.

climbdex's People

Contributors

abant07 avatar btmccord avatar gardaholm avatar lemeryfertitta avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

climbdex's Issues

Feature request: metrics

So I know the individual apps have their own way of tracking climbs over time. I really like the idea of open sourcing some of that, both to consolidate the data in one place and to allow for more refined training progression. Is this planned?

I'd like to spend some time here when I can, but right now can't commit too much. I'm more proficient in C and Python, but some older experience with various OOP languages. Also interested in learning some of the others here of course.

Sort search results

The search results should be sortable by multiple values with ascending and descending options. Initial sortable values:

  • Name
  • Difficulty
  • Quality
  • Ascents

Filter by climb name

Very simple one, just querying by name like '%substring%' should probably be good enough. Needs a new input on the /filter page and a new query param passed to the results.

feature request: persist the filters selection when searching

sick repo ✨ curious if we could convert the filters selection page to a persistent filters search bar that appears above the results page? this would make it easier for a user to update their search criteria without having to navigate between the pages.

Support different product sizes

For a given product there can be multiple sizes. For example, the "Kilter Board Original" product (ID = 1) has the following sizes:

  • 8 x 12
  • 7 x 10
  • 12 x 14
  • 12 x 12 with kickboard
  • 12 x 12 without kickboard
  • 16 x 12

For a given product size:

  • The image of the board should be the
  • The list of climbs should be limited to holds that are within the bounds of the product size

No matching indicator

Not sure if this was already displayed or not.
Tension uses a separate icon to indicate that a climb is without matching holds. See Screenshot of the app.

I think they have some regex filter on the route description and search for keywords like "no matching / don't match" and then they add this icon next to the route name. There is no toogle to add this when adding a new route.

since most of the harder routes are without matching, this indicator would be helpful.

signal-2024-02-03-132859_002

Beta page - better iframe sizing

Some widths and heights of the embedded instagram videos are a bit awkward to view, either on desktop, mobile, or both. Its possible that getting the post metadata could allow for better sizing, though my initial look into this wasn't very fruitful.

Show error message on API error

The search results page will seem like its loading when the search API has actually returned an error. For example:

https://climbdex.com/results?minGrade=undefined&maxGrade=undefined&name=&angle=any&minAscents=1&sortBy=ascents&sortOrder=desc&minRating=1.0&onlyClassics=0&gradeAccuracy=1&settername=&holds=&mirroredHolds=&board=kilter&layout=1&size=8&set=1&set=20&roleMatch=strict

It would be more useful if there was an error message, possibly with a link to report the issue here.

Add filtering for grades/angles/ascents

Many of the problems are garbage problems, not real climbs. Additional filtering on ascent counts and/or quality ratings may help to avoid too many of the garbage problems cluttering the results. The climbs should also display angle/grade info and potentially be filterable on these fields as well.

Support more boards

Tension should be the next highest priority, but once generic board support is made, it should be relatively effortless to support all of the existing boards that run the Aurora software.

Includes mirror problems when searching with selected holds

Some board have a mirror layout.
When searching for problems with a selection of holds, it would be convenient that the search results also includes mirrored problems

for example, searching with these holds
Screenshot 2024-01-30 at 13 58 53

should allows finding this problem
Screenshot 2024-01-30 at 13 58 14

(really nice work on climbdex !!)

Mirror Climbs

In addition to the Bluetooth feature it would be great to also display the mirrored version of a climb (only if the board is set in mirrored layout), which will add another complexity in the navigation layout: see Issue #46 for UI suggestions

Tick climbs

This is probably the last major issue before Climbdex can be used without having to open the apps during most sessions.

In addition to some UI on the results page, Boardlib needs to be updated to include calls to write to the Aurora central db: lemeryfertitta/BoardLib#20.

Collapsible advanced filters

As discussed in #39, we can free up some space on the filters page by having an "advanced filters" collapse.

For now, I'd like to move Min Rating and Grade Accuracy to this new collapse. Another future candidate for this would be a Setter search. This would be a pretty easy add, so we can tack that one onto this issue as well.

Visual indication of bluetooth connectivity and auto-illuminate

It would be convenient to be able to automatically illuminate climbs after switching on the app. We could use the lighbulb to toggle "connected/disconnected" without actually disconnecting. We would want a visual indication of this, and we can use the filled lightbulb icon to do so (and maybe switch the button to be filled blue instead of outline).

Split from #45

Mirror ticks

Similar to the official apps, ticks which have is_mirror=true should be indicated differently than ticks with is_mirror=false.

The is_mirror field is return in the by the Boardlib get_logbook call. In the apps, a backwards checkmark is used to indicate mirror ascent, and the checkmark and backwards checkmark overlapped indicates an ascent of both the mirror and non-mirror of a climb. Something similar could be done for Climbdex, but an SVG will be needed instead of the unicode symbol.

Maybe using https://icons.getbootstrap.com/icons/check/ and then manipulating the SVG as needed for the mirrored/doubled versions.

Example of doubled checkmark:
Screenshot_20240203-110507

Beta page - support non-instagram sources

In the beta_links table, less than 1% of the links are from non-instagram sources. The only other sources I've seen so far are TikTok and Kaya. In theory, this could be supported by Climbdex, but given the rarity of these beta sources, this seems very low priority.

For now, beta_links not matching https://www.instagram.com% are filtered out.

Bluetooth Improvements

Just starting a catch-all thread here for various bluetooth-related improvements. This one can be used for discussion and spin-off issues can be created as needed. Some ideas I had immediately from using it for the first time:

  1. The lightbulb symbol could change to be a filled in symbol when connected. There is also an "off" icon available through bootstrap that could be useful. https://icons.getbootstrap.com/?q=lightbulb
  2. Current behavior requires clicking on the lightbulb each time to light up a climb. In my experience, this is a hotly debated feature. When you're boarding alone, its much nicer not to have to keep clicking the light bulb, so you can just swipe through climbs and see the LEDs update. When you're with a group, its nice to be able to look at climbs without affecting the current LEDs so you can pick your next climb while others are still climbing the current one. This feature could work in both cases by using an explicit disconnect (i.e. click the lightbulb again) to avoid changing the lights when picking a new climb.
  3. Navigating away from the results (or create) page requires re-pairing when returning to the page. For example if you light up a climb, change filters, then light up another climb. This requires a pairing dialogue both times. It would be nice to cache the connection in a way that avoids this (when not switching boards).

Support more layouts

Currently only the Kilter Original layout is supported. Rather than hardcode the layoutId, all layouts should be supported (e.g. Kilter Home). From a UX perspective, this can be similar to switching the product size.

Additional navigation options for climbs and beta videos

Branching from #16 - it would be nice to be able to get the previous/next climb or beta video in the list using left/right swipes on mobile, respectively. Additionally, on desktop it would be nice to use the left/right arrow keys for this purpose.

This should be pretty straightforward, using something like this code to detect the left/right swipes on the climb or beta div, then behaving similarly to the prev/next buttons.

Set climbs

The create page allows for climbs to be illuminated but not saved. After completion of lemeryfertitta/BoardLib#20 they could be uploaded to the Aurora db. There would need to be some UI form for gathering the required fields before uploading.

The create form can be a modal, similar to the login form.

Support routes

Routes are a sequencing of climbs (frames) with a certain speed (frames_pace). In order to properly display a route, there should be a playback mechanism to see all of the frames for the route. One idea would be a slideshow style that allows for clicking through the frames.

For now, routes have been removed from the data to avoid confusion.

Marking this one as low priority given that there are very few routes on the board and they seem to be significantly less popular than boulders.

Support sets

Sets are supported when choosing a board and hold filtering, but the search results do not filter out climbs which wouldn't work on the combination of sets. My initial guess is that the frames of each climb have to be inspected to see if each of the holds are available within a given combination of sets.

Support filtering ticked climbs

Branched from discussion in #16.

As is possible in the apps, it would be useful to be able to filter out climbs which you have already done. This is possible using both the sync and the logbook APIs, though the sync API would require some storage, which would greatly increase complexity.

One idea to do this without introducing storage of user data is to use the logbook API. The user could optionally provide a username and password on the board selection screen. Then a token can be fetched and stored in the query params when filtering. With a new filter to remove ticked climbs selected, the results API would fetch the users logbook, then remove those climbs from the fetched list.

Climb drawn incorrectly

Bug Description:

At least one climb is missing the start holds which are displayed correctly in the app.

So far only one climb has been found with this issue. Please report any other instances here.

Steps to Reproduce:

Go to this results page and scroll down to "Casual in Wyoming." Click on the climb to display it.

Cause:

The start holds have a role ID of 20, which is not the correct role ID for start holds of the given layout. This seems like an issue in the data, but it is being handled differently by the official apps. To support this, Climbdex would need to match hold filters against all role IDs of the same role, instead of just roles of a given layout. Given that there is only one known climb with this issue and the fix is non-trivial, this bug is low-priority.

Show personal climb history/stats below climb

If logged in, it would be nice to show the personal history of this climb below the drawing.
For example: No. of Attempts / No. of Sends or a detailed view.
Maybe also including the dates. This would make projecting sessions more helpful. Right now we don't have any idea how often we tried a boulder or how long we are projecting it.

for example
02.10.23: 4 Attempts
10.10.23: 4 Attempts
05.01.24: 3 Attempts
01.02.24: Send

At the moment I think only sends (+ attempts) are available via the personal logbook?

Support more boards/layouts

There is enough data in the sqlite databases to support all of the aurora boards and their layouts generically. This is a larger issue that can be broken down into some smaller ones, e.g. supporting a new layout (e.g. Kilter home wall), supporting a new board type (e.g. Tension).

Classics (AKA benchmarks)

The Tension board has "Classics" which seems to be intended to be similar to the Moonboard "benchmark" feature. In the database, these climbs are distinguished by climb_stats.benchmark_difficulty is not null.

Interestingly, Kilter has not chosen to display Classics yet, though there are 112 climbs in the database that are marked with a non-null benchmark_difficulty.

Some considerations:

  • I'd like to avoid having too many filters, at least on the main filter screen. Perhaps some "additional filters" collapsible could be used to hide some filters. That being said, classics may be a more common filter. This could replace "difficulty accuracy" which was an experimental filter that I added.
  • This would be exposing an "unreleased" feature for Kilter, which might be a bit confusing to users. On the other hand, this also might be a benefit of using Climbdex.
  • Tension has an icon to indicate a climb is a classic. As mentioned in previous issues, it would be good to keep the interface clean, and I'm not sure how important this info is. Maybe the icon isn't needed and just a filter would suffice for now, or perhaps the description segment at the bottom could be used to also indicate classic status.

Interested to hear other opinions on this one, I have only used the "Classics" feature on the OG Tension board for a session or two. It was nice but didn't seem to have the level of importance that Moonboard benchmarks do.

Filter on handhold distance

As a user it would be awesome to have two additional filters that would enable looking for climbs of a specific nature (ie. long/short, big moves/small moves etc) I think two additional filters would enable this pretty well.

  • Filter by number of hand holds

  • Filter by hand hold distance, This one seems hard to achieve since this data is not in the database from what I can tell.

Display detailed climb stats

Climb stats are available via the info API. This includes the precise quality and difficulty distributions, as well as all of the ascents (users, comments, etc.).

Filter climbs by hand set

After using the TB2 a bit, something that would be nice is the ability to filter climbs that only use wood hands for when skin is low. It is possible to get a subset of these climbs in the app by creating a wall which only has the "woods" set, but this is less ideal when you want the option of using plastic and wood feet while using only wood hands, as this will filter out all plastic holds in general, even if they are just feet.

This might be an easier feature to implement after #12 is implemented.

feature request: add left right button to

really awesome repo, love it!

For the mobile view a left right button, next to the Climbs name would be really handy.
So you can scroll through the route-images easier.

image

Uneven icon spacing on climb card

image

In addition, I wonder if the arrow icons are even necessary still. With swipe and arrow key support, it seems like the arrow buttons are not even very useful and take up some valuable screen real estate.

Directly Control Aurora LEDs via Web-Bluetooth API

stumbled upon https://kilterboard.app/ and this posts from @Georift
https://tim.wants.coffee/posts/kilterboard-app/

So somebody already figured out how to control the aurora controler via WebBluetooth API.
A combination of climbdex + WebBluetooth would be nice.

@lemeryfertitta: feel free to remove this issue if this is out of your scope :)
I also have some features in mind which would make group-sessions a lot more fun, which is a pain right now if you have 5 people using 5 different smartphones … but this is probably a future-future add-on

Grade range in one slider

Using a custom slider, we could have grade range in a single input. This is probably more intuitive and also frees up some space on the UI as we can compress one line into two as discussed in #39.

The linked plugin will probably be fairly easy to use, but I'd like to make sure that the style matches well, so it may require some CSS customization to get it looking just right.

Find hosting

Currently, the app is being served as a static website through Github Pages for cost and convenience. The data can only be updated via commit and may not scale with more boards and layouts.

feature request: add grade accuracy to results

curious how you'd feel if we added the grade accuracy of a climb in the results list? it feels a lil confusing if someone filters by grade accuracy, but that value isn't shown to a user in the results 🤔

that's exposed via the quality property in the api, right? would love to contribute if possible

Embed beta videos

Beta videos are stored in the beta_links table and could be embedded on the page to make for easier viewing.

Swipe gestures making pinch zooming difficult

Pinching to zoom (to see the climb better, as the holds are pretty small on a mobile screen) causes the prev/next swipe to register. I think some tweaking needs to be done to the swipe logic to avoid conflating with the pinch to zoom gesture.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.