Files
silo/web/assets/silo-open.svg
Forbes 50923cf56d feat: production release with React SPA, file attachments, and deploy tooling
Backend:
- Add file_handlers.go: presigned upload/download for item attachments
- Add item_files.go: item file and thumbnail DB operations
- Add migration 011: item_files table and thumbnail_key column
- Update items/projects/relationships DB with extended field support
- Update routes: React SPA serving from web/dist, file upload endpoints
- Update auth handlers and middleware for cookie + bearer token auth
- Remove Go HTML templates (replaced by React SPA)
- Update storage client for presigned URL generation

Frontend:
- Add TagInput component for tag/keyword entry
- Add SVG assets for Silo branding and UI icons
- Update API client and types for file uploads, auth, extended fields
- Update AuthContext for session-based auth flow
- Update LoginPage, ProjectsPage, SchemasPage, SettingsPage
- Fix tsconfig.node.json

Deployment:
- Update config.prod.yaml: single-binary SPA layout at /opt/silo
- Update silod.service: ReadOnlyPaths for /opt/silo
- Add scripts/deploy.sh: build, package, ship, migrate, start
- Update docker-compose.yaml and Dockerfile
- Add frontend-spec.md design document
2026-02-07 13:35:22 -06:00

98 lines
2.7 KiB
XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 24 24"
fill="none"
stroke="#cba6f7"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
version="1.1"
id="svg2"
sodipodi:docname="silo-open.svg"
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs2" />
<sodipodi:namedview
id="namedview2"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="32"
inkscape:cx="5.96875"
inkscape:cy="12.09375"
inkscape:window-width="2560"
inkscape:window-height="1371"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<!-- Folder open icon -->
<!-- Search magnifier -->
<rect
width="24"
height="24"
rx="3"
fill="#313244"
id="rect1"
inkscape:label="rect1"
x="0"
y="0"
style="stroke:none;stroke-width:0.749719;stroke-dasharray:none" />
<path
d="M 6.1818179,7.6363633 V 18.63072 c 0,0.969697 1.9393931,2.096551 5.8181811,2.096551 3.878787,0 5.624399,-1.126981 5.640104,-2.096551 L 17.81818,7.6363633"
fill="#313244"
stroke="#cba6f7"
stroke-width="2"
id="path1"
sodipodi:nodetypes="csssc"
style="fill:#45475a;fill-opacity:1;stroke-width:0.909091;stroke-dasharray:none" />
<ellipse
cx="11.999998"
cy="7.6363635"
rx="5.818182"
ry="2.181818"
fill="#45475a"
stroke="#cba6f7"
stroke-width="2"
id="ellipse1"
style="stroke:#cba6f7;stroke-width:0.909091;stroke-dasharray:none;stroke-opacity:1" />
<path
d="m 6.1818179,7.6363633 c 0,-7.272727 11.6363621,-7.272727 11.6363621,0"
fill="none"
stroke="#cba6f7"
stroke-width="4.65698"
stroke-linecap="round"
id="path2"
style="fill:#45475a;fill-opacity:1;stroke-width:0.909091;stroke-dasharray:none"
sodipodi:nodetypes="cc" />
<g
id="g2"
transform="translate(-13.871014,1.4359614)">
<line
x1="30.121014"
y1="14.814038"
x2="32.621014"
y2="17.314039"
stroke="#a6e3a1"
stroke-width="1.5"
id="line2" />
<circle
cx="28.460087"
cy="13.153111"
r="2.0712578"
fill="#1e1e2e"
stroke="#a6e3a1"
stroke-width="1.03563"
id="circle2"
style="fill:none" />
</g>
</svg>