<feed xmlns='http://www.w3.org/2005/Atom'>
<title>camagru, branch master</title>
<subtitle>Webcam and upload photo editing web app</subtitle>
<id>http://git.tvcloud.fr/cgit.cgi/camagru/atom?h=master</id>
<link rel='self' href='http://git.tvcloud.fr/cgit.cgi/camagru/atom?h=master'/>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/'/>
<updated>2026-03-24T12:43:28Z</updated>
<entry>
<title>Move uploads to a named Docker volume</title>
<updated>2026-03-24T12:43:28Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-24T12:43:28Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/commit/?id=207950e6522f54e3d5111db2bbae8ab9b8281b32'/>
<id>urn:sha1:207950e6522f54e3d5111db2bbae8ab9b8281b32</id>
<content type='text'>
Replace the bind-mounted src/uploads/ with a named volume shared
between PHP (read-write) and Nginx (read-only). Remove entrypoint.sh
since the volume handles directory creation automatically.
</content>
</entry>
<entry>
<title>Isolate database and mail behind internal Docker network</title>
<updated>2026-03-24T11:01:44Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-24T11:01:44Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/commit/?id=03147e99dea93bda229634cd5980b8474ad41b14'/>
<id>urn:sha1:03147e99dea93bda229634cd5980b8474ad41b14</id>
<content type='text'>
Remove exposed MariaDB port and split services into frontend/backend
networks. Only Nginx is reachable from the host; MariaDB and Mailpit
are only accessible to the PHP container.
</content>
</entry>
<entry>
<title>Add rate limiting on login and password reset endpoints</title>
<updated>2026-03-22T12:57:45Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-22T12:57:45Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/commit/?id=94dbb795cc3fe9799d34beb5d6bfa052eba81b0c'/>
<id>urn:sha1:94dbb795cc3fe9799d34beb5d6bfa052eba81b0c</id>
<content type='text'>
Track attempts per IP in a rate_limits table with a sliding time
window. Login allows 5 failed attempts per 15 min, password reset
allows 3 requests per 15 min. Old entries are purged automatically.
</content>
</entry>
<entry>
<title>Add session cookie hardening and Nginx security headers</title>
<updated>2026-03-22T12:53:01Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-22T12:53:01Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/commit/?id=78e891f06ab94ef478de1c431157f7d634fe4ac8'/>
<id>urn:sha1:78e891f06ab94ef478de1c431157f7d634fe4ac8</id>
<content type='text'>
Set httponly, samesite=Lax, and auto-detected secure flag on session
cookies. Add X-Content-Type-Options, X-Frame-Options, and
Content-Security-Policy headers in Nginx. Document both in README.
</content>
</entry>
<entry>
<title>Add chmod 600 guidance for .env file in README</title>
<updated>2026-03-22T12:40:53Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-22T12:40:53Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/commit/?id=de41aa4531df4515de93eba685cfeb03227a5d4e'/>
<id>urn:sha1:de41aa4531df4515de93eba685cfeb03227a5d4e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add upload security: size limit, per-user and site-wide post caps</title>
<updated>2026-03-22T12:34:47Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-22T12:34:47Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/commit/?id=d6a9fd1c32f07b993cb8ecc3c1b7c22f7a0ce848'/>
<id>urn:sha1:d6a9fd1c32f07b993cb8ecc3c1b7c22f7a0ce848</id>
<content type='text'>
Reject base64 payloads over 10 MB, limit users to 50 posts each,
and cap total posts at 10,000 (~650 MB on disk). Document upload
security model in README.
</content>
</entry>
<entry>
<title>Add favicon using webcam.svg</title>
<updated>2026-03-22T12:24:50Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-22T12:24:18Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/commit/?id=6a2c38dff48529672411419e1f56df0671f40365'/>
<id>urn:sha1:6a2c38dff48529672411419e1f56df0671f40365</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add environment variables, MailPit, and composer clarifications to README</title>
<updated>2026-03-21T22:08:15Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-21T22:08:15Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/commit/?id=6ced3fae5446a8b173025d708c2f07aa23e640f8'/>
<id>urn:sha1:6ced3fae5446a8b173025d708c2f07aa23e640f8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Replace home page with redirect to gallery or login</title>
<updated>2026-03-21T21:57:36Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-21T21:57:36Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/commit/?id=6f300d7676aa36903c1a279aeb100d6f4caf1197'/>
<id>urn:sha1:6f300d7676aa36903c1a279aeb100d6f4caf1197</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add likes, comments, email notifications, and pagination to gallery</title>
<updated>2026-03-21T21:55:13Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-21T21:55:13Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/camagru/commit/?id=f9ad3f4dc05252839457579303a4e0a0f94d8b80'/>
<id>urn:sha1:f9ad3f4dc05252839457579303a4e0a0f94d8b80</id>
<content type='text'>
</content>
</entry>
</feed>
