<feed xmlns='http://www.w3.org/2005/Atom'>
<title>skunky-art.git/app/wrapper.go, branch v1.3.5</title>
<subtitle>alternative deviantart frontend, no javascript. go.
</subtitle>
<id>http://git.krz.sh/krz/skunky-art.git/atom?h=v1.3.5</id>
<link rel='self' href='http://git.krz.sh/krz/skunky-art.git/atom?h=v1.3.5'/>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/'/>
<updated>2026-07-15T08:17:09+00:00</updated>
<entry>
<title>fix: serve media again by unsetting download-proxy and scoping Host per request</title>
<updated>2026-07-15T08:17:09+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T08:17:09+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=83d9cd0b7a3e0ec6beb5c889102211567a6db03f'/>
<id>urn:sha1:83d9cd0b7a3e0ec6beb5c889102211567a6db03f</id>
<content type='text'>
Two independent faults made every image fail while pages still rendered.

config.example.json shipped download-proxy=http://127.0.0.1:8080. Only media
fetches go through that proxy — pages reach DeviantArt via devianter on the
default transport — so when nothing listens there, images 502 and the rest of
the page looks fine. In a scratch container 127.0.0.1 is the container itself,
so the default could never work under Docker. Unset it and document that it must
stay empty unless an operator really runs a proxy.

Host was a package global reassigned by every request, so a concurrent request
could overwrite it mid-render and emit URLs on another origin's host and port.
The instance's own default-src 'self' CSP then blocked those images. Thread the
request's host through skunkyart instead, and take it as an explicit argument in
URLBuilder, ParseMedia, ParseDescription, BuildUserPlate and
ConvertDeviantArtURLToSkunkyArt. Feeds keep their absolute URLs.

Also start RefreshInstances after ExecuteConfig rather than before it: the
goroutine read CFG while json.Unmarshal was writing it (a race the detector
flags), and its fetch escaped both the throttle and the configured User-Agent.

Verified: 300 concurrent requests with distinct Host headers now round-trip
their own host (was 1 leak per 300), go test -race is clean, and
cache+proxy both enabled serves 200 image/jpeg cold and from cache.
</content>
</entry>
<entry>
<title>fix: document exported API, fix naming, and harden Download</title>
<updated>2026-07-15T07:25:20+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T07:25:20+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=d6789522d3dd076f7c98dafa3e7d42df09252093'/>
<id>urn:sha1:d6789522d3dd076f7c98dafa3e7d42df09252093</id>
<content type='text'>
The remaining golangci-lint findings. These land together because the
Url -&gt; URL rename spans util.go, parsers.go and wrapper.go, and splitting
it would leave an intermediate commit that does not compile.

Download() carried the most serious bug here: try() only prints an error,
it does not return, so a failed request fell through to
resp.Body.Close() on a nil resp and panicked. Every failure path now
returns the zero Downloaded, and callers check Status. ReturnHTTPError
guards against the resulting status 0, which would otherwise panic
WriteHeader. Requests carry a context with a timeout (noctx), and a
download-proxy now routes through ProxiedTransport so it keeps the DA
throttle and timeouts.

Also:
- doc comments on all 48 exported symbols (revive's exported rule, with
  checkPrivateReceivers, since most of app is exported methods on the
  unexported skunkyart type), plus package docs in new doc.go files so
  both the embed and non-embed builds are covered.
- ST1003 naming: UrlBuilder -&gt; URLBuilder, id_search -&gt; idSearch,
  cache_config -&gt; cacheConfig, TXT_RAW -&gt; TxtRaw, mediaUrl -&gt; mediaURL.
- explicit json tags on structs that are unmarshaled (musttag); the
  hyphenated keys already had tags, the rest relied on case-insensitive
  fallback. Behaviour is unchanged.
- modernization: range-over-int, WaitGroup.Go, stale +build lines,
  interface{} -&gt; any, strings.Builder over string concatenation in a loop.
