> For the complete documentation index, see [llms.txt](https://docs.apryse.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.apryse.com/android/collaboration/server-a.md).

# Connecting to a server to collaborate on documents in realtime

Learn how to host annotations on your server for real-time collaboration with Apryse. Connect your data to an out-of-the-box UI and manage annotations effortlessly. Get started today! The Apryse Andro

## Host annotations in your own server

In realtime collaboration, a server will merely act as an online database that triggers events upon data creation/modification/deletion. As long as the above requirement is met, your server can be built in any language and stack of your choice. Apryse provides an interface that will allow you to connect your data to the out-of-box UI.

1. Your will need to obtain a reference to `CollabManager` from the `CollabViewerTabHostFragment2`, then setup the current collaboration session, for example:

{% tabs %}
{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
void handleTabDocumentLoaded(String tag) {
    // setup the current collaboration session
    CollabManager collabManager = mCollabViewerTabHostFragment.getCollabManager();
    if (collabManager != null) {
        collabManager.setCurrentUser(mUserId, mUserName);
        collabManager.setCurrentDocument(mDocumentId);

        collabManager.setCollabManagerListener(new CollabManager.CollabManagerListener() {
            @Override
            public void onSendAnnotation(String action, ArrayList<AnnotationEntity> annotations, String documentId, @Nullable String userName) {
                // local change, send info to server here
            }
        });
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="Kotlin" %}
{% code lineNumbers="true" %}

```kotlin
internal fun handleTabDocumentLoaded(tag: String) {
    // setup the current collaboration session
    val collabManager = mCollabViewerTabHostFragment.collabManager
    collabManager!!.setCurrentUser(mUserId, mUserName)
    collabManager.setCurrentDocument(mDocumentId)

    collabManager.setCollabManagerListener { action, annotations, documentId, userName ->
        // local change, send info to server here
    }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

1. When your server notifies the client about remote changes, import the XFDF command string with `CollabManager`:

{% tabs %}
{% tab title="Java" %}
{% code lineNumbers="true" %}

```java
void importXfdf(String xfdfCommand) {
    CollabManager collabManager = mCollabViewerTabHostFragment.getCollabManager();
    if (collabManager != null) {
        collabManager.importAnnotationCommand(xfdfCommand);
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="Kotlin" %}
{% code lineNumbers="true" %}

```kotlin
fun importXfdf(xfdfCommand: String) {
    val collabManager = mCollabViewerTabHostFragment.collabManager
    collabManager!!.importAnnotationCommand(xfdfCommand)
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

The annotations appearing on the document in real time are managed through a separate XFDF format, while the original version of the document is preserved on the server. Note that the client downloads the original untouched document at the start of the collaboration session.

And that is it! Apryse will handle all annotation syncing and annotation reply for you.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.apryse.com/android/collaboration/server-a.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
