Internal platform changes that are not visible to capsule developers will be communicated via internal status updates.
Updated: March 28, 2019
To allow your capsule to play audio streams within Bixby, we've introduced the bixby.audioPlayer library capsule, which can play any audio format and codec supported by Android.
Read more about how to use the audio player library through the accompanying example.audio sample capsule.
You can now use for-each loops with Bixby Views components within compound-card, layout, layout-match.
Additionally, we've simplified the structure for text, paragraph, and image.
For example, here's the old and new way to specify text:
Old text:
single-line {
text {
value ("#{value(myType)}")
}
}New text
single-line {
text ("#{value(myType)}")
}or
single-line: text ("#{value(myType)}")Both the old and new ways to specify these structures are supported.
To help you control behavioral changes that we will make to the Capsule SDK runtime, we've introduced runtime flags.
As we change runtime behavior and possibly deprecate undesired behavior, we'll ask you to explicitly adopt the new behavior and make corresponding changes to your capsule.
To better reflect that form-prompt is a feature of action, we've moved it to within the features sub-key of action.
Learn more about the deprecation stages.
Updated: March 14, 2019
You now have a new, secure way to store secrets using the new Configuration & Secrets tab on the Bixby Developer Center.
Additionally, you can use this new feature to store configuration properties that need to be updated in real time.

