Guide

Briscola — rules & protocol

How to play classic two-player Briscola, plus how scores are published to Nostr so anyone can verify they came from this app. The rules and pass-and-play work fully offline.

How to play Briscola

Overview

Briscola is a traditional Italian trick-taking card game. This app uses the classic two-player rules with a 40-card Italian deck. The goal is to capture more card points than your opponent. There are 120 points in the deck; more than 60 wins, exactly 60 is a draw.

Players & deal

  • Two players sit opposite each other.
  • The 40-card deck is shuffled. Each player is dealt 3 cards.
  • The next card is turned face-up: that suit is the briscola (trump) for the whole hand. The rest of the deck sits on top of it as the draw pile.
  • The non-dealer (or the host in this app) leads the first trick.

The deck

Four suits — Bastoni (clubs), Coppe (cups), Denari (coins), Spade (swords) — each with ranks 1–7, Fante (jack), Cavallo (knight), Re (king).

Card points

Only five ranks score. The rest are worth 0. Total of all cards = 120.

CardPoints
Asso (Ace / 1)11
Tre (3)10
Re (King / 10)4
Cavallo (Knight / 9)3
Fante (Jack / 8)2
7, 6, 5, 4, 20

Strength order (within a suit)

From strongest to weakest: Asso → Tre → Re → Cavallo → Fante → 7 → 6 → 5 → 4 → 2. Note that the 3 beats everything except the Ace, even though the King is higher in “face” rank.

Playing a trick

  1. Players alternate. The leader plays any card from hand.
  2. In classic two-player Briscola there is no obligation to follow suit — the second player may play any card.
  3. The trick is won by: (1) the highest trump if any trump was played; otherwise (2) the highest card of the suit that was led. An off-suit non-trump never wins.
  4. The winner of the trick takes both cards into their captured pile and leads the next trick.
  5. While cards remain in the draw pile, each player draws one card after the trick — winner first, then the other player. The face-up briscola is drawn last.

End of the hand

  • When the draw pile is empty, play continues with the remaining cards in hand until none are left.
  • Add up the points in each player’s captured cards.
  • More than 60 points wins. Exactly 60 is a draw. (A common target in social play is “best of” several hands.)

Tips

  • Save trumps and high cards (Ace, 3) for when they can take valuable opponents’ points.
  • Leading a low card of a plain suit can force information about the opponent’s hand.
  • Remember what high cards have already been played — especially Aces and 3s of each suit.
  • The briscola under the deck is public knowledge; plan around that suit.

Nostr score events

After a match, the app can publish a single score for a username. Events are signed with a fixed app identity so anyone can verify they originated from Briscola — not from random posters. Offline, scores stay on this device until you publish.

Quick facts

Kind
31250
NIP
NIP-01 + NIP-33
Default relay
https://nostr.relay.hedwig.sh
App tag
briscola-score
App pubkey (hex)
79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798

What is stored

Content is intentionally minimal — only the player’s username and their score for that match (0–120 points), plus a schema version field. No hand history, no opponent name, no room code.

content (JSON)
{
  "v": 1,
  "username": "alice",
  "score": 72
}

How to verify origin

  1. Check event.kind matches the Briscola kind
  2. Check event.pubkey equals the app public key
  3. Check the app tag is present
  4. Validate the Nostr signature (NIP-01) against the app pubkey
  5. Parse content JSON and require v === 1

The private key lives only on the server. Clients call a signed-in server function to publish; they never hold the app secret. Filtering on the public key is enough to ignore forgeries that claim to be scores.

pubkey
79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798

Tags

tags
[
  [
    "d",
    "alice"
  ],
  [
    "app",
    "briscola-score"
  ],
  [
    "username",
    "alice"
  ],
  [
    "score",
    "72"
  ]
]
  • dNIP-33 identifier; lowercased username. One latest score per user.
  • appalways the app tag value briscola-score
  • username / scoreindexed copies for relay filters

Example event shape

event
{
  "kind": 31250,
  "pubkey": "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
  "created_at": 1710000000,
  "tags": [
    [
      "d",
      "alice"
    ],
    [
      "app",
      "briscola-score"
    ],
    [
      "username",
      "alice"
    ],
    [
      "score",
      "72"
    ]
  ],
  "content": "{\"v\":1,\"username\":\"alice\",\"score\":72}"
}

Relay filter (REQ)

REQ
[
  "REQ",
  "briscola-scores",
  {
    "kinds": [
      31250
    ],
    "authors": [
      "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"
    ],
    "#app": [
      "briscola-score"
    ],
    "limit": 50
  }
]

Default relay WebSocket: wss://nostr.relay.hedwig.sh

Multiplayer

Tables use WebRTC data channels (host-authoritative rules). Signaling uses short-lived room codes — ideal for playing with someone you trust. Pass-and-play and the rules docs work fully offline via the service worker cache.

Back to play · Live scores