What is this?
Dekapai is an unofficial, community-driven "which looks bigger?" voting tool for Azur Lane skins. You get two skins at a time and pick the one you think has larger assets. Rankings are computed server-side from those votes.
This is fan-made and not affiliated with Azur Lane, Manjuu, Yongshi, or Yostar. All character art belongs to its respective owners.
Voting
Go to the voting page and pick between two skins. Votes are pairwise comparisons only; there’s no manual "score" input.
Rankings
Skin rankings list each skin separately. Ship rankings show each ship once, using the ship's highest-ranked skin at the time.
FAQ
How do the rankings work?
Every vote is a "match". On each match, the winner skins gets some points and the loser skins loses some points. The idea is that after enough matches we should get to a stable ranking where bigger tits float to the top.
Why do the rankings sometimes feel "off"?
Skins with very few matches may have an inaccurate rating, so that might be why. I added a warning to skins with less than 20 matches to make that clear. It could also just be that most people disagree with you.
Does this store personal data?
The only thing I store that is kind of (not really) personal is your IP. On every vote I store the current time, the IP where the vote came from, the two skins in the match, and the skin voted for. I only really store your IP so I can block/remove votes if someone malicious tries to mess up the rankings or something.
There are no cookies.
There are no cookies.
What does "base" mean?
That's just the default skin of the ship.
Does this have all skins?
Yes, as of December 30th 2025. Unfortunately, this isn't set up to update automatically when new skins/ships come out, so I'll have to update it manually when that happens.
No promises, but as long as I'm not too busy and I'm still interested in the game, I plan to keep this updated.
No promises, but as long as I'm not too busy and I'm still interested in the game, I plan to keep this updated.
How many times can I vote?
You can vote as many times as you want, mostly. Still, there is a limit of how much you can vote in a 24-hour period. This is to prevent a single person from influencing the ranks too much. How this limit works will remain undisclosed, but most people should never reach it.
But flat is justice
That's not a question. Also, while I respect your opinion, it is, unfortunately, wrong. There's no such thing as tits that are too big, and the bigger the better. I welcome the Azur Lane breast inflation we've been seeing for the last recent years and pray every night for a new shipgirl who breaks the current record. May this game be dominated by titty monsters 🙏
Jokes aside, if you really like flatwhy are you even playing this game?, the rankings are still useful to you, you just have to scroll all the way to the bottom.
Jokes aside, if you really like flat
What is dekapai?
Comes from でかいおっぱい, Japanese slang for "huge tits".
In the dev's opinion, who is best girl?
Bremerton is best girl. Also, whoever is at the top of the ranking, it depends on how horny I am.
I'm a nerd. How does this thing work? How are the pairs chosen? How are rankings calculated?
Hello fellow nerd. This is hosted on AWS and runs on a totally serverless architecture (S3, CloudFront, API Gateway, Lambda, DynamoDB), mostly so because I don't expect it to be used that much and that's exactly where serverless shines.
Front-end is 99% vibecoded because I hate CSS with a passion and uses no frameworks because I can't be bothered to learn any of them; pure HTML/CSS/JS is good enough for this. Back-end was written by hand and autistically optimized to save as many DynamoDB RRCs/WRCs as possible because it's fun and I'm cheap.
Front-end is 99% vibecoded because I hate CSS with a passion and uses no frameworks because I can't be bothered to learn any of them; pure HTML/CSS/JS is good enough for this. Back-end was written by hand and autistically optimized to save as many DynamoDB RRCs/WRCs as possible because it's fun and I'm cheap.
How are the pairs chosen?
The first skin:- 40% of the time: is picked randomly from all skins.
- 60% of the time: is picked randomly from the 500 skins with the least matches (bigger weight to the ones with less matches). Skins with less than 50 matches have an even higher boost and will get picked way more often.
- 15% of the time: is picked randomly from all skins
- 85% of the time: is picked randomly from the same/adjacent buckets as the first skin
skin["rating"] // 50.
How are rankings calculated?
I'll just copy-paste the relevant code:
ZERO = Decimal("0")
ONE = Decimal("1")
TEN = Decimal("10")
SCALE = Decimal("400")
TWOPLACES = Decimal("0.01")
MINIMUM_K = Decimal("16")
MAXIMUM_K = Decimal("96")
def get_k(skin):
matches = Decimal(skin["matches"])
k = MAXIMUM_K / (matches + ONE).sqrt()
return max(MINIMUM_K, k)
def update_elo(first, second, vote):
rating_first = Decimal(first["rating"])
rating_second = Decimal(second["rating"])
difference = rating_second - rating_first
expected_first = ONE / (ONE + TEN ** (difference / SCALE))
score_first = ONE if vote == "first" else ZERO
expected_second = ONE - expected_first
score_second = ONE - score_first
k_first = get_k(first)
k_second = get_k(second)
new_first = rating_first + k_first * (score_first - expected_first)
new_second = rating_second + k_second * (score_second - expected_second)
# Only store 2 decimals to save space
new_first = new_first.quantize(TWOPLACES)
new_second = new_second.quantize(TWOPLACES)
Thanks
People that helped:
- /u/Kinexity — came up with the idea in this post.
Projects that helped make this possible:
- nobbyfix/AzurLane-AssetDownloader — used to download and extract the game's assets.
- Krazete/azur-wiki — used as a head start to extract some data from the JSON files.
- Krazete/azur-paint — used to build finalized skin images from the extracted assets.
- Senkin219/AzurLanePainting — fork from the above with some fixes and improvements.
- AzurLaneTools/AzurLaneData — auto updating repo with data from the game in easy-to-use JSON files.