Developer Blog
Dekkaru posted to Developer Blog -

Since the last update four months ago, we've been working on a wide range of features and improvements for CubeCobra. In the last update I talked about opening up avenues for new projects to benefit from CubeCobra with new integration points, and today I'm really excited to announce two new integrations, in addition to a couple new large features.

The first integration is with a new project, still in open beta, called Snapdrafter. Snapdrafter is currently only available as an android app and if you'd like to see it an iOS app, I'd encourage you to support the app here. Snapdrafter is an app that lets you take photos of your drafted deck, and save them to your phone as a text decklist file. From there, you can click the CubeCobra icon to import scanned decks into CubeCobra. I believe that creating an easy way to collect data for in-person drafts will make it feasible to do data analysis for in-person drafts of a cube. These imported decks won't just be a playtest draft object you're familiar with, we have added a new cube section called "Records" to track actual drafts of your cubes. This section is meant to be a data store, a place where data can be input or imported, in order to perform analysis on the performance of cards or strategies. It's still very basic, so if there is something you'd like to see in this section, please let us know.

The second integration is with a project you may have heard of before, Commander Spellbook. Commander Spellbook is the most comprehensive database for combos within magic. We've added a new analysis tab to cubes that allows you to see the combos that are available in your cube, with detailed information about each combo. If you feel a combo is missing, you can submit new combos here.

If you regularly follow development of the site, you may know that I retrain the ML system roughly once a year. I was unable to retrain this year due to our dataset outscaling the training infrastructure we had set up. This has been a pain point for users as newly printed cards that were outside of the training data were effectively invisible to the model at the time. We implemented some mitigation measures, so cards outside the training dataset are matched to similar cards. This has been an effective stopgap for now, and will help keep the system working well in between re-trainings. Fortunately we have recently had help from a contributor who refactored our training scripts, to be able to handle the scale of our dataset for many years going forward. I'm currently working on rebuilding this dataset and retraining the model, and I hope to have that done in the next month or two. There have been some new features that interact with the ML system, such as being able to view draftbot scores during playtest drafts, and also being able to view these scores in the pick-by-pick breakdown.

New Features
  • Added records tab, for tracking of practical draft data
  • Added combos analysis tab, using commander spellbook data
  • Added bot scores for pick-by-pick analysis and during playtest draft
  • Performance optimizations on draftbot calls, making playtest drafts smoother
  • Allow users to set default preferences in card searches
  • Added word count sort
  • Updated custom draft formats to fill restrictive slots before non-restrictive slots
  • Added mana breakdown for deck stats
  • Added filter for card notes
  • Added Mana Pool purchase links
  • Added purchase links for entire cubes and selected group of cards in a cube
  • Added user preferences for grid tightness
  • Add User auto blog preference, which determines whether "Create blog post" is checked or not by default (and defaults to false)
  • Async load cube or user followers when the modal is opened, page results for page load performance on popular cubes
  • Added spam mitigation measure warnings for improved UX
  • Allow custom back of card images to make the Transform button appear
  • Added power/toughness comparison filters
  • Support tag exact match searching
  • Added inner scrolling for large modals, have some buttons always visible
  • Return draft notifications to the solo, within CubeCobra bot drafts
  • Add notifications for Draftmancer draft imports
  • Performance improvements with fetching cube recommendations
