Stable Diffusion 1.5 18,251 (2022) is the small classic: a 512 x 512 latent diffusion model with a CLIP 34,379 text encoder (Latent Diffusion and Text Conditioning) and about 2 GB of half-precision weights. SDXL 1.0 1,113 (July 2023) works at 1024 x 1024 with two text encoders and a 6.9 GB checkpoint. Stable Diffusion 3.5 (October 2024) replaces the U-Net with a diffusion transformer. Each came with a different license:
| Model | License | Commercial use |
|---|---|---|
| SD 1.5 | CreativeML OpenRAIL-M | Yes, with use restrictions |
| SDXL 1.0 base | CreativeML OpenRAIL++-M | Yes, with use restrictions |
| SDXL Turbo | Stability AI 18,251 Non-Commercial Research Community | No (paid membership) |
| SD 3.5 Large, Medium | Stability AI Community License | Free under $1M yearly revenue |
| FLUX.1 57,408 [schnell], FLUX.2 [klein] 4B | Apache 2.0 | Yes |
| FLUX.1 [dev], FLUX.2 [dev], [klein] 9B | FLUX Non-Commercial License | Outputs yes, weights no |
The RAIL ("Responsible AI License") licenses are permissive but list forbidden uses that travel with the model. Two traps: SDXL's model card calls it "intended for research purposes only" although its license allows commercial use, and the Community License counts your organization's revenue, not the project's. SD on the CPU uses SD 1.5, whose terms do not change with the publisher's size.
<!doctype html>
<style>
body { margin: 0; padding: 8px; background: #fafaf7; font: 11px system-ui, sans-serif; color: #263238; }
svg { width: 100%; max-width: 600px; display: block; }
</style>
<script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
<p>Organization revenue: <select id="rev"><option value="small">under $1M a year</option><option value="big">over $1M a year</option></select>
· <label><input type="checkbox" id="weights"> we would run the weights in a paid product</label></p>
<svg viewBox="0 0 600 260" font-size="11"></svg>
<p id="note">The Community License counts your organization's revenue, not the project's. RAIL licenses carry use restrictions with the model.</p>
<script>
// size: approximate download (GB); rule: can BookNest use it commercially?
const MODELS = [
{ name: 'SD 1.5', lic: 'CreativeML OpenRAIL-M', gb: 2.1, rule: () => 'yes*' },
{ name: 'SDXL 1.0 base', lic: 'CreativeML OpenRAIL++-M', gb: 6.9, rule: () => 'yes*' },
{ name: 'SDXL Turbo', lic: 'Stability Non-Commercial', gb: 6.9, rule: () => 'no' },
{ name: 'SD 3.5 Large / Medium', lic: 'Stability Community License', gb: 16, rule: s => s.big ? 'no' : 'yes' },
{ name: 'FLUX.1 [schnell]', lic: 'Apache 2.0', gb: 23.8, rule: () => 'yes' },
{ name: 'FLUX.2 [klein] 4B', lic: 'Apache 2.0', gb: 7.8, rule: () => 'yes' },
{ name: 'FLUX.1 [dev] / FLUX.2 [dev]', lic: 'FLUX Non-Commercial', gb: 23.8, rule: s => s.weights ? 'no' : 'outputs only' },
];
const colors = { 'yes': '#3f7d3a', 'yes*': '#7cb342', 'outputs only': '#e09a10', 'no': '#b5452f' };
const svg = d3.select('svg');
const y = d3.scaleBand(MODELS.map(m => m.name), [10, 220]).padding(0.25), x = d3.scaleLinear([0, 25], [170, 440]);
svg.append('g').attr('transform', 'translate(0,220)').call(d3.axisBottom(x).ticks(5).tickFormat(d => `${d} GB`));
const row = svg.selectAll('g.m').data(MODELS).join('g').attr('class', 'm').attr('transform', m => `translate(0,${y(m.name)})`);
row.append('text').attr('x', 164).attr('y', y.bandwidth() / 2).attr('dy', '0.35em').attr('text-anchor', 'end').text(m => m.name);
const bars = row.append('rect').attr('x', 170).attr('height', y.bandwidth()).attr('width', m => x(m.gb) - 170);
const verdict = row.append('text').attr('x', 448).attr('y', y.bandwidth() / 2 - 4).attr('font-weight', 'bold');
row.append('text').attr('x', 448).attr('y', y.bandwidth() / 2 + 9).attr('fill', '#78909c').text(m => m.lic);
svg.append('text').attr('x', 170).attr('y', 250).text('* commercial use allowed, with the licence\'s use restrictions');
function draw() {
const s = { big: document.getElementById('rev').value === 'big', weights: document.getElementById('weights').checked };
bars.transition().attr('fill', m => colors[m.rule(s)]);
verdict.attr('fill', m => colors[m.rule(s)]).text(m => ({ 'yes': 'commercial: yes', 'yes*': 'commercial: yes*', 'no': 'commercial: no', 'outputs only': 'outputs yes, weights no' })[m.rule(s)]);
}
document.querySelectorAll('select, input').forEach(e => e.addEventListener('input', draw));
draw();
</script>