Community settings
Some behaviors of the community UI are set per community in the Octopus back office rather than in your code. The SDK reads the community configuration at startup and on each configuration refresh, and adapts its screens. This page lists each setting and what the SDK does with it. To change a setting for your community, contact Octopus.
Before you begin
- Complete the Quickstart: the SDK is initialized and the community UI opens.
- Check the minimum SDK version of each setting you plan to use: the versions are listed under each section and in Platform support.
- If your app declares app-managed profile fields, read App-managed profile fields first: the profile field lock does not block them.
Content options
Android ≥ 1.12.1iOS ≥ 1.12.3Flutter ≥ 1.12.2React Native ≥ 1.13.0Unity ≥ 1.12.2
Content options turn off specific creation controls, separately for posts, comments and replies. They govern what members can add to new content, not how existing content is displayed. Your app has nothing to integrate.
What is controlled
Each of these controls can be turned off on its own:
| Option | Effect when turned off |
|---|---|
| Post pictures | Hides the add-picture button in the post editor. |
| Post polls | Hides the create-poll button in the post editor, and the poll prompt on the member's own profile. |
| Comment pictures | Hides the add-picture button in the comment field. |
| Reply pictures | Hides the add-picture button in the reply field. Comment and reply pictures are set separately. |
Images in a post that your app prefills, for example through a share or a deep link, are not affected by the post pictures option.
Default behavior
Every option is on by default. A community that sets no content options shows all the creation controls.
Image-and-poll posts and optional text
Android ≥ 1.15.0iOS ≥ 1.15.0Flutter ≥ 1.15.0React Native ≥ 1.15.0Unity ≥ 1.15.0
A post can carry an image and a poll together. If the community makes post text optional, an image post can be published without text, with or without a poll. A post without an image still needs text, including a poll alone. The SDK applies this configuration automatically.
Platform details
- Android
- iOS
- Flutter
- React Native
- Unity
The SDK applies the options itself. To read them in your own UI, for example to hide a matching control, collect the community configuration:
import com.octopuscommunity.sdk.OctopusSDK
import com.octopuscommunity.sdk.domain.model.CommunityConfig
OctopusSDK.communityConfigRepository.getCommunityConfigFlow().collect { config ->
val options: CommunityConfig.ContentOptions = config?.contentOptions ?: CommunityConfig.ContentOptions()
options.post.enablePictures // false hides the add-picture button in the post editor
options.post.enablePolls // false hides the create-poll button
options.post.textRequired // false allows an image post without text (since 1.15.0)
options.comment.enablePictures // false hides the add-picture button in comments
options.reply.enablePictures // false hides the add-picture button in replies
}
Since 1.15.0, a post can carry an image and a poll together, including a prefilled image: the image appears above the poll. CommunityConfig.ContentOptions.PostOptions.textRequired defaults to true. When it is false, an image post can be published without text, with or without a poll; blank text is omitted. A post without an image still needs text, including a poll alone. When supplied, text still needs 10 characters (1 with a poll), up to 5000. The no-argument and two-flag PostOptions constructors and copy() keep text required.
The SDK applies the options itself. The iOS SDK does not expose them to your app, so there is nothing to read or configure.
≥ 1.15.0 A post can carry an image and a poll together, including a prefilled image. The feed and post detail show the image above the poll, and removing either attachment in the editor keeps the other.
≥ 1.15.0 When the community makes post text optional, an image post can be published without text, with or without a poll. Whitespace-only text is sent as no text. A post without an image still needs text, including a poll alone. Communities that keep text required are unchanged.
≥ 1.15.0 Image-and-poll posts and optional image-post text follow the community configuration. In debug content overrides, PostOptions.textRequired defaults to true; set it to false to test an image post without text. This override is for local testing, not production configuration.
The SDK applies the options itself, and there is no Flutter API to read them. The ContentOptions class exists only for OctopusSDK().debugOverrideContentOptions(), a debug hook that lets you test each option locally without changing the community configuration.
≥ 1.15.0 Image-and-poll posts and optional image-post text follow the community configuration. In debug content overrides, ContentOptions.post.textRequired defaults to true; set it to false to test an image post without text. This override is for local testing, not production configuration.
The SDK applies the options itself, and there is no React Native function to read them. The ContentOptions type exists only for debugOverrideContentOptions(), a debug hook that lets you test each option locally without changing the community configuration.
≥ 1.15.0 Image-and-poll posts and optional image-post text follow the community configuration. In debug content overrides, OctopusPostOptions.TextRequired defaults to true. To test an image post without text, call OctopusSDK.DebugOverrideContentOptions(new OctopusContentOptions(post: new OctopusPostOptions(enablePictures, enablePolls, textRequired: false))). This override is for local testing, not production configuration.
The SDK applies the options itself, and there is no Unity function to read them.
Profile field lock
Android ≥ 1.12.1iOS ≥ 1.12.3Flutter ≥ 1.12.2React Native ≥ 1.13.0Unity ≥ 1.12.2
The profile field lock sets whether members can edit their nickname, avatar and bio in the community. The SDK adapts the profile screens to the lock. Your app has nothing to integrate. A community that sets no lock keeps every field editable.
Lock states
Each field is in one of three states:
| State | Meaning |
|---|---|
| Editable (default) | The field is shown and members can change it. |
| Read-only | The current value is shown, but members cannot change it in the community. |
| Disabled | The field is hidden entirely. Only the bio can be disabled: the nickname and avatar are either editable or read-only. |
Your app cannot change the lock, apart from the debug overrides described in Configuration. It always reflects the community configuration.
Per-field behavior
Nickname
- Editable: shown and editable. Members confirm their nickname before their first post.
- Read-only: shown but not editable. The SDK skips the first-post nickname confirmation, and members post with the nickname the community assigned them.
Avatar
- Editable: shown with the add or edit overlay. Tapping it opens the edit flow.
- Read-only: shown as a plain image, with no overlay. Tapping it does nothing.
Bio
- Editable: shown, with an "Add a bio" prompt when it is empty. Tapping it opens the edit flow.
- Read-only: the current bio is shown as plain text, with no "Add a bio" prompt.
- Disabled: the bio section is removed from the profile.
Edit profile screen
The edit profile screen shows only the editable fields. Read-only and disabled fields are absent, not greyed out. The Edit profile button on the profile stays visible while at least one of the three fields is editable, and is hidden when all three are locked.
Interaction with app-managed fields
A field that your app declares as app-managed is not blocked by the lock. When a member tries to edit it, the SDK asks your app to open its own profile editor, as usual. The lock applies only to the fields your app does not manage.
Configuration
- Android
- iOS
- Flutter
- React Native
- Unity
The SDK applies the lock itself. To read it in your own UI, collect the community configuration. CommunityConfig.profileFieldsLock holds a ProfileFieldLockState for each field, EDITABLE, READ_ONLY or DISABLED, and defaults to ProfileFieldsLock.AllEditable when the community sets no lock.
import com.octopuscommunity.sdk.OctopusSDK
import com.octopuscommunity.sdk.domain.model.ProfileFieldLockState
import com.octopuscommunity.sdk.domain.model.ProfileFieldsLock
OctopusSDK.communityConfigRepository.getCommunityConfigFlow().collect { config ->
val lock: ProfileFieldsLock = config?.profileFieldsLock ?: ProfileFieldsLock.AllEditable
val canEditBio = lock.bio == ProfileFieldLockState.EDITABLE
}
Nickname choice ≥ 1.15.0
Since 1.15.0, members who have not confirmed a nickname choose it before their first post, comment or reply; the SDK sends the waiting contribution after confirmation. CommunityConfig.forceNicknameChoice defaults to false (generated nickname prefilled); true starts with an empty field. A signed-in member whose nickname is app-managed, locked or already confirmed skips this screen. Back cannot skip it; after a failed confirmation, closing keeps the draft without sending it.
For a custom profile editor, the new ProfileRepository.updateProfile overload takes:
newProfile(CurrentUserProfile): the desired profile.previousProfile(CurrentUserProfile?): the previous profile, ornull.findAvailableNickname(Boolean): whether the server should choose an available nickname.wantNicknameSuggestions(Boolean): settrueto request alternatives when the nickname is taken.
// Call from a coroutine, for example inside viewModelScope.launch { }
val result = OctopusSDK.profileRepository.updateProfile(
newProfile = editedProfile,
previousProfile = previousProfile,
findAvailableNickname = false,
wantNicknameSuggestions = true,
)
A taken nickname returns ProfileUpdateError.NicknameError.AlreadyUsed.suggestions (List<String>); it is empty unless suggestions were requested. UpdateProfileUseCase has the equivalent four-argument overload (oldProfile instead of previousProfile); the old three-argument calls remain and request no suggestions.
Recompile prebuilt code that constructs or copies CommunityConfig, or implements ProfileRepository or CommunityConfigRepository; Java callers of the configuration constructor or copy must pass the new arguments.
Consent wordings ≥ 1.15.0
Since 1.15.0, CommunityConfig.consentTexts carries the community's own markdown wordings in the member's language for the consent shown before a member's first contribution: CommunityConfig.ConsentTexts.Implicit(notice), MultiCheckbox(termsLabel, privacyLabel, rulesLabel) or SingleCheckbox(label, belowText). Only the case matching termsAcceptanceMode applies. Missing or empty texts keep the SDK wording; links, bold, italic and line breaks are supported. Configuration and stored consent texts migrate automatically on upgrade.
The SDK routes links in these wordings through the host's onNavigateToUrl. If you embed com.octopuscommunity.sdk.ui.comments.components.OctopusItemInputField yourself, wire its new trailing onNavigateToUrl: (String) -> Unit parameter to your URL handler: its default does nothing. Recompile prebuilt code that calls this composable or constructs/copies CommunityConfig.
Since 1.15.0, the explicit consent sheet scrolls while its button stays at the bottom. The implicit notice scrolls inside a zone capped at five and a half lines and one fifth of the window height, keeping the editor usable at large font sizes. No integration change is needed.
The SDK applies the lock itself. The iOS SDK does not expose it to your app, so there is nothing to read or configure.
Nickname choice ≥ 1.15.0
Members who have not confirmed a nickname choose it, and can set their picture, before their first post, comment or reply. The SDK sends the waiting contribution after confirmation. When the community requires a choice, the field starts empty instead of prefilling the generated nickname; a taken nickname comes with available suggestions. Members whose nickname is app-managed, locked or already confirmed skip this screen. The screen cannot be dismissed; after a failed confirmation, closing it keeps the draft without sending it. No integration change is needed.
Consent wordings ≥ 1.15.0
The consent sheet and the legal notice under the post, comment and reply editors use the community's own wordings in the member's language. All these wordings support markdown links, bold and italic. Missing or empty fields keep the SDK wording. Links go through the callback registered with set(onNavigateToURLCallback:), just like other SDK links.
The explicit consent sheet scrolls when its content exceeds the available height, while its button stays at the bottom, including on iPad. The implicit notice shows up to five lines plus half of the next line, then scrolls, and never takes more than 20% of the window height. On iOS 17 and later, the scroll indicator flashes once when the notice appears. No integration change is needed.
The SDK applies the lock itself, and there is no Flutter API to read it. The ProfileFieldsLock class and the ProfileFieldLockState enum (editable, readOnly, disabled) exist only for OctopusSDK().debugOverrideProfileFieldsLock(), a debug hook that lets you test each state locally without changing the community configuration.
The SDK applies the lock itself, and there is no React Native function to read it. The ProfileFieldsLock type and ProfileFieldLockState ('editable' | 'readOnly' | 'disabled') exist only for debugOverrideProfileFieldsLock(), a debug hook that lets you test each state locally without changing the community configuration.
The SDK applies the lock itself. There is nothing to call from Unity.
Nickname choice before contributing
Android ≥ 1.15.0iOS ≥ 1.15.0Flutter ≥ 1.15.0React Native ≥ 1.15.0Unity ≥ 1.15.0
Members who have not confirmed their nickname choose it before their first post, comment or reply. Members whose nickname is app-managed, locked or already confirmed skip this screen. The SDK keeps the draft until confirmation. Your app has nothing to integrate; the community controls whether the generated nickname is prefilled or the field starts empty.
Community consent wordings
Android ≥ 1.15.0iOS ≥ 1.15.0Flutter ≥ 1.15.0React Native ≥ 1.15.0Unity ≥ 1.15.0
The legal notice and consent sheet use the community's wordings in the member's language. Markdown links, bold and italic are supported, and missing or empty texts keep the SDK wording. Links use your existing URL callback. The consent sheet scrolls while its confirmation button remains accessible. Your app has nothing to integrate; wordings are configured for the community.
Comments tab visibility ≥ 1.14.0
Whether members can see the Comments tab on other members' profiles and activity is a back-office setting of your community, off by default: contact Octopus to turn it on. The SDK screens follow it on every platform, with no code in your app. Members always see the Comments tab on their own profile, whatever this setting.
Next steps
- Connect your users: declare app-managed profile fields.
- Unified Profile: open member profiles from your app.
- Display the community: host the community screens.