Double XP Software

Games, apps, and other cool stuff

Down & Across on iPhone in the light themeDown & Across on iPhone in the dark themeDown & Across on iPhone in the pink themeDown & Across on iPhone in the purple theme

A crossword app for iPhone, iPad and the web. Open any .puz file, solve with a keyboard or write answers in with Apple Pencil, and pick from 20+ themes. Free, with no ads and no subscriptions.

Play online →

schemas.ts
import { belongsTo, cast, hasMany, Schema, t, timestamps } from "egon-orm";

export class User extends Schema("users", {
  id: t.bigint({ mode: "number" }).primaryKey().dbGenerated(),
  email: t.string(),
  name: t.string().nullable(),
  ...timestamps(),
}) {
  static posts = hasMany(() => Post, { foreignKey: "authorId" });

  static changeset(user: User | typeof User, params: unknown) {
    return cast(user, params, ["email", "name"])
      .validateRequired(["email"])
      .validateFormat("email", /^[^@\s]+@[^@\s]+$/)
      .uniqueConstraint("email");
  }
}
main.ts
import { count, from } from "egon-orm";
import { repo } from "./repo.js";
import { User } from "./schemas.js";

const counts = await repo.all(
  from(User, "u")
    .leftJoinAssoc("u", "posts", "p")
    .groupBy(({ u }) => u.id)
    .select(({ u, p }) => ({ email: u.email, posts: count(p.id) })),
); // type: { email: string; posts: number }[]

A TypeScript ORM for Postgres, SQLite and MySQL inspired by Elixir's Ecto ORM. Schemas, changesets and queries are typed end to end with no code generation.

Docs →GitHub →

The Dicemates home pageDicemates on iPhone

Peer to Peer marketplace allowing users to buy and sell board games. List games, accessories and handmade upgrades, search listings from sellers and local game stores across the country, and let Dicemates handle the payment and shipping so buyers and sellers can trade with confidence.

About

Casey Tickes
Casey Tickes
Founder

I'm Casey. I've been building software for over 20 years, from Top 10 App Store apps and indie games to ticketing platforms for the country's largest events and large scale IoT systems. Double XP is where I make the things I want to use.