Bug Fixes
  • Increased card tag color contrast to improve visibility
  • Fixed deck deletion
  • Fix duplicate card removals that also remove unintended cards
  • Fixed collector number sort
  • Allow card search with apostrophes
  • Card prices for 'Etched' finishes now show the correct price
  • Fixed failing drafts when basic lands are not lands (you know who you are)
  • Fix not using distinct card names for searches correctly
  • Fixed saving of new packages to correct format
  • Use short id if it exists in "Your Cubes" dropdown
  • Fix card name sorting on playtest data
  • Fix invalid dates in date added sorting
  • Fix vote package count being stored in the wrong attribute, not aligned with the vote count index.
  • Fix error where frontend causes a 404 on redirect because the short id changed.
  • Fix Playtest data CSV containing card ID instead of name, so different than the UI
  • Updated Tile component to use anchor instead of onClick so browser's normal ctrl/cmd click behavior opens the cube in a new tab.
  • Fix delete deck modal actions redirecting to the deck
  • Fix bug that resulted in Art Cards appearing before the actual cards
  • Prevent last step of a pack in custom draft format from being a "pass", which stalls the draft
  • Fixed trashing cards during playtest drafts
  • Fix matched cards in CSV upload not tracked when user is asked to correct misidentified cards
  • Fix blog post redirection on edit/delete if the cube is deleted
  • Fixed searching while not logged in
  • Fix color identity filter case sensitivity
  • Default card notes to empty string instead of null to fix filtering error
  • Fix drafts not finishing or ending in a weird state, related to pending picks and failing bot predictions
Technical Changes
  • Added spam mitigation measures
  • Split webpack into common and page-specific chunks, reducing page sizes
  • Started back-end typescript migration, migrated many files
  • Response time logging to help diagnose performance issues
  • Significantly increased unit test coverage
Dekkaru posted to Developer Blog -

When I first launched CubeCobra, I had a vision that one site could house every single tool that you would need to build a Cube, and that's what I attempted to build. As the site grew, and new features were added, we were in a spot where we had some good core functionality and a handful of features that quite honestly didn't work too well. Multiplayer drafting was the biggest offender here. I tried my best to design a reliable system, but it was riddled with many extremely difficult to solve bugs, that I just didn't have the capacity to solve them all. To make matters worse, our buggy client impacted singleplayer drafts as well, causing drafts to end early, or crash, despite not evening utilizing the multiplayer features. CubeCobra users felt this pain, and many opted to do multiplayer drafts on Draftmancer. While that site was reliable, drafting their resulted in draft logs that never made it to CubeCobra, and users wouldn't benefit from the draftbots we've worked so hard on.

This release changes all that. Unless opted out, all Cube drafts run on Draftmancer will now have their logs pushed to CubeCobra. I've added a button to the playtest page to quickly create a lobby on Draftmancer. I've also made our draftbots available to Draftmancer, so you may notice an improvement in the quality of bot picks over there. All in all, I think this integration will better suite the needs of the users of both site. You can still run playtest drafts on CubeCobra, against a pod full of our draft bots - and I expect this experience to have significantly improved as we gutted the complexity of the previous system.

This integration is part of larger shift in the goals of the website. I was wrong to think that there should be one site that should handle everything Cube-related. We are never going to out-Scryfall Scryfall, or provide a better multiplayer drafting service then a dedicated tool like Draftmancer. I want to focus instead on provided the best core services that we can provide, and create tools and integrations that other community projects can utilize to create a better Cube ecosystem for everyone.

Our last update in December saw a major migration to move our front end to Typescript. The goal of this change was to improve developer experience, and help reduce type related bugs. This has been a massive success, and we've seen a stark increase in the number of community contributions to the site. I've continued this work and now started partially migrated the backend to Typescript as well. This update is just the start of this work, but I'm thrilled to see a new wave of contributors help out with the site.

In just the past month, here are all the improvements new contributors have made:

New Features
  • Added an inline emoji to cards names if they are tagged with that emoji (you do need to enable the setting under display, you definitely want to try this one out :wink:)
  • Added "Borrowed" as a new card status
  • Added a transform button to view the back of DFCs to the card modal
  • Tag suggestions no longer require refreshing the page to update
  • Added many missing symbols, such as a, pw, tk
  • Update non-publioc Cube icon tooltip to match private or unlisted
  • Added arena export (copy to clipboard)
Bug Fixes
  • Fixed markdown code syntax highlighting
  • Fixed minor package page bugs including failing to apply keyword sorting, incorrect casing
  • Fixed label on "Show Total Prices"
  • Fixed card dragging on mobile
  • Fixed some modals not working on mobile
  • Fixed cards not being trashed during the draft
  • Align the old and new card details in changelist when there is a swap
  • Fixed some markdown regresssions from 1.0.0
  • Fixed bug where blog posts couldn't be modified
  • Fixed bug where card foiling wasn't visible in visual spoiler
  • Fixed issue where color categories weren't being read from CSV correctly
  • Fixed bug where enter/tab wasn't working correctly when modifying a Cube
  • Fixed amount of cards filtered text so it shows when there is no maybeboard
  • Fixed tag suggestion dropdown
  • Fixed token consolidation
  • Fixed bug with CSV encoding where only the first quotes were correctly encoded

