maintenance
Maintain the Wax memory store used by the Hermes wax-memory provider.
Swift client guidance for Wax's public Memory, PhotoMemory, and VideoMemory APIs. Use only when writing or changing Swift app code that imports Wax. Do not use at session start. Do not use for MCP remember/recall/stats — those follow the live MCP server instructions. Do not use
$ npx -y skills add christopherkarani/Wax --skill wax --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/waxContext preview
The summary Claude sees to decide when to auto-load this skill.
Swift client guidance for Wax's public Memory, PhotoMemory, and VideoMemory APIs. Use only when writing or changing Swift app code that imports Wax. Do not use at session start. Do not use for MCP remember/recall/stats — those follow the live MCP server instructions. Do not use
name: wax description: > Swift client guidance for Wax's public Memory, PhotoMemory, and VideoMemory APIs. Use only when writing or changing Swift app code that imports Wax. Do not use at session start. Do not use for MCP remember/recall/stats — those follow the live MCP server instructions. Do not use for waxmcp install or doctor (that is wax-mcp).
Use this skill to design and implement correct Wax-based on-device memory flows in Swift 6.2, emphasizing deterministic retrieval, single-file persistence, and safe concurrency.
Do not load this skill at session start or for MCP `remember` / `recall` / `stats`. Follow the live MCP server instructions for those tools. Use `wax-mcp` only when installing or diagnosing a host.
1. Use `Memory` (public actor) for text memory and retrieval. 2. Use experimental `PhotoMemory` / `VideoMemory` (`import Wax`) for photo and video RAG on Darwin. Build the embedder with `BuiltInMultimodalEmbeddings.make`. 3. `MemoryOrchestrator`, `PhotoRAGOrchestrator`, `VideoRAGOrchestrator`, `Wax`, `WaxSession`, and `MiniLMEmbedder` are **package-only internals** — downstream apps cannot import or construct them. Do not generate client code against them. 4. Structured memory (entities/facts) stays MCP/broker-facing, not a public Swift CRUD API. 5. Import `Wax` to get the re-exported embedding protocols (`EmbeddingProvider`, `BatchEmbeddingProvider`, `EmbeddingIdentity`).
1. Choose a `.wax` store URL. 2. Open `Memory(at:)` — `.automatic` opens immediately while MiniLM loads (iOS 18/macOS 15+, default `MiniLMEmbeddings` trait), then live-attaches. Check `stats().embeddingStatus`. 3. Or select the embedder in config: `Memory(at: url) { $0.embedding = .custom(MyEmbedder()) }`, or force a built-in via `$0.embedding = .builtIn(.miniLM)` (throws when unavailable). 4. Call `save(...)` to ingest and `search(...)` to retrieve `RAGContext`. 5. Call `flush()` or `close()` to persist.
import Foundation
import Wax
func demoDefault() async throws {
let url = FileManager.default.temporaryDirectory
.appendingPathComponent("wax-memory")
.appendingPathExtension("wax")
// Semantic search out of the box on iOS 18/macOS 15+ (built-in MiniLM).
let memory = try await Memory(at: url)
try await memory.save("User: prefers Swift over Java.")
let results = try await memory.search("language preferences")
_ = results.items
// Verify which retrieval mode actually ran.
if let diagnostics = results.diagnostics {
print(diagnostics.effectiveMode) // Memory.RetrievalMode (alias of SearchMode); prints "hybrid(alpha=0.500)" or "text"
}
try await memory.close()
}import Foundation
import Wax
func demoTextOnly() async throws {
let url = FileManager.default.temporaryDirectory
.appendingPathComponent("wax-text")
.appendingPathExtension("wax")
// Explicit text-only mode: no embedder is loaded.
let memory = try await Memory(at: url) { config in
config.enableVectorSearch = false
}
try await memory.save("User: prefers Swift over Java.")
let results = try await memory.search("preferences", options: .init(mode: .textOnly))
_ = results.items
try await memory.close()
}import Foundation
import Wax
actor MyEmbedder: EmbeddingProvider {
let dimensions = 384
let normalize = true
let identity: EmbeddingIdentity? = .init(
provider: "Local",
model: "v1",
dimensions: 384,
normalized: true
)
func embed(_ text: String) async throws -> [Float] {
[Float](repeating: 0.0, count: dimensions)
}
}
func demoCustomEmbedder() async throws {
let url = FileManager.default.temporaryDirectory
.appendingPathComponent("wax-vector")
.appendingPathExtension("wax")
let memory = try await Memory(at: url) { $0.embedding = .custom(MyEmbedder()) }
try await memory.save("Vector search enabled.")
let results = try await memory.search("vector", options: .init(mode: .vectorOnly))
_ = results.totalTokens
try await memory.flush()
try await memory.close()
}import Foundation
import Wax
func demoPhotoMemory(storeURL: URL, imageURL: URL) async throws {
let embedder = try await BuiltInMultimodalEmbeddings.make(.miniLM)
let photos = try await PhotoMemory(at: storeURL, embedder: embedder, ocr: VisionOCRProvider())
try await photos.ingest(files: [PhotoFile(id: "receipt-1", url: imageURL)])
let context = try await photos.recall(PhotoQuery(text: "coffee receipt"))
_ = context.items
try await photos.close()
}Shared Single-file memory layer for all your agents, sub mili-second RAG over text, photo and video on Apple Silicon.. No Server. No API. One File. Pure Swift
Repo: christopherkarani/Wax
Maintain the Wax memory store used by the Hermes wax-memory provider.
Operator install and diagnose playbook for waxmcp hosts (HTTP vs stdio, LaunchAgent, Hermes…
Benchmarking and performance auditing for the Wax repo. Use when running or interpreting Wax…