TODO _headers file place.wisp.settings lexicon as a lexiconal way of configuring this
+31
-1
README.md
+31
-1
README.md
···+The hosting service supports Netlify-style `_redirects` files for managing URLs. Place a `_redirects` file in your site root to enable:
-123
hosting-service/EXAMPLE.md
-123
hosting-service/EXAMPLE.md
···-This document demonstrates how HTML path rewriting works when serving sites via the `/s/:identifier/:site/*` route.-When you create a static site with absolute paths like `/style.css` or `/images/logo.png`, these paths work fine when served from the root domain. However, when served from a subdirectory like `/s/alice.bsky.social/mysite/`, these absolute paths break because they resolve to the server root instead of the site root.-The hosting service automatically rewrites absolute paths in HTML files to work correctly in the subdirectory context.-srcset="/s/alice.bsky.social/mysite/images/hero.jpg 1x, /s/alice.bsky.social/mysite/images/hero@2x.jpg 2x"-If you're using relative paths already (like `./style.css` or `../images/logo.png`), they'll work without any rewriting.
+134
hosting-service/example-_redirects
+134
hosting-service/example-_redirects
···
+215
hosting-service/src/lib/redirects.test.ts
+215
hosting-service/src/lib/redirects.test.ts
···
+413
hosting-service/src/lib/redirects.ts
+413
hosting-service/src/lib/redirects.ts
···+if ([200, 301, 302].includes(rule.status) && context?.queryParams && !targetPath.includes('?')) {
+168
-6
hosting-service/src/server.ts
+168
-6
hosting-service/src/server.ts
···import { logger, observabilityMiddleware, observabilityErrorHandler, logCollector, errorTracker, metricsCollector } from './lib/observability';import { fileCache, metadataCache, rewrittenHtmlCache, getCacheKey, type FileMetadata } from './lib/cache';+import { loadRedirectRules, matchRedirectRule, parseCookies, parseQueryString, type RedirectRule } from './lib/redirects';······+async function serveFileInternalWithRewrite(did: string, rkey: string, filePath: string, basePath: string) {···············
+66
cli/src/cid.rs
+66
cli/src/cid.rs
···
+71
cli/src/download.rs
+71
cli/src/download.rs
···+pub async fn download_blob(pds_url: &Url, blob_ref: &BlobRef<'_>, did: &str) -> miette::Result<Bytes> {+pub fn decompress_blob(data: &[u8], is_base64: bool, is_gzipped: bool) -> miette::Result<Vec<u8>> {
+109
-16
cli/src/main.rs
+109
-16
cli/src/main.rs
···use jacquard::client::{Agent, FileAuthStore, AgentSessionExt, MemoryCredentialSession, AgentSession};···
+46
cli/src/metadata.rs
+46
cli/src/metadata.rs
···
+305
cli/src/pull.rs
+305
cli/src/pull.rs
···+let file_count = fs_record.file_count.map(|c| c.to_string()).unwrap_or_else(|| "?".to_string());+let output_name = output_dir.file_name().unwrap_or_else(|| std::ffi::OsStr::new("site")).to_string_lossy();
+202
cli/src/serve.rs
+202
cli/src/serve.rs
···+fn watch_firehose(state: ServerState) -> std::pin::Pin<Box<dyn std::future::Future<Output = miette::Result<()>> + Send>> {
-3
.gitmodules
-3
.gitmodules
-1
cli/jacquard
-1
cli/jacquard
···
+1
-1
cli/Cargo.toml
+1
-1
cli/Cargo.toml
+28
-1
crates.nix
+28
-1
crates.nix
·········
+17
-2
flake.nix
+17
-2
flake.nix
···+packages.wisp-cli-x86_64-linux = mkRenamedPackage "wisp-cli-x86_64-linux" crateOutputs.packages.release;+packages.wisp-cli-aarch64-linux = mkRenamedPackage "wisp-cli-aarch64-linux" crateOutputs.allTargets."aarch64-unknown-linux-gnu".packages.release;+packages.wisp-cli-x86_64-windows = mkRenamedPackage "wisp-cli-x86_64-windows.exe" crateOutputs.allTargets."x86_64-pc-windows-gnu".packages.release;+packages.wisp-cli-aarch64-darwin = mkRenamedPackage "wisp-cli-aarch64-darwin" crateOutputs.allTargets."aarch64-apple-darwin".packages.release;