<feed xmlns='http://www.w3.org/2005/Atom'>
<title>skunky-art.git, branch v1.3.4</title>
<subtitle>alternative deviantart frontend, no javascript. go.
</subtitle>
<id>http://git.krz.sh/krz/skunky-art.git/atom?h=v1.3.4</id>
<link rel='self' href='http://git.krz.sh/krz/skunky-art.git/atom?h=v1.3.4'/>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/'/>
<updated>2026-07-15T07:55:52+00:00</updated>
<entry>
<title>ci: publish multi-arch image to GHCR on release tags</title>
<updated>2026-07-15T07:55:52+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T07:55:52+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=8d08f343c930f556c6ab016be9d00b23f1e516e3'/>
<id>urn:sha1:8d08f343c930f556c6ab016be9d00b23f1e516e3</id>
<content type='text'>
Build and push linux/amd64 + linux/arm64 images to
ghcr.io/zerolabsco/skunky-art on every v* tag, with a signed provenance
attestation. The Dockerfile cross-compiles from $BUILDPLATFORM, so the
arm64 image builds without QEMU emulation.

Default both compose examples to the published image and keep `build: .`
commented out for building from a checkout, and extend dependabot to the
github-actions and docker ecosystems.
</content>
</entry>
<entry>
<title>docs: correct advertised proxifying flag and instance list link</title>
<updated>2026-07-15T07:49:48+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T07:49:48+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=47bfe56e728d046fc8fb78b784efe6926f08ff9e'/>
<id>urn:sha1:47bfe56e728d046fc8fb78b784efe6926f08ff9e</id>
<content type='text'>
The published entry for zerolabs.sh claimed proxifying was off while the
instance runs with proxy enabled, so /about advertised the opposite of
what the instance does. The instance list is fetched from main at runtime,
so this corrects the live about page without a rebuild.

Also point the instances.json link at skunky-art/main, which is what the
app actually fetches, rather than the old SkunkyArt/dev path.
</content>
</entry>
<entry>
<title>build: bump builder image to Go 1.25</title>
<updated>2026-07-15T07:44:24+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T07:44:24+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=59359fdda9db92d95aa3a2819e87a61d63f560fd'/>
<id>urn:sha1:59359fdda9db92d95aa3a2819e87a61d63f560fd</id>
<content type='text'>
go.mod requires go 1.25.0, but the Dockerfile still pinned the builder to
1.18, which cannot parse a three-part version string and failed with
"invalid go version '1.25.0': must match format 1.23".

Track the 1.25 tag rather than a patch release so the builder does not
drift out of date again.
</content>
</entry>
<entry>
<title>fix: attribute fork in copyright and replace upstream matrix link</title>
<updated>2026-07-15T07:34:41+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T07:34:41+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=bc9c79be7824252f385b9d052595ed8d7460f43f'/>
<id>urn:sha1:bc9c79be7824252f385b9d052595ed8d7460f43f</id>
<content type='text'>
The copyright on /about and in the CLI help credited only lost+skunk and
linked to their matrix account. Credit this fork alongside the original,
as the X11 license requires retaining the upstream notice, and point the
attribution at the upstream repo rather than the stale matrix link.

Replace the upstream matrix room link with this fork's issue tracker.
</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: harden HTTP transport, server timeouts and panic paths</title>
<updated>2026-07-15T07:24:58+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T07:24:58+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=7eb5e5e2230b6fb5b1bed6f0eaa03279aa61555b'/>
<id>urn:sha1:7eb5e5e2230b6fb5b1bed6f0eaa03279aa61555b</id>
<content type='text'>
Correctness and security findings surfaced by golangci-lint, plus two
latent panics found alongside them.

- router: http.ListenAndServe has no timeouts at all (gosec G114), so a
  slow client could hold a connection and its handler open indefinitely.
  Replace it with an explicit http.Server carrying read/write/idle
  timeouts.
- httpclient: InstallDAThrottle asserted http.DefaultTransport was a
  *http.Transport and would panic outright if anything had already
  wrapped it -- which is precisely what that function does. Check the
  assertion and fall back to a fresh transport. Expose ProxiedTransport
  so a configured download-proxy can inherit the same throttle and
  timeouts instead of silently bypassing them.
- cache: the Sys() assertion to *syscall.Stat_t is only valid on unix and
  would panic elsewhere; skip rotation instead. Indexing
  Headers["Content-Type"][0] panics when the header is absent; use
  Headers.Get. Cache files are written 0600 rather than 0700, as they are
  never executed.
- cli, api: check error returns, and exit rather than nil-dereference a
  file handle that failed to open.

SHA-1 and math/rand keep //nolint:gosec with reasons: they are cache-key
hashes and random-artwork picks, not security primitives.
</content>
</entry>
<entry>
<title>fix(cache): correct max-size megabyte conversion</title>
<updated>2026-07-15T07:23:59+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T07:23:59+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=40d405f318a109aad5e7de7ad71fedcc04bb0e86'/>
<id>urn:sha1:40d405f318a109aad5e7de7ad71fedcc04bb0e86</id>
<content type='text'>
max-size is documented in SETUP.md as megabytes, but the conversion was
`*= 1024 ^ 2`. In Go `^` is XOR, not exponentiation, so this multiplied
by 1026 rather than 1048576 -- a configured max-size of 200 produced a
~205 KB cap instead of 200 MB, wiping the cache almost immediately.

This changes runtime behaviour: the cache will now grow to the size the
config actually asks for.
</content>
</entry>
<entry>
<title>build: add golangci-lint configuration</title>
<updated>2026-07-15T07:23:40+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-15T07:23:40+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=672ff7f44b0061e179fb33c16418738d6455a4e9'/>
<id>urn:sha1:672ff7f44b0061e179fb33c16418738d6455a4e9</id>
<content type='text'>
Enables the standard linters plus revive's exported rule, a set of
correctness/security linters (bodyclose, noctx, gosec, forcetypeassert,
canonicalheader, musttag, predeclared, exhaustive), modernization
linters, and staticcheck's full check set including the doc-comment and
naming checks that are off by default.

The idiom-fighting linters stay off: varnamelen objects to short names
that are idiomatic Go, exhaustruct demands every field be initialized,
gochecknoglobals flags CFG/Host which are deliberate, and tagliatelle
would rename JSON config keys and break existing instances' configs.
</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>Bump golang.org/x/net from 0.27.0 to 0.57.0 (#3)</title>
<updated>2026-07-15T06:48:14+00:00</updated>
<author>
<name>dependabot[bot]</name>
<email>49699333+dependabot[bot]@users.noreply.github.com</email>
</author>
<published>2026-07-15T06:48:14+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/skunky-art.git/commit/?id=155a7b9ea6de609cdc8deb6ebef233013f23c9f0'/>
<id>urn:sha1:155a7b9ea6de609cdc8deb6ebef233013f23c9f0</id>
<content type='text'>
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.27.0 to 0.57.0.
- [Commits](https://github.com/golang/net/compare/v0.27.0...v0.57.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.57.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] &lt;support@github.com&gt;
Co-authored-by: dependabot[bot] &lt;49699333+dependabot[bot]@users.noreply.github.com&gt;</content>
</entry>
</feed>
