
> [!WARNING]
> Due to limited funds for AI tokens, this project is currently awaiting grant funding. Until then, please do not expect frequent code updates.
>
> I plan to use this time to refine the project's architecture, for which I do not need AI anyway.


# Just Onboarding
The point is that modern apps are extremely limited in terms of functionality. It is easy to justify this by saying that the screen is small, fingers are thick, and controls need to be simple. As a result, we get very few options so as “not to complicate the interface.” In practice, this turns people into passive consumers. The algorithm serves something up, and you either accept it or reject it.

What I want is for the user to regain control. The idea is to preserve simplicity while returning to a time when you had control over what your phone displayed.

## Manifest

When the old internet collapses, we must be ready.

Like mammals waiting for the meteor to hit.

What should the new internet look like?

1. No one can enslave you.

Everything else is just detail.

It does not matter whether someone controls your friends list or knows your preferences. It does not matter who has access to the controls behind the algorithm that shapes your behavior.

What matters is that no such person should EXIST AT ALL.

It is difficult, but IT CAN BE DONE.

In fact, it has essentially ALREADY BEEN DONE.

Technologies such as Bitcoin, the Lightning Network, Nostr, and smart contracts already exist. It is all here already.

But one final invention was missing.

An invention without which none of these technologies will ever achieve widespread adoption:

"speek_and_show"

Our most primal form of communication, transferred from the human-to-human level to the human-to-machine level.

This is not an invention.

It is the ultimate way of communication. 

Except direct brain–computer interaction.

The transition to this form of communication is only a matter of time.

That is why the race has begun.

A race to decide what will power it underneath.

Will it be a corporate ecosystem?

Or will it be a PROTOCOL?

A decentralized network no one can use to enslave us.

This matters.

## General System Overview

![General System Overview](docs/diagrams/general_system_overview.png)

## Documentation

- [Coding style](docs/coding_style.md)
- [Roadmap](docs/roadmap.md)

## Basic Flow
![Simple Flow](docs/diagrams/basic_flow.png)

## Example Flow

1. The user clicks the red button and says:

   > Show me all the people that I follow.

2. The host is waiting for the `mcp_user.what_next` tool to return the user’s next instruction.

3. `mcp_user` converts the audio to text and sends the recognized text back to the host:

   ```text
   Show me all the people that I follow.
   ```

4. The host constructs a request to the LLM, something like:

   ```text
   You have access to the following tools:

   - mcp_user.what_next
   - mcp_user.present_data
   - mcp_user.say_by_voice
   - mcp_nostr_db.query

   Your task is:

   "Show me all the people that I follow."

   Complete the task using the available tools.
   ```

5. The LLM determines that it needs to query the Nostr database and requests a tool call such as:

   ```text
   mcp_nostr_db.query("SELECT ...")
   ```

6. The host detects that the LLM wants to call a tool and forwards the following request to `gateway_mcps`:

   ```text
   mcp_nostr_db.query("SELECT ...")
   ```

7. `gateway_mcps` routes the request to the appropriate MCP server. In this case, it sends the request to `mcp_nostr_db`, which executes the query against the Nostr data.

8. `mcp_nostr_db` returns a JSON payload containing the list of people followed by the user:

   ```json
   {
     "people": [
       {
         "name": "Juzek"
       },
       {
         "name": "Stefan"
       },
       {
         "name": "Marek"
       }
     ]
   }
   ```

9. The host receives the result and constructs another request to the LLM, something like:

   ```text
   You have access to the following tools:

   - mcp_user.what_next
   - mcp_user.present_data
   - mcp_user.say_by_voice
   - mcp_nostr_db.query

   We are having a conversation.

   I asked you to complete the following task:

   "Show me all the people that I follow."

   You requested this tool call:

   mcp_nostr_db.query("SELECT ...")

   The tool call was successful and returned the following result:

   {
     "people": [
       {
         "name": "Juzek"
       },
       {
         "name": "Stefan"
       },
       {
         "name": "Marek"
       }
     ]
   }

   What should happen next?
   ```

10. The LLM determines that the requested data has already been retrieved and should now be presented to the user. It requests another tool call:

    ```text
    mcp_user.present_data("<html>...</html>")
    ```

11. `gateway_mcps` routes the `present_data` tool call to the `mcp_user` server.

12. `mcp_user` renders the provided HTML, and the list of followed people appears on the user’s screen.


## License

This project is licensed under the **Apache License, Version 2.0**.

You may use, copy, modify, and distribute this project, including for commercial purposes, subject to the terms of the license.

See [LICENSE](LICENSE) for the full license text and [NOTICE](NOTICE) for attribution and project-origin information.

## Other names
NoBro (Nostr Browser), NoEx (Nostr Explorer), Zk-Onboarding (Zero-Knowledge Onboarding). You can call it whatever you want, but I call it Just Onboarding.

## Media

* [Nostr 1](https://agent0.pl/vid/nostr.mp4)
* [Nostr 2](https://agent0.pl/vid/nostr.mp4)
* [Just onboarding](https://agent0.pl/vid/onboarding.mp4)