</content>
</entry>
<entry>
<title>fix: remove russian language throughout</title>
<updated>2026-07-15T06:58:41+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T06:54:26+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=b1ad14553277d9d72a5e4b4462a52a2e2d0fdbb1'/>
<id>urn:sha1:b1ad14553277d9d72a5e4b4462a52a2e2d0fdbb1</id>
<content type='text'>
</content>
</entry>
<entry>
<title>deps: migrate to github.com/zerolabsco/devianter v0.3.1</title>
<updated>2026-07-15T01:22:04+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T01:22:04+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=0fdc45a668d95d603a9013f90392f6bc966c72f9'/>
<id>urn:sha1:0fdc45a668d95d603a9013f90392f6bc966c72f9</id>
<content type='text'>
Repoint the import path from git.macaw.me/skunky/devianter, replacing a
placeholder v0.0.0 require that had no go.sum entry and did not resolve.

v0.3.1 reorders the last two return values of PerformSearch, Group.Get
and Group.Gallery from (..., error, Error) to (..., Error, error);
adapt the call sites. The two types differ, so the compiler enforces
this.
</content>
</entry>
<entry>
<title>Add da.opnxng.com + lost-skunk.cc is now in Finland</title>
<updated>2025-04-07T10:53:47+00:00</updated>
<author>
<name>lost+skunk</name>
<email>me@lost-skunk.cc</email>
</author>
<published>2025-04-07T10:53:47+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=210c69e48c2af4d1fdb53c0654ed33a21688696c'/>
<id>urn:sha1:210c69e48c2af4d1fdb53c0654ed33a21688696c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>ы</title>
<updated>2025-02-23T19:03:02+00:00</updated>
<author>
<name>lost+skunk</name>
<email>skunky@macaw.me</email>
</author>
<published>2025-02-23T19:03:02+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=40d3d89623836fbcdea6efbcdbc4611f20528cfe'/>
<id>urn:sha1:40d3d89623836fbcdea6efbcdbc4611f20528cfe</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Переключатель кеша в озу, небольшие улучшения ксс, фикс нсфв, фикс максимального размера кеша</title>
<updated>2025-02-22T12:30:29+00:00</updated>
<author>
<name>lost+skunk</name>
<email>skunky@macaw.me</email>
</author>
<published>2025-02-22T12:30:29+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=048bb470ab8dc3adce83d2e615f3ab369efa2199'/>
<id>urn:sha1:048bb470ab8dc3adce83d2e615f3ab369efa2199</id>
<content type='text'>
</content>
</entry>
<entry>
<title>v1.3.2</title>
<updated>2024-09-23T06:38:32+00:00</updated>
<author>
<name>lost+skunk</name>
<email>skunky@ebloid.ru</email>
</author>
<published>2024-09-23T06:38:32+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=191984b31ef228c4077904a2831a2af593352670'/>
<id>urn:sha1:191984b31ef228c4077904a2831a2af593352670</id>
<content type='text'>
</content>
</entry>
<entry>
<title>отображение ошибок</title>
<updated>2024-09-04T17:22:58+00:00</updated>
<author>
<name>lost+skunk</name>
<email>skunky@ebloid.ru</email>
</author>
<published>2024-09-04T17:22:58+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=c39399403e031a8c1ad53969770e4261d2c9e7aa'/>
<id>urn:sha1:c39399403e031a8c1ad53969770e4261d2c9e7aa</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Два API-эндпоинта</title>
<updated>2024-09-03T12:36:19+00:00</updated>
<author>
<name>lost+skunk</name>
<email>skunky@ebloid.ru</email>
</author>
<published>2024-09-03T12:36:19+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=db53a8bd9004098e6a1507e5826a833fd9efa954'/>
<id>urn:sha1:db53a8bd9004098e6a1507e5826a833fd9efa954</id>
<content type='text'>
</content>
</entry>
</feed>