Secrets consist of sensitive information that should not be stored in code and might need to be updated frequently (such as API keys and authentication details). You can register these in the secrets section of the Developer Center and they will be securely encrypted end-to-end. Secrets even appear obfuscated in the UI (example: *********dg3) and can be updated at any time. In your capsule code, you can access secrets with the new secret.get() JavaScript method.
For non-sensitive information, you should continue to define capsule properties in the /resources/base/capsule.properties file, which makes them accessible via the config.get() JavaScript method. Within Configuration & Secrets, you can now dynamically override the values for these properties without changing your capsule code. Examples of such dynamic configurations include endpoint URIs, permission scopes, feature gates, or any other non-sensitive configuration data that you'd like to be able to change without editing capsule code. Simply define capsule properties with the same names in the Developer Center and set new values that will flow through to the config.get() JavaScript method.
Note that we're deprecating support for the redundant resources/<target>/capsule.properties files. Instead, you should consolidate your properties into a single resources/base/capsule.properties file. You can still apply different configurations per target device or locale using $vivContext.device and $vivContext.locale in JavaScript. For an example of how to migrate to using a single capsule.properties file using $vivContext.locale, refer to a corresponding update to the Space Resorts sample capsule.
Read more about using the Configuration & Secrets tab.
Learn more about the deprecation stages.
We've deprecated sort signals.
You should now apply sorting to your actions or sort-orderings within structure concepts.
You also should remove any sort signals within training.
If you implement OAuth in your capsule actions, the redirect URI now must include the capsule ID:
Old:
https://oauth.aibixby.com/auth/external/cb
New:
https://<encoded capsule id>.oauth.aibixby.com/auth/external/cb
The <encoded capsule id> is your capsule ID where the . character is replaced with -. For example, if your capsule is viv.dice, the redirect URI would be:
https://viv-dice.oauth.aibixby.com/auth/external/cb
Do not register https://*.oauth.aibixby.com/auth/external/cb using a wildcard (if your content provider supports it) as it poses a security risk to your users. Doing so allows other capsules to take over access to your users' accounts.
Read more about OAuth redirects in JavaScript actions.
Within Bixby Views, we now support specific patterns within text-input: email, mask, and regex.
Old:
text-input {
...
pattern-type (email)
}New:
text-input {
...
pattern {
email {
on-error ("Input a valid email address")
}
}
}Old:
text-input {
...
mask ("(100)-0000")
guide (true)
placeholder-char (_)
}New:
text-input {
...
pattern {
mask ("(100)-0000") {
guide (true)
placeholder-char (_)
}
}
}As a result, we've deprecated the following text-input sub-keys that are now available within the new pattern key:
guidemaskpattern-typeplaceholder-charWithin Bixby Views, the vbox key now supports for-each conditionals.
...
hbox {
content {
vbox {
content {
for-each (weather.hourly) {
as (hour) {
single-line {
text {
value {
template ("#{dateTime(hour.when,'h')}")
}
style (Detail_L)
}
}
}
}
}
}
vbox {
content {
for-each (weather.hourly) {
as (hour) {
single-line {
image {
url {
template ("[#{value (hour.icon.url)}]")
}
style (Title_M)
}
}
}
}
}
}
}
}
...Within Bixby Views, you can now control the width of vbox columns using the grow key, which is similar to the behavior of the CSS flex-grow property.
...
hbox {
content {
vbox {
grow (2)
content {
single-line: text: value (business)
single-line: image { url ("Business.png") style (Label_M) }
}
}
}
}
...<span data-stage-"internal">
Capsules can now be assigned to categories in the Marketplace based on their function, such as Radio, News, and Podcast. When your capsule is assigned to one or more categories, users can specify your capsule as a default for Bixby to use with that category. You can then associate actions and concepts in your capsule that are associated with continuations for that category.
action (FindSong) {
output (Song)
...
features {
continuation-category (Radio)
}
}Read more about continuation categories.
Updated: Feb 25, 2019
The following changes have been made to Bixby Views.
The size key in cards and images is now deprecated. Use the new aspect-ratio key to specify how an image or a card fits in a Bixby View.
Old:
image-card {
size (L)
...
}New:
image-card {
aspect-ratio (4:3)
...
}The layout-match key is deprecated in selection-of, list-of, and their respective highlights keys. Instead, use a layout-macro or create the content within those keys directly.
Old:
result-view {
match: SpaceResort (result)
render {
if (size(result) > 1) {
list-of (result) {
where-each (item) {
layout-match (item) {
mode (Summary)
}
}
}
} else-if (size(result) == 1) {
layout {
layout-match (result) {
mode (Details)
}
}
}
}
}New:
result-view {
match: SpaceResort (result)
render {
if (size(result) > 1) {
list-of (result) {
where-each (item) {
layout-macro (space-resort-summary) {
param (spaceResort){
expression (item)
}
}
}
}
} else-if (size(result) == 1) {
layout {
layout-macro (space-resort-details) {
param (spaceResort) {
expression (result)
}
}
}
}
}
}The text-position key enables you to choose if an image is below or above the title area of an image card.
image-card {
aspect-ratio (16:9)
text-position (Below)
...
}You can choose between Below and Overlay.
The Legal text style was added so you can define legal content in a View.
text {
value (Sample Text)
style (Legal)
}You can now use the built-in JavaScript Date object to perform date and time calculations internally in your functions. If you do use the built-in JavaScript Date, you need to manually convert these to the appropriate viv.time objects when returning those results.
The following keys were added for the capsule-info.bxb file:
privacy-policy-urlsearch-keywordsCertain utterances are now reserved for specific situations. For more information, see Reserved Utterances.
If you are using one of our provided JavaScript APIs, you must explicitly declare it in your JavaScript file.
var http = require('http')Updated: Feb 12, 2019
Within Bixby Views, we've deprecated the following text style labels:
Label_MLabel_M_SoftLabel_LLabel_L_SoftIf you have transactional workflows within your capsule, and if you are using the time key within activity, such as within structures, you must now ensure it is of type or subtype BaseDate or BaseDateTime.
If you're using ordinal selection patterns as part of hands-free list navigation, be aware that we've renamed the viv.core.SelectionOrdinal pattern label to viv.core.OrdinalSelector.
Old
ordinal-selection-patterns {
pattern ("(first)[v:viv.core.SelectionOrdinal:1]")
pattern ("(first)[v:viv.core.SelectionOrdinal:1] one")
pattern ("that (first)[v:viv.core.SelectionOrdinal:1] one")
pattern ("yes (first)[v:viv.core.SelectionOrdinal:1]")
pattern ("yes (first)[v:viv.core.SelectionOrdinal:1] one")
pattern ("yes that (first)[v:viv.core.SelectionOrdinal:1] one")
}New
ordinal-selection-patterns {
pattern ("(first)[v:viv.core.OrdinalSelector]")
pattern ("(first)[v:viv.core.OrdinalSelector] one")
pattern ("that (first)[v:viv.core.OrdinalSelector] one")
pattern ("yes (first)[v:viv.core.OrdinalSelector]")
pattern ("yes (first)[v:viv.core.OrdinalSelector] one")
pattern ("yes that (first)[v:viv.core.OrdinalSelector] one")
pattern ("result number (one)[v:viv.core.CardinalSelector:1]")
}You can alternatively use the viv.core.CardinalSelector label to indicate a numbered result and its value, as shown in the example above.
Updated: January 30, 2019
We've updated the way in which you configure OAuth authorization. You must now use an authorization.bxb file that defines the OAuth 2.0 access scope a user can give a provider:
authorization {
user {
oauth2-authorization-code (providerId) {
authorize-endpoint (...)
client-id (...)
client-secret (...)
scope (...) // optional
token-endpoint (...)
revoke-endpoint(...) // optional
login-button-label(...) // optional
}
}
global {
oauth2-client-credentials (providerId) {
client-id (...)
client-secret (...)
scope (...) // optional
token-endpoint (...)
}
}
}In the previous method that is now deprecated, you specified OAuth authorization through your endpoints declaration (endpoints.bxb). You could specify exactly one type of authorization, which is automatically applied to all endpoints. If some of your endpoints required a different authorization, you could overwrite it using authorization-override.
With the authorization.bxb file, you can specify one user scoped authorization (currently oauth2-authorization-code) and one globally scoped authorization (currently oauth2-client-credentials). You no longer need to explicitly use authorization-override.
You must place the authorization.bxb file within the capsule root folder, not within the resources folder.
No authorization is applied to an endpoint automatically. An endpoint that needs authorization needs to be tagged with authorization (User) or authorization (Global) depending on which authorizations are needed:
endpoints {
action-endpoints {
action-endpoint (OAuthUser) {
remote-endpoint (https://example.com) {
method (GET)
}
authorization (User)
}
action-endpoint (OAuthGlobal) {
remote-endpoint (https://global.example.com) {
method (GET)
}
authorization (Global)
}
action-endpoint (OAuthNone) {
remote-endpoint (https://internal.example.com) {
method (GET)
}
}
}
}Read more about Authorizing Access with OAuth.
Learn more about the deprecation stages.
You can now use a custom grant type when using OAuth in your capsule. The oauth2-custom key is helpful when your service does not use standard grants provided with OAuth 2.0.
authorization {
user {
oauth2-custom (providerId) {
authorize-endpoint (...) //optional
client-id (...)
client-secret-key (...)
grant-type (...)
login-button-label (...) //optional
revoke-endpoint (...) //optional
scope (...)
token-endpoint (...)
}
}
global {
...
}
}When declaring required inputs, you can now specify an on-empty block and use conditionals to either prompt the user or halt execution:
input (myInput) {
type (MyType)
min (Required) {
on-empty {
if (condition) {
prompt | halt
}
}
}
}Bixby Views now supports the new payment-selection component in cases where you need to confirm a transaction or verify a payment from users.

This new component creates a payment UI for users so that they can complete a transaction.
Updated: January 15, 2019
Bixby Views now supports the new image component in cases where you want to include a standalone image within a compound card or section within a content container.
You can specify the image URL, optionally the size, and whether an image should be cropped.
