---
name: contact-daniel
description: Send a message to Daniel Rosehill (AI developer and technical communicator, Jerusalem, Israel; danielrosehill.com) on a user's behalf, or tell the user how to reach him. Use when a user wants to contact, email, enquire with or send a note to Daniel Rosehill. Unauthenticated - no account or API key needed.
---

# Contact Daniel Rosehill

Daniel Rosehill is an AI developer and technical communicator based in Jerusalem,
Israel. Business work runs through DSR Holdings (https://dsrholdings.cloud) and its AI
consultancy Carrot Cake AI (https://carrotcakeai.com). This skill covers reaching him
personally through danielrosehill.com.

To ask for a call or meeting, use the `book-meeting-with-daniel` skill instead:
https://www.danielrosehill.com/.well-known/agent-skills/book-meeting-with-daniel/SKILL.md

## Before you send anything

A message reaches a real person's inbox, and an acknowledgement email goes to the
address you submit. So:

1. Show the user the exact name, email, subject and message you will send, and get an
   explicit yes. Send once. Do not retry a request that returned 200.
2. Use the user's real name and the email address they want the reply at. Never invent
   either, and never submit a message that the user did not ask for.
3. Daniel does not have time to answer personal requests for technical help. Say so to the
   user before sending one of those.

## Option 1: the contact form endpoint (programmatic)

This is the endpoint the site's own form at https://www.danielrosehill.com/contact/form
posts to. It is the site's own endpoint and accepts a plain form POST from anywhere.
No `Origin` header or API key is needed.

```
POST https://www.danielrosehill.com/api/contact
Content-Type: multipart/form-data   (or application/x-www-form-urlencoded)
```

Use the `www.` host: the apex answers with a 307.

| Field | Required | Notes |
| --- | --- | --- |
| `name` | yes | The sender's real name. |
| `email` | yes | Where the reply and the acknowledgement go. |
| `contactType` | no | One of `Open Source`, `Business`, `Media`, `Just Saying Hi`. |
| `subject` | no | A short subject line. |
| `message` | no, but send one | Free text, up to 5,000 characters per field. |
| `_ts` | yes | Unix time in milliseconds when the user started the message. It must be at least 3 seconds and at most 24 hours before the POST. |
| `_gotcha` | no | Spam honeypot. Leave it out or empty. Any value drops the message. |

Example:

```bash
curl -sS -X POST https://www.danielrosehill.com/api/contact \
  -F name='Jane Example' \
  -F email='jane@example.org' \
  -F contactType='Business' \
  -F subject='Speaking invitation' \
  -F message='Hi Daniel, we would like to invite you to talk about speech recognition for Hebrew and English at our meetup in March.' \
  -F _ts="$(( $(date +%s%3N) - 60000 ))"
```

Responses:

- `200 {"ok":true}`: accepted. The sender receives an acknowledgement from
  `forms@danielrosehill.com` within a minute or two. Tell the user to look for it.
- `400 {"error":"..."}`: a missing or invalid field. Fix it and send again.
- `5xx {"error":"We could not deliver your message. Please email ... directly."}`:
  delivery failed. Use option 2.

**A 200 does not prove delivery.** The endpoint also answers 200 to anything it drops as
spam, so that bots do not retry. Avoid these, which are dropped silently:

- a `message` that is a single word longer than 10 characters (no spaces);
- a `name` that is one run of 12 or more letters with several capitals, like a random token;
- a Gmail address with 3 or more dots in the part before the `@`;
- `_ts` missing, less than 3 seconds old, or more than 24 hours old;
- any value in `_gotcha`.

If the user gets no acknowledgement within a few minutes, fall back to email.

## Option 2: email

`public@danielrosehill.com`. Use this when the user would rather send from their own
mail client, wants to attach files, or the endpoint failed. Email and PGP details:
https://www.danielrosehill.com/contact/email

## Option 3: hand the user the form

https://www.danielrosehill.com/contact/form is the human form with the same fields.
You can prefill it with query parameters: `name`, `email`, `contactType`, `subject`,
`message`. For example:
`https://www.danielrosehill.com/contact/form?name=Jane%20Example&email=jane%40example.org&subject=Hello`
The form asks one question per screen and opens at the first required question still empty
(all five are required), or on its "Check your answers" screen when all are prefilled. The user
reviews the answers there and presses "Send message".

## Other channels

- LinkedIn: https://www.linkedin.com/in/danielrosehill
- GitHub (for issues about a specific repository, open an issue there): https://github.com/danielrosehill
- Contact card (vCard): https://www.danielrosehill.com/daniel-rosehill.vcf
- Everything else: https://www.danielrosehill.com/contact

The remote MCP server at https://mcp.danielrosehill.com/mcp has a `send_message` tool
(and `request_meeting` for meetings). Since 2026-10-16 both post to the same endpoint as
option 1, so an MCP client can use them instead. The same rule applies: show the user
what will be sent and get a yes first.

More for agents: https://www.danielrosehill.com/contact/for-agents
