Releases: zopdev/static-server
v0.0.9
What's Changed
Features
SPA fallback mode (SPA_MODE)
When SPA_MODE=true, extensionless routes that don't match a file now serve index.html with status 200, enabling client-side routing (React Router, Vue Router, etc.) without duplicating index.html as 404.html. Defaults to false — existing setups are unaffected.
Configurable default extension (DEFAULT_EXTENSION)
Replaces the hardcoded .html auto-resolution. Set DEFAULT_EXTENSION=.json (or any extension) to serve extensionless requests from a different file type. Defaults to .html to preserve existing behavior.
Note: only one extension is tried per request. Setting
DEFAULT_EXTENSIONto a non-html value disables.htmlauto-resolution. See README for interaction withSPA_MODE.
Multi-platform Docker images (amd64 + arm64)
Images now build for both linux/amd64 and linux/arm64 via Docker buildx with native Go cross-compilation. Apple Silicon users no longer need emulation.
Bug fixes
404 response headers no longer flushed prematurely
The previous handler called w.WriteHeader(404) before http.ServeFile, which flushed headers early and prevented ServeFile from setting Content-Type, Content-Length, and caching headers. A new statusOverrideWriter lets ServeFile set all headers normally and only overrides the status code.
Broader Stat error handling
ServeHTTP now treats any Stat error (permissions, I/O, symlink loop) as "not serveable" and routes to the 404 / SPA fallback, instead of falling through to http.ServeFile with a broken path.
Dockerfile builds all Go files
Build step changed from go build main.go to go build . so handler.go and future files are included.
Refactor & internals
- Middleware extracted into testable
staticFileHandlerstruct backed by GoFr'sfile.FileSysteminterface. - Per-request
regexp.MatchStringreplaced withfilepath.Ext— eliminates regex compilation on every request. SPA_MODEparsing usesstrconv.ParseBool.- Tests replaced non-deterministic
go main()+time.Sleepwithhttptest.NewServerfor proper lifecycle.
Dependencies & tooling
- GoFr upgraded to v1.56.0; replaced deprecated
file.Newwithfile.NewLocalFileSystem. - GitHub Actions:
checkoutv4→v6,setup-gov4→v6 (caching default),golangci-lint-actionv8→v9.
Compatibility
Fully backward compatible. SPA_MODE defaults to false and DEFAULT_EXTENSION defaults to .html, so services upgrading from v0.0.8 with no env changes behave identically.
Full Changelog: v0.0.8...v0.0.9
v0.0.8
What's Changed
Features
1. Config File Hydration
When the CONFIG_FILE_PATH environment variable is set, the server replaces any ${VAR} placeholders in that file at startup using values from the environment (including .env files). The file is rewritten in-place before serving begins.
This is useful for injecting runtime configuration into static front-end apps without rebuilding them.
If any placeholders have no matching environment variable, the server still writes the file (substituting empty strings for missing values) and logs an error listing the unresolved variables.
Full Changelog: v0.0.7...v0.0.8
v0.0.7
Release Notes
🚀 New Features
- Added ARM64 support enabling the image to run on ARM-based systems (e.g., Apple Silicon, AWS Graviton).
🔧 Improvements
- Updated GitHub Action versions to the latest supported releases for improved stability and security.
- Added a workflow step to print the image registry path, making it easier to identify the published image location during CI runs.
📦 Compatibility
- Images are now available for both
amd64andarm64architectures.
v0.0.6
🚀 Release Notes — v0.0.6
🔧 CI & Build
- Migrated to
golangci-lintv2 with caching - Improved GitHub Actions workflow (faster builds, cleaner job separation)
- Docker push now configurable and skips gracefully if credentials are missing
🔐 Security
- Improved path handling logic
- Added tests for path validation
- Updated gosec configuration to handle false positives
🐳 Docker
- Switched to distroless base image
- Built fully static binary (
CGO_ENABLED=0, stripped flags)
📘 Docs
- Updated README to reference
v0.0.6tag
Focus: CI reliability, performance improvements, container hardening, and minor security refinements.
v0.0.5
Fixes:
Corrected File Serving Priority Between filePath.html and filePath/index.html
- The server now correctly prioritizes filePath.html if it exists.
- If filePath.html does not exist but filePath/ is a directory, the server serves filePath/index.html.
- If neither exists, the server returns 404 Not Found.
v0.0.4
- Update gofr version to v1.34.0
v0.0.3
What's Changed
- Exempt gofr's well-known endpoint in static server middleware.
Full Changelog: v0.0.2...v0.0.3
v0.0.2
Enhancements
-
Removed File Mapping
The server no longer creates a map of files, streamlining the file-serving process. -
404 Status for Missing Files
If a requested file is not found, the server now returns a 404 status code, improving error handling. -
Default Directory Update
The default directory for serving static files has been changed tostatic.- To customize this directory set the
STATIC_DIR_PATHenvironment variable.
- To customize this directory set the
v0.0.1
Release Notes
- Create Static File Server which reads from website directory with the following support.
- Re-direct to 404.html endpoint when webpage does not exist.
- Add .html endpoint to urls which does not have any extension.