Bitcoin Forum
April 19, 2024, 11:33:13 PM *
News: Latest Bitcoin Core release: 26.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Beginner's Guide to CoinJoin  (Read 359 times)
pawanjain (OP)
Hero Member
*****
Offline Offline

Activity: 2646
Merit: 713


Nothing lasts forever


View Profile
November 03, 2020, 05:48:13 PM
Last edit: May 16, 2023, 03:10:36 AM by pawanjain
Merited by ABCbits (2), DdmrDdmr (2), 1miau (2), Heisenberg_Hunter (2), mk4 (1), tranthidung (1), Husna QA (1), Coyster (1), webtricks (1)
 #1

Hello guys,
 
Lately, I came across  the word “CoinJoin” quite a few times and I wondered what it is. So I thought to do a little research to find out what it actually is and how it works. I read a few articles but was only able to understand the high level context of CoinJoin. So I decided to spend some time on it and understand it well enough to create a beginner’s guide so that any person who reads it knows what it is and how it works. I have tried to make this guide as simple as I can to make it beginner friendly.



Introduction


As we all know, a bitcoin transaction consumes one or more inputs and creates one or more outputs. These outputs are the UTXOs (Unspent Transaction Output) which becomes the input of the next transaction. A standard bitcoin transaction may spend many inputs to get enough value to make the intended payment and this often leads to creating ‘change’ output which goes back to the sender’s address as an unspent output. All of these are visible on the blockchain and any person can look into these transactions to find out the amount that was transferred from one address to another.
 
Bitcoin addresses are pseudonymous which means privacy can be compromised through reuse of these addresses. This is why it is advised to use a new address every time we make a new transaction. Over the years Blockchain analysis techniques have grown increasingly sophisticated and are capable of linking addresses to identities more efficiently. This is where “CoinJoin” provides a privacy efficient way of making transactions.
 
CoinJoin was first introduced by gmaxwell (Gregory Maxwell) in 2013 in his post “ CoinJoin: Bitcoin privacy for the real world “. CoinJoin doesn’t require any softfork because it does not require any changes to the bitcoin protocol.

What is CoinJoin ?


CoinJoin is a technique where multiple participants combine their coins into one large transaction consisting of multiple inputs and multiple outputs (including change outputs). Here, an observer cannot determine which output belongs to which input. This makes it difficult for anybody to determine which participant was making a particular transaction. CoinJoin can be applied many times and as many transactions can be grouped together to make it more privacy efficient.

People use Coin Join to protect their privacy and / or anonymity but the level of anonymity they get at the ends will depend on 2 main factors:

  1. How they mix their coin with Coin Join transaction (big or small anonymity set)
  2. How they use their received coin after the Coin Join transaction (coins post-mix)

  • The larger the anonymity set, the better
  • The less times you post-mix your coins, the better.
  • In case you decide to post-mix your coins, please only mix exactly the amount of UTXOs you want to spend from, not post-mix all UTXOs you get from Coin join transaction.
  • Ideally, use each post-mix UTXO for each of your sending transaction

Example



Here, the anonymity set is the size of the privacy group.  I could have explained more on the anonymity set but it will be too technical for a beginner friendly guide. The last 3 transactions are the change output from the 3 inputs. There is no way to determine which transactions from the anonymity set belongs to which input. The only thing an observer can know is that one of the output from the anonymity set is derived from one of the inputs thus increasing the privacy.
 
CoinJoin transactions

https://blockstream.info/tx/e4a789d16a24a6643dfee06e018ad27648b896daae6a3577ae0f4eddcc4d9174
https://blockstream.info/tx/ef329b3ed8e790f10f0b522346f1b3d9f1c9d45dfa5b918e92d6f0a25d91c7ce
https://blockstream.info/tx/f82206145413db5c1272d5609c88581c414815e36e400aee6410e0de9a2d46b5

 
How to get started ?