One last note, regarding spambots. You probably have noticed a number of changes around the site to help mitigate this, including security questions, captchas, stricter content filtering, and report buttons around the site. Some amount of spam is still coming through, and it's very helpful for users to flag malicious Cubes and users for me to clean up. With the advancements in LLMs and cost of compute - this is probably just the reality we live in now, but every little bit helps in this constant battle against the spammers. Thank you for your understanding and support!

Dekkaru posted to Developer Blog -

Hi everyone, it's been just about a year since our last update. In that time I have done some small bugfixes here and there, but haven't made any big changes that warranted release notes. Today, I do have a major update to announce, an I'm calling it version 1.0.0, rather than sticking with our previous version scheme. The biggest change you'll see is a sweeping overhaul of the frontend. This is because we migrated away from Bootstrap and to Tailwind CSS. This change was made to make the frontend more maintainable and to make it easier to add new features in the future. I really hope you like the new look! I aimed to make things mostly 1:1 but there are noticable changes, in particular I cleaned up some areas I felt weren't up to par. We've also migrated our front end from Javascript to Typescript, which has fixed potentially hundreds of bugs in the process.

Since the front end has been overhauled so thoroughly, there may be some gaps in experience that I missed - I would love to hear your feedback! Please reach out if you encounter unexpected bugs or you feel something doesn't look good.

As the site has grown over the past year, so have our costs. We've been able to keep the site running through a combination of our generous patrons and the ads we show on the site. You may notice that I've tweaked the ads, including adding a small video ad in the corner. To be transparent, this is to help improve ad revenue to keep up with our rising costs that have been scaling faster than our patron support. I hope you understand and I hope the ads aren't too intrusive. If you'd like to support the site, please consider becoming a patron. You can find more information on our Patreon page.

Recently, you may have also noticed a sharp uptick on spam on the site. There are some mitigations I've added, included captchas on registration and on creating cubes. This has helped a lot, but there is still some spam that gets through. I've been collaborating with some other web admins who are also experiencing the same issues, and will be continuing to work on mitigations to prevent spam coming through.

We've also decided to stop using our Twitter page, and instead you can follow our Bluesky account for updates regarding the site.

There is a very long list of bugs fixed by myself and our community of developers who have graciously contributed to the site. I won't list them all here this time, but I want to thank everyone who has contributed to the site in the past year. I really appreciate all the help and support you've given us.

Dekkaru posted to Developer Blog -

It's been a while since our last official update, but I'm very happy to announce the results of an end of year bug squashing endeavor. There are a number of bugfixes that have been long-overdue, and I've tried to address to largest impact ones with this update. Special thanks to all the contributors who helped with this update, this is not something I can do alone easily and the extra help is very appreciated.

Some of the larger bugfixes include an issue where drafts would end early. We're not sure if we've completely fixed the issue, as it's a difficult issue to reproduce, but we believe this should happen significantly less often now. There have been some data errors with cubes, particularly when editing with multiple devices and an older cube list is loaded up in a browser. When trying to apply an update to an out-of-date cubelist, now we will correctly error, preventing the unintended removal of cards.

We've also taken the time to update our multi-purpose machine learning model that includes draftbots, deckbuilding, card suggestions, and the "synergy with" section on card pages. A re-train was necessary in order for the draftbots to recognize newer cards that were not in the prior training dataset. We removed elo from the model as we decided it wasn't needed, and it was negatively impacting high elo outlier cards. We added a new function to the model to help calculate synergy, which as a side effect helps all the other functions "understand" individual cards better.

