Supplies: https://cardstock.denta.co/kb/supplies Printer Settings: https://cardstock.denta.co/kb/settings Instructions: https://cardstock.denta.co/kb/instructions
Overview: I built Cardstock because I had some scripts to do this lying around, and wanted to explore the new Rails 8 magic. Kamal 2 (kamal-deploy.org/) is a game changer, SQLite in production is fine, and the database backed solid family of gems work like a charm.
Compute: I am renting a box on https://hetzner.com located in VA for $15/mo. This box has 8 gigs of ram and 2 vCPU's. This is such a deal compared to compute prices on https://render.com.
Kamal 2: This thing is amazing. Kamal gives me everything I could want (easy console access, easy shell access, a way to manage secrets, a way to see my logs, and letsencrypt support for DNS), all without a PaaS tax. The best part is the accessories feature: https://kamal-deploy.org/docs/commands/accessory/. I am running my main app with two accessories: Meilisearch(https://meilisearch.com) and OpenObserve (https://openobserve.ai). Instead of paying Algolia to host search infrastructure and sentry to host monitoring infrastructure, I’m hosting my own OSS without any fanfare.
Upscaling: To upscale the trading cards (a mandatory part of this build, scans are never high enough DPI). I am using this (https://replicate.com/nightmareai/real-esrgan) model. For upscaling every card, I've used under a hundred bucks of compute. This model was picked on a whim, but worked well enough that I didn’t compare other models.
SQLite: I used SQLite combined with Litestream (litestream.io) for my database. While I considered Postgres, I hesitated due to uncertainties around handling backups on self-hosted infrastructure. This was my first time using SQLite in production, and it was functional but with some minor annoyances. Here’s what I encountered: 1. No Default UUID Primary Key Type I had to set primary keys as strings and assign IDs manually from the application record. It’s an annoying workaround but manageable. 2. No Native Array Columns Because SQLite doesn’t support array columns, I had to use its native JSON column type, which just felt icky. If I were working with something like embeddings, this would be especially annoying, because you couldn’t enforce all the records to have the same number of dimensions. 3. Cryptic Errors At one point, a migration failed silently, leaving a cryptic error in schema.rb. The issue was resolved by rolling back the migration and redoing it, but it was once again, annoying. 4. Litestream Defaults Litestream deletes snapshots after 24 hours by default, which is far too short. When I tried to recover some data, I found it had already been deleted. Adjusting these defaults fixed the problem.
Solid Queue/Cache/Cable: The solid family of gems are all backed by the database and were a pleasure to work with. Goal was to prevent needing to reach for redis, so you have one less thing to worry about. You end up with a little more latency, which is a totally reasonable tradeoff.
Conclusions: We are moving into a post platform as a service world. Instead of buying a bespoke render.com or heroku, you just buy commodity compute and use Kamal to manage. It's like, pretty much all there, excited to see how this space matures.
The red bordered cards are the ones I just printed, real cards are on the right. Also all are US sized, the real yugioh cards are slightly smaller than that.
I tried to get a couple diff angles and card types. Like I said, totally good enough for my use cases!
There's no screenshots and no information about how it works (or information at all for that matter), which doesn't really convince me to create an account (in my mind, the process of picking a deck and printing it is not one where requiring a login would be obvious, so some more "convincing" might help).
I don't want to sound mean-spirited, but I'd guess many people would similarly refrain from creating an account for the reasons mentioned above.
Edit: Turns out there's a cool scrolling cards animation as background! It's just that it doesn't seem to work on Firefox so there it just has a blank background.
I also saw your other comment about the "test" account (didn't feel like replying on both places). Thank you for that.
That said, maybe there's some other advantage to having an account that I just didn't think of.
I didn't add any restrictions on email registration because I hear you that actually creating an account can be a chore. Exposing web services to the public internet without auth seems scary, which is why I rarely do it.
Aren’t you still effectively doing that, though?
This seems like the combination of two downsides: Bots will be able to perform email verification if they want to; honest users will still be deterred.
bot protection is enabled in clerk, where email registration is not.
Thanks for setting this up adenta!
document.querySelectorAll('img.mantine-Image-root').forEach(i => i.style.flex = 1);
I think the problem is money changing hands which isn't happening.
TL;DR: Use them all you want for play testing but don't use them in events or for trading.
Edit: They DO want a watermark for proxy cards, not sure they enforce that much since most proxy sites make it optional.
It says
"A playtest card is most commonly a basic land with the name of a different card written on it with a marker. Playtest cards aren't trying to be reproductions of real Magic cards; they don't have official art and they wouldn't pass even as the real thing under the most cursory glance. Fans use playtest cards to test out new deck ideas before building out a deck for real and bringing it to a sanctioned tournament. And that's perfectly fine with us. Wizards of the Coast has no desire to police playtest cards made for personal, non-commercial use, even if that usage takes place in a store."
So they say that they have no desire to police them, but define them as not using original art and not passing for the real card even briefly. Those descriptions do not apply to high-resolution original art card images printed out.
Imagine a proxy only tournament of any card game, where you have to submit your decklist ahead of time and it is waiting for you when you arrive, ready to play and keep.
If you want to play around with it, try account [email protected] with password 'hackernews'
Your search function could have puppies and rainbows but it surely doesn't do anything worth creating an account for.
I’d love to know:
1) How it compares to Sentry in terms of insights you get 2) How you set it up as an accessory
I’ve used various (hosted) APM services for my Rails apps but they all are stupendously expensive so your approach sounds intriguing.