The only two production ready platforms are Wasabi wallet and Joinmarket.
Wasabi is an open-source, non-custodial, privacy-focused Bitcoin wallet for Desktop, that implements trustless CoinJoin.
JoinMarket is a CoinJoin implementation aimed at improving the privacy and fungibility of bitcoin transactions.

https://wasabiwallet.io/
https://github.com/JoinMarket-Org/joinmarket-clientserver

 
Tip

One input per bitcoin address would be efficient to use for a CoinJoin transaction as reusing the same address damages the privacy. You can consolidate all your small inputs to create one bigger input. LoyceV has created a beautiful thread for this.
[Oct 2020] Fees are low, use this opportunity to Consolidate your small inputs!
 
Sources & References

https://en.bitcoin.it/wiki/CoinJoin#:~:text=CoinJoin%20is%20a%20trustless%20method,paid%20which%20recipient%20or%20recipients.
https://academy.binance.com/en/articles/coin-mixing-and-coinjoins-explained
https://wasabiwallet.io/

 


Forgive me for any mistakes. Suggestions and feedback are welcome.


███████████████████████████
███████▄████████████▄██████
████████▄████████▄████████
███▀█████▀▄███▄▀█████▀███
█████▀█▀▄██▀▀▀██▄▀█▀█████
███████▄███████████▄███████
███████████████████████████
███████▀███████████▀███████
████▄██▄▀██▄▄▄██▀▄██▄████
████▄████▄▀███▀▄████▄████
██▄███▀▀█▀██████▀█▀███▄███
██▀█▀████████████████▀█▀███
███████████████████████████
.
.Duelbits.
..........UNLEASH..........
THE ULTIMATE
GAMING EXPERIENCE
DUELBITS
FANTASY
SPORTS
████▄▄█████▄▄
░▄████
███████████▄
▐███
███████████████▄
███
████████████████
███
████████████████▌
███
██████████████████
████████████████▀▀▀
███████████████▌
███████████████▌
████████████████
████████████████
████████████████
████▀▀███████▀▀
.
▬▬
VS
▬▬
████▄▄▄█████▄▄▄
░▄████████████████▄
▐██████████████████▄
████████████████████
████████████████████▌
█████████████████████
███████████████████
███████████████▌
███████████████▌
████████████████
████████████████
████████████████
████▀▀███████▀▀
/// PLAY FOR  FREE  ///
WIN FOR REAL
..PLAY NOW..
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1713569593
Hero Member
*
Offline Offline

Posts: 1713569593

View Profile Personal Message (Offline)

Ignore
1713569593
Reply with quote  #2

1713569593
Report to moderator
1713569593
Hero Member
*
Offline Offline

Posts: 1713569593

View Profile Personal Message (Offline)

Ignore
1713569593
Reply with quote  #2

1713569593
Report to moderator
pawanjain (OP)
Hero Member
*****
Offline Offline

Activity: 2646
Merit: 713


Nothing lasts forever


View Profile
November 03, 2020, 05:49:45 PM
Last edit: November 04, 2020, 02:26:08 PM by pawanjain
 #2

Honorable mentions :

tranthidung for
People use Coin Join to protect their privacy and / or anonymity but the level of anonymity they get at the ends will depend on 2 main factors:
  • How they mix their coin with Coin Join transaction (big or small anonymity set)
  • How they use their received coin after the Coin Join transaction (coins post-mix)

  • The larger the anonymity set, the better
  • The less times you post-mix your coins, the better.
  • In case you decide to post-mix your coins, please only mix exactly the amount of UTXOs you want to spend from, not post-mix all UTXOs you get from Coin join transaction.
  • Ideally, use each post-mix UTXO for each of your sending transaction