On a more personal note, I want to thank all the users and supporters of the site for bearing with us while we have had so many outstanding bugs. I know it's been frustrating, and I'm sorry it's taken so long to get to this point. This year I've been faced with many distractions from fulfilling my role as the maintainer of Cube Cobra, including finishing up my final semesters in grad school and working on CubeCon. Fortunately I've graduated now, and hopefully that will translate into more free time to continue the work to improve Cube Cobra. I've also made the difficult decision to no longer work with CubeCon going forward, which frees up even more time and energy to focus on Cube Cobra. I'm excited to see what the future holds for Cube Cobra, and I hope you are too.

Bug fixes:

  • Fixed a bug that causes drafts to end on an earlier pack than expected
  • Invalid cards in packages fixed
  • New patreons can correctly link their accounts again
  • Fixed a bug with editing cubes where cards can be removed unintentionally
  • Featured cube queue has been fixed, including rotation automation
  • Podcast auto-fetching automation fixed
  • Fixed a bug where account email can't be updated
  • Special characters don't break autocomplete (looking at you, LTR)
  • Content creator dashboard fixed
  • Fixed a bug where comment reports fail to be delivered
  • "Synergy with" section on card pages no longer shows nonsense for high elo outlier cards
Dekkaru posted to Developer Blog -

Thank you for your patience during our downtime! This migration was important for the long term maintainability of Cube Cobra. We've been working on this update diligently since the last release, 9 months ago. As of writing this post, you will immediately notice that all of your old decks are missing, and that card analytics (like top cards) have no history, don't panic! This is going to take another few days to be migrated, and I didn't want that to be a blocker to use the website. I'll keep up a banner until those two processes are complete.

So, what's new with this update? In truth, only a handful of things. We've fixed many major bugs since the last release, and refactored the entire front end. The goals of the work we've done are more focused around scalability and maintainability of the project. That said, there are some major improvements to the core workflows of managing a cube. First, all cubes now have a history tab, that shows the history of the cube. We've backfilled this history based on blog posts, but moving forward, even changing attributes of cards will be tracked in the history. There's still a lot more work we can do to build on top of this, such as undoing changes, viewing a "point in time" view of a cube, and even comparing that point in time with another cube. The cube history system is designed to support these operations, so you can expect us to deliver those features in the future. With this update in how we handle edits to cubes, you'll notice blog posts have similarly been refactored. As a legacy remnant of the first implementation of the site, we were storing changelogs as plain text instead of the data the change represented. Since we now track the actual change in data, changelogs in blog posts will be easier to read, with consistent autocard and links, and updated symbols that I think you'll love.

Analytics is a big part of this update. While they're not going to migrated at the time of writing this blog post, they will be soon. The old system relied on a script running every day that saved the state of the system. This is problematic because if this script ever failed for any reason, we would have gaps in our data until the issue can be fixed. This has led to all sorts of various issues with our analytics including inconsistent Elo, and the graphs looking nonsensical. The new system leverages the fact that we have dated changelogs for every single cube, and will write updates as a function of the entire state of the system. This means that if there are gaps in the data, they will be backfilled. This also means that Elo will be calculated as a function of all drafts, instead of updated as drafts occur. If we change how we calculate Elo now, the Elo value for all cards will be adjusted as if the new calculation was in place since the launch of the site.

So, what does this update NOT do? This update is not a complete fix for all the drafting issues. We've been struggling significantly with our draftbots for quite honestly an unacceptable amount of time, and for that I'm sorry. There are still some open bugs related to drafts crashing, that will be my top priority now. The draftbots themselves will be slightly better, but not great. They are a simple function of Elo and Color Identity. However, I am currently working on a complete refactor that I believe will be a game changer.

Lastly, I want to say thank you to all the volunteers who decided to help test this release. I really cannot express the depth of my gratitude, this release would not have been nearly as polished without the time that you have all put in. This doesn't mean this release is perfect, and I will be working around the clock the next few weeks to squash any and all bugs reported, so if you encounter any unexpected behavior please let me know. This was a major refactor, and there will be corner cases we have missed.

Dekkaru posted to Developer Blog -

