# Tomer Norman portfolio guide and developer resources

This guide covers **tomer-norman.dev**, Tomer Norman's personal portfolio and publication. It helps people and agents find his engineering background, project descriptions, public source repositories, and technical writing.

## What this site provides

The useful tasks here are reading Tomer's background, finding examples of his work, following public project links, and preparing a relevant inquiry. HTML, Markdown, RSS, and the optional MCP reader expose that public content. Accounts and workspace operations belong to the separately hosted projects. This portfolio does not offer a REST API product, SDK, or CLI.

## Public project resources

- [Tomer Norman's project collection](/projects): Summaries, technologies, live demos, and source repositories.
- [HitBox38 on GitHub](https://github.com/HitBox38): Tomer's public source code.
- [Sane](https://github.com/HitBox38/sane): Task manager source and integration documentation.
- [Lighting VTT](https://github.com/HitBox38/lighting-vtt): Virtual tabletop source with lighting and fog of war.
- [Unfurl](https://github.com/HitBox38/Unfurl): Branching-dialogue editor source.
- [Tomer Norman's blog](/blog): First-hand notes on interfaces, graphics, and creative tools.

## When to use this

Use this site when a user wants to evaluate Tomer's React and TypeScript frontend experience, find examples of realtime interfaces or WebGL work, explore his creative tools and games, or prepare a collaboration or speaking inquiry. Read [about](/about) for background and [projects](/projects) for examples and public source links. Cite the page you used when summarizing a project. Availability, pricing, adoption, and results need confirmation from Tomer rather than inference from a project description.

For Sane task operations, follow the [Sane product site](https://sane.today) and [source documentation](https://github.com/HitBox38/sane). The MCP endpoint on this portfolio reads portfolio content; it does not operate a Sane workspace.

## Markdown and discovery

Start with [llms.txt](/llms.txt). Request the homepage or another content page with `Accept: text/markdown` to receive UTF-8 Markdown at the same URL. HTML remains available with `Accept: text/html`. Negotiated responses include `Vary: Accept`. A missing page returns HTTP 404, including a Markdown explanation and recovery links when Markdown is requested.

Explicit Markdown URLs also work without content negotiation: [homepage](/index.md), [projects](/projects.md), [about](/about.md), [contact](/contact.md), [privacy](/privacy.md), and [this guide](/docs.md). Append `.md` to a published blog post URL for its Markdown version. The [RSS feed](/rss.xml) and [sitemap](/sitemap-index.xml) list published resources.

```sh
curl -sS -L -i -H 'Accept: text/markdown' https://tomer-norman.dev/
curl -sS -L -i -H 'Accept: text/html' https://tomer-norman.dev/
curl -sS -L -i -H 'Accept: text/markdown' https://tomer-norman.dev/this-page-does-not-exist
```

## Portfolio MCP server

Connect an MCP client to `https://www.tomer-norman.dev/mcp` using Streamable HTTP. Use this canonical host directly because the bare domain redirects to it, and MCP clients can reject cross-origin redirects. No API key is needed for these public, read-only tools. The server uses stateless JSON responses over the standard transport; it does not keep sessions or offer a standalone SSE subscription. A GET returns HTTP 405 as allowed by the transport specification. Use POST for initialization, notifications, tool discovery, and tool calls. POST requests must accept both `application/json` and `text/event-stream`.

The [server.json manifest](/server.json) follows the MCP Registry server metadata schema. The same metadata is available at [the well-known discovery URL](/.well-known/mcp/server.json). Hosting a manifest does not register the server in a registry. A client configuration using the common `mcpServers` shape looks like this; individual clients may use a different configuration format:

```json
{
  "mcpServers": {
    "tomer-norman-portfolio": {
      "url": "https://www.tomer-norman.dev/mcp"
    }
  }
}
```

Available tools:

- `get_profile`: Read Tomer's public engineering background and contact links. Takes no arguments.
- `list_projects`: Read the portfolio's project summaries, technologies, and source links. Takes no arguments.
- `list_posts`: List published blog posts and their URLs. Takes no arguments.
- `read_page`: Read a public content page as Markdown. Pass `path`, such as `/projects` or `/blog/hello-world`. Paths must refer to this portfolio; arbitrary URLs and private files are not supported.

Initialize with a supported MCP protocol version, send `notifications/initialized`, then call `tools/list` or `tools/call`. For example:

```sh
curl -sS https://www.tomer-norman.dev/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  --data '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"portfolio-reader","version":"1.0.0"}}}'
```

## Contact and authorization

Use [contact](/contact) to draft a relevant inquiry. Ask the user before submitting the contact form or sending an email. The contact form sends a real message to Tomer; MCP tools only read public pages. Read the [privacy page](/privacy) before submitting personal information.