███████████████████████████
███████▄████████████▄██████
████████▄████████▄████████
███▀█████▀▄███▄▀█████▀███
█████▀█▀▄██▀▀▀██▄▀█▀█████
███████▄███████████▄███████
███████████████████████████
███████▀███████████▀███████
████▄██▄▀██▄▄▄██▀▄██▄████
████▄████▄▀███▀▄████▄████
██▄███▀▀█▀██████▀█▀███▄███
██▀█▀████████████████▀█▀███
███████████████████████████
.
.Duelbits.
..........UNLEASH..........
THE ULTIMATE
GAMING EXPERIENCE
DUELBITS
FANTASY
SPORTS
████▄▄█████▄▄
░▄████
███████████▄
▐███
███████████████▄
███
████████████████
███
████████████████▌
███
██████████████████
████████████████▀▀▀
███████████████▌
███████████████▌
████████████████
████████████████
████████████████
████▀▀███████▀▀
.
▬▬
VS
▬▬
████▄▄▄█████▄▄▄
░▄████████████████▄
▐██████████████████▄
████████████████████
████████████████████▌
█████████████████████
███████████████████
███████████████▌
███████████████▌
████████████████
████████████████
████████████████
████▀▀███████▀▀
/// PLAY FOR  FREE  ///
WIN FOR REAL
..PLAY NOW..
Charles-Tim
Legendary
*
Offline Offline

Activity: 1526
Merit: 4804



View Profile
November 03, 2020, 08:29:29 PM
 #3

I have read an article before about Joinmarket, it is also an open source, and it has a plugin for electrum wallet. Is this true?

I have seen many members of this forum like o-e-l-e-o and 20kevin20 commenting good about Wasabi wallet, so this wallet is a good wallet for CoinJoin purpose.

Also, how about making use of mixer, because mixers can also mix bitcoin transactions in a way to maintain high level of privacy. Chipmixer is good for this purpose.

.
HUGE
▄██████████▄▄
▄█████████████████▄
▄█████████████████████▄
▄███████████████████████▄
▄█████████████████████████▄
███████▌██▌▐██▐██▐████▄███
████▐██▐████▌██▌██▌██▌██
█████▀███▀███▀▐██▐██▐█████

▀█████████████████████████▀

▀███████████████████████▀

▀█████████████████████▀

▀█████████████████▀

▀██████████▀▀
█▀▀▀▀











█▄▄▄▄
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
.
CASINSPORTSBOOK
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀▀█











▄▄▄▄█
tranthidung
Legendary
*
Offline Offline

Activity: 2254
Merit: 3968


Farewell o_e_l_e_o


View Profile WWW
November 04, 2020, 01:48:39 AM
Merited by pawanjain (1)
 #4

People use Coin Join to protect their privacy and / or anonymity but the level of anonymity they get at the ends will depend on 2 main factors:
  • How they mix their coin with Coin Join transaction (big or small anonymity set)
  • How they use their received coin after the Coin Join transaction (coins post-mix)

  • The larger the anonymity set, the better
  • The less times you post-mix your coins, the better.
  • In case you decide to post-mix your coins, please only mix exactly the amount of UTXOs you want to spend from, not post-mix all UTXOs you get from Coin join transaction.
  • Ideally, use each post-mix UTXO for each of your sending transaction

Sources to read more (just my invitation)

▄▄███████▄▄
▄██████████████▄
▄██████████████████▄
▄████▀▀▀▀███▀▀▀▀█████▄
▄█████████████▄█▀████▄
███████████▄███████████
██████████▄█▀███████████
██████████▀████████████
▀█████▄█▀█████████████▀
▀████▄▄▄▄███▄▄▄▄████▀
▀██████████████████▀
▀███████████████▀
▀▀███████▀▀
.
 MΞTAWIN  THE FIRST WEB3 CASINO   
.
.. PLAY NOW ..
ABCbits
Legendary
*
Offline Offline

Activity: 2856
Merit: 7385


Crypto Swap Exchange


View Profile
November 04, 2020, 11:31:39 AM
Merited by tranthidung (1)
 #5

You should also research about legal concern of mixed coin/coinjoin. Some centralized exchange assume deposited Bitcoin from CoinJoin process is suspicious/malicious or forbid using Bitcoin (withdrawn from exchange) to CoinJoin service which are very ridiculous.