Today's the big day! It's our first major update since 5.7, seven months ago! I promise that the wait was well worth it though, as this is the update that brings multiplayer drafting to CubeCobra. All drafts on CubeCobra will use the new model, even singleplayer drafts. These drafts bring completely brand new draft bots - with the only major downside that we no longer support users drafting while not being logged on. The reasons for this is somewhat complicated, but the brief is that anonymous drafters leads to unique challenges that we want to avoid entirely.

In addition to the new major feature, we've also upgraded our front end styling library up a major version, which will have impacts on every page of the site. If something minor now looks wrong, like a button color being off, or a spacing issue, please let us know, as it's been difficult to find every small issue during this update. As a result, more components are now ctrl+clickable, such as cube previews - another highly requested feature.

This is the part where I'd usually list every new feature and bugfix, but seven months of small changes is a bit cumbersome to look through, so instead I'll omit this section. Moving forward, I'm implementing a new internal practice to ensure that even with these long lulls of no updates, we'll still have a comprehensive changelog.

Dekkaru posted to Developer Blog -

Today, we're releasing a batch of changes in order to fix a bug that was created by the "Heads I Win, Tails You Lose" secret lair, that caused our automated card update script to fail to import new cards from Scryfall. This should be fixed, and you can expect missing cards to be propagated up to a day after this announcement.

We definitely are in a bit of a lull for development of new features, and I wanted to give a special thanks to Vaasa (on discord, lunakv on GitHub) for implementing almost every change in this release. My personal development time has been quite limited, and the time that I do have I have spent on a large feature that is still not quite ready enough for release

Since our last release, CubeTutor has sunsetted their service, so we've accordingly removes all references to CubeTutor, including our "Import from Cubetutor" feature.

We've made major changes to how we handle private cubes, previously dubbed "Unlisted Cubes". Now, on a private cube, no one besides the owner can see the cube overview or any other pages, start a draft of the cube, generate sample packs of the cube, and view blog posts attached to that cube.

New Features:

  • Added 'banned' and 'restricted' filters
  • URL parameters carried over when editing cube, so your sort/filter won't be reset
  • Better private cube support
  • Added system for global notices (like "this site is in maintenance mode")
  • Blogposts now created when a cube is cleaned for invalid cards
  • Added 'Etched' as a finish, in addition to 'Foil' and 'Non-Foil'

Bugfixes:

  • Fixed a bug with banner advertisements blocking some UI elements
  • Several missing tokens added
  • Fixed a bug with bulk TXT upload format
  • Remove defunct CubeTutor import
  • Grist now filters correctly for being a commander
  • Fixed a bug with pagination calculations
  • Fixed parsing of reversible cards (such as cards from "Heads I Win, Tails You Lose")
Dekkaru posted to Developer Blog -

Thank you for your patience during our downtime. This maintenance was necessary to enable us to help build new features that are still in the pipeline.

It's been a considerable amount of time since our last release, and while we don't have any game-changing new features to bring to you today, we do have some significant quality of life features and bugfixes.

The biggest new feature is an automated featured cube rotation, for 'Coiling Oracle' level patrons. You can now add your cube to the queue, and easily track your cubes placement until it's your turn to have your cube featured.

New Features:

  • Automated the Patreon featured cubes queue
  • Adds a default seat count option to custom draft formats
  • Added a download button to the QR code modal and updated styling
  • Added an error message page for users who have javascript disabled in their browser
  • Added "is:reprint" filter
  • Added "is:firstprint" filter
  • Added "Add", "Remove", and "Total Size" counters when editing a cube
  • Notifications will now be sent when a cube has cards removed through the periodic data cleaning process

Bugfixes:

  • Fix some issues with editing a blogpost
  • Fixed adding a card to a cube from card pages
  • Accept "TRUE" as a value for maybeboard to support excel edits
  • Fixed a couple +2 Mace bugs
  • Fixed several edge case bugs around bulk upload
  • Fixed a bug with mass editing cards' CMC
  • Fixed card redirect URLs that used slash characters, such as split cards
  • Fixed an issue where users could not delete their own decks
  • Fixed the missing 5%-8% category in popularity sort
  • Fixed "Cannot read 'cards' of null" appearing when trying to draft a cube
  • Fixed several client-side warnings
  • Fixed a typo on filter syntax documentation
