Developer Blog
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
Dekkaru posted to Developer Blog -

Thank you for being patient during our downtime. This was a necessary measure to perform a data migration to enable some of our new features, help keep hosting costs low, and to lower the amount of data needed to be loaded for various activities.

With this release we updated cubes to only have 2 IDs. Previously cubes had a random long id, a random short id, and possibly a custom ID. We combined the short ID and custom ID so now when you define a custom ID for your cube it'll replace the short ID. This makes links much more consistent across the site. We also added the long ID to a modal on the overview page for the cube. You can access it by clicking the question mark next to the Cube ID field. Use the long ID if you need links that will always work since links using the short/custom ID will break when the custom ID is set or changed. This will break some links to existing cubes that used the short ID when the cube had a custom ID as well.

Now for the big stuff. Drafting got a major overhaul this release. Internally nearly all the code was edited or rewritten to modernize and improve functionality. What this means for you is that draft and deck pages should load faster now. The draftbots should also be improved and faster. Ruler501 will write about the draftbot improvements and what else is being done for them in her series on the draftbots at a later time. It is unlikely that these changes will destroy data in existing cubes/decks/drafts, but if you notice any please report it to Dekkaru who can get the previous version restored from our backups.

Custom formats were also greatly improved with this release with several all new, and much requested features. First you can now specify the steps to draft each pack in your cube. A step is an action such as

  • Pass the pack in the correct direction
  • Pick a card from the pack (can also have this be a random card).
  • Trash/Burn a card from the pack (which can also be random).

In the future we can add even more actions to this list as they are suggested. Using these actions you can implement things like the formats for Commander Legends, Double Masters, Sealed, Pancake and more. As a tip if you want to have the last N cards in a pack picked or trashed (like say a sealed pack) you can make it randomly pick that number of cards so you don't have to click through picking each one. The UI for this is experimental and we would greatly appreciate feedback on how to improve it.

New Features:

  • Reworked custom draft formats, adding a way to customize draft steps (pick, skip, burn/trash, pass)
  • Updated cubes to only have two IDs, a long canonical ID, and a customizable shortID.
  • Clarified cube ID presentation on cube overview page
  • Sort card version list by release date in card edit modal
  • Fixed links to Lucky Paper's cube map

Bugfixes:

  • Fixed an issue with adding a card while specifying versions when that card has multiple versions in the selected set
  • Fixed memory leak with analytics aggregation, should regularly update automatically now
Dekkaru posted to Developer Blog -

We have a very exciting release tonight, with a couple big new features. The first thing I want to talk about is something that's been very widely requested that for the longest time I didn't think was worth building up until recently, and that's per-cube draft analytics and Elo. The difficulty with this, is that in order to have draft data be statistically significant, at least thousands of drafts of a cube need to be done, possibly more, depending on the size of the cube. So, what I decided to do is have per-cube Elo move ten times faster than site-wide, or global, card Elo. This means that a card's Elo will be noisier, but take less drafts to get to it's "correct" value. I also added a toggle button in the cube settings, found in overview, that makes draftbots for that cube use that cube's Elo instead of global Elo. By making this an opt-in feature, I think it makes it more reasonable as new cubes won't suffer from having no way to compare card quality.

With the new draft data tracking, we added a new tab in the analytics page to show a ranking of all cards. This allows you to view each card's Elo, pick/pass ratio, and mainboard/sideboard ratio. Since a lot of drafters don't bother to build decks after the draft, we exclude decks that don't have a sideboard from this calculation. You can also find these fields in other analysis sections, like chart, averages, and pivot chart.

The next big feature I want to talk about is the addition of "Card Packages". These are sets of cards with some unifying theme, such as "Power Nine" or "Fetch Lands". These packages can be quickly added to a cube, and doing so will create a blog entry with a link to the package, and also will tag the new cards with the name of the package. Any user can create and submit packages, and also upvote packages for greater visibility. You can search for packages by keywords, that include the name of the package and the names of the cards in the package, so searching for "lotus" will show you all packages with "lotus" in the name but also all packages with a card that has "lotus" in the name. There's also a system for "approving" packages, which I will manually curate - this will create two lists, one that includes all packages, and one that includes packages I've deemed particularly useful for cube building.

I've also added a new feature for basic cube editing, you'll notice that when adding and removing cards, there is now a checkbox with the label "Specify Versions". If this is checked, the "add" field will autocomplete with the set code and collector's number - so you can make sure to add the correct version to your cube, and not have to worry about going through your list and correcting the version after the fact. The autocomplete dropdown will also have the correct autocard popup so you're 100% sure the card you're adding is the one you wanted.

It's also time for an update that I suppose was inevitable, but some users may not be welcome to: switching from CMC to "Mana Value". This is now the correct term, so that's what we'll use.

New Features:

  • Added analytic for playtest data aggregation
  • Added easy-add "Card Packages"
  • Added a checkbox when adding cards to cube that allows specification of card versions
  • Added the ability to have draft bots use cube-specific elo instead of global elo
  • Added mouseover text to cube preview to view cut-off names
  • Updated front end components to display "Mana Value" over "CMC"
  • Added a cache for sample pack images, significantly improving load times for discord pack bots

Bugfixes:

  • Added back autocard on autocomplete dropdowns
  • Autocard on the remove autocomplete will now use correct versions from your cube