Few references:
https://docs.wasabiwallet.io/why-wasabi/LegalConcern.html
https://twitter.com/bittlecat/status/1207621591820951552

█▀▀▀











█▄▄▄
▀▀▀▀▀▀▀▀▀▀▀
e
▄▄▄▄▄▄▄▄▄▄▄
█████████████
████████████▄███
██▐███████▄█████▀
█████████▄████▀
███▐████▄███▀
████▐██████▀
█████▀█████
███████████▄
████████████▄
██▄█████▀█████▄
▄█████████▀█████▀
███████████▀██▀
████▀█████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
c.h.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀█











▄▄▄█
▄██████▄▄▄
█████████████▄▄
███████████████
███████████████
███████████████
███████████████
███░░█████████
███▌▐█████████
█████████████
███████████▀
██████████▀
████████▀
▀██▀▀
pawanjain (OP)
Hero Member
*****
Offline Offline

Activity: 2646
Merit: 713


Nothing lasts forever


View Profile
November 04, 2020, 02:39:04 PM
 #6

You should also research about legal concern of mixed coin/coinjoin. Some centralized exchange assume deposited Bitcoin from CoinJoin process is suspicious/malicious or forbid using Bitcoin (withdrawn from exchange) to CoinJoin service which are very ridiculous.

Few references:
https://docs.wasabiwallet.io/why-wasabi/LegalConcern.html
https://twitter.com/bittlecat/status/1207621591820951552
Thanks for the info I will surely check this out. Getting to know the legal concerns is definitely worth a read.  Smiley

But does it really matter ? I think the legal concerns would be the same for CoinJoin and Coinmixing. I remember reading a post where a particular exchange was bothered why it's user was sending his coins to a mixer after the withdrawal. It's definitely ridiculous for these exchanges to determine legal concerns on coins linked to mixing services. I know obfuscating the history of bitcoin addresses might lead to encouraging money laundering but don't people do that already with bitcoins and also with other currencies including fiat.

If this keeps on going then these central authorities will keep increasing their dominance on us eventually leading to damaging the decentralization part of bitcoin  Undecided

███████████████████████████
███████▄████████████▄██████
████████▄████████▄████████
███▀█████▀▄███▄▀█████▀███
█████▀█▀▄██▀▀▀██▄▀█▀█████
███████▄███████████▄███████
███████████████████████████
███████▀███████████▀███████
████▄██▄▀██▄▄▄██▀▄██▄████
████▄████▄▀███▀▄████▄████
██▄███▀▀█▀██████▀█▀███▄███
██▀█▀████████████████▀█▀███
███████████████████████████
.
.Duelbits.
..........UNLEASH..........
THE ULTIMATE
GAMING EXPERIENCE
DUELBITS
FANTASY
SPORTS
████▄▄█████▄▄
░▄████
███████████▄
▐███
███████████████▄
███
████████████████
███
████████████████▌
███
██████████████████
████████████████▀▀▀
███████████████▌
███████████████▌
████████████████
████████████████
████████████████
████▀▀███████▀▀
.
▬▬
VS
▬▬
████▄▄▄█████▄▄▄
░▄████████████████▄
▐██████████████████▄
████████████████████
████████████████████▌
█████████████████████
███████████████████
███████████████▌
███████████████▌
████████████████
████████████████
████████████████
████▀▀███████▀▀
/// PLAY FOR  FREE  ///
WIN FOR REAL
..PLAY NOW..
webtricks
Legendary
*
Offline Offline

Activity: 1918
Merit: 1728



View Profile
November 04, 2020, 03:15:31 PM
Merited by Halab (2), condoras (1), ABCbits (1)
 #7

Also, how about making use of mixer, because mixers can also mix bitcoin transactions in a way to maintain high level of privacy. Chipmixer is good for this purpose.

