sepia-cli 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yiğit Erdoğan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,204 @@
1
+ Metadata-Version: 2.4
2
+ Name: sepia-cli
3
+ Version: 0.1.0
4
+ Summary: Describe a picture and watch it appear as colored text in a second terminal window.
5
+ Keywords: ascii-art,cli,terminal,claude,image-generation,flux
6
+ Author: Yiğit Erdoğan
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Environment :: Console
11
+ Classifier: Operating System :: MacOS
12
+ Classifier: Operating System :: Microsoft :: Windows
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Topic :: Artistic Software
17
+ Classifier: Topic :: Multimedia :: Graphics
18
+ Requires-Dist: anthropic>=2.3.0
19
+ Requires-Dist: numpy>=2.5.4
20
+ Requires-Dist: pillow>=13.0.0
21
+ Requires-Dist: platformdirs>=4.14.0
22
+ Requires-Dist: prompt-toolkit>=3.0.53
23
+ Requires-Dist: pydantic>=2.14.1
24
+ Requires-Dist: python-dotenv>=1.2.4
25
+ Requires-Dist: rich>=15.0.0
26
+ Requires-Dist: torch>=2.14.1 ; extra == 'local'
27
+ Requires-Dist: diffusers>=0.42.1 ; extra == 'local'
28
+ Requires-Dist: transformers>=4.57 ; extra == 'local'
29
+ Requires-Dist: accelerate>=1.10 ; extra == 'local'
30
+ Requires-Dist: bitsandbytes>=0.50.2 ; sys_platform != 'darwin' and extra == 'local'
31
+ Requires-Python: >=3.12
32
+ Project-URL: Homepage, https://github.com/Yigtwxx/sepia
33
+ Project-URL: Repository, https://github.com/Yigtwxx/sepia
34
+ Project-URL: Issues, https://github.com/Yigtwxx/sepia/issues
35
+ Provides-Extra: local
36
+ Description-Content-Type: text/markdown
37
+
38
+ # sepia
39
+
40
+ Type a short request in your terminal and get a photograph painted in colored text characters in a second terminal window.
41
+
42
+ <!-- demo gif -->
43
+
44
+ ```text
45
+ › waterfall
46
+ ⏺ Painting a tall waterfall in a mossy gorge.
47
+ pollinations · 6.2s
48
+ › mountains
49
+ ⏺ Adding snowy mountains behind the waterfall.
50
+ pollinations · 5.8s
51
+ ```
52
+
53
+ Follow-up requests build on the same picture: "mountains" after "waterfall" gives the same waterfall with mountains behind it. `/new` starts over. sepia only makes pictures; it is not a chat assistant.
54
+
55
+ ## How it works
56
+
57
+ ```text
58
+ prompt window viewer window
59
+ ------------- -------------
60
+ "mountains" + earlier requests
61
+ |
62
+ v
63
+ Claude (art director) -> English photo prompt, edit or new, one-line reply
64
+ |
65
+ v
66
+ Pollinations web API ---- fails or rate limited ----> FLUX.2 [klein] 4B on your GPU
67
+ | |
68
+ +------------------------> PNG <-----------------------+
69
+ |
70
+ +--- path over a loopback socket ---> photo -> colored characters
71
+ ```
72
+
73
+ 1. **Direct.** Claude (`claude-haiku-5-5` at low effort by default) turns the request and the scene so far into a detailed English photo prompt written for symbol rendering: one clear subject, strong light, saturated color, no text. It also decides whether the request edits the current picture or starts a new one, and writes a one-sentence reply in the language you typed in. The reply comes back as structured output (JSON with a fixed schema).
74
+ 2. **Paint.** The prompt goes to [Pollinations](https://pollinations.ai) first. If the API fails or rate limits, sepia paints the picture locally with [FLUX.2 [klein] 4B](https://huggingface.co/black-forest-labs/FLUX.2-klein-4B) (Apache 2.0), if you installed the local extra. The picture is painted at the viewer window's aspect ratio.
75
+ 3. **Show.** The picture is saved as a PNG, and the viewer window is told where it is. The viewer stretches contrast, boosts saturation, crops the picture to the window, and draws every cell as one character whose density matches the brightness, in 24-bit color where the terminal supports it (256 colors otherwise). Resizing the window redraws the picture without new API calls.
76
+
77
+ The two windows are two processes that talk over an authenticated loopback socket (see [SECURITY.md](SECURITY.md)).
78
+
79
+ ## Install
80
+
81
+ You need Windows 10/11 or macOS, [uv](https://docs.astral.sh/uv/), and an [Anthropic API key](https://console.anthropic.com/). uv provides Python 3.12 if you do not have it.
82
+
83
+ **API painting only** (small install, no GPU needed):
84
+
85
+ ```bash
86
+ uv tool install sepia-cli
87
+ ```
88
+
89
+ **With the local fallback model** (about 3 GB of packages plus a 16 GB model download):
90
+
91
+ ```bash
92
+ # macOS (Apple Silicon)
93
+ uv tool install "sepia-cli[local]"
94
+
95
+ # Windows: CUDA builds of torch are not on PyPI, so point uv at the PyTorch index
96
+ uv tool install "sepia-cli[local]" --index https://download.pytorch.org/whl/cu130 --index-strategy unsafe-best-match
97
+ ```
98
+
99
+ Then download the model once:
100
+
101
+ ```bash
102
+ sepia --download
103
+ ```
104
+
105
+ ## Usage
106
+
107
+ ```bash
108
+ sepia
109
+ ```
110
+
111
+ On the first run sepia asks for your Anthropic API key (hidden input) and saves it to the user config folder. The first request opens the viewer window; keep it next to the prompt window.
112
+
113
+ | Command | What it does |
114
+ | --- | --- |
115
+ | `/new` | Start a fresh picture. The next request does not build on the old one. |
116
+ | `/style [ink\|fill]` | `ink` colors the characters on the terminal's own background (made for dark backgrounds); `fill` also paints each cell's background, which works on any theme. Without an argument it switches to the other style. |
117
+ | `/charset [classic\|symbols]` | `classic` uses 31 density levels of the ASCII-art alphabet (letters, digits, punctuation); `symbols` uses punctuation only. Without an argument it switches to the other set. |
118
+ | `/help` | List the commands. |
119
+ | `/exit` | Close sepia and the viewer window. `/quit`, `/q` and Ctrl+D do the same. |
120
+
121
+ Up and down arrows walk the request history, and typing `/` completes commands. The bottom bar shows the model, the current style and charset, and whether the viewer window is connected (`●`) or not (`○`). If you close the viewer, the next request opens it again.
122
+
123
+ Command-line flags:
124
+
125
+ | Flag | What it does |
126
+ | --- | --- |
127
+ | `--download` | Download the local model (about 16 GB) from Hugging Face. Needs `sepia-cli[local]`. |
128
+ | `--version` | Print the version. |
129
+ | `--help` | Print usage. |
130
+
131
+ The interface speaks English and Turkish. It follows the system language unless `SEPIA_LANG` is set.
132
+
133
+ ## Configuration
134
+
135
+ sepia reads settings from the environment, then from `.env` in the current directory, then from `.env` in the user config folder. A value that is already set is never overridden by a later source. See [.env.example](.env.example).
136
+
137
+ | Variable | Default | Meaning |
138
+ | --- | --- | --- |
139
+ | `ANTHROPIC_API_KEY` | none | Required. Asked for on the first run if missing and saved to the user config `.env`. |
140
+ | `POLLINATIONS_KEY` | none | Optional free key from [enter.pollinations.ai](https://enter.pollinations.ai). Uses the keyed endpoint with `flux.2-klein-4b` and no logo. |
141
+ | `SEPIA_MODEL` | `claude-haiku-5-5` | The art director model. `claude-sonnet-5-5` writes richer prompts at a higher price. |
142
+ | `SEPIA_EFFORT` | `low` | Claude effort: `low`, `medium`, `high`, `xhigh` or `max`. |
143
+ | `SEPIA_STYLE` | `ink` | Starting style: `ink` or `fill`. |
144
+ | `SEPIA_CHARSET` | `classic` | Starting character set: `classic` or `symbols`. |
145
+ | `SEPIA_IMAGE_MODEL` | `black-forest-labs/FLUX.2-klein-4B` | Hugging Face id of the local model. |
146
+ | `SEPIA_LANG` | system language | Interface language: `en` or `tr`. Set it in the shell environment; it is read before the `.env` files load. |
147
+
148
+ An invalid value for `SEPIA_EFFORT`, `SEPIA_STYLE` or `SEPIA_CHARSET` stops sepia at startup.
149
+
150
+ The user config folder is `%LOCALAPPDATA%\sepia` on Windows and `~/Library/Application Support/sepia` on macOS. It holds the key file, the request history, and one folder per session with that session's pictures (`01.png`, `02.png`, ...). The newest 10 session folders are kept.
151
+
152
+ ## Painting backends
153
+
154
+ | Backend | When it runs | Notes |
155
+ | --- | --- | --- |
156
+ | Pollinations, keyed (`gen.pollinations.ai`) | First, when `POLLINATIONS_KEY` is set | `flux.2-klein-4b`, no logo. |
157
+ | Pollinations, keyless (`image.pollinations.ai`) | First without a key; second with a key | About one picture per 15 seconds, adds a small logo. Requests are sent with `private=true`. |
158
+ | FLUX.2 [klein] 4B, local | When the API fails or rate limits | Needs `sepia-cli[local]` and `sepia --download`. |
159
+
160
+ After a rate-limit or out-of-credit answer (HTTP 429 or 402), sepia skips that endpoint for 120 seconds instead of retrying it on every picture.
161
+
162
+ The local model runs on CUDA, then Apple Silicon (MPS), then CPU, whichever is found first:
163
+
164
+ - **CUDA:** the transformer and text encoder load in 4-bit (bitsandbytes nf4), about 5 GB of VRAM. On an RTX 4070 laptop GPU a 768x512 picture takes about 3 seconds.
165
+ - **MPS:** bf16 weights without quantization, so it needs more memory than the CUDA path.
166
+ - **CPU:** float32. It works, but slowly.
167
+
168
+ The model loads on the first local picture, so that picture takes longer. Edits differ by backend: the local model repaints using the previous picture as a reference, while the API cannot see the previous picture and repaints from the full prompt with the scene's fixed seed, which keeps the composition close.
169
+
170
+ ## Cost
171
+
172
+ | Part | Cost |
173
+ | --- | --- |
174
+ | Claude Haiku as art director | About $0.0003 per request with the default model and effort |
175
+ | Pollinations | Free (keyless, or with the free key) |
176
+ | Local model | Free, runs on your hardware |
177
+
178
+ `SEPIA_MODEL=claude-sonnet-5-5` or a higher `SEPIA_EFFORT` costs more per request.
179
+
180
+ ## Platform notes
181
+
182
+ **Windows.** The viewer opens as a new Windows Terminal window in focus mode, so there is no tab bar or title bar. It uses a `sepia` profile (6 pt Cascadia Mono, black background, no padding) that sepia writes as a Windows Terminal fragment to `%LOCALAPPDATA%\Microsoft\Windows Terminal\Fragments\sepia\sepia.json`. Your own `settings.json` is not touched; delete that folder to remove the profile. The small font fits several times more cells into the window, which gives the picture more detail. Without Windows Terminal, the viewer falls back to a plain console window.
183
+
184
+ **macOS.** The viewer opens in a new Terminal.app window through `osascript`. The first time, macOS asks whether your terminal may control Terminal.app (Automation permission); allow it. Terminal.app cannot hide its title bar. Press ⌘- in the viewer window to shrink the font: the picture redraws with more cells and more detail.
185
+
186
+ **Linux.** Not supported. The viewer window cannot be opened there.
187
+
188
+ ## Privacy
189
+
190
+ What leaves your machine:
191
+
192
+ - **To Anthropic:** your request, the earlier requests of the current scene, and the last generated prompt.
193
+ - **To Pollinations:** the generated English prompt, the picture size and the seed. Your original request is not sent. Nothing goes to Pollinations when the picture is painted locally.
194
+ - **To Hugging Face:** only the model download when you run `sepia --download`.
195
+
196
+ Pictures, the request history and the API key file stay in the user config folder on your machine. sepia has no telemetry of its own.
197
+
198
+ ## Development
199
+
200
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the setup on Windows and macOS, the checks, and the commit and test conventions. The design is described in [docs/superpowers/specs/2026-10-28-sepia-design.md](docs/superpowers/specs/2026-10-28-sepia-design.md), and releases in [docs/releasing.md](docs/releasing.md).
201
+
202
+ ## License
203
+
204
+ [MIT](LICENSE). The optional local model, FLUX.2 [klein] 4B, is published by Black Forest Labs under Apache 2.0 and is downloaded separately from Hugging Face.
@@ -0,0 +1,167 @@
1
+ # sepia
2
+
3
+ Type a short request in your terminal and get a photograph painted in colored text characters in a second terminal window.
4
+
5
+ <!-- demo gif -->
6
+
7
+ ```text
8
+ › waterfall
9
+ ⏺ Painting a tall waterfall in a mossy gorge.
10
+ pollinations · 6.2s
11
+ › mountains
12
+ ⏺ Adding snowy mountains behind the waterfall.
13
+ pollinations · 5.8s
14
+ ```
15
+
16
+ Follow-up requests build on the same picture: "mountains" after "waterfall" gives the same waterfall with mountains behind it. `/new` starts over. sepia only makes pictures; it is not a chat assistant.
17
+
18
+ ## How it works
19
+
20
+ ```text
21
+ prompt window viewer window
22
+ ------------- -------------
23
+ "mountains" + earlier requests
24
+ |
25
+ v
26
+ Claude (art director) -> English photo prompt, edit or new, one-line reply
27
+ |
28
+ v
29
+ Pollinations web API ---- fails or rate limited ----> FLUX.2 [klein] 4B on your GPU
30
+ | |
31
+ +------------------------> PNG <-----------------------+
32
+ |
33
+ +--- path over a loopback socket ---> photo -> colored characters
34
+ ```
35
+
36
+ 1. **Direct.** Claude (`claude-haiku-5-5` at low effort by default) turns the request and the scene so far into a detailed English photo prompt written for symbol rendering: one clear subject, strong light, saturated color, no text. It also decides whether the request edits the current picture or starts a new one, and writes a one-sentence reply in the language you typed in. The reply comes back as structured output (JSON with a fixed schema).
37
+ 2. **Paint.** The prompt goes to [Pollinations](https://pollinations.ai) first. If the API fails or rate limits, sepia paints the picture locally with [FLUX.2 [klein] 4B](https://huggingface.co/black-forest-labs/FLUX.2-klein-4B) (Apache 2.0), if you installed the local extra. The picture is painted at the viewer window's aspect ratio.
38
+ 3. **Show.** The picture is saved as a PNG, and the viewer window is told where it is. The viewer stretches contrast, boosts saturation, crops the picture to the window, and draws every cell as one character whose density matches the brightness, in 24-bit color where the terminal supports it (256 colors otherwise). Resizing the window redraws the picture without new API calls.
39
+
40
+ The two windows are two processes that talk over an authenticated loopback socket (see [SECURITY.md](SECURITY.md)).
41
+
42
+ ## Install
43
+
44
+ You need Windows 10/11 or macOS, [uv](https://docs.astral.sh/uv/), and an [Anthropic API key](https://console.anthropic.com/). uv provides Python 3.12 if you do not have it.
45
+
46
+ **API painting only** (small install, no GPU needed):
47
+
48
+ ```bash
49
+ uv tool install sepia-cli
50
+ ```
51
+
52
+ **With the local fallback model** (about 3 GB of packages plus a 16 GB model download):
53
+
54
+ ```bash
55
+ # macOS (Apple Silicon)
56
+ uv tool install "sepia-cli[local]"
57
+
58
+ # Windows: CUDA builds of torch are not on PyPI, so point uv at the PyTorch index
59
+ uv tool install "sepia-cli[local]" --index https://download.pytorch.org/whl/cu130 --index-strategy unsafe-best-match
60
+ ```
61
+
62
+ Then download the model once:
63
+
64
+ ```bash
65
+ sepia --download
66
+ ```
67
+
68
+ ## Usage
69
+
70
+ ```bash
71
+ sepia
72
+ ```
73
+
74
+ On the first run sepia asks for your Anthropic API key (hidden input) and saves it to the user config folder. The first request opens the viewer window; keep it next to the prompt window.
75
+
76
+ | Command | What it does |
77
+ | --- | --- |
78
+ | `/new` | Start a fresh picture. The next request does not build on the old one. |
79
+ | `/style [ink\|fill]` | `ink` colors the characters on the terminal's own background (made for dark backgrounds); `fill` also paints each cell's background, which works on any theme. Without an argument it switches to the other style. |
80
+ | `/charset [classic\|symbols]` | `classic` uses 31 density levels of the ASCII-art alphabet (letters, digits, punctuation); `symbols` uses punctuation only. Without an argument it switches to the other set. |
81
+ | `/help` | List the commands. |
82
+ | `/exit` | Close sepia and the viewer window. `/quit`, `/q` and Ctrl+D do the same. |
83
+
84
+ Up and down arrows walk the request history, and typing `/` completes commands. The bottom bar shows the model, the current style and charset, and whether the viewer window is connected (`●`) or not (`○`). If you close the viewer, the next request opens it again.
85
+
86
+ Command-line flags:
87
+
88
+ | Flag | What it does |
89
+ | --- | --- |
90
+ | `--download` | Download the local model (about 16 GB) from Hugging Face. Needs `sepia-cli[local]`. |
91
+ | `--version` | Print the version. |
92
+ | `--help` | Print usage. |
93
+
94
+ The interface speaks English and Turkish. It follows the system language unless `SEPIA_LANG` is set.
95
+
96
+ ## Configuration
97
+
98
+ sepia reads settings from the environment, then from `.env` in the current directory, then from `.env` in the user config folder. A value that is already set is never overridden by a later source. See [.env.example](.env.example).
99
+
100
+ | Variable | Default | Meaning |
101
+ | --- | --- | --- |
102
+ | `ANTHROPIC_API_KEY` | none | Required. Asked for on the first run if missing and saved to the user config `.env`. |
103
+ | `POLLINATIONS_KEY` | none | Optional free key from [enter.pollinations.ai](https://enter.pollinations.ai). Uses the keyed endpoint with `flux.2-klein-4b` and no logo. |
104
+ | `SEPIA_MODEL` | `claude-haiku-5-5` | The art director model. `claude-sonnet-5-5` writes richer prompts at a higher price. |
105
+ | `SEPIA_EFFORT` | `low` | Claude effort: `low`, `medium`, `high`, `xhigh` or `max`. |
106
+ | `SEPIA_STYLE` | `ink` | Starting style: `ink` or `fill`. |
107
+ | `SEPIA_CHARSET` | `classic` | Starting character set: `classic` or `symbols`. |
108
+ | `SEPIA_IMAGE_MODEL` | `black-forest-labs/FLUX.2-klein-4B` | Hugging Face id of the local model. |
109
+ | `SEPIA_LANG` | system language | Interface language: `en` or `tr`. Set it in the shell environment; it is read before the `.env` files load. |
110
+
111
+ An invalid value for `SEPIA_EFFORT`, `SEPIA_STYLE` or `SEPIA_CHARSET` stops sepia at startup.
112
+
113
+ The user config folder is `%LOCALAPPDATA%\sepia` on Windows and `~/Library/Application Support/sepia` on macOS. It holds the key file, the request history, and one folder per session with that session's pictures (`01.png`, `02.png`, ...). The newest 10 session folders are kept.
114
+
115
+ ## Painting backends
116
+
117
+ | Backend | When it runs | Notes |
118
+ | --- | --- | --- |
119
+ | Pollinations, keyed (`gen.pollinations.ai`) | First, when `POLLINATIONS_KEY` is set | `flux.2-klein-4b`, no logo. |
120
+ | Pollinations, keyless (`image.pollinations.ai`) | First without a key; second with a key | About one picture per 15 seconds, adds a small logo. Requests are sent with `private=true`. |
121
+ | FLUX.2 [klein] 4B, local | When the API fails or rate limits | Needs `sepia-cli[local]` and `sepia --download`. |
122
+
123
+ After a rate-limit or out-of-credit answer (HTTP 429 or 402), sepia skips that endpoint for 120 seconds instead of retrying it on every picture.
124
+
125
+ The local model runs on CUDA, then Apple Silicon (MPS), then CPU, whichever is found first:
126
+
127
+ - **CUDA:** the transformer and text encoder load in 4-bit (bitsandbytes nf4), about 5 GB of VRAM. On an RTX 4070 laptop GPU a 768x512 picture takes about 3 seconds.
128
+ - **MPS:** bf16 weights without quantization, so it needs more memory than the CUDA path.
129
+ - **CPU:** float32. It works, but slowly.
130
+
131
+ The model loads on the first local picture, so that picture takes longer. Edits differ by backend: the local model repaints using the previous picture as a reference, while the API cannot see the previous picture and repaints from the full prompt with the scene's fixed seed, which keeps the composition close.
132
+
133
+ ## Cost
134
+
135
+ | Part | Cost |
136
+ | --- | --- |
137
+ | Claude Haiku as art director | About $0.0003 per request with the default model and effort |
138
+ | Pollinations | Free (keyless, or with the free key) |
139
+ | Local model | Free, runs on your hardware |
140
+
141
+ `SEPIA_MODEL=claude-sonnet-5-5` or a higher `SEPIA_EFFORT` costs more per request.
142
+
143
+ ## Platform notes
144
+
145
+ **Windows.** The viewer opens as a new Windows Terminal window in focus mode, so there is no tab bar or title bar. It uses a `sepia` profile (6 pt Cascadia Mono, black background, no padding) that sepia writes as a Windows Terminal fragment to `%LOCALAPPDATA%\Microsoft\Windows Terminal\Fragments\sepia\sepia.json`. Your own `settings.json` is not touched; delete that folder to remove the profile. The small font fits several times more cells into the window, which gives the picture more detail. Without Windows Terminal, the viewer falls back to a plain console window.
146
+
147
+ **macOS.** The viewer opens in a new Terminal.app window through `osascript`. The first time, macOS asks whether your terminal may control Terminal.app (Automation permission); allow it. Terminal.app cannot hide its title bar. Press ⌘- in the viewer window to shrink the font: the picture redraws with more cells and more detail.
148
+
149
+ **Linux.** Not supported. The viewer window cannot be opened there.
150
+
151
+ ## Privacy
152
+
153
+ What leaves your machine:
154
+
155
+ - **To Anthropic:** your request, the earlier requests of the current scene, and the last generated prompt.
156
+ - **To Pollinations:** the generated English prompt, the picture size and the seed. Your original request is not sent. Nothing goes to Pollinations when the picture is painted locally.
157
+ - **To Hugging Face:** only the model download when you run `sepia --download`.
158
+
159
+ Pictures, the request history and the API key file stay in the user config folder on your machine. sepia has no telemetry of its own.
160
+
161
+ ## Development
162
+
163
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the setup on Windows and macOS, the checks, and the commit and test conventions. The design is described in [docs/superpowers/specs/2026-10-28-sepia-design.md](docs/superpowers/specs/2026-10-28-sepia-design.md), and releases in [docs/releasing.md](docs/releasing.md).
164
+
165
+ ## License
166
+
167
+ [MIT](LICENSE). The optional local model, FLUX.2 [klein] 4B, is published by Black Forest Labs under Apache 2.0 and is downloaded separately from Hugging Face.
@@ -0,0 +1,128 @@
1
+ [project]
2
+ name = "sepia-cli"
3
+ version = "0.1.0"
4
+ description = "Describe a picture and watch it appear as colored text in a second terminal window."
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ license-files = ["LICENSE"]
8
+ requires-python = ">=3.12"
9
+ keywords = [
10
+ "ascii-art",
11
+ "cli",
12
+ "terminal",
13
+ "claude",
14
+ "image-generation",
15
+ "flux",
16
+ ]
17
+ classifiers = [
18
+ "Development Status :: 3 - Alpha",
19
+ "Environment :: Console",
20
+ "Operating System :: MacOS",
21
+ "Operating System :: Microsoft :: Windows",
22
+ "Programming Language :: Python :: 3",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Programming Language :: Python :: 3.13",
25
+ "Topic :: Artistic Software",
26
+ "Topic :: Multimedia :: Graphics",
27
+ ]
28
+ dependencies = [
29
+ "anthropic>=2.3.0",
30
+ "numpy>=2.5.4",
31
+ "pillow>=13.0.0",
32
+ "platformdirs>=4.14.0",
33
+ "prompt-toolkit>=3.0.53",
34
+ "pydantic>=2.14.1",
35
+ "python-dotenv>=1.2.4",
36
+ "rich>=15.0.0",
37
+ ]
38
+
39
+ [[project.authors]]
40
+ name = "Yiğit Erdoğan"
41
+
42
+ [project.optional-dependencies]
43
+ local = [
44
+ "torch>=2.14.1",
45
+ "diffusers>=0.42.1",
46
+ "transformers>=4.57",
47
+ "accelerate>=1.10",
48
+ "bitsandbytes>=0.50.2; sys_platform != 'darwin'",
49
+ ]
50
+
51
+ [project.urls]
52
+ Homepage = "https://github.com/Yigtwxx/sepia"
53
+ Repository = "https://github.com/Yigtwxx/sepia"
54
+ Issues = "https://github.com/Yigtwxx/sepia/issues"
55
+
56
+ [project.scripts]
57
+ sepia = "sepia.cli:main"
58
+
59
+ [build-system]
60
+ requires = ["uv_build>=0.12.1,<0.13.0"]
61
+ build-backend = "uv_build"
62
+
63
+ [tool.uv.build-backend]
64
+ module-name = "sepia"
65
+
66
+ [[tool.uv.sources.torch]]
67
+ index = "pytorch-cuda"
68
+ marker = "sys_platform != 'darwin'"
69
+
70
+ [[tool.uv.index]]
71
+ name = "pytorch-cuda"
72
+ url = "https://download.pytorch.org/whl/cu130"
73
+ explicit = true
74
+
75
+ [tool.ruff]
76
+ line-length = 88
77
+ target-version = "py312"
78
+
79
+ [tool.ruff.lint]
80
+ select = [
81
+ "E",
82
+ "F",
83
+ "W",
84
+ "I",
85
+ "UP",
86
+ "B",
87
+ "SIM",
88
+ "ANN",
89
+ "RUF",
90
+ ]
91
+
92
+ [tool.ruff.lint.per-file-ignores]
93
+ "tests/**" = ["ANN"]
94
+ "src/sepia/ui.py" = ["RUF001"]
95
+
96
+ [tool.mypy]
97
+ python_version = "3.12"
98
+ strict = true
99
+ files = ["src"]
100
+
101
+ [[tool.mypy.overrides]]
102
+ module = [
103
+ "diffusers",
104
+ "diffusers.*",
105
+ ]
106
+ follow_imports = "skip"
107
+ ignore_missing_imports = true
108
+
109
+ [[tool.mypy.overrides]]
110
+ module = [
111
+ "torch",
112
+ "torch.*",
113
+ "huggingface_hub",
114
+ "huggingface_hub.*",
115
+ ]
116
+ ignore_missing_imports = true
117
+
118
+ [tool.pytest.ini_options]
119
+ testpaths = ["tests"]
120
+ addopts = "-q"
121
+ filterwarnings = ["error::pytest.PytestUnhandledThreadExceptionWarning"]
122
+
123
+ [dependency-groups]
124
+ dev = [
125
+ "mypy>=2.4.1",
126
+ "pytest>=9.2.0",
127
+ "ruff>=0.17.3",
128
+ ]
@@ -0,0 +1,106 @@
1
+ [project]
2
+ name = "sepia-cli"
3
+ version = "0.1.0"
4
+ description = "Describe a picture and watch it appear as colored text in a second terminal window."
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ license-files = ["LICENSE"]
8
+ authors = [{ name = "Yiğit Erdoğan" }]
9
+ requires-python = ">=3.12"
10
+ keywords = ["ascii-art", "cli", "terminal", "claude", "image-generation", "flux"]
11
+ classifiers = [
12
+ "Development Status :: 3 - Alpha",
13
+ "Environment :: Console",
14
+ "Operating System :: MacOS",
15
+ "Operating System :: Microsoft :: Windows",
16
+ "Programming Language :: Python :: 3",
17
+ "Programming Language :: Python :: 3.12",
18
+ "Programming Language :: Python :: 3.13",
19
+ "Topic :: Artistic Software",
20
+ "Topic :: Multimedia :: Graphics",
21
+ ]
22
+ dependencies = [
23
+ "anthropic>=2.3.0",
24
+ "numpy>=2.5.4",
25
+ "pillow>=13.0.0",
26
+ "platformdirs>=4.14.0",
27
+ "prompt-toolkit>=3.0.53",
28
+ "pydantic>=2.14.1",
29
+ "python-dotenv>=1.2.4",
30
+ "rich>=15.0.0",
31
+ ]
32
+
33
+ [project.optional-dependencies]
34
+ # The local fallback painter: FLUX.2 [klein] 4B on this machine's GPU (about 3 GB of
35
+ # packages plus a 16 GB model). Without it sepia paints through the web API only.
36
+ local = [
37
+ "torch>=2.14.1",
38
+ "diffusers>=0.42.1",
39
+ "transformers>=4.57",
40
+ "accelerate>=1.10",
41
+ "bitsandbytes>=0.50.2; sys_platform != 'darwin'",
42
+ ]
43
+
44
+ [project.urls]
45
+ Homepage = "https://github.com/Yigtwxx/sepia"
46
+ Repository = "https://github.com/Yigtwxx/sepia"
47
+ Issues = "https://github.com/Yigtwxx/sepia/issues"
48
+
49
+ [project.scripts]
50
+ sepia = "sepia.cli:main"
51
+
52
+ [build-system]
53
+ requires = ["uv_build>=0.12.1,<0.13.0"]
54
+ build-backend = "uv_build"
55
+
56
+ [tool.uv.build-backend]
57
+ module-name = "sepia"
58
+
59
+ # CUDA builds of torch on Windows and Linux; macOS takes the PyPI build, which has MPS.
60
+ [tool.uv.sources]
61
+ torch = [{ index = "pytorch-cuda", marker = "sys_platform != 'darwin'" }]
62
+
63
+ [[tool.uv.index]]
64
+ name = "pytorch-cuda"
65
+ url = "https://download.pytorch.org/whl/cu130"
66
+ explicit = true
67
+
68
+ [dependency-groups]
69
+ dev = [
70
+ "mypy>=2.4.1",
71
+ "pytest>=9.2.0",
72
+ "ruff>=0.17.3",
73
+ ]
74
+
75
+ [tool.ruff]
76
+ line-length = 88
77
+ target-version = "py312"
78
+
79
+ [tool.ruff.lint]
80
+ select = ["E", "F", "W", "I", "UP", "B", "SIM", "ANN", "RUF"]
81
+
82
+ [tool.ruff.lint.per-file-ignores]
83
+ "tests/**" = ["ANN"]
84
+ # The prompt window draws with typographic glyphs (› ⏺ ※ ·) on purpose.
85
+ "src/sepia/ui.py" = ["RUF001"]
86
+
87
+ [tool.mypy]
88
+ python_version = "3.12"
89
+ strict = true
90
+ files = ["src"]
91
+
92
+ # diffusers ships without type information; treat it as untyped.
93
+ [[tool.mypy.overrides]]
94
+ module = ["diffusers", "diffusers.*"]
95
+ follow_imports = "skip"
96
+ ignore_missing_imports = true
97
+
98
+ # The local extra may not be installed (CI type-checks without it).
99
+ [[tool.mypy.overrides]]
100
+ module = ["torch", "torch.*", "huggingface_hub", "huggingface_hub.*"]
101
+ ignore_missing_imports = true
102
+
103
+ [tool.pytest.ini_options]
104
+ testpaths = ["tests"]
105
+ addopts = "-q"
106
+ filterwarnings = ["error::pytest.PytestUnhandledThreadExceptionWarning"]
@@ -0,0 +1,3 @@
1
+ """sepia: prompts become colored symbol paintings in your terminal."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,3 @@
1
+ from sepia.cli import main
2
+
3
+ raise SystemExit(main())