The Mirror API is not designed to receive requests from users and respond in
real-time or with low latency. If this is a requirement, use the GDK.
For example, Mirror API Glassware works well with the "take a note" or
"post an update" command,
because users do not have to wait for a response from the Glassware after
invoking the command.
In contrast, "start a timer" and "tune an instrument" don't work well with Mirror
API Glassware, because users expect the experience to start immediately.
The two main ways for users to invoke Glassware and its features are
by using a voice or touch command from the ok glass main menu
or through a contextual menu from a timeline card.
You should never force users to pin a timeline card with menu items
for the purpose launching Glassware. The Mirror API is designed for
periodic notifications
based on user-configured settings or to share content with contacts.
For example, a pet adoption Glassware shouldn't insert a timeline
card and force users to pin it to access features later
on (for example, to "Search for dogs", "Search for
cats", "Search for birds", and so on). Instead,
the Glassware should allow users to set criteria for the pets
they want and periodically deliver cards that meet this criteria. These
cards can then contain menu items to carry out actions such
as "Read bio" and "Adopt pet".
Glass is designed for small pieces of information that's delivered at the right
time. Porting every feature from a mobile app will not work well on Glass. Instead
find the main use cases that work well on Glass and focus on delivering a few
magical features. See
Design for Glass
for inspiration.
Taps on live cards always bring up a Glass menu. All live cards must have a Stop menu item
to dismiss the live card from the timeline.
If live cards start immersions, users are brought to where they previously left
off in the immersion, where it makes sense.
Swiping or tapping in immersions always produce an action or feedback that the gesture
was not consumed (for example, use
horizontal tugging).
Gestures that don't behave like the Glass system should have clear instructions on how to use them
and clear results.
If you create UI elements that are similar to what the Glass system provides,
use what the Glass system provides instead. For instance, use a
card scroll view
instead of implementing your own.
Use immersions for focused tasks that require it. Otherwise, other options such as a live
card or static cards are preferred.
Bundles and pagination allow you to group together cards, but you should
use them correctly in the following situations.
Note: Bundling and paginating features are built into the Mirror API. If
you are trying to achieve the same functionality in the GDK, mimic how the Mirror
API presents bundling and pagination as close as possible. Use stack indicators,
menu items,
and card scrollers
to present your cards.
Bundles
Use bundles for groups of cards that are similar but shouldn't be on the same
card.
Design bundle cover cards to be digests that are visually different from the
cards the bundle contains.
Notify the user with a notification sound only once for each bundle.
Cases where bundles work well:
A thread of emails or short messages
Three SMS messages between the same people
Five photos taken within an hour of each other
Related articles inserted all at once
A list of key events and score updates for an ongoing sports game
Cases where bundles don't work well:
All content from your service
Many headlines sent to Glass over the course of a day
Pagination
Use pagination for timeline items that do not fit on a single card because of
space constraints, but otherwise should be on the same card.
Cases where pagination work well:
A single email, news story, or similar content that doesn't fit on one card
Cases where pagination doesn't work well:
A group of distinct cards, such as multiple news stories or emails
Indicate visually that a settings change is saved.
Indicate update frequency overall and per feed if applicable to
keep your content relevant. The following
screenshot shows an example of allowing users to set update frequency and feed
types.
The Glass brand and its associated assets are proprietary and are carefully
designed and used by Google.
Do not use, modify, or mimic proprietary Glass logos or assets in any way unless
they are provided on the [Assets](/glass/tools-downloads/downloads) page.
Do not use, modify, or mimic the Glass logo font for use in your product.
Glassware and its related descriptions must be in English by default. Multiple languages
are okay if there is complete feature parity between languages.
Ensure your Glassware name accurately portrays the Glassware's functionality or branding. Do not use
the string "Glass" in the name, unless it is in the phrase "for Glass." For example, "Cat Facts for Glass"
is okay, but not "Glass Cat Facts" or "Glassy Cat Photos."
Run your Glassware on actual Glass hardware. This is the only way to accurately gauge
the user experience. Also ensure that GDK Glassware does not cause unexpected
performance, such as overheating Glass.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-07-10 UTC."],[[["\u003cp\u003eThese guidelines help you build high-quality Glassware by avoiding common pitfalls, focusing on voice command usage, Glassware invocation methods, and design principles.\u003c/p\u003e\n"],["\u003cp\u003eWhen designing Glassware, prioritize features suitable for Glass's capabilities, leverage the GDK for innovation while maintaining system consistency, and adhere to standard card designs and templates.\u003c/p\u003e\n"],["\u003cp\u003eOptimize card organization using bundles and pagination appropriately, and ensure your Glassware follows best practices for content creation and user experience.\u003c/p\u003e\n"],["\u003cp\u003eFor web properties related to your Glassware, highlight Glass-specific features, provide seamless authorization flows, and offer clear and useful settings.\u003c/p\u003e\n"],["\u003cp\u003eAdhere to Glass branding guidelines by using proprietary assets correctly, ensuring Glassware names and descriptions are appropriate, and following Glass terminology and voice guidelines.\u003c/p\u003e\n"]]],[],null,["# Glassware Guidelines\n\nThese guidelines will help you avoid common pitfalls and guide you through\nthe process of building a high-quality Glassware.\n| **Note:** If a guideline item has GDK or Mirror API in the title, then you do not have to check that item if you're not using that particular API.\n\n### Invocation\n\n[I1. Use voice commands correctly](#)\n\n-\n Ensure your Glassware uses [approved\n voice commands](/glass/develop/gdk/reference/com/google/android/glass/app/VoiceTriggers.Command).\n\n-\n Ensure your Glassware uses [approved\n contextual commands](/glass/develop/gdk/reference/com/google/android/glass/app/ContextualMenus.Command).\n\n- The Mirror API is not designed to receive requests from users and respond in\n real-time or with low latency. If this is a requirement, use the GDK.\n\n For example, Mirror API Glassware works well with the \"take a note\" or\n \"post an update\" command,\n because users do not have to wait for a response from the Glassware after\n invoking the command.\n- In contrast, \"start a timer\" and \"tune an instrument\" don't work well with Mirror\n API Glassware, because users expect the experience to start immediately.\n\n[I2. Don't use a pinned Mirror API timeline item as a launcher](#)\n\nThe two main ways for users to invoke Glassware and its features are\nby using a voice or touch command from the **ok glass** main menu\nor through a contextual menu from a timeline card.\n\nYou should never force users to pin a timeline card with menu items\nfor the purpose launching Glassware. The Mirror API is designed for\n[periodic notifications](/glass/design/patterns#periodic_notifications)\nbased on user-configured settings or to [share content with contacts](/glass/develop/mirror/contacts).\n\nProviding menu items to launch GDK Glassware or call the Mirror API\nis okay as long as the experience is consistent with the\n[periodic notifications](/glass/design/patterns#periodic_notifications)\ndesign pattern and does not use the\n[Mirror API for immediate interactivity](/glass/distribute/best-practices#dont_use_the_mirror_api_for_immediate_interactivity).\n\nFor example, a pet adoption Glassware shouldn't insert a timeline\ncard and force users to pin it to access features later\non (for example, to \"Search for dogs\", \"Search for\ncats\", \"Search for birds\", and so on). Instead,\nthe Glassware should allow users to set criteria for the pets\nthey want and periodically deliver cards that meet this criteria. These\ncards can then contain menu items to carry out actions such\nas \"Read bio\" and \"Adopt pet\".\n[I3. Invoking GDK Glassware from Glass home starts a live card or immersion](#)\n\nIt must be clear to users that Glassware is running if they explicitly\ninvoke it.\n\n### Design\n\n[D3. Don't use the GDK to port mobile features that work poorly on Glass](#)\n\nGlass is designed for small pieces of information that's delivered at the right\ntime. Porting every feature from a mobile app will not work well on Glass. Instead\nfind the main use cases that work well on Glass and focus on delivering a few\nmagical features. See\n[Design for Glass](/glass/design/principles#design_for_glass)\nfor inspiration.\n[D4. Use the GDK to innovate new features, but be consistent with the Glass system when appropriate](#)\n\n- Taps on live cards always bring up a Glass menu. All live cards must have a **Stop** menu item to dismiss the live card from the timeline.\n- If live cards start immersions, users are brought to where they previously left off in the immersion, where it makes sense.\n- Swiping or tapping in immersions always produce an action or feedback that the gesture was not consumed (for example, use [horizontal tugging](/glass/develop/gdk/card-scroller#horizontal_tugging_feedback)).\n- Gestures that don't behave like the Glass system should have clear instructions on how to use them and clear results.\n- If you create UI elements that are similar to what the Glass system provides, use what the Glass system provides instead. For instance, use a [card scroll view](/glass/develop/gdk/card-scroller#scrolling_cards_in_activities) instead of implementing your own.\n- Use immersions for focused tasks that require it. Otherwise, other options such as a live card or static cards are preferred.\n[D6. Follow standard card design and templates](#)\n\nWhen possible, use approved [card designs](/glass/design/style#layout_templates).\n[Mirror API](/glass/tools-downloads/playground) and\n[GDK](/glass/develop/gdk/card-design#xml_layouts) templates are\navailable for some of these designs.\n\n- Use the styles in [base_style.css](https://mirror-api-playground.appspot.com/assets/css/base_style.css) if you are using the Mirror API.\n- Follow the [general rules](/glass/design/style#card_regions) for padding and spacing as the built-in templates.\n\n[D7. Bundle and paginate cards properly](#)\n\nBundles and pagination allow you to group together cards, but you should\nuse them correctly in the following situations.\n\n**Note:** Bundling and paginating features are built into the Mirror API. If\nyou are trying to achieve the same functionality in the GDK, mimic how the Mirror\nAPI presents bundling and pagination as close as possible. Use [stack indicators](/glass/develop/gdk/card-design#stack_indicator),\n[menu items](/glass/develop/gdk/immersions#creating_and_displaying_a_menu),\nand [card scrollers](/glass/develop/gdk/card-scroller#scrolling_cards_in_activities)\nto present your cards.\n\n### Bundles\n\n- Use bundles for groups of cards that are similar but shouldn't be on the same card.\n- Design bundle cover cards to be digests that are visually different from the cards the bundle contains.\n- Notify the user with a notification sound only once for each bundle.\n\nCases where bundles work well:\n\n- A thread of emails or short messages\n- Three SMS messages between the same people\n- Five photos taken within an hour of each other\n- Related articles inserted all at once\n- A list of key events and score updates for an ongoing sports game\n\nCases where bundles don't work well:\n\n- All content from your service\n- Many headlines sent to Glass over the course of a day\n\n### Pagination\n\nUse pagination for timeline items that do not fit on a single card because of\nspace constraints, but otherwise should be on the same card.\n\nCases where pagination work well:\n\n- A single email, news story, or similar content that doesn't fit on one card\n\nCases where pagination doesn't work well:\n\n- A group of distinct cards, such as multiple news stories or emails\n[D8. Follow best practices](#)\n\nEnsure your Glassware adheres to the rest of our Glassware\n[best practices](/glass/distribute/best-practices#create_content_appropriately).\n\n### Web properties\n\n[WP1. Highlight Glass-specific features on your website](#)\n\n- Use the [Send to Glass](/static/glass/tools-downloads/send-to-glass-buttons.zip) icons if sending content to Glass from the web.\n- Use the [Get it on Glass](/static/glass/tools-downloads/get-it-on-glass-buttons.zip) icons if providing a link to download Glassware.\n- Ensure correct grammar and spelling.\n[WP2. Provide easy authorization flows](#)\n\n- Do not have more than two authorization or login pages.\n- Settings should not require re-authorization within a reasonable span of time (less than three months).\n- If an account or a companion app is required, the authorization flow is clear for users who have or don't have an account with your service.\n- The URL to the authorization web page must be different from the URL for the settings web page.\n- If a user account is required, Glassware must not authenticate a user without connecting to the user account.\n[WP3. Provide clear and useful settings](#)\n\n- Indicate visually that a settings change is saved.\n- Indicate update frequency overall and per feed if applicable to [keep your content relevant](/glass/design/principles#keep_it_relevant). The following screenshot shows an example of allowing users to set update frequency and feed types.\n\n### Branding\n\n[B1. Use proprietary Glass assets correctly](#)\n\n\nThe Glass brand and its associated assets are proprietary and are carefully\ndesigned and used by Google.\n\n- Do not use, modify, or mimic proprietary Glass logos or assets in any way unless they are provided on the \\[Assets\\](/glass/tools-downloads/downloads) page.\n- Do not use, modify, or mimic the Glass logo font for use in your product.\n\n### Writing\n\n[W1. Glassware and its descriptions are in English](#)\n\n\nGlassware and its related descriptions must be in English by default. Multiple languages\nare okay if there is complete feature parity between languages.\n[W2. Name your Glassware appropriately](#)\n\n\nEnsure your Glassware name accurately portrays the Glassware's functionality or branding. Do not use\nthe string \"Glass\" in the name, unless it is in the phrase \"for Glass.\" For example, \"Cat Facts for Glass\"\nis okay, but not \"Glass Cat Facts\" or \"Glassy Cat Photos.\"\n[W3. Use Glass terms correctly](#)\n\n\nSee the [Glass in text](/glass/distribute/branding-guidelines#glass_in_text)\nsection for restrictions and guidelines.\n[W5. Use Glass voice](#)\n\n\nFollow [guidelines](/glass/design/style#writing) for writing\nwhen applicable. \n\n### Testing\n\n[T1. Test on actual hardware](#)\n\n\nRun your Glassware on actual Glass hardware. This is the only way to accurately gauge\nthe user experience. Also ensure that GDK Glassware does not cause unexpected\nperformance, such as overheating Glass."]]