Coinjoin and mixer are very different from each other.

Mixer is a centralized service and you are trusting the third-party for privacy and hoping they won't log or leak your digital footprints like IP logs, addresses from which funds are sent, etc. That's why even though several mixers keep popping time-to-time, it is very difficult for us to trust them. Reputable mixers spent thousands to get hold of the market and whole industry is working on the trust factor.

Whereas, coinjoin as mentioned in the OP is a trustless mechanism. You are the one who's directly spending your UTXO and getting output back on your own bitcoin address in the same transaction.

However, Coinjoin although providing privacy don't hide you completely. It just makes you stand in the group of 50-100 and let the tracker guess which one is you. Moreover, if you make mistake in spending the output by either spending it with non-coinjoined UTXO or send that back to your already used address, the whole purpose is defeated. On the other side, mixer provides comparatively higher degree of anonymity for the world (except the mixer owner) especially using Chipmixer which provides you private keys of bitcoin moved before the bitcoins are sent for mixing.

So both have pros and cons.

..JAMBLER.io..Create Your Bitcoin Mixing
Business Now for   F R E E 
▄█████████████████████████████
█████████████████████████
████▀████████████████████
███▀█████▄█▀███▀▀▀██████
██▀█████▄█▄██████████████
██▄▄████▀▄▄▄▀▀▀▀▀▄▄██████
█████▄▄▄██████████▀▄████
█████▀▄█▄██████▀█▄█████
███████▀▄█▀█▄██▀█▄███████
█████████▄█▀▄█▀▄█████████
█████████████████████████
█████████████████████████
▀█████████████████████████████
█████████████████████████████████████████████████
.
      OUR      
PARTNERS

.
█████████████████████████████████████████████████
████▄
██
██
██
██
██
██
██
██
██
██
██
████▀
▄█████████████████████████████
████████▀▀█████▀▀████████
█████▀█████████████▀█████
████████████████████████
███████████████▄█████████
█████████████████████████
█████████████████████████
█████████████████████████
███████████████▀█████████
████████████████████████
█████▄█████████████▄█████
████████▄▄█████▄▄████████
▀█████████████████████████████
█████████████████████████████████████████████████
.
   INVEST   
BITCOIN

.
█████████████████████████████████████████████████
████▄
██
██
██
██
██
██
██
██
██
██
██
████▀
LeGaulois
Copper Member
Legendary
*
Offline Offline

Activity: 2870
Merit: 4088


Top Crypto Casino


View Profile
November 04, 2020, 05:55:09 PM
Last edit: November 04, 2020, 06:08:06 PM by LeGaulois
 #8

...


Using Coinjoin, the user also needs to rely on a 3rd party for privacy especially its server, and to not steal the BTC. Then depending on the 3rd party, the back end server can know which inputs/outputs are yours (i.e. Whirlpool) and probably more than that

Regardless of the fact that you need to trust that the protocol is implemented correctly.
Otherwise, an example of what could be done...https://github.com/kristovatlas/coinjoin-sudoku

The point with Coinjoin is the deniability since like you say we belong to a group of xx persons, so we could simply say "perhaps it's me but perhaps it's someone else too, guess it from 50 people"

█████████████████████████
████▐██▄█████████████████
████▐██████▄▄▄███████████
████▐████▄█████▄▄████████
████▐█████▀▀▀▀▀███▄██████
████▐███▀████████████████
████▐█████████▄█████▌████
████▐██▌█████▀██████▌████
████▐██████████▀████▌████
█████▀███▄█████▄███▀█████
███████▀█████████▀███████
██████████▀███▀██████████
█████████████████████████
.
BC.GAME
▄▄░░░▄▀▀▄████████
▄▄▄
██████████████
█████░░▄▄▄▄████████
▄▄▄▄▄▄▄▄▄██▄██████▄▄▄▄████
▄███▄█▄▄██████████▄████▄████
███████████████████████████▀███
▀████▄██▄██▄░░░░▄████████████
▀▀▀█████▄▄▄███████████▀██
███████████████████▀██
███████████████████▄██
▄███████████████████▄██
█████████████████████▀██
██████████████████████▄
.
..CASINO....SPORTS....RACING..
█░░░░░░█░░░░░░█
▀███▀░░▀███▀░░▀███▀
▀░▀░░░░▀░▀░░░░▀░▀
░░░░░░░░░░░░
▀██████████
░░░░░███░░░░
░░█░░░███▄█░░░
░░██▌░░███░▀░░██▌
░█░██░░███░░░█░██
░█▀▀▀█▌░███░░█▀▀▀█▌
▄█▄░░░██▄███▄█▄░░▄██▄
▄███▄
░░░░▀██▄▀