Dekkaru posted to Developer Blog -

We have a small release for you today, but a significant one. I want to preface this with a bit of context. I love working on Cube Cobra, and it makes me incredibly happy to see how far we've grown. I am dedicated to doing the best I can to provide the best possible service, and this would not be possible without the generosity of our patrons. But unfortunately, despite our successful Patreon campaign, we haven't been able to consistently meet our hosting costs, even between Patreon, affiliates, and merch. As much as I love maintaining and updating this project, I can't continue it if it becomes a significant monthly bill for me. That's why I've decided to run advertisements on the website. I know this isn't the direction you were hoping for us to go in, but I have gone out of my way to make them as non-intrusive as possible. If you're a patron, and you have your account linked, you will not see any ads. If you have an adblock on, please consider turning it off, as it will impact our bottom line. The ads will not occupy and previously used space, but please let me know if you have any feedback. And once again, thank you so much for all of your support so far, I really could not have done this without the incredible community behind me.

Let's move on from the sappy talk - we do have some nice quality of life features and bugfixes to roll out. I've made some requested UI tweaks that should noticeably improve user experience. In a previous release, we removed the dashboard blog post pagination, and now we're bringing back the ability to view older blogposts, with infinite scroll! If you want to see older posts, just keep scrolling... and scrolling... forever! Or, at least, until we run out of content to show you.

New Features:

  • Added infinite scroll to dashboard feed
  • Add show/hide unsorted cards to display dropdown
  • Added "Add new cube" option to your cubes dropdown
  • Card search now respect filters for set more strictly, card must be in set, not have a version in the set (only affects card search and top cards)
  • Onboarded with Nitro Pay(our advertising partner)

Bugfixes:

  • Fixed cube card count on bulk upload
  • Fixed clone and rebuild deck
  • Fixed issue where delete deck modal could not be dismissed
  • Fixed error handling on sample pack failure
  • Fixed content browsing pagination
  • Fixed playtest page crashing if logged out
  • Fixed viewing user pages when logged out
Dekkaru posted to Developer Blog -

In today's release, we've mostly fixed a few critical issues with the site around top cards and cube searching. The previous paradigms for both these pages turned out to not be scalable, and poorly utilized our database. Top Cards has been reworked to not even touch the database now, by utilizing some cached information, and should work perfectly. Cube search has been reworked completely as well, using the keyword indexing capabilities of our database. I'll still keep a close eye on cube search latencies, but I believe it should be significantly improved. I've also added a new way to search for cubes: tags. If you have a tag on your cube (set in overview), you can now click that tag to see all cubes with that tag. If you haven't tagged your cube yet, go try it out! It's potentially a great way for other users to find your cube with a specific theme!

We've also added a long-requested feature of popularity sort and filter. This value is a percentage of cubes a card is included in. You can also filter cards by cube count and pick count, by using the numerical filters pickcount and cubecount.

Another big improvement we made is an integration with Patreon. On your account information page, you can now find a tab to link your Cube Cobra account with your Patreon account. Currently, this won't accomplish anything, but we have plans to add some extra perks to patrons, like a cosmetic name alteration across the site to mirror our discord roles, and also a fully automated featured cube queue. I want to be clear, we will not ever put any cube curation features behind a paywall. The only patron only features will be either cosmetic, or related to amplifying exposure, such as the featured cube queue. We are also exploring the possibility of putting ads on certain pages to help cover our rising infrastructure costs, being a patron will automatically hide these, if we decide to move forward in that direction.

New Features:

  • Added popularity sort and filter
  • Implemented full cube tag functionality
  • Added Patreon Integration
  • Added cube count and pick count filters
  • Changed reminder banner background color

Bugfixes:

  • Top cards reworked and fixed
  • Cube querying improved
  • Fixed anonymous draft notifications
  • Fixed decklist uploading
  • Fixed an issue where the last pick of drafts wouldn't be submitted
  • Fixed an issue that prevented cube Elo from being updated