▄▄████▄▄
▄███▀▀███▄
██████████
▀███▄░▄██▀
▄▄████▄▄░▀█▀▄██▀▄▄████▄▄
▄███▀▀▀████▄▄██▀▄███▀▀███▄
███████▄▄▀▀████▄▄▀▀███████
▀███▄▄███▀░░░▀▀████▄▄▄███▀
▀▀████▀▀████████▀▀████▀▀
Chikito
Legendary
*
Offline Offline

Activity: 2366
Merit: 2052



View Profile WWW
November 05, 2020, 12:00:18 AM
 #9

I have seen many members of this forum like o-e-l-e-o and 20kevin20 commenting good about Wasabi wallet, so this wallet is a good wallet for CoinJoin purpose.
You should also try itself or make it test by using Testnet BTC and watch your coin mixed. or if you have free time, try also Samourai wallet, mixing using coin using Whirlpool.

.
.BLACKJACK ♠ FUN.
█████████
██████████████
████████████
█████████████████
████████████████▄▄
░█████████████▀░▀▀
██████████████████
░██████████████
████████████████
░██████████████
████████████
███████████████░██
██████████
CRYPTO CASINO &
SPORTS BETTING
▄▄███████▄▄
▄███████████████▄
███████████████████
█████████████████████
███████████████████████
█████████████████████████
█████████████████████████
█████████████████████████
███████████████████████
█████████████████████
███████████████████
▀███████████████▀
█████████
.
Saint-loup
Legendary
*
Offline Offline

Activity: 2590
Merit: 2346



View Profile
November 07, 2020, 09:17:58 PM
 #10

Also, how about making use of mixer, because mixers can also mix bitcoin transactions in a way to maintain high level of privacy. Chipmixer is good for this purpose.

Coinjoin and mixer are very different from each other.

Mixer is a centralized service and you are trusting the third-party for privacy and hoping they won't log or leak your digital footprints like IP logs, addresses from which funds are sent, etc. That's why even though several mixers keep popping time-to-time, it is very difficult for us to trust them. Reputable mixers spent thousands to get hold of the market and whole industry is working on the trust factor.

Whereas, coinjoin as mentioned in the OP is a trustless mechanism. You are the one who's directly spending your UTXO and getting output back on your own bitcoin address in the same transaction.

However, Coinjoin although providing privacy don't hide you completely. It just makes you stand in the group of 50-100 and let the tracker guess which one is you. Moreover, if you make mistake in spending the output by either spending it with non-coinjoined UTXO or send that back to your already used address, the whole purpose is defeated. On the other side, mixer provides comparatively higher degree of anonymity for the world (except the mixer owner) especially using Chipmixer which provides you private keys of bitcoin moved before the bitcoins are sent for mixing.

So both have pros and cons.
Your post is a little bit OT IMO, I don't really understand why you're promoting this paid service here?
Tumblers have a big disadvantage : they force you to mix your coins with dirty money, and to potentially get coins from criminals.

██
██
██
██
██
██
██
██
██
██
██
██
██
... LIVECASINO.io    Play Live Games with up to 20% cashback!...██
██
██
██
██
██
██
██
██
██
██
